using UnityEngine; using UnityEngine.AI; using System.Collections.Generic; using Kryz.CharacterStats.Examples; using Kryz.CharacterStats; [CreateAssetMenu(fileName = "MovementSpeedModifierEffect", menuName = "RiftMayhem/AbilitySystem/Effects/Movement Speed Modifier Effect", order = 1)] public class MovementSpeedModifierEffect : StatusEffect { public float speedModifierPercentage; MovementSpeedModifierEffectInstance targetMovementSpeedModifierEffect; public override void ApplyEffect(Taggable user, List targets) { base.ApplyEffect(user, targets); if (applyToTargetsHit) { foreach (Taggable target in targets) { //if (IsAlliedTarget(user, target)) //{ targetMovementSpeedModifierEffect = target.GetComponent(); targetMovementSpeedModifierEffect.owner.RPC(nameof(targetMovementSpeedModifierEffect.RPC_ApplyMovementSpeedModifierEffect), targetMovementSpeedModifierEffect.owner.Owner, StatusEffectIndexer.Instance.StatusEffects.IndexOf(this), GetCorrectValueSign(user, target)); //} } } if (applyToSelf) { targetMovementSpeedModifierEffect = user.GetComponent(); targetMovementSpeedModifierEffect.ApplyEffect(this, GetCorrectValueSign(user, user)); } } private bool IsAlliedTarget(Taggable user, Taggable target) { return user.AlliedTagsContains(target.targetTag); } private float CalculateFinalAmount(Taggable user) { float finalAmount = speedModifierPercentage; CharacterStats stats = user.GetComponent(); foreach (var statInfluence in influencingStats) { if (stats.primaryStatsDictionary.TryGetValue(statInfluence.statTag.name.ToLower(), out CharacterStat stat)) { finalAmount += stat.Value * statInfluence.percentInfluence; } else if (stats.secondaryStatsDictionary.TryGetValue(statInfluence.statTag.name.ToLower(), out CharacterStat secondaryStat)) { finalAmount += secondaryStat.Value * statInfluence.percentInfluence; } } return finalAmount; } private float GetCorrectValueSign(Taggable user, Taggable target) { if (user == null) return 0; if (target == null) return 0; //return user.targetTag.AlliedTags.Contains(target.targetTag) ? (finalValue * AlliedTargetMultiplier) : (-finalValue * EnemyTargetMultiplier); return user.AlliedTagsContains(target.targetTag) ? CalculateFinalAmount(user) : -CalculateFinalAmount(user); } }