139 lines
4.4 KiB
C#
139 lines
4.4 KiB
C#
using Kryz.CharacterStats;
|
|
using Kryz.CharacterStats.Examples;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
[CreateAssetMenu(fileName = "InstantEffect", menuName = "RiftMayhem/AbilitySystem/Effects/Instant Effect", order = 1)]
|
|
public class InstantValueEffect : BaseEffect
|
|
{
|
|
public float baseValue;
|
|
public DamageType damageType = DamageType.Attack;
|
|
|
|
[Header("Optional Modifiers for damage / healing based on target")]
|
|
public float AlliedTargetMultiplier = 1f;
|
|
public float EnemyTargetMultiplier = 1f;
|
|
public float FriendlyNPCTargetMultiplier = 1f;
|
|
[Header("Optional apply this to class resource instead:")]
|
|
public bool applyToClassResourceInstead = false;
|
|
public bool applyToSelfResourceInsteadOfHit = false;
|
|
|
|
Health targetHealth;
|
|
ClassResource classResource;
|
|
|
|
private float finalValue;
|
|
private EntityEventBroker userBroker;
|
|
private CharacterStats stats;
|
|
private DamageOutputModifierEffectInstance damageOutputModifier;
|
|
private bool isCrit;
|
|
|
|
public override void ApplyEffect(Taggable user, List<Taggable> targets, BaseAbility source)
|
|
{
|
|
if (user == null) return;
|
|
|
|
userBroker = user.GetComponent<EntityEventBroker>();
|
|
|
|
foreach (Taggable target in targets)
|
|
{
|
|
if (target == null) continue;
|
|
|
|
//Debug.Log($"Applied instant effect of {GetCorrectValueSign(user, target)} to target {target.name}");
|
|
if (applyToClassResourceInstead)
|
|
{
|
|
/*if (user.IsMinion()) return;
|
|
|
|
if (applyToSelfResourceInsteadOfHit)
|
|
{
|
|
classResource = user.GetComponent<ClassResource>();
|
|
if (classResource != null)
|
|
classResource.ChangeValue(GetCorrectValueSign(user, user));
|
|
}
|
|
else
|
|
{
|
|
classResource = target.GetComponent<ClassResource>();
|
|
if (classResource != null)
|
|
classResource.ChangeValue(GetCorrectValueSign(user, target));
|
|
}*/
|
|
|
|
}
|
|
else
|
|
{
|
|
targetHealth = target.GetComponent<Health>();
|
|
if (targetHealth != null)
|
|
{
|
|
ApplyEffect(user, target, source, targets.Count);
|
|
//targetHealth.ChangeValue(GetCorrectValueSign(user, target), (int)damageType, isCrit);
|
|
}
|
|
//targetHealth.ChangeValue(target.targetTag == TargettingTag.Enemy ? -value : value);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void ApplyEffect(Taggable user, Taggable target, BaseAbility source, int totalTargetsHit)
|
|
{
|
|
if (user == null)
|
|
{
|
|
Debug.LogError("ApplyEffect user is null");
|
|
return;
|
|
}
|
|
if (target == null)
|
|
{
|
|
Debug.LogError("ApplyEffect target is null");
|
|
return;
|
|
}
|
|
|
|
|
|
if (user.AlliedTagsContains(target.targetTag))
|
|
{
|
|
HealArgs args = CObjectPool<HealArgs>.Get();
|
|
|
|
|
|
args.source = source;
|
|
args.effect = this;
|
|
args.user = user;
|
|
args.target = target;
|
|
args.currentValue = baseValue;
|
|
args.outgoingAccumulator = 0f;
|
|
args.incomingAccumulator= 0f;
|
|
args.applicationMethod = EffectApplicationMethod.Hit;
|
|
args.isCrit = false;
|
|
args.totalTargetsHit = totalTargetsHit;
|
|
|
|
|
|
userBroker.OnOutgoingHeal.Invoke(args);
|
|
|
|
userBroker.OnOutgoingHealProcessed.Invoke(args);
|
|
|
|
targetHealth.ApplyHeal(args);
|
|
|
|
CObjectPool<HealArgs>.Release(args);
|
|
}
|
|
else
|
|
{
|
|
DamageArgs args = CObjectPool<DamageArgs>.Get();
|
|
|
|
args.sourceAbility = source;
|
|
args.sourceEffect = this;
|
|
args.user = user;
|
|
args.target = target;
|
|
args.currentValue = -baseValue;
|
|
args.outgoingAccumulator = 0f;
|
|
args.incomingAccumulator = 0f;
|
|
args.damageType = damageType;
|
|
args.applicationMethod = EffectApplicationMethod.Hit;
|
|
args.isCrit = false;
|
|
args.totalTargetsHit = totalTargetsHit;
|
|
args.targetDead = false;
|
|
|
|
userBroker.OnOutgoingDamage.Invoke(args);
|
|
|
|
userBroker.OnOutgoingDamageProcessed.Invoke(args);
|
|
|
|
targetHealth.ApplyDamage(args);
|
|
|
|
CObjectPool<DamageArgs>.Release(args);
|
|
}
|
|
|
|
}
|
|
}
|