using System; using MoleMole.Config; namespace MoleMole { public class AbilityAttachModifierToAbilityStateMixin : BaseAbilityMixin { public AttachModifierToAbilityStateMixin config; public AbilityAttachModifierToAbilityStateMixin(ActorAbility instancedAbility, ActorModifier instancedModifier, ConfigAbilityMixin config) : base(instancedAbility, instancedModifier, config) { this.config = (AttachModifierToAbilityStateMixin)config; } public override void OnAdded() { BaseAbilityActor baseAbilityActor = actor; baseAbilityActor.onAbilityStateAdd = (Action)Delegate.Combine(baseAbilityActor.onAbilityStateAdd, new Action(OnAbilityStateAdd)); BaseAbilityActor baseAbilityActor2 = actor; baseAbilityActor2.onAbilityStateRemove = (Action)Delegate.Combine(baseAbilityActor2.onAbilityStateRemove, new Action(OnAbilityStateRemove)); bool flag = IsTargetState(actor.abilityState); if (flag && config.OnModifierName != null) { actor.abilityPlugin.ApplyModifier(instancedAbility, config.OnModifierName); } if (!flag && config.OffModifierName != null) { actor.abilityPlugin.ApplyModifier(instancedAbility, config.OffModifierName); } } public override void OnRemoved() { BaseAbilityActor baseAbilityActor = actor; baseAbilityActor.onAbilityStateAdd = (Action)Delegate.Remove(baseAbilityActor.onAbilityStateAdd, new Action(OnAbilityStateAdd)); BaseAbilityActor baseAbilityActor2 = actor; baseAbilityActor2.onAbilityStateRemove = (Action)Delegate.Remove(baseAbilityActor2.onAbilityStateRemove, new Action(OnAbilityStateRemove)); if (config.OnModifierName != null) { actor.abilityPlugin.TryRemoveModifier(instancedAbility, config.OnModifierName); } if (config.OffModifierName != null) { actor.abilityPlugin.TryRemoveModifier(instancedAbility, config.OffModifierName); } } private void OnAbilityStateAdd(AbilityState state, bool muteDisplayEffect) { bool flag = IsTargetState(state); if (flag && config.OnModifierName != null) { actor.abilityPlugin.ApplyModifier(instancedAbility, config.OnModifierName); } if (flag && config.OffModifierName != null) { actor.abilityPlugin.TryRemoveModifier(instancedAbility, config.OffModifierName); } } private void OnAbilityStateRemove(AbilityState state) { bool flag = IsTargetState(state); if (flag && config.OnModifierName != null) { actor.abilityPlugin.TryRemoveModifier(instancedAbility, config.OnModifierName); } if (flag && config.OffModifierName != null) { actor.abilityPlugin.ApplyModifier(instancedAbility, config.OffModifierName); } } private bool IsTargetState(AbilityState target) { for (int i = 0; i < config.AbilityStates.Length; i++) { if (target.ContainsState(config.AbilityStates[i])) { return true; } } return false; } } }