74 lines
2.2 KiB
C#

using System.Collections.Generic;
using UnityEngine;
public class ChainLightningBehavior : RuntimeBehavior
{
public int maxChains = 3;
public float chainRange = 8f;
public float damageMultiplier = 0.5f; // Each chain does 50% of original damage
public ChainLightningBehavior()
{
Trigger = BehaviorTrigger.OnHit;
BehaviorName = "Chain Lightning";
}
public override void Execute(RuntimeAbilityInstance ability, Taggable user, Transform target, Vector3 point)
{
if (target == null) return;
var currentTarget = target.GetComponent<Taggable>();
var chainedTargets = new List<Taggable> { currentTarget };
for (int i = 0; i < maxChains; i++)
{
var nextTarget = FindNextChainTarget(currentTarget.transform.position, chainedTargets);
if (nextTarget == null) break;
chainedTargets.Add(nextTarget);
// Apply reduced damage
var health = nextTarget.GetComponent<Health>();
if (health != null)
{
float chainDamage = CalculateChainDamage(ability, i + 1);
health.ChangeValue(-chainDamage);
}
currentTarget = nextTarget;
}
}
private Taggable FindNextChainTarget(Vector3 position, List<Taggable> excludeTargets)
{
var colliders = Physics.OverlapSphere(position, chainRange);
foreach (var collider in colliders)
{
var target = collider.GetComponent<Taggable>();
if (target != null && !excludeTargets.Contains(target))
{
return target;
}
}
return null;
}
private float CalculateChainDamage(RuntimeAbilityInstance ability, int chainNumber)
{
// This would need to be adapted to your damage system
// For now, just return a reduced amount
return 50f * Mathf.Pow(damageMultiplier, chainNumber);
}
public override RuntimeBehavior Clone()
{
return new ChainLightningBehavior
{
maxChains = this.maxChains,
chainRange = this.chainRange,
damageMultiplier = this.damageMultiplier
};
}
}