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 targets, BaseAbility source) { if (user == null) return; userBroker = user.GetComponent(); 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(); if (classResource != null) classResource.ChangeValue(GetCorrectValueSign(user, user)); } else { classResource = target.GetComponent(); if (classResource != null) classResource.ChangeValue(GetCorrectValueSign(user, target)); }*/ } else { targetHealth = target.GetComponent(); 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.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.Release(args); } else { DamageArgs args = CObjectPool.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.Release(args); } } }