74 lines
2.2 KiB
C#
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
|
|
};
|
|
}
|
|
} |