protected virtual void PerformAbility(AbilityCastData castData) { if (castData.AbilityCast.Methods.CastOriginTiming == AbilityCastOriginTiming.PerformEntrance) { castData.FillOrigin(DetermineCastOrigin(castData.AbilityCast)); } OnPerformAbility.Invoke(master, castData); castData.OnResultEmitted.Subscribe(OnCastDataEmitResult); AbilityPerformer.PerformAbility(castData); OnAbilityPerformed.Invoke(master, castData); }
protected void CastAbility(IAbilityContainer container, Vector3 castDirection, int multiCastID) { if (container.ContainsAbility == false) { return; } AbilityData ability = container.Ability; AbilityCastData castData = new AbilityCastData(master, container, -1, multiCastID); _activeCastData = castData; castData.FillBase( ComputeResourcesImpacts(container), ability.Main.BaseKnockback * (HasStats ? Stats.EvaluateAbilitiesStat(EntityAbilitiesStat.KnockbackInflictedFactor, 1f) : 1f), ability.Main.BaseRecoil / container.AbilityTriggerData.MultiCastCount); if (castDirection.sqrMagnitude <= Mathf.Epsilon) { castData.FillCastDirection(DetermineCastDirection(castData.AbilityCast, container.AbilityTriggerData)); } else { castData.FillCastDirection(castDirection); } if (castData.AbilityCast.Methods.CastOriginTiming == AbilityCastOriginTiming.CastEntrance) { castData.FillOrigin(DetermineCastOrigin(castData.AbilityCast)); } if (castData.AbilityCast.Timing.Instant == true) { PerformAbility(castData); _activeCastData = null; _abilityCastTimingsCoroutine = null; } else { master.RestartCoroutine(CastAbilityTimingCoroutine(castData), ref _abilityCastTimingsCoroutine); } }