using System; using System.Collections.Generic; using System.Diagnostics; using FullInspector; using MoleMole.Config; using UniRx; using UnityEngine; namespace MoleMole { public class ActorAbilityPlugin : BaseActorPlugin { public enum OnKillBehavior { RemoveAll = 0, DoNotRemoveUntilDestroyed = 1, RemoveAllDebuffsAndDurationed = 2 } public delegate bool AbilityPredicateHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt); private static ConfigEntityAttackProperty _attackProperty = new ConfigEntityAttackProperty(); private static Dictionary EMPTY_OVERRIDE_MAP = new Dictionary(); protected BaseAbilityActor _owner; protected LevelActor _levelActor; [ShowInInspector] [InspectorCollapsedFoldout] protected List _appliedAbilities; [InspectorCollapsedFoldout] [ShowInInspector] protected List _appliedModifiers; private List _deadModifiers; private Dictionary> _displayValueMap; private Dictionary> _dynamicValueMap; private List> _modifierDurationTimers; private List> _modifierThinkTimers; private List _additionalAbilities; private bool _isKilled; private bool _isMuted; private bool _waitForStageReady; public OnKillBehavior onKillBehavior; public bool muteEvents; public bool IsImmuneDebuff; protected ActorAbilityPlugin(BaseAbilityActor abilityActor) { _owner = abilityActor; _appliedAbilities = new List(); _appliedModifiers = new List(); _deadModifiers = new List(); _displayValueMap = new Dictionary>(); _dynamicValueMap = new Dictionary>(); _modifierDurationTimers = new List>(); _modifierThinkTimers = new List>(); _additionalAbilities = new List(); _levelActor = Singleton.Instance.levelActor; } public void FireEffectHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { FireEffect fireEffect = (FireEffect)actionConfig; if (fireEffect.OwnedByLevel) { Singleton.Instance.levelActor.entity.FireEffect(fireEffect.EffectPattern, target.entity.XZPosition, target.entity.transform.forward); } else if (target.entity != null && target.entity.gameObject.activeSelf) { target.entity.FireEffect(fireEffect.EffectPattern); } } public void FireEffectToTargetHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { FireEffectToTarget fireEffectToTarget = (FireEffectToTarget)actionConfig; if (instancedAbility.caster.entity != null && target.entity != null) { if (fireEffectToTarget.Reverse) { target.entity.FireEffectTo(fireEffectToTarget.EffectPattern, instancedAbility.caster.entity); } else { instancedAbility.caster.entity.FireEffectTo(fireEffectToTarget.EffectPattern, target.entity); } } } public void ApplyModifierHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ApplyModifier applyModifier = (ApplyModifier)actionConfig; if (evt is EvtEvadeSuccess) { instancedAbility.CurrentTriggerEvent = evt; } target.abilityPlugin.ApplyModifier(instancedAbility, applyModifier.ModifierName); } public void RemoveModifierHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { RemoveModifier removeModifier = (RemoveModifier)actionConfig; target.abilityPlugin.TryRemoveModifier(instancedAbility, removeModifier.ModifierName); } public void RemoveUniqueModifierHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { RemoveUniqueModifier removeUniqueModifier = (RemoveUniqueModifier)actionConfig; ActorModifier firstUniqueModifier = target.abilityPlugin.GetFirstUniqueModifier(removeUniqueModifier.ModifierName); if (firstUniqueModifier != null) { target.abilityPlugin.TryRemoveModifier(firstUniqueModifier); } } public void AttachModifierHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { AttachModifier attachModifier = (AttachModifier)actionConfig; ActorModifier actorModifier = target.abilityPlugin.ApplyModifier(instancedAbility, attachModifier.ModifierName); if (actorModifier != null) { if (instancedModifier != null) { instancedModifier.AttachModifier(actorModifier); } else { instancedAbility.AttachModifier(actorModifier); } } } public void AttachEffectHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { AttachEffect attachEffect = (AttachEffect)actionConfig; int patternIx = target.entity.AttachEffect(attachEffect.EffectPattern); if (instancedModifier != null) { instancedModifier.AttachEffectPatternIndex(patternIx); } else { instancedAbility.AttachEffectPatternIndex(patternIx); } } public void AttachShaderHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { AttachShader attachShader = (AttachShader)actionConfig; float enableDuration = ((!attachShader.UsePrefabEnableDurtion) ? instancedAbility.Evaluate(attachShader.Duration) : (-1f)); target.entity.SetShaderDataLerp(attachShader.ShaderType, true, enableDuration, -1f, attachShader.UseNewTexture); } public void DetachShaderHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { DetachShader detachShader = (DetachShader)actionConfig; float disableDuration = ((!detachShader.UsePrefabDisableDurtion) ? detachShader.Duration : (-1f)); target.entity.SetShaderDataLerp(detachShader.ShaderType, false, -1f, disableDuration); } public void AttachAnimEventPredicateHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { AttachAnimEventPredicate attachAnimEventPredicate = (AttachAnimEventPredicate)actionConfig; target.entity.AddAnimEventPredicate(attachAnimEventPredicate.AnimEventPredicate); if (instancedModifier != null) { instancedModifier.AttachAnimEventPredicate(target.entity, attachAnimEventPredicate.AnimEventPredicate); } else { instancedAbility.AttachAnimEventPredicate(target.entity, attachAnimEventPredicate.AnimEventPredicate); } } public void DetachAnimEventPredicateHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { DetachAnimEventPredicate detachAnimEventPredicate = (DetachAnimEventPredicate)actionConfig; target.entity.RemoveAnimEventPredicate(detachAnimEventPredicate.AnimEventPredicate); if (instancedModifier != null) { instancedModifier.DetachAnimEventPredicate(target.entity, detachAnimEventPredicate.AnimEventPredicate); } else { instancedAbility.DetachAnimEventPredicate(target.entity, detachAnimEventPredicate.AnimEventPredicate); } } public void HealHPHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { HealHP healHP = (HealHP)actionConfig; float num = 0f; if (healHP.Amount != null) { num += instancedAbility.Evaluate(healHP.Amount); } if (healHP.AmountByCasterMaxHPRatio != null) { num += (float)instancedAbility.caster.maxHP * instancedAbility.Evaluate(healHP.AmountByCasterMaxHPRatio); } if (healHP.AmountByTargetMaxHPRatio != null) { num += (float)target.maxHP * instancedAbility.Evaluate(healHP.AmountByTargetMaxHPRatio); } if ((bool)target.isAlive || (target.abilityState & AbilityState.Limbo) != AbilityState.None) { target.HealHP(num * healHP.HealRatio); if (!healHP.MuteHealEffect && num > 0f && target != null && target.entity.gameObject.activeSelf) { target.entity.FireEffect("Ability_HealHP"); } } } public void HealSPHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { HealSP healSP = (HealSP)actionConfig; if ((bool)target.isAlive || (target.abilityState & AbilityState.Limbo) != AbilityState.None) { float num = instancedAbility.Evaluate(healSP.Amount); target.HealSP(num); if (!healSP.MuteHealEffect && num > 0f && target != null && target.entity.gameObject.activeSelf) { target.entity.FireEffect("Ability_HealSP"); } } } public void MuteAdditiveVelocityHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { MuteAdditiveVelocity muteAdditiveVelocity = (MuteAdditiveVelocity)actionConfig; if (target != null && (bool)target.isAlive) { BaseMonoAnimatorEntity baseMonoAnimatorEntity = target.entity as BaseMonoAnimatorEntity; if (baseMonoAnimatorEntity != null) { baseMonoAnimatorEntity.MuteAdditiveVelocity = muteAdditiveVelocity.Mute; } } } public void CameraShakeHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ActCameraShake actCameraShake = (ActCameraShake)actionConfig; if (Singleton.Instance.IsLocalAvatar(target.runtimeID)) { AttackPattern.ActCameraShake(actCameraShake.CameraShake); } } public void CameraExposureHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ActCameraExposure actCameraExposure = (ActCameraExposure)actionConfig; MonoMainCamera mainCamera = Singleton.Instance.GetMainCamera(); if (mainCamera != null) { mainCamera.ActExposureEffect(actCameraExposure.ExposureTime, actCameraExposure.KeepTime, actCameraExposure.RecoverTime, actCameraExposure.MaxExposure); } } public void CameraGlareHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ActCameraGlare actCameraGlare = (ActCameraGlare)actionConfig; MonoMainCamera mainCamera = Singleton.Instance.GetMainCamera(); if (mainCamera != null) { mainCamera.ActGlareEffect(actCameraGlare.GlareTime, actCameraGlare.KeepTime, actCameraGlare.RecoverTime, actCameraGlare.TargetRate); } } public void CameraActionHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { DoCameraAction doCameraAction = (DoCameraAction)actionConfig; if (Singleton.Instance.IsLocalAvatar(target.runtimeID)) { BaseMonoAvatar avatarByRuntimeID = Singleton.Instance.GetAvatarByRuntimeID(target.runtimeID); avatarByRuntimeID.DoCameraAction(doCameraAction.CameraAction); } } public void ShowLevelDisplayTextHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ShowLevelDisplayText showLevelDisplayText = (ShowLevelDisplayText)actionConfig; string text = LocalizationGeneralLogic.GetText(showLevelDisplayText.Text); Singleton.Instance.FireNotify(new Notify(NotifyTypes.ShowLevelDisplayText, text)); } public void SetAIParamHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { SetAIParam setAIParam = (SetAIParam)actionConfig; switch (setAIParam.LogicType) { case ParamLogicType.Replace: if (target.entity is BaseMonoMonster) { BaseMonoMonster baseMonoMonster2 = target.entity as BaseMonoMonster; if (baseMonoMonster2.IsAIControllerActive()) { ((BTreeMonsterAIController)(target.entity as BaseMonoMonster).GetActiveAIController()).SetBehaviorVariable(instancedAbility.Evaluate(setAIParam.Param), setAIParam.Value); } } break; case ParamLogicType.Add: if (target.entity is BaseMonoMonster) { BaseMonoMonster baseMonoMonster = target.entity as BaseMonoMonster; if (baseMonoMonster.IsAIControllerActive()) { ((BTreeMonsterAIController)(target.entity as BaseMonoMonster).GetActiveAIController()).AddBehaviorVariableFloat(instancedAbility.Evaluate(setAIParam.Param), setAIParam.Value); } } break; } } public void SetAIParamBoolHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { SetAIParamBool setAIParamBool = (SetAIParamBool)actionConfig; if (target.entity is BaseMonoMonster) { BaseMonoMonster baseMonoMonster = target.entity as BaseMonoMonster; if (baseMonoMonster.IsAIControllerActive()) { ((BTreeMonsterAIController)(target.entity as BaseMonoMonster).GetActiveAIController()).SetBehaviorVariable(instancedAbility.Evaluate(setAIParamBool.Param), setAIParamBool.Value); } } } public void SetAIParamStringHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { SetAIParamString setAIParamString = (SetAIParamString)actionConfig; if (target.entity is BaseMonoMonster) { BaseMonoMonster baseMonoMonster = target.entity as BaseMonoMonster; if (baseMonoMonster.IsAIControllerActive()) { ((BTreeMonsterAIController)(target.entity as BaseMonoMonster).GetActiveAIController()).SetBehaviorVariable(instancedAbility.Evaluate(setAIParamString.Param), instancedAbility.Evaluate(setAIParamString.Value)); } } } public void TimeSlowHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ActTimeSlow actTimeSlow = (ActTimeSlow)actionConfig; ConfigTimeSlow timeSlow = actTimeSlow.TimeSlow; Singleton.Instance.levelActor.TimeSlow(timeSlow.Duration, timeSlow.SlowRatio, null); } public void ReplaceAttackEffectHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ReplaceAttackEffect replaceAttackEffect = (ReplaceAttackEffect)actionConfig; EvtBeingHit evtBeingHit = evt as EvtBeingHit; if (replaceAttackEffect.AttackEffect != null) { evtBeingHit.attackData.attackEffectPattern = replaceAttackEffect.AttackEffect; } if (replaceAttackEffect.BeHitEffect != null) { evtBeingHit.attackData.beHitEffectPattern = replaceAttackEffect.BeHitEffect; } } public void ReplaceAttackDataHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ReplaceAttackData replaceAttackData = (ReplaceAttackData)actionConfig; EvtBeingHit evtBeingHit = evt as EvtBeingHit; if (replaceAttackData.ReplaceFrameHalt) { evtBeingHit.attackData.frameHalt = replaceAttackData.FrameHalt; } if (replaceAttackData.ReplaceAttackerAniDamageRatio) { evtBeingHit.attackData.attackerAniDamageRatio = replaceAttackData.AttackerAniDamageRatio; } if (replaceAttackData.AddAttackeeAniDefenceRatio != 0f) { evtBeingHit.attackData.attackeeAniDefenceRatio += replaceAttackData.AddAttackeeAniDefenceRatio; } } protected float _Internal_CalculateApplyLevelBuffDuration(ApplyLevelBuff config, ActorAbility instancedAbility, BaseEvent evt) { float num = instancedAbility.Evaluate(config.Duration); switch (config.LevelBuffSpecial) { case LevelBuffSpecial.WitchTimeDurationScaledByEvadedAttack: if (evt is EvtEvadeSuccess) { EvtEvadeSuccess evtEvadeSuccess = (EvtEvadeSuccess)evt; BaseAbilityActor actor = Singleton.Instance.GetActor(evtEvadeSuccess.attackerID); if (actor == null) { break; } if (actor is MonsterActor) { ConfigMonsterAnimEvent configMonsterAnimEvent = SharedAnimEventData.ResolveAnimEvent((actor as MonsterActor).config, evtEvadeSuccess.skillID); if (configMonsterAnimEvent != null) { num *= configMonsterAnimEvent.AttackProperty.WitchTimeRatio; } } else if (actor is PropObjectActor) { ConfigEntityAnimEvent configEntityAnimEvent = SharedAnimEventData.ResolveAnimEvent((actor as PropObjectActor).config, evtEvadeSuccess.skillID); if (configEntityAnimEvent != null) { num *= configEntityAnimEvent.AttackProperty.WitchTimeRatio; } } } else { if (!(evt is EvtDefendSuccess)) { break; } EvtDefendSuccess evtDefendSuccess = (EvtDefendSuccess)evt; MonsterActor actor2 = Singleton.Instance.GetActor(evtDefendSuccess.attackerID); if (actor2 != null) { ConfigMonsterAnimEvent configMonsterAnimEvent2 = SharedAnimEventData.ResolveAnimEvent(actor2.config, evtDefendSuccess.skillID); if (configMonsterAnimEvent2 != null) { num *= configMonsterAnimEvent2.AttackProperty.WitchTimeRatio; } } } break; case LevelBuffSpecial.InfiniteDuration: num = 999999f; break; } return num; } public void ApplyLevelBuffHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ApplyLevelBuff applyLevelBuff = (ApplyLevelBuff)actionConfig; LevelActor levelActor = Singleton.Instance.levelActor; bool flag = true; if (_levelActor.IsLevelBuffActive(applyLevelBuff.LevelBuff)) { flag = false; } float duration = _Internal_CalculateApplyLevelBuffDuration(applyLevelBuff, instancedAbility, evt); uint runtimeID = instancedAbility.caster.runtimeID; LevelBuffSide side = ((!applyLevelBuff.UseOverrideCurSide) ? CalculateLevelBuffSide(runtimeID) : applyLevelBuff.OverrideCurSide); switch (applyLevelBuff.LevelBuff) { case LevelBuffType.WitchTime: { Singleton.Instance.levelActor.StartLevelBuff(levelActor.witchTimeLevelBuff, duration, applyLevelBuff.LevelBuffAllowRefresh, applyLevelBuff.EnteringTimeSlow, side, runtimeID, applyLevelBuff.NotStartEffect); BaseLevelBuff baseLevelBuff = levelActor.witchTimeLevelBuff; break; } case LevelBuffType.StopWorld: { Singleton.Instance.levelActor.StartLevelBuff(levelActor.stopWorldLevelBuff, duration, applyLevelBuff.LevelBuffAllowRefresh, applyLevelBuff.EnteringTimeSlow, side, runtimeID, applyLevelBuff.NotStartEffect); BaseLevelBuff baseLevelBuff = levelActor.stopWorldLevelBuff; break; } default: { BaseLevelBuff baseLevelBuff = null; break; } } if (!flag) { return; } List list = new List(); for (int i = 0; i < applyLevelBuff.AttachModifiers.Length; i++) { AttachModifier attachModifier = applyLevelBuff.AttachModifiers[i]; BaseAbilityActor outTarget; BaseAbilityActor[] outTargetLs; bool needHandleTargetOnNull; ResolveTarget(attachModifier.Target, attachModifier.TargetOption, instancedAbility, target, out outTarget, out outTargetLs, out needHandleTargetOnNull); if (outTarget != null || needHandleTargetOnNull) { ActorModifier actorModifier = outTarget.abilityPlugin.ApplyModifier(instancedAbility, attachModifier.ModifierName); if (actorModifier != null) { list.Add(actorModifier); } } else { if (outTargetLs == null) { continue; } for (int j = 0; j < outTargetLs.Length; j++) { if (outTargetLs[j] != null) { ActorModifier actorModifier2 = outTargetLs[j].abilityPlugin.ApplyModifier(instancedAbility, attachModifier.ModifierName); if (actorModifier2 != null) { list.Add(actorModifier2); } } } } } for (int k = 0; k < list.Count; k++) { _levelActor.GetPlugin().AddLevelBuffModifier(applyLevelBuff.LevelBuff, list[k]); } if (applyLevelBuff.AttachLevelEffectPattern != null) { _levelActor.GetPlugin().AttachLevelBuffEffect(applyLevelBuff.LevelBuff, applyLevelBuff.AttachLevelEffectPattern); } } public void StopTargetLevelBuffHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { StopTargetLevelBuff stopTargetLevelBuff = (StopTargetLevelBuff)actionConfig; if (!_levelActor.IsLevelBuffActive(stopTargetLevelBuff.LevelBuff)) { return; } LevelBuffSide levelBuffSide = CalculateLevelBuffSide(instancedAbility.caster.runtimeID); if (stopTargetLevelBuff.LevelBuff == LevelBuffType.WitchTime) { LevelBuffWitchTime witchTimeLevelBuff = _levelActor.witchTimeLevelBuff; if ((!stopTargetLevelBuff.stopOtherSide) ? (levelBuffSide == witchTimeLevelBuff.levelBuffSide) : (levelBuffSide != witchTimeLevelBuff.levelBuffSide)) { _levelActor.StopLevelBuff(witchTimeLevelBuff); } } else if (stopTargetLevelBuff.LevelBuff == LevelBuffType.StopWorld) { LevelBuffStopWorld stopWorldLevelBuff = _levelActor.stopWorldLevelBuff; if ((!stopTargetLevelBuff.stopOtherSide) ? (levelBuffSide == stopWorldLevelBuff.levelBuffSide) : (levelBuffSide != stopWorldLevelBuff.levelBuffSide)) { _levelActor.StopLevelBuff(stopWorldLevelBuff); } } } public void RefreshTargetLevelBuffHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { RefreshTargetLevelBuff refreshTargetLevelBuff = (RefreshTargetLevelBuff)actionConfig; LevelActor levelActor = Singleton.Instance.levelActor; if (_levelActor.IsLevelBuffActive(refreshTargetLevelBuff.LevelBuff) && refreshTargetLevelBuff.LevelBuff == LevelBuffType.WitchTime) { levelActor.witchTimeLevelBuff.ApplyWitchTimeSlowedBySideWithRuntimeID(target.runtimeID); } } public void AttachMaterialGroupHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { AttachMaterialGroup attachMaterialGroup = (AttachMaterialGroup)actionConfig; target.entity.PushMaterialGroup(attachMaterialGroup.MaterialGroupName); if (instancedModifier != null) { instancedModifier.AttachPushMaterialGroup(target.entity); } else { instancedAbility.AttachPushMaterialGroup(target.entity); } } public void PredicateByTargetDistanceHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { PredicateByTargetDistance predicateByTargetDistance = (PredicateByTargetDistance)actionConfig; BaseActor caster = instancedAbility.caster; if (caster != null) { if (target == null || predicateByTargetDistance.Distance < 0f || (target.gameObject.transform.position - caster.gameObject.transform.position).magnitude < predicateByTargetDistance.Distance) { HandleActionTargetDispatch(predicateByTargetDistance.InActions, instancedAbility, instancedModifier, target, evt); } else { HandleActionTargetDispatch(predicateByTargetDistance.OutActions, instancedAbility, instancedModifier, target, evt); } } } public void PredicateByHitTypeHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { PredicateByHitType predicateByHitType = (PredicateByHitType)actionConfig; EvtBeingHit evtBeingHit = evt as EvtBeingHit; if (evtBeingHit != null) { if (evtBeingHit.attackData.hitType == AttackResult.ActorHitType.Melee) { HandleActionTargetDispatch(predicateByHitType.MeleeActions, instancedAbility, instancedModifier, target, evt); } else if (evtBeingHit.attackData.hitType == AttackResult.ActorHitType.Ranged) { HandleActionTargetDispatch(predicateByHitType.RangeActions, instancedAbility, instancedModifier, target, evt); } } } public void SpawnPropObjectHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { SpawnPropObject spawnPropObject = (SpawnPropObject)actionConfig; if (target.entity != null) { uint runtimeID = Singleton.Instance.CreatePropObject(_owner.runtimeID, spawnPropObject.PropObjectName, 0f, target.attack, (!spawnPropObject.FollowRootNode) ? target.entity.XZPosition : target.entity.GetAttachPoint("RootNode").position, target.entity.transform.forward); PropObjectActor actor = Singleton.Instance.GetActor(runtimeID); if (spawnPropObject.ModifierName != null) { actor.abilityPlugin.ApplyModifier(instancedAbility, spawnPropObject.ModifierName); } } } public void ShootPalsyBombHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ShootPalsyBomb shootPalsyBomb = (ShootPalsyBomb)actionConfig; DamageModelLogic.CreateAttackDataFromAttackerAnimEvent(Singleton.Instance.GetActor(instancedAbility.caster.runtimeID), shootPalsyBomb.BombAttackID); uint runtimeID = Singleton.Instance.CreatePropObject("Spawn01", instancedAbility.Evaluate(shootPalsyBomb.PropName)); MonoPalsyBombProp monoPalsyBombProp = (MonoPalsyBombProp)Singleton.Instance.GetPropObjectByRuntimeID(runtimeID); Transform attachPoint = instancedAbility.caster.entity.GetAttachPoint(shootPalsyBomb.AttachPoint); Vector3 vector = Vector3.RotateTowards(instancedAbility.caster.entity.transform.forward, Vector3.up, (float)Math.PI / 3f, 0f); monoPalsyBombProp.StartParabolaBorn(bornVelocity: new Vector3(vector.x * shootPalsyBomb.BombSpeed, vector.y * 10f, vector.z * shootPalsyBomb.BombSpeed), bornPosition: attachPoint.position, bornAcceleration: new Vector3(0f, -20f, 0f)); } public void CreateUnitFieldHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { CreateUnitField createUnitField = (CreateUnitField)actionConfig; string propName = "Trap_Slow"; Vector3 xZPosition = instancedAbility.caster.entity.XZPosition; uint runtimeID = Singleton.Instance.CreatePropObject(562036737u, propName, 1f, 1f, xZPosition, instancedAbility.caster.entity.transform.forward); MonoTriggerUnitFieldProp monoTriggerUnitFieldProp = (MonoTriggerUnitFieldProp)Singleton.Instance.GetPropObjectByRuntimeID(runtimeID); monoTriggerUnitFieldProp.InitUnitFieldPropRange(createUnitField.numberX, createUnitField.numberZ); monoTriggerUnitFieldProp.EnableProp(); } public void AttachMaskAnimEventIDsHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { AttachMaskAnimEventIDs attachMaskAnimEventIDs = (AttachMaskAnimEventIDs)actionConfig; BaseActorActionContext baseActorActionContext = ((instancedModifier == null) ? ((BaseActorActionContext)instancedAbility) : ((BaseActorActionContext)instancedModifier)); for (int i = 0; i < attachMaskAnimEventIDs.AnimEventIDs.Length; i++) { string text = attachMaskAnimEventIDs.AnimEventIDs[i]; target.entity.MaskAnimEvent(text); baseActorActionContext.AttachMaskedAnimEventID(target.entity, text); } } public void RandomedHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { Randomed randomed = (Randomed)actionConfig; float value = UnityEngine.Random.value; float num = instancedAbility.Evaluate(randomed.Chance); bool flag = value < num; if (value < num) { HandleActionTargetDispatch(randomed.SuccessActions, instancedAbility, instancedModifier, target, evt); } else { HandleActionTargetDispatch(randomed.FailActions, instancedAbility, instancedModifier, target, evt); } } public void PredicatedHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { Predicated predicated = (Predicated)actionConfig; if (EvaluateAbilityPredicate(predicated.TargetPredicates, instancedAbility, instancedModifier, target, evt)) { HandleActionTargetDispatch(predicated.SuccessActions, instancedAbility, instancedModifier, target, evt); } else { HandleActionTargetDispatch(predicated.FailActions, instancedAbility, instancedModifier, target, evt); } } public void RetargetedHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { Retargeted retargeted = (Retargeted)actionConfig; BaseAbilityActor outTarget; BaseAbilityActor[] outTargetLs; bool needHandleTargetOnNull; ResolveTarget(retargeted.Retarget, retargeted.RetargetOption, instancedAbility, target, out outTarget, out outTargetLs, out needHandleTargetOnNull); if (outTarget != null || needHandleTargetOnNull) { HandleActionTargetDispatch(retargeted.RetargetedActions, instancedAbility, instancedModifier, outTarget, evt); } else { if (outTargetLs == null || outTargetLs.Length <= 0) { return; } if (retargeted.RandomedTarget) { int num = UnityEngine.Random.Range(0, outTargetLs.Length); if (outTargetLs[num] != null) { HandleActionTargetDispatch(retargeted.RetargetedActions, instancedAbility, instancedModifier, outTargetLs[num], evt); } return; } for (int i = 0; i < outTargetLs.Length; i++) { if (outTargetLs[i] != null && (!retargeted.IgnoreSelf || outTargetLs[i] != instancedAbility.caster)) { HandleActionTargetDispatch(retargeted.RetargetedActions, instancedAbility, instancedModifier, outTargetLs[i], evt); } } } } public void PredicateByTargetClassHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { PredicateByTargetClass config = (PredicateByTargetClass)actionConfig; for (int i = 0; i < config.Actions.Length; i++) { HandleActionTargetDispatch(config.Actions[i], instancedAbility, instancedModifier, target, evt, (BaseAbilityActor actionTarget) => actionTarget != null && actionTarget.commonConfig.CommonArguments.Class == config.EntityClass); } } public void PredicateByTargetNatureHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { PredicateByTargetNature config = (PredicateByTargetNature)actionConfig; for (int i = 0; i < config.Actions.Length; i++) { HandleActionTargetDispatch(config.Actions[i], instancedAbility, instancedModifier, target, evt, (BaseAbilityActor actionTarget) => actionTarget != null && actionTarget.commonConfig.CommonArguments.Nature == config.EntityNature); } } public void PredicateBySpecialHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { PredicateBySpecial predicateBySpecial = (PredicateBySpecial)actionConfig; List allPlayerAvatars = Singleton.Instance.GetAllPlayerAvatars(); switch (predicateBySpecial.Special) { case PredicateBySpecial.SpecialType.IsEveryAvatarHasDifferenctClass: { bool flag3 = true; for (int m = 0; m < allPlayerAvatars.Count; m++) { for (int n = 0; n < allPlayerAvatars.Count; n++) { if (m != n && allPlayerAvatars[m].config.CommonArguments.Class == allPlayerAvatars[n].config.CommonArguments.Class) { flag3 = false; } } } if (flag3) { HandleActionTargetDispatch(predicateBySpecial.Actions, instancedAbility, instancedModifier, target, evt); } break; } case PredicateBySpecial.SpecialType.IsEveryAvatarHasDifferenctRoleName: { bool flag4 = true; for (int num = 0; num < allPlayerAvatars.Count; num++) { for (int num2 = 0; num2 < allPlayerAvatars.Count; num2++) { if (num != num2 && allPlayerAvatars[num].config.CommonArguments.RoleName == allPlayerAvatars[num2].config.CommonArguments.RoleName) { flag4 = false; } } } if (flag4) { HandleActionTargetDispatch(predicateBySpecial.Actions, instancedAbility, instancedModifier, target, evt); } break; } case PredicateBySpecial.SpecialType.IsEveryAvatarHasDifferenctNature: { bool flag2 = true; for (int k = 0; k < allPlayerAvatars.Count; k++) { for (int l = 0; l < allPlayerAvatars.Count; l++) { if (k != l && allPlayerAvatars[k].config.CommonArguments.Nature == allPlayerAvatars[l].config.CommonArguments.Nature) { flag2 = false; } } } if (flag2) { HandleActionTargetDispatch(predicateBySpecial.Actions, instancedAbility, instancedModifier, target, evt); } break; } case PredicateBySpecial.SpecialType.IsEveryAvatarHasSameNature: { bool flag = true; for (int i = 0; i < allPlayerAvatars.Count; i++) { for (int j = 0; j < allPlayerAvatars.Count; j++) { if (allPlayerAvatars[i].config.CommonArguments.Nature != predicateBySpecial.SameNature) { flag = false; } } } if (flag) { HandleActionTargetDispatch(predicateBySpecial.Actions, instancedAbility, instancedModifier, target, evt); } break; } } } public void PredicateByActorPresenceHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { PredicateByActorPresence predicateByActorPresence = (PredicateByActorPresence)actionConfig; List allPlayerAvatars = Singleton.Instance.GetAllPlayerAvatars(); bool flag = true; for (int i = 0; i < predicateByActorPresence.ActorNames.Length; i++) { bool flag2 = false; for (int j = 0; j < allPlayerAvatars.Count; j++) { if (predicateByActorPresence.ActorNames[i] == allPlayerAvatars[j].config.CommonArguments.RoleName) { flag2 = true; break; } } if (!flag2) { flag = false; break; } } if (flag) { HandleActionTargetDispatch(predicateByActorPresence.Actions, instancedAbility, instancedModifier, target, evt); } } public void ModifyPropertyHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ModifyProperty modifyProperty = (ModifyProperty)actionConfig; int num = instancedModifier.config.Properties.IndexOfKey(modifyProperty.Property); int stackIx = instancedModifier.stackIndices[num]; float propertyByStackIndex = target.GetPropertyByStackIndex(modifyProperty.Property, stackIx); float value = propertyByStackIndex + instancedAbility.Evaluate(modifyProperty.Delta); value = Mathf.Clamp(value, instancedAbility.Evaluate(modifyProperty.Min), instancedAbility.Evaluate(modifyProperty.Max)); target.SetPropertyByStackIndex(modifyProperty.Property, stackIx, value); } public void ResetPropertyHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ResetProperty resetProperty = (ResetProperty)actionConfig; int num = instancedModifier.config.Properties.IndexOfKey(resetProperty.Property); int stackIx = instancedModifier.stackIndices[num]; target.SetPropertyByStackIndex(resetProperty.Property, stackIx, instancedAbility.Evaluate(instancedModifier.config.Properties[resetProperty.Property])); } public void SetAnimatorBoolHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { SetAnimatorBool setAnimatorBool = (SetAnimatorBool)actionConfig; target.entity.SetPersistentAnimatorBool(setAnimatorBool.BoolID, setAnimatorBool.Value); } public void SetAnimatorIntHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { SetAnimatorInt setAnimatorInt = (SetAnimatorInt)actionConfig; target.entity.SetPersistentAnimatoInt(setAnimatorInt.IntID, setAnimatorInt.Value); } public void SetLocomotionRandomHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { SetLocomotionRandom setLocomotionRandom = (SetLocomotionRandom)actionConfig; (target.entity as BaseMonoAnimatorEntity).SetLocomotionRandom(instancedAbility.Evaluate(setLocomotionRandom.Range)); } public void SetLocomotionFloatHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { SetLocomotionFloat setLocomotionFloat = (SetLocomotionFloat)actionConfig; (target.entity as BaseMonoAnimatorEntity).SetLocomotionFloat(setLocomotionFloat.Param, setLocomotionFloat.Value); } public void DamageByAnimEventIDHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { DamageByAnimEventID damageByAnimEventID = (DamageByAnimEventID)actionConfig; BaseActor caster = instancedAbility.caster; AttackData attackData = DamageModelLogic.CreateAttackDataFromAttackerAnimEvent(caster, damageByAnimEventID.AnimEventID); bool forceSkipAttackerResolve = !caster.IsEntityExists(); AttackPattern.SendHitEvent(caster.runtimeID, target.runtimeID, damageByAnimEventID.AnimEventID, null, attackData, forceSkipAttackerResolve); } public void DamageByAttackPropertyHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { DamageByAttackProperty damageByAttackProperty = (DamageByAttackProperty)actionConfig; BaseActor caster = instancedAbility.caster; AttackData attackData = DamageModelLogic.CreateAttackDataFromAttackProperty(caster, damageByAttackProperty.AttackProperty, damageByAttackProperty.AttackEffect, damageByAttackProperty.CameraShake); attackData.hitType = AttackResult.ActorHitType.Ailment; bool forceSkipAttackerResolve = !caster.IsEntityExists(); AttackPattern.SendHitEvent(caster.runtimeID, target.runtimeID, null, null, attackData, forceSkipAttackerResolve); } public void ReflectDamageByAttackPropertyHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ReflectDamageByAttackProperty reflectDamageByAttackProperty = (ReflectDamageByAttackProperty)actionConfig; BaseActor caster = instancedAbility.caster; EvtBeingHit evtBeingHit = evt as EvtBeingHit; if (!evtBeingHit.GetAttackResult().rejected) { ConfigEntityAttackProperty attackProperty = reflectDamageByAttackProperty.AttackProperty; attackProperty.AddedDamageValue = evtBeingHit.GetAttackResult().GetTotalDamage() * instancedAbility.Evaluate(reflectDamageByAttackProperty.ReflectRatio); AttackData attackData = DamageModelLogic.CreateAttackDataFromAttackProperty(caster, reflectDamageByAttackProperty.AttackProperty, reflectDamageByAttackProperty.AttackEffect, reflectDamageByAttackProperty.CameraShake); attackData.hitType = AttackResult.ActorHitType.Ailment; bool forceSkipAttackerResolve = !caster.IsEntityExists(); AttackPattern.SendHitEvent(caster.runtimeID, target.runtimeID, null, null, attackData, forceSkipAttackerResolve); } } public void DamageByAttackValueHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { DamageByAttackValue damageByAttackValue = (DamageByAttackValue)actionConfig; BaseActor caster = instancedAbility.caster; _attackProperty.DamagePercentage = instancedAbility.Evaluate(damageByAttackValue.DamagePercentage); _attackProperty.AddedDamageValue = instancedAbility.Evaluate(damageByAttackValue.AddedDamageValue); _attackProperty.NormalDamage = instancedAbility.Evaluate(damageByAttackValue.PlainDamage); _attackProperty.NormalDamagePercentage = instancedAbility.Evaluate(damageByAttackValue.PlainDamagePercentage); _attackProperty.FireDamage = instancedAbility.Evaluate(damageByAttackValue.FireDamage); _attackProperty.FireDamagePercentage = instancedAbility.Evaluate(damageByAttackValue.FireDamagePercentage); _attackProperty.ThunderDamage = instancedAbility.Evaluate(damageByAttackValue.ThunderDamage); _attackProperty.ThunderDamagePercentage = instancedAbility.Evaluate(damageByAttackValue.ThunderDamagePercentage); _attackProperty.IceDamage = instancedAbility.Evaluate(damageByAttackValue.IceDamage); _attackProperty.IceDamagePercentage = instancedAbility.Evaluate(damageByAttackValue.IceDamagePercentage); _attackProperty.AlienDamage = instancedAbility.Evaluate(damageByAttackValue.AlienDamage); _attackProperty.AlienDamagePercentage = instancedAbility.Evaluate(damageByAttackValue.AlienDamagePercentage); _attackProperty.AniDamageRatio = instancedAbility.Evaluate(damageByAttackValue.AniDamageRatio); _attackProperty.FrameHalt = instancedAbility.Evaluate(damageByAttackValue.FrameHalt); _attackProperty.HitType = AttackResult.ActorHitType.Ailment; _attackProperty.HitEffect = damageByAttackValue.HitEffect; _attackProperty.RetreatVelocity = instancedAbility.Evaluate(damageByAttackValue.RetreatVelocity); _attackProperty.IsAnimEventAttack = damageByAttackValue.IsAnimEventAttack; _attackProperty.IsInComboCount = damageByAttackValue.IsInComboCount; AttackData attackData = DamageModelLogic.CreateAttackDataFromAttackProperty(caster, _attackProperty, damageByAttackValue.AttackEffect, damageByAttackValue.CameraShake); attackData.hitLevel = damageByAttackValue.HitLevel; bool forceSkipAttackerResolve = !caster.IsEntityExists(); AttackPattern.SendHitEvent(caster.runtimeID, target.runtimeID, null, null, attackData, forceSkipAttackerResolve); } public void PredicateByAnimEventIDHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { PredicateByAnimEventID predicateByAnimEventID = (PredicateByAnimEventID)actionConfig; string text = null; if (evt is EvtBeingHit) { EvtBeingHit evtBeingHit = (EvtBeingHit)evt; text = evtBeingHit.animEventID; } else if (evt is EvtHittingOther) { EvtHittingOther evtHittingOther = (EvtHittingOther)evt; text = evtHittingOther.animEventID; } else if (evt is EvtAttackLanded) { EvtAttackLanded evtAttackLanded = (EvtAttackLanded)evt; text = evtAttackLanded.animEventID; } if (text == null) { return; } for (int i = 0; i < predicateByAnimEventID.AnimEventIDs.Length; i++) { if (text == predicateByAnimEventID.AnimEventIDs[i]) { HandleActionTargetDispatch(predicateByAnimEventID.Actions, instancedAbility, instancedModifier, target, evt); break; } } } public void PredicateByParamHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { PredicateByParam predicateByParam = (PredicateByParam)actionConfig; if (instancedAbility.HasParam(predicateByParam.Param)) { HandleActionTargetDispatch(predicateByParam.Actions, instancedAbility, instancedModifier, target, evt); } } public void PredicateByParamNotZeroHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { PredicateByParamNotZero predicateByParamNotZero = (PredicateByParamNotZero)actionConfig; if (instancedAbility.GetFloatParam(predicateByParamNotZero.Param) != 0f) { HandleActionTargetDispatch(predicateByParamNotZero.Actions, instancedAbility, instancedModifier, target, evt); } } public void PredicateByHasEnemyAroundHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { PredicateByHasEnemyAround predicateByHasEnemyAround = (PredicateByHasEnemyAround)actionConfig; List list = CollisionDetectPattern.CircleCollisionDetectBySphere(_owner.entity.XZPosition + Vector3.up, 0f, _owner.entity.transform.forward, instancedAbility.Evaluate(predicateByHasEnemyAround.Range), Singleton.Instance.GetAbilityTargettingMask(_owner.runtimeID, MixinTargetting.Enemy)); if (list.Count > 0) { HandleActionTargetDispatch(predicateByHasEnemyAround.Actions, instancedAbility, instancedModifier, target, evt); } } public void TriggerAbilityHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { MoleMole.Config.TriggerAbility triggerAbility = (MoleMole.Config.TriggerAbility)actionConfig; EvtAbilityStart evtAbilityStart = new EvtAbilityStart(target.runtimeID, instancedAbility.CurrentTriggerEvent); evtAbilityStart.abilityID = triggerAbility.AbilityID; evtAbilityStart.abilityName = triggerAbility.AbilityName; evtAbilityStart.otherID = GetOtherID(evt); evtAbilityStart.hitCollision = GetHitCollision(evt); evtAbilityStart.abilityArgument = triggerAbility.Argument; Singleton.Instance.FireEvent(evtAbilityStart); } public void ClearComboHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { LevelActor levelActor = Singleton.Instance.levelActor; levelActor.ResetCombo(); } public void AttachImmuneAbilityStateHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { AttachImmuneAbilityState attachImmuneAbilityState = (AttachImmuneAbilityState)actionConfig; if (attachImmuneAbilityState.ClearAppliedState && (target.abilityState & attachImmuneAbilityState.ImmuneState) != AbilityState.None) { target.RemoveAbilityState(attachImmuneAbilityState.ImmuneState); } target.SetAbilityStateImmune(attachImmuneAbilityState.ImmuneState, true); if (instancedModifier != null) { instancedModifier.AttachImmuneAbilityState(target, attachImmuneAbilityState.ImmuneState); } else { instancedAbility.AttachImmuneAbilityState(target, attachImmuneAbilityState.ImmuneState); } } public void AttachBuffDebufResistanceHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { if (target.IsEntityExists()) { BaseActorActionContext baseActorActionContext = ((instancedModifier == null) ? ((BaseActorActionContext)instancedAbility) : ((BaseActorActionContext)instancedModifier)); AttachBuffDebuffResistance resistance = (AttachBuffDebuffResistance)actionConfig; baseActorActionContext.AttachBuffDebuffResistance(target, resistance); } } public void DebugLogHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { } public void MissionTriggerAbilityActionHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { Singleton.Instance.TryToUpdateTriggerAbilityAction((uint)((MissionTriggerAbilityAction)actionConfig).FinishParaInt); } public void FireAudioHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { } public void AttachTintHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { AttachStageTint tintConfig = (AttachStageTint)actionConfig; BaseActorActionContext baseActorActionContext = ((instancedModifier == null) ? ((BaseActorActionContext)instancedAbility) : ((BaseActorActionContext)instancedModifier)); baseActorActionContext.AttachStageTint(tintConfig); } public void SetAnimatorTriggerHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { SetAnimatorTrigger setAnimatorTrigger = (SetAnimatorTrigger)actionConfig; target.entity.SetTrigger(setAnimatorTrigger.TriggerID); } public void ResetAnimatorTriggerHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ResetAnimatorTrigger resetAnimatorTrigger = (ResetAnimatorTrigger)actionConfig; target.entity.ResetTrigger(resetAnimatorTrigger.TriggerID); } public void CreateGoodsHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { CreateGoods createGoods = (CreateGoods)actionConfig; Singleton.Instance.CreateGood(562036737u, createGoods.GoodType, createGoods.GoodAbility, instancedAbility.Evaluate(createGoods.GoodArgument), target.entity.XZPosition, target.entity.transform.forward, true); } public void AttachDisableHitboxHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { if (target.IsEntityExists()) { BaseActorActionContext baseActorActionContext = ((instancedModifier == null) ? ((BaseActorActionContext)instancedAbility) : ((BaseActorActionContext)instancedModifier)); AttachIsGhost attachIsGhost = (AttachIsGhost)actionConfig; baseActorActionContext.AttachIsGhost(target.entity, attachIsGhost.IsGhost); } } public void AttachNoCollisionHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { if (target.IsEntityExists()) { BaseActorActionContext baseActorActionContext = ((instancedModifier == null) ? ((BaseActorActionContext)instancedAbility) : ((BaseActorActionContext)instancedModifier)); baseActorActionContext.AttachNoCollision(target.entity); } } public void AttachAllowSelectionHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { if (target.IsEntityExists()) { BaseActorActionContext baseActorActionContext = ((instancedModifier == null) ? ((BaseActorActionContext)instancedAbility) : ((BaseActorActionContext)instancedModifier)); AttachAllowSelection attachAllowSelection = (AttachAllowSelection)actionConfig; baseActorActionContext.AttachAllowSelected(target.entity, attachAllowSelection.AllowSelection); } } public void AttachOpacityHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { if (target.IsEntityExists()) { BaseActorActionContext baseActorActionContext = ((instancedModifier == null) ? ((BaseActorActionContext)instancedAbility) : ((BaseActorActionContext)instancedModifier)); AttachOpacity attachOpacity = (AttachOpacity)actionConfig; baseActorActionContext.AttachOpacity(target.entity, instancedAbility.Evaluate(attachOpacity.Opacity)); } } public void SetSelfAttackTargetHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { if (target.IsEntityExists() && _owner.IsEntityExists()) { SetSelfAttackTarget setSelfAttackTarget = (SetSelfAttackTarget)actionConfig; _owner.entity.SetAttackTarget(target.entity); if (setSelfAttackTarget.SteerToTargetImmediately) { Vector3 forward = target.entity.XZPosition - _owner.entity.XZPosition; _owner.entity.SteerFaceDirectionTo(forward); } } } public void SetAllowSwitchOther(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { if (target.IsEntityExists()) { BaseActorActionContext baseActorActionContext = ((instancedModifier == null) ? ((BaseActorActionContext)instancedAbility) : ((BaseActorActionContext)instancedModifier)); AttachAllowSwitchOther attachAllowSwitchOther = (AttachAllowSwitchOther)actionConfig; baseActorActionContext.AttachAllowSwitchOther(target.entity, attachAllowSwitchOther.AllowSwitchOther); } } public void SetMuteOtherQTE(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { if (target.IsEntityExists()) { BaseActorActionContext baseActorActionContext = ((instancedModifier == null) ? ((BaseActorActionContext)instancedAbility) : ((BaseActorActionContext)instancedModifier)); AttachMuteOtherQTE attachMuteOtherQTE = (AttachMuteOtherQTE)actionConfig; baseActorActionContext.AttachMuteOtherQTE(target.entity, attachMuteOtherQTE.MuteOtherQTE); } } public void AttachImmuneDebuffHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { AttachImmuneDebuff attachImmuneDebuff = (AttachImmuneDebuff)actionConfig; if (attachImmuneDebuff.ClearAppliedDebuff) { target.abilityPlugin.RemoveAllDebuffModifiers(); } target.SetImmuneDebuff(true); BaseActorActionContext baseActorActionContext = ((instancedModifier == null) ? ((BaseActorActionContext)instancedAbility) : ((BaseActorActionContext)instancedModifier)); baseActorActionContext.AttachImmuneDebuff(target); } public void AttachEffectOverrideHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { AttachEffectOverride attachEffectOverride = (AttachEffectOverride)actionConfig; target.entity.AddEffectOverride(attachEffectOverride.EffectOverrideKey, attachEffectOverride.EffectPattern); BaseActorActionContext baseActorActionContext = ((instancedModifier == null) ? ((BaseActorActionContext)instancedAbility) : ((BaseActorActionContext)instancedModifier)); baseActorActionContext.AttachEffectOverride(target.entity, attachEffectOverride.EffectOverrideKey); } public void AvatarSkillStartHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { AvatarSkillStart avatarSkillStart = (AvatarSkillStart)actionConfig; if (instancedAbility.caster is AvatarActor) { Singleton.Instance.FireEvent(new EvtSkillStart(target.runtimeID, avatarSkillStart.CDSkillID)); } } public void FireEventHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { FireEvent fireEvent = (FireEvent)actionConfig; EventCategory eventCategory = (EventCategory)(int)Enum.Parse(typeof(EventCategory), fireEvent.EvtCategory); if (eventCategory == EventCategory.EvtDefendStart) { Singleton.Instance.FireEvent(new EvtDefendStart(_owner.runtimeID)); } if (eventCategory == EventCategory.EvtDefendSuccess && evt != null && evt is EvtBeingHit) { EvtBeingHit evtBeingHit = evt as EvtBeingHit; Singleton.Instance.FireEvent(new EvtDefendSuccess(_owner.runtimeID, evtBeingHit.sourceID, evtBeingHit.animEventID)); } } public void TriggerAttackPatternHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { TriggerAttackPattern triggerAttackPattern = (TriggerAttackPattern)actionConfig; if (target.IsActive()) { if (triggerAttackPattern.IgnoreEvade) { target.entity.TriggerAttackPattern(triggerAttackPattern.AnimEventID, Singleton.Instance.GetAbilityTargettingMask(target.runtimeID, triggerAttackPattern.Targetting)); } else { target.entity.TriggerAttackPattern(triggerAttackPattern.AnimEventID, Singleton.Instance.GetAbilityHitboxTargettingMask(target.runtimeID, triggerAttackPattern.Targetting)); } } } public void TriggerAnimEventHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { TriggerAnimEvent triggerAnimEvent = (TriggerAnimEvent)actionConfig; if (target.IsActive()) { (target.entity as BaseMonoAnimatorEntity).AnimEventHandler(triggerAnimEvent.AnimEventID); } } public void ForceKillHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ForceKill forceKill = (ForceKill)actionConfig; if ((bool)target.isAlive) { target.ForceKill(_owner.runtimeID, forceKill.KillEffect); } } public void RestartMainAIHandler(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { if ((bool)target.isAlive && target.HasPlugin()) { target.GetPlugin().RestartMainAI(); } } protected LevelBuffSide CalculateLevelBuffSide(uint ownerID) { if (Singleton.Instance.ParseCategory(ownerID) == 3) { return LevelBuffSide.FromAvatar; } if (Singleton.Instance.ParseCategory(ownerID) == 4) { return LevelBuffSide.FromMonster; } return LevelBuffSide.FromLevel; } public bool ByTargetClassHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { return target != null && ((ByTargetEntityClass)predConfig).TargetClass == target.commonConfig.CommonArguments.Class; } public bool ByTargetNatureHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { return target != null && ((ByTargetEntityNature)predConfig).TargetNature == target.commonConfig.CommonArguments.Nature; } public bool ByTargetDistanceHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ByTargetDistance byTargetDistance = (ByTargetDistance)predConfig; if (target == null) { return false; } float magnitude = (target.entity.XZPosition - instancedAbility.caster.entity.XZPosition).magnitude; switch (byTargetDistance.Logic) { case MixinPredicate.Greater: case MixinPredicate.GreaterOrEqual: return magnitude > instancedAbility.Evaluate(byTargetDistance.Distance); case MixinPredicate.Lesser: return magnitude < instancedAbility.Evaluate(byTargetDistance.Distance); default: return false; } } public bool ByTargetInLevelAnimHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ByTargetInLevelAnim byTargetInLevelAnim = (ByTargetInLevelAnim)predConfig; if (target == null) { return false; } return target.isInLevelAnim == byTargetInLevelAnim.InLevelAnim; } public bool ByTargetAnimStateHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ByTargetAnimState byTargetAnimState = (ByTargetAnimState)predConfig; if (target == null) { return false; } bool result = false; if (byTargetAnimState.State == ByTargetAnimState.AnimState.Throw && target is MonsterActor) { return ((MonsterActor)target).monster.IsAnimatorInTag(MonsterData.MonsterTagGroup.Throw); } return result; } public bool ByAttackTargetAnimStateHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ByAttackTargetAnimState byAttackTargetAnimState = (ByAttackTargetAnimState)predConfig; if (target == null) { return false; } bool result = false; if (byAttackTargetAnimState.State == ByAttackTargetAnimState.AnimState.Throw) { AvatarActor avatarActor = target as AvatarActor; if (avatarActor != null && avatarActor.avatar != null && avatarActor.avatar.AttackTarget is BaseMonoMonster) { return ((BaseMonoMonster)avatarActor.avatar.AttackTarget).IsAnimatorInTag(MonsterData.MonsterTagGroup.Throw); } } return result; } public bool ByAttackCategoryTagHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ByAttackCategoryTag byAttackCategoryTag = (ByAttackCategoryTag)predConfig; if (target == null) { return false; } IEvtWithAttackResult evtWithAttackResult = evt as IEvtWithAttackResult; if (evtWithAttackResult == null) { return false; } AttackResult attackResult = evtWithAttackResult.GetAttackResult(); if (attackResult == null) { return false; } return attackResult.attackCategoryTag.ContainsTag(byAttackCategoryTag.CategoryTag); } public bool ByTargetWithinAbilityStateHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ByTargetWithinAbilityState byTargetWithinAbilityState = (ByTargetWithinAbilityState)predConfig; if (byTargetWithinAbilityState.TargetStates != null) { AbilityState abilityState = AbilityState.None; for (int i = 0; i < byTargetWithinAbilityState.TargetStates.Length; i++) { abilityState |= byTargetWithinAbilityState.TargetStates[i]; } return target != null && (abilityState & target.abilityState) != 0; } return target != null && (byTargetWithinAbilityState.TargetState & target.abilityState) != 0; } public bool ByTargetContainAnimEventPredicateHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ByTargetContainAnimEventPredicate byTargetContainAnimEventPredicate = (ByTargetContainAnimEventPredicate)predConfig; if (byTargetContainAnimEventPredicate.ForceByCaster) { target = instancedAbility.caster; } if (target == null) { return false; } return target.entity.ContainAnimEventPredicate(byTargetContainAnimEventPredicate.AnimEventPredicate); } public bool ByTargetAppliedUniqueModifierHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ByTargetAppliedUniqueModifier byTargetAppliedUniqueModifier = (ByTargetAppliedUniqueModifier)predConfig; if (target == null) { return false; } return target.abilityPlugin.GetFirstUniqueModifier(byTargetAppliedUniqueModifier.UniquModifierName) != null; } public bool ByAttackHitTypeHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { AttackResult attackResult = GetAttackResult(evt); if (attackResult != null) { return attackResult.hitType == ((ByAttackHitType)predConfig).HitType; } return false; } public bool ByAttackHitFlagHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { AttackResult attackResult = GetAttackResult(evt); if (attackResult != null) { return attackResult.ContainHitFlag(((ByAttackHitFlag)predConfig).HitFlag); } return false; } public bool ByAttackAniDamageRatioHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ByAttackAniDamageRatio byAttackAniDamageRatio = (ByAttackAniDamageRatio)predConfig; AttackData attackData = GetAttackResult(evt) as AttackData; if (attackData != null) { switch (byAttackAniDamageRatio.CompareType) { case ByAttackAniDamageRatio.LogicType.MoreThan: return (attackData.attackerAniDamageRatio > byAttackAniDamageRatio.AniDamageRatio) ? true : false; case ByAttackAniDamageRatio.LogicType.LessThan: return (attackData.attackerAniDamageRatio < byAttackAniDamageRatio.AniDamageRatio) ? true : false; } } return false; } public bool ByAttackIsAnimEventHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { AttackResult attackResult = GetAttackResult(evt); if (attackResult != null) { return attackResult.isAnimEventAttack == ((ByAttackFromAnimEvent)predConfig).IsAnimEventAttack; } return false; } public bool ByAttackInComboCountHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { AttackResult attackResult = GetAttackResult(evt); if (attackResult != null) { return attackResult.isInComboCount == ((ByAttackInComboCount)predConfig).InComboCount; } return false; } public bool ByHitDirectionHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { EvtBeingHit evtBeingHit = evt as EvtBeingHit; if (evtBeingHit.attackData != null) { if (!evtBeingHit.attackData.isAnimEventAttack) { return false; } if (evtBeingHit.attackData.rejected) { return false; } BaseAbilityActor actor = Singleton.Instance.GetActor(evtBeingHit.sourceID); float num = Vector3.Angle(instancedAbility.caster.entity.transform.forward, actor.entity.transform.position - instancedAbility.caster.entity.transform.position); bool flag = num < ((ByHitDirection)predConfig).Angle; if (((ByHitDirection)predConfig).ReverseAngle) { flag = !flag; } if (flag) { return true; } } return false; } public bool ByAttackAnimEventIDHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { string animEventID = GetAnimEventID(evt); if (animEventID != null) { if (((ByAttackAnimEventID)predConfig).ByAnyEventID) { return true; } return Miscs.ArrayContains(((ByAttackAnimEventID)predConfig).AnimEventIDs, animEventID); } return false; } public bool ByTargetQTENameHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ByTargetQTEName byTargetQTEName = predConfig as ByTargetQTEName; AvatarActor avatarActor = target as AvatarActor; if (avatarActor != null && byTargetQTEName != null) { return avatarActor.CurrentQTEName == byTargetQTEName.targetQTEName; } return false; } public bool ByAttackerCategoryHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ByAttackerCategory byAttackerCategory = predConfig as ByAttackerCategory; EvtBeingHit evtBeingHit = evt as EvtBeingHit; if (evtBeingHit != null) { BaseAbilityActor actor = Singleton.Instance.GetActor(evtBeingHit.sourceID); if (actor != null) { ushort num = Singleton.Instance.ParseCategory(actor.runtimeID); if (byAttackerCategory.Category == num) { return true; } } } return false; } public bool ByAttackDataTypeHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ByAttackDataType byAttackDataType = predConfig as ByAttackDataType; AttackResult attackResult = GetAttackResult(evt); if (attackResult == null) { return false; } if (byAttackDataType.Type == ByAttackDataType.AttackDataType.Breakable) { return attackResult.hitEffect > AttackResult.AnimatorHitEffect.Light; } if (byAttackDataType.Type == ByAttackDataType.AttackDataType.EvadeDefendable) { return !attackResult.noTriggerEvadeAndDefend; } return false; } public bool ByAnyHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ByAny byAny = predConfig as ByAny; for (int i = 0; i < byAny.Predicates.Length; i++) { if (EvaluateAbilityPredicate(byAny.Predicates[i], instancedAbility, instancedModifier, target, evt)) { return true; } } return false; } public bool ByNotHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ByNot byNot = predConfig as ByNot; for (int i = 0; i < byNot.Predicates.Length; i++) { if (EvaluateAbilityPredicate(byNot.Predicates[i], instancedAbility, instancedModifier, target, evt)) { return false; } } return true; } public bool ByAvatarHasChargesLeftHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ByAvatarHasChargesLeft byAvatarHasChargesLeft = (ByAvatarHasChargesLeft)predConfig; AvatarActor avatarActor = _owner as AvatarActor; return avatarActor.HasChargesLeft(byAvatarHasChargesLeft.CDSkillID); } public bool ByIsLocalAvatarHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { return Singleton.Instance.IsLocalAvatar(_owner.runtimeID); } public bool ByIsPlayerAvatarHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { return Singleton.Instance.IsPlayerAvatar(_owner.runtimeID); } public bool ByControlDataHasSteerHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ByControlDataHasSteer byControlDataHasSteer = predConfig as ByControlDataHasSteer; BaseMonoAvatar baseMonoAvatar = _owner.entity as BaseMonoAvatar; return (!byControlDataHasSteer.HasSteer) ? (!baseMonoAvatar.GetActiveControlData().hasSteer) : baseMonoAvatar.GetActiveControlData().hasSteer; } public bool ByAnimatorBoolTrueHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ByAnimatorBoolTrue byAnimatorBoolTrue = predConfig as ByAnimatorBoolTrue; if (target == null) { return false; } return (target.entity as BaseMonoAnimatorEntity).GetLocomotionBool(byAnimatorBoolTrue.Param); } public bool ByTargetIsSelfHandler(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { ByTargetIsSelf byTargetIsSelf = predConfig as ByTargetIsSelf; if (target == null) { return false; } return !((target.runtimeID == _owner.runtimeID) ^ byTargetIsSelf.IsSelf); } public static void PostInitAbilityActorPlugin(BaseAbilityActor actor) { if (Singleton.Instance.gameMode is NetworkedMP_Default_GameMode) { actor.mpAbilityPlugin = new MPActorAbilityPlugin(actor); actor.abilityPlugin = actor.mpAbilityPlugin; actor.AddPluginAs(actor.abilityPlugin); } else { actor.abilityPlugin = new ActorAbilityPlugin(actor); actor.AddPlugin(actor.abilityPlugin); } } public override void Core() { for (int i = 0; i < _appliedAbilities.Count; i++) { ActorAbility actorAbility = _appliedAbilities[i]; if (actorAbility != null) { CoreMixins(actorAbility.instancedMixins); } } for (int j = 0; j < _appliedModifiers.Count; j++) { ActorModifier actorModifier = _appliedModifiers[j]; if (actorModifier != null) { CoreMixins(actorModifier.instancedMixins); } } for (int k = 0; k < _modifierDurationTimers.Count; k++) { if (_modifierDurationTimers[k] != null) { _modifierDurationTimers[k].Item2.Core(1f); if (_modifierDurationTimers[k].Item2.isTimeUp) { TryRemoveModifier(_modifierDurationTimers[k].Item1); _modifierDurationTimers[k] = null; } } } for (int l = 0; l < _modifierThinkTimers.Count; l++) { if (_modifierThinkTimers[l] == null) { continue; } _modifierThinkTimers[l].Item2.Core(1f); if (_modifierThinkTimers[l].Item2.isTimeUp) { HandleModifierActions(_modifierThinkTimers[l].Item1, null, null, (ConfigAbilityModifier config) => config.OnThinkInterval); _modifierThinkTimers[l].Item2.Reset(true); } } } public DisplayValue CreateOrGetDisplayFloat(string key, float floor, float ceiling, float value) { if (_displayValueMap.ContainsKey(key)) { return _displayValueMap[key]; } DisplayValue displayValue = new DisplayValue(floor, ceiling, value); _displayValueMap.Add(key, displayValue); return displayValue; } public bool HasDisplayFloat(string key) { return _displayValueMap.ContainsKey(key); } public void SubAttachDisplayFloat(string key, Action cb, ref float curValue, ref float floor, ref float ceiling) { DisplayValue displayValue = _displayValueMap[key]; displayValue.SubAttach(cb, ref curValue, ref floor, ref ceiling); } public void SubDetachDisplayFloat(string key, Action cb) { DisplayValue displayValue = _displayValueMap[key]; displayValue.SubDetach(cb); } public DynamicActorValue CreateOrGetDynamicFloat(string key, float value) { if (_dynamicValueMap.ContainsKey(key)) { return _dynamicValueMap[key]; } DynamicActorValue dynamicActorValue = new DynamicActorValue(value); _dynamicValueMap.Add(key, dynamicActorValue); return dynamicActorValue; } public bool HasDynamicFloat(string key) { return _dynamicValueMap.ContainsKey(key); } public void SubAttachDynamicFloat(string key, Action cb, ref float curValue) { DynamicActorValue dynamicActorValue = _dynamicValueMap[key]; dynamicActorValue.SubAttach(cb, ref curValue); } public void SubDetachDynamicFloat(string key, Action cb) { DynamicActorValue dynamicActorValue = _dynamicValueMap[key]; dynamicActorValue.SubDetach(cb); } private bool IsMuted() { return _isKilled || _isMuted; } private ActorModifier TryRecycleDeadModifier(ActorAbility ownerAbility, ConfigAbilityModifier config) { for (int i = 0; i < _deadModifiers.Count; i++) { if (_deadModifiers[i] != null && _deadModifiers[i].config == config && _deadModifiers[i].parentAbility == ownerAbility) { ActorModifier result = _deadModifiers[i]; _deadModifiers[i] = null; return result; } } return null; } public List GetAppliedAbilities() { return (_appliedAbilities == null) ? new List() : _appliedAbilities; } public ActorAbility AddAbility(ConfigAbility abilityConfig) { return AddAbility(abilityConfig, EMPTY_OVERRIDE_MAP); } public virtual ActorAbility AddAbility(ConfigAbility abilityConfig, Dictionary overrideMap) { if (IsMuted()) { return null; } ActorAbility actorAbility = new ActorAbility(_owner, abilityConfig, overrideMap); _appliedAbilities.Add(actorAbility); int num = _appliedAbilities.Count - 1; actorAbility.instancedAbilityID = num + 1; HandleAbilityActions(actorAbility, null, null, (ConfigAbility config) => config.OnAdded); actorAbility.Attach(); AddInstancedMixins(actorAbility.instancedMixins); return _appliedAbilities[num]; } protected virtual void RemoveAbility(ActorAbility instancedAbility) { for (int i = 0; i < _appliedAbilities.Count; i++) { if (_appliedAbilities[i] == instancedAbility) { ActorAbility actorAbility = _appliedAbilities[i]; HandleAbilityActions(actorAbility, null, null, (ConfigAbility config) => config.OnRemoved); RemoveInstancedMixins(actorAbility.instancedMixins); actorAbility.Detach(); _appliedAbilities[i] = null; } } } public ActorModifier ApplyModifier(ActorAbility instancedAbility, string modifierName) { ConfigAbilityModifier modifierConfig = instancedAbility.config.Modifiers[modifierName]; return ApplyModifier(instancedAbility, modifierConfig); } protected virtual ActorModifier ApplyModifier(ActorAbility instancedAbility, ConfigAbilityModifier modifierConfig) { if (IsMuted()) { return null; } string modifierName = modifierConfig.ModifierName; if (modifierConfig.State != AbilityState.None && _owner.IsImmuneAbilityState(modifierConfig.State)) { return null; } if (AbilityData.IsModifierDebuff(modifierConfig)) { if (AbilityData.IsModifierDebuff(modifierConfig) && IsImmuneDebuff) { return null; } if (_owner is MonsterActor) { MonsterActor monsterActor = (MonsterActor)_owner; ConfigDebuffResistance debuffResistance = monsterActor.config.DebuffResistance; float resistanceRatio = debuffResistance.ResistanceRatio; float debuffResistanceRatio = monsterActor.config.EliteArguments.DebuffResistanceRatio; float resistanceRatio2 = monsterActor.GetResistanceRatio(modifierConfig.State); float value = UnityEngine.Random.value; float num = (1f - resistanceRatio) * (1f - debuffResistanceRatio) * resistanceRatio2; if (value >= num) { return null; } } else if (_owner is AvatarActor) { AvatarActor avatarActor = (AvatarActor)_owner; ConfigDebuffResistance debuffResistance2 = avatarActor.config.DebuffResistance; float resistanceRatio3 = debuffResistance2.ResistanceRatio; float resistanceRatio4 = avatarActor.GetResistanceRatio(modifierConfig.State); float value2 = UnityEngine.Random.value; float num2 = (1f - resistanceRatio3) * resistanceRatio4; if (value2 >= num2) { return null; } } } ActorModifier appliedModifier = GetAppliedModifier(modifierConfig, instancedAbility); if (appliedModifier != null) { if (modifierConfig.Stacking == ConfigAbilityModifier.ModifierStacking.Unique) { return null; } if (modifierConfig.Stacking != ConfigAbilityModifier.ModifierStacking.Multiple) { for (int i = 0; i < _modifierDurationTimers.Count; i++) { if (_modifierDurationTimers[i] != null && _modifierDurationTimers[i].Item1 == appliedModifier) { EntityTimer item = _modifierDurationTimers[i].Item2; float num3 = instancedAbility.Evaluate(modifierConfig.Duration); if (AbilityData.IsModifierDebuff(modifierConfig)) { num3 *= 1f + _owner.GetProperty("Actor_DebuffDurationRatioDelta"); } if (AbilityData.IsModifierBuff(modifierConfig) || AbilityData.IsModifierDebuff(modifierConfig)) { num3 *= _owner.GetAbilityStateDurationRatio(modifierConfig.State); } if (modifierConfig.Stacking == ConfigAbilityModifier.ModifierStacking.Prolong) { item.timespan = item.timespan - item.timer + num3; item.Reset(); } else if (modifierConfig.Stacking == ConfigAbilityModifier.ModifierStacking.Refresh) { item.Reset(); } } } return null; } } if (modifierConfig.State != AbilityState.None) { AbilityState[] precedenceTrack = null; int stateIx = -1; AbilityData.GetStateIndiceInPrecedenceMap(modifierConfig.State, out precedenceTrack, out stateIx); for (int j = 0; j < AbilityData.ABILITY_STATE_PRECEDENCE_MAP.Length; j++) { AbilityState[] array = AbilityData.ABILITY_STATE_PRECEDENCE_MAP[j]; for (int k = 0; k < array.Length; k++) { if (array[k] != modifierConfig.State) { continue; } precedenceTrack = array; stateIx = k; for (int l = 0; l < stateIx; l++) { int modifierIndexByState = GetModifierIndexByState(precedenceTrack[l]); ActorModifier actorModifier = ((modifierIndexByState >= 0) ? _appliedModifiers[modifierIndexByState] : null); if (actorModifier != null) { return null; } } for (int m = stateIx + 1; m < precedenceTrack.Length; m++) { RemoveModifierByState(precedenceTrack[m]); } } } } bool flag = false; if (modifierConfig.State != AbilityState.None && modifierConfig.IsDebuff) { int modifierIndexByState2 = GetModifierIndexByState(modifierConfig.State); ActorModifier actorModifier2 = ((modifierIndexByState2 >= 0) ? _appliedModifiers[modifierIndexByState2] : null); if (actorModifier2 != null) { if (!actorModifier2.config.IsDebuff) { return null; } _owner.AddAbilityState(modifierConfig.State, actorModifier2.config.MuteStateDisplayEffect); flag = true; RemoveModifier(actorModifier2, modifierIndexByState2); } } int index = _appliedModifiers.SeekAddPosition(); appliedModifier = AddModifierOnIndex(instancedAbility, modifierConfig, index); if (flag) { _owner.RemoveAbilityState(modifierConfig.State); } BaseMonoEntity timeScaleEntity = null; if (modifierConfig.TimeScale == ConfigAbilityModifier.ModifierTimeScale.Owner) { timeScaleEntity = _owner.entity; } else if (modifierConfig.TimeScale == ConfigAbilityModifier.ModifierTimeScale.Caster) { timeScaleEntity = instancedAbility.caster.entity; } else if (modifierConfig.TimeScale == ConfigAbilityModifier.ModifierTimeScale.Level) { timeScaleEntity = _levelActor.levelEntity; } float num4 = instancedAbility.Evaluate(appliedModifier.config.Duration); if (modifierConfig.ApplyAttackerWitchTimeRatio && instancedAbility.CurrentTriggerEvent is EvtEvadeSuccess) { EvtEvadeSuccess evtEvadeSuccess = instancedAbility.CurrentTriggerEvent as EvtEvadeSuccess; if (evtEvadeSuccess != null) { MonsterActor actor = Singleton.Instance.GetActor(evtEvadeSuccess.attackerID); if (actor != null) { ConfigMonsterAnimEvent configMonsterAnimEvent = SharedAnimEventData.ResolveAnimEvent(actor.config, evtEvadeSuccess.skillID); if (configMonsterAnimEvent != null) { num4 *= configMonsterAnimEvent.AttackProperty.WitchTimeRatio; } } } } if (num4 != 0f) { if (AbilityData.IsModifierDebuff(modifierConfig)) { num4 *= 1f + _owner.GetProperty("Actor_DebuffDurationRatioDelta"); } if (AbilityData.IsModifierBuff(modifierConfig) || AbilityData.IsModifierDebuff(modifierConfig)) { num4 *= _owner.GetAbilityStateDurationRatio(modifierConfig.State); } int index2 = _modifierDurationTimers.SeekAddPosition(); _modifierDurationTimers[index2] = Tuple.Create(appliedModifier, new EntityTimer(num4, timeScaleEntity)); _modifierDurationTimers[index2].Item2.SetActive(true); } float num5 = instancedAbility.Evaluate(appliedModifier.config.ThinkInterval); if (num5 != 0f) { int index3 = _modifierThinkTimers.SeekAddPosition(); _modifierThinkTimers[index3] = Tuple.Create(appliedModifier, new EntityTimer(num5, timeScaleEntity)); _modifierThinkTimers[index3].Item2.SetActive(true); } HandleModifierActions(appliedModifier, null, null, (ConfigAbilityModifier config) => config.OnAdded); if (appliedModifier.config.OnMonsterCreated.Length > 0) { Singleton.Instance.RegisterEventListener(_owner.runtimeID); } if (appliedModifier.config.OnAvatarCreated.Length > 0) { Singleton.Instance.RegisterEventListener(_owner.runtimeID); } return appliedModifier; } private ActorModifier GetAppliedModifier(ConfigAbilityModifier modifierConfig, ActorAbility ownerAbility) { for (int i = 0; i < _appliedModifiers.Count; i++) { if (_appliedModifiers[i] != null && _appliedModifiers[i].config == modifierConfig && _appliedModifiers[i].parentAbility == ownerAbility) { return _appliedModifiers[i]; } } return null; } protected virtual void RemoveModifier(ActorModifier modifier, int index) { HandleModifierActions(modifier, null, null, (ConfigAbilityModifier config) => config.OnRemoved); RemoveModifierOnIndex(modifier, index); for (int num = 0; num < _modifierThinkTimers.Count; num++) { if (_modifierThinkTimers[num] != null && _modifierThinkTimers[num].Item1 == modifier) { _modifierThinkTimers[num] = null; } } for (int num2 = 0; num2 < _modifierDurationTimers.Count; num2++) { if (_modifierDurationTimers[num2] != null && _modifierDurationTimers[num2].Item1 == modifier) { _modifierDurationTimers[num2] = null; } } if (modifier.config.OnMonsterCreated.Length > 0) { Singleton.Instance.RemoveEventListener(_owner.runtimeID); } if (modifier.config.OnAvatarCreated.Length > 0) { Singleton.Instance.RemoveEventListener(_owner.runtimeID); } } public bool TryRemoveModifier(ActorModifier modifier) { if (modifier == null) { return false; } for (int i = 0; i < _appliedModifiers.Count; i++) { if (_appliedModifiers[i] == modifier) { RemoveModifier(modifier, i); return true; } } return false; } public bool TryRemoveModifier(ActorAbility instancedAbility, string modifierName) { ConfigAbilityModifier configAbilityModifier = instancedAbility.config.Modifiers[modifierName]; bool result = false; for (int i = 0; i < _appliedModifiers.Count; i++) { if (_appliedModifiers[i] != null && _appliedModifiers[i].config == configAbilityModifier) { RemoveModifier(_appliedModifiers[i], i); if (configAbilityModifier.Stacking != ConfigAbilityModifier.ModifierStacking.Multiple) { return true; } result = true; } } return result; } public bool HasAbility(string abilityName) { if (string.IsNullOrEmpty(abilityName)) { return false; } if (_appliedAbilities == null) { return false; } for (int i = 0; i < _appliedAbilities.Count; i++) { if (_appliedAbilities[i] != null && _appliedAbilities[i].config != null && _appliedAbilities[i].config.AbilityName == abilityName) { return true; } } return false; } public override void OnAdded() { if (_levelActor.levelState == LevelActor.LevelState.LevelRunning) { AddAppliedAbilities(); return; } Singleton.Instance.RegisterEventListener(_owner.runtimeID); _waitForStageReady = true; } public override bool OnEvent(BaseEvent evt) { if (muteEvents) { return false; } bool flag = false; string text = null; EvtAbilityStart evtAbilityStart = null; if (evt is EvtAbilityStart) { evtAbilityStart = (EvtAbilityStart)evt; if (evtAbilityStart.abilityName == null) { evtAbilityStart.abilityName = _owner.GetAbilityNameByID(evtAbilityStart.abilityID); } text = evtAbilityStart.abilityName; if (text == "Noop") { return false; } } for (int i = 0; i < _appliedAbilities.Count; i++) { ActorAbility actorAbility = _appliedAbilities[i]; if (actorAbility == null) { continue; } bool flag2 = actorAbility.config.AbilityName == text; for (int j = 0; j < actorAbility.instancedMixins.Length; j++) { flag |= EventInstancedMixin(actorAbility.instancedMixins[j], evt); if (flag2) { flag = true; if (actorAbility.config.UseAbilityArgumentAsSpecialKey != null) { actorAbility.argumentRecieved = true; actorAbility.argumentSpecialValue = (float)evtAbilityStart.abilityArgument; } else if (actorAbility.config.SetAbilityArgumentToOverrideMap != null) { actorAbility.SetOverrideMapValue(actorAbility.config.SetAbilityArgumentToOverrideMap, evtAbilityStart.abilityArgument); } AbilityStartInstancedMixin(actorAbility.instancedMixins[j], evtAbilityStart); actorAbility.argumentRecieved = false; } } } for (int k = 0; k < _appliedModifiers.Count; k++) { ActorModifier actorModifier = _appliedModifiers[k]; if (actorModifier == null) { continue; } bool flag3 = actorModifier.parentAbility.config.AbilityName == text; for (int l = 0; l < actorModifier.instancedMixins.Length; l++) { flag |= EventInstancedMixin(actorModifier.instancedMixins[l], evt); if (flag3) { flag = true; AbilityStartInstancedMixin(actorModifier.instancedMixins[l], evtAbilityStart); } } } if (evt is EvtAbilityStart) { for (int m = 0; m < _appliedAbilities.Count; m++) { ActorAbility actorAbility2 = _appliedAbilities[m]; if (actorAbility2 != null && actorAbility2.config.AbilityName == text) { if (actorAbility2.config.UseAbilityArgumentAsSpecialKey != null) { actorAbility2.argumentRecieved = true; actorAbility2.argumentSpecialValue = (float)evtAbilityStart.abilityArgument; } else if (actorAbility2.config.SetAbilityArgumentToOverrideMap != null) { actorAbility2.SetOverrideMapValue(actorAbility2.config.SetAbilityArgumentToOverrideMap, evtAbilityStart.abilityArgument); } flag |= HandleAbilityActions(actorAbility2, Singleton.Instance.GetActor(evtAbilityStart.otherID), evt, (ConfigAbility config) => config.OnAbilityStart); actorAbility2.argumentRecieved = false; } } } else if (evt is EvtBeingHit) { EvtBeingHit evtBeingHit = (EvtBeingHit)evt; flag |= HandleModifierActions(Singleton.Instance.GetActor(evtBeingHit.sourceID), evt, (ConfigAbilityModifier config) => config.OnBeingHit); } else if (evt is EvtAttackLanded) { EvtAttackLanded evtAttackLanded = (EvtAttackLanded)evt; flag |= HandleModifierActions(Singleton.Instance.GetActor(evtAttackLanded.attackeeID), evt, (ConfigAbilityModifier config) => config.OnAttackLanded); } else if (evt is EvtEvadeStart) { flag |= HandleModifierActions(null, evt, (ConfigAbilityModifier config) => config.OnEvadeStart); } else if (evt is EvtEvadeSuccess) { EvtEvadeSuccess evtEvadeSuccess = (EvtEvadeSuccess)evt; flag |= HandleModifierActions(Singleton.Instance.GetActor(evtEvadeSuccess.attackerID), evt, (ConfigAbilityModifier config) => config.OnEvadeSuccess); } else if (evt is EvtDefendStart) { flag |= HandleModifierActions(null, evt, (ConfigAbilityModifier config) => config.OnDefendStart); } else if (evt is EvtDefendSuccess) { EvtDefendSuccess evtDefendSuccess = (EvtDefendSuccess)evt; flag |= HandleModifierActions(Singleton.Instance.GetActor(evtDefendSuccess.attackerID), evt, (ConfigAbilityModifier config) => config.OnDefendSuccess); } else if (evt is EvtFieldEnter) { EvtFieldEnter evtFieldEnter = (EvtFieldEnter)evt; BaseAbilityActor actor = Singleton.Instance.GetActor(evtFieldEnter.otherID); if (actor != null) { flag |= HandleAbilityActions(actor, evt, (ConfigAbility config) => config.OnFieldEnter); } } else if (evt is EvtFieldExit) { EvtFieldExit evtFieldExit = (EvtFieldExit)evt; BaseAbilityActor actor2 = Singleton.Instance.GetActor(evtFieldExit.otherID); if (actor2 != null) { flag |= HandleAbilityActions(actor2, evt, (ConfigAbility config) => config.OnFieldExit); } } else if (evt is EvtKilled) { BaseAbilityActor actor3 = Singleton.Instance.GetActor(((EvtKilled)evt).killerID); HandleModifierActions(actor3, evt, (ConfigAbilityModifier config) => config.OnKilled); HandleAbilityActions(actor3, evt, (ConfigAbility config) => config.OnKilled); return OnKilled((EvtKilled)evt); } return flag; } public override bool ListenEvent(BaseEvent evt) { bool flag = false; for (int i = 0; i < _appliedAbilities.Count; i++) { ActorAbility actorAbility = _appliedAbilities[i]; if (actorAbility != null) { for (int j = 0; j < actorAbility.instancedMixins.Length; j++) { flag |= actorAbility.instancedMixins[j].ListenEvent(evt); } } } for (int k = 0; k < _appliedModifiers.Count; k++) { ActorModifier actorModifier = _appliedModifiers[k]; if (actorModifier != null) { for (int l = 0; l < actorModifier.instancedMixins.Length; l++) { flag |= actorModifier.instancedMixins[l].ListenEvent(evt); } } } if (evt is EvtMonsterCreated) { EvtMonsterCreated evtMonsterCreated = (EvtMonsterCreated)evt; HandleModifierActions(Singleton.Instance.GetActor(evtMonsterCreated.monsterID), evt, (ConfigAbilityModifier config) => config.OnMonsterCreated); } else if (evt is EvtAvatarCreated) { EvtAvatarCreated evtAvatarCreated = (EvtAvatarCreated)evt; HandleModifierActions(Singleton.Instance.GetActor(evtAvatarCreated.avatarID), evt, (ConfigAbilityModifier config) => config.OnAvatarCreated); } else if (evt is EvtStageReady) { ListenStageReady((EvtStageReady)evt); } return flag; } public override bool OnPostEvent(BaseEvent evt) { if (muteEvents) { return false; } bool flag = false; for (int i = 0; i < _appliedAbilities.Count; i++) { ActorAbility actorAbility = _appliedAbilities[i]; if (actorAbility != null) { for (int j = 0; j < actorAbility.instancedMixins.Length; j++) { flag |= PostEventInstancedMixin(actorAbility.instancedMixins[j], evt); } } } for (int k = 0; k < _appliedModifiers.Count; k++) { ActorModifier actorModifier = _appliedModifiers[k]; if (actorModifier != null) { for (int l = 0; l < actorModifier.instancedMixins.Length; l++) { flag |= PostEventInstancedMixin(actorModifier.instancedMixins[l], evt); } } } return flag; } public override bool OnResolvedEvent(BaseEvent evt) { if (muteEvents) { return false; } bool flag = false; if (evt is EvtBeingHit) { EvtBeingHit evtBeingHit = (EvtBeingHit)evt; flag |= HandleModifierActions(Singleton.Instance.GetActor(evtBeingHit.sourceID), evt, (ConfigAbilityModifier config) => config.OnBeingHitResolved); } return flag; } private bool OnKilled(EvtKilled evt) { _isKilled = true; if (onKillBehavior == OnKillBehavior.RemoveAll) { RemoveAllNonOnDestroyAbilities(); RemoveAllModifies(); } else if (onKillBehavior == OnKillBehavior.RemoveAllDebuffsAndDurationed) { RemoveAllDurationedOrDebuffs(); } else if (onKillBehavior != OnKillBehavior.DoNotRemoveUntilDestroyed) { } return true; } private bool ListenStageReady(EvtStageReady evt) { if (_waitForStageReady) { AddAppliedAbilities(); Singleton.Instance.RemoveEventListener(_owner.runtimeID); _waitForStageReady = false; } return true; } public void InsertPreInitAbility(ConfigAbility abilityConfig) { _additionalAbilities.Add(abilityConfig); } protected virtual void AddAppliedAbilities() { List>> appliedAbilities = _owner.appliedAbilities; for (int i = 0; i < appliedAbilities.Count; i++) { AddAbility(appliedAbilities[i].Item1, appliedAbilities[i].Item2); } for (int j = 0; j < _additionalAbilities.Count; j++) { AddAbility(_additionalAbilities[j]); } _additionalAbilities = null; } protected virtual void RemoveAllAbilities() { for (int i = 0; i < _appliedAbilities.Count; i++) { if (_appliedAbilities[i] != null) { RemoveAbility(_appliedAbilities[i]); } } } protected virtual void RemoveAllNonOnDestroyAbilities() { for (int i = 0; i < _appliedAbilities.Count; i++) { if (_appliedAbilities[i] != null && _appliedAbilities[i].config.OnDestroy.Length <= 0) { RemoveAbility(_appliedAbilities[i]); } } } protected virtual void RemoveAllModifies() { for (int i = 0; i < _appliedModifiers.Count; i++) { if (_appliedModifiers[i] != null) { RemoveModifier(_appliedModifiers[i], i); } } } public void ResetKilled() { _isKilled = false; } public override void OnRemoved() { if (Singleton.Instance.levelActor.levelState != LevelActor.LevelState.LevelRunning) { return; } HandleAbilityActions(null, null, (ConfigAbility config) => config.OnDestroy); RemoveAllModifies(); RemoveAllAbilities(); foreach (DisplayValue value in _displayValueMap.Values) { value.Dispose(); } } public void StopAndDropAll() { RemoveAllModifies(); RemoveAllAbilities(); _isMuted = true; } protected virtual bool HandleAbilityActions(ActorAbility instancedAbility, BaseAbilityActor other, BaseEvent evt, Func actionsGetter) { ConfigAbilityAction[] array = actionsGetter(instancedAbility.config); for (int i = 0; i < array.Length; i++) { HandleActionTargetDispatch(array[i], instancedAbility, null, other, evt); } return array.Length > 0; } protected virtual bool HandleAbilityActions(BaseAbilityActor other, BaseEvent evt, Func actionsGetter) { bool flag = false; for (int i = 0; i < _appliedAbilities.Count; i++) { if (_appliedAbilities[i] != null) { ActorAbility actorAbility = _appliedAbilities[i]; ConfigAbilityAction[] array = actionsGetter(actorAbility.config); flag |= array.Length > 0; for (int j = 0; j < array.Length; j++) { HandleActionTargetDispatch(array[j], actorAbility, null, other, evt); } } } return flag; } protected virtual bool HandleModifierActions(ActorModifier instancedModifier, BaseAbilityActor other, BaseEvent evt, Func actionsGetter) { ConfigAbilityAction[] array = actionsGetter(instancedModifier.config); for (int i = 0; i < array.Length; i++) { HandleActionTargetDispatch(array[i], instancedModifier.parentAbility, instancedModifier, other, evt); } return array.Length > 0; } protected virtual bool HandleModifierActions(BaseAbilityActor other, BaseEvent evt, Func actionsGetter) { bool flag = false; for (int i = 0; i < _appliedModifiers.Count; i++) { if (_appliedModifiers[i] != null) { ActorModifier actorModifier = _appliedModifiers[i]; ConfigAbilityAction[] array = actionsGetter(actorModifier.config); flag |= array.Length > 0; for (int j = 0; j < array.Length; j++) { HandleActionTargetDispatch(array[j], actorModifier.parentAbility, actorModifier, other, evt); } } } return flag; } public void HandleActionTargetDispatch(ConfigAbilityAction[] actionConfigs, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor other, BaseEvent evt) { for (int i = 0; i < actionConfigs.Length; i++) { HandleActionTargetDispatch(actionConfigs[i], instancedAbility, instancedModifier, other, evt); } } private static bool YesTargetPredicate(BaseAbilityActor target) { return true; } protected virtual void HandleActionTargetDispatch(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor other, BaseEvent evt, Func targetPredicate) { BaseAbilityActor outTarget; BaseAbilityActor[] outTargetLs; bool needHandleTargetOnNull; ResolveTarget(actionConfig.Target, actionConfig.TargetOption, instancedAbility, other, out outTarget, out outTargetLs, out needHandleTargetOnNull); if ((outTarget != null && targetPredicate(outTarget)) || needHandleTargetOnNull) { HandleAction(actionConfig, instancedAbility, instancedModifier, outTarget, evt); } else { if (outTargetLs == null) { return; } for (int i = 0; i < outTargetLs.Length; i++) { if (outTargetLs[i] != null && targetPredicate(outTargetLs[i])) { HandleAction(actionConfig, instancedAbility, instancedModifier, outTargetLs[i], evt); } } } } private void HandleActionTargetDispatch(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor other, BaseEvent evt) { HandleActionTargetDispatch(actionConfig, instancedAbility, instancedModifier, other, evt, (BaseAbilityActor actionTarget) => YesTargetPredicate(actionTarget)); } private BaseAbilityActor CheckTargetAvailable(BaseAbilityActor target, bool includeGhost = false) { if (target != null && target.entity != null) { if (!includeGhost && target.entity.isGhost) { return null; } return target; } return null; } public BaseAbilityActor[] FilterTargetArray(BaseAbilityActor[] targets, bool includeGhost = false) { for (int i = 0; i < targets.Length; i++) { targets[i] = CheckTargetAvailable(targets[i], includeGhost); } return targets; } protected void ResolveTarget(AbilityTargetting targetting, TargettingOption option, ActorAbility instancedAbility, BaseAbilityActor other, out BaseAbilityActor outTarget, out BaseAbilityActor[] outTargetLs, out bool needHandleTargetOnNull) { BaseAbilityActor caster = instancedAbility.caster; BaseAbilityActor owner = _owner; BaseAbilityActor baseAbilityActor = ((caster == owner) ? other : owner); switch (targetting) { case AbilityTargetting.Self: outTarget = owner; outTargetLs = null; needHandleTargetOnNull = false; break; case AbilityTargetting.Caster: outTarget = caster; outTargetLs = null; needHandleTargetOnNull = false; break; case AbilityTargetting.Target: outTarget = CheckTargetAvailable(baseAbilityActor, true); outTargetLs = null; needHandleTargetOnNull = false; break; case AbilityTargetting.Creator: outTarget = CheckTargetAvailable(Singleton.Instance.GetActor(owner.ownerID), true); outTargetLs = null; needHandleTargetOnNull = false; break; case AbilityTargetting.CasterAllied: outTarget = null; outTargetLs = FilterTargetArray(Singleton.Instance.GetAlliedActorsOf(caster), true); needHandleTargetOnNull = false; break; case AbilityTargetting.TargetAllied: outTarget = null; outTargetLs = FilterTargetArray(Singleton.Instance.GetAlliedActorsOf(baseAbilityActor)); needHandleTargetOnNull = false; break; case AbilityTargetting.EnemyAllied: outTarget = null; outTargetLs = FilterTargetArray(Singleton.Instance.GetEnemyActorsOf(caster)); needHandleTargetOnNull = false; break; case AbilityTargetting.Other: outTarget = other; outTargetLs = null; needHandleTargetOnNull = true; break; case AbilityTargetting.CasterCenteredAllied: outTarget = null; if (!caster.IsActive()) { outTargetLs = null; } else { outTargetLs = Singleton.Instance.GetAlliedActorsOf(caster); for (int j = 0; j < outTargetLs.Length; j++) { if (!outTargetLs[j].IsActive() || CheckTargetAvailable(outTargetLs[j], true) == null || Miscs.DistancForVec3IgnoreY(outTargetLs[j].entity.XZPosition, caster.entity.XZPosition) > instancedAbility.Evaluate(option.Range)) { outTargetLs[j] = null; } } } needHandleTargetOnNull = false; break; case AbilityTargetting.CasterCenteredEnemies: outTarget = null; if (!caster.IsActive()) { outTargetLs = null; } else { outTargetLs = Singleton.Instance.GetEnemyActorsOf(caster); for (int l = 0; l < outTargetLs.Length; l++) { if (!outTargetLs[l].IsActive() || CheckTargetAvailable(outTargetLs[l]) == null || Miscs.DistancForVec3IgnoreY(outTargetLs[l].entity.XZPosition, caster.entity.XZPosition) > instancedAbility.Evaluate(option.Range)) { outTargetLs[l] = null; } } } needHandleTargetOnNull = false; break; case AbilityTargetting.TargetCenteredAllied: { needHandleTargetOnNull = false; outTarget = null; if (baseAbilityActor == null || !baseAbilityActor.IsActive()) { outTargetLs = null; break; } outTargetLs = Singleton.Instance.GetAlliedActorsOf(caster); for (int k = 0; k < outTargetLs.Length; k++) { if (!outTargetLs[k].IsActive() || (CheckTargetAvailable(outTargetLs[k], true) == null && Miscs.DistancForVec3IgnoreY(outTargetLs[k].entity.XZPosition, baseAbilityActor.entity.XZPosition) > instancedAbility.Evaluate(option.Range))) { outTargetLs[k] = null; } } break; } case AbilityTargetting.TargetCenteredEnemies: { needHandleTargetOnNull = false; outTarget = null; if (baseAbilityActor == null || !baseAbilityActor.IsActive()) { outTargetLs = null; break; } outTargetLs = Singleton.Instance.GetEnemyActorsOf(caster); for (int i = 0; i < outTargetLs.Length; i++) { if (!outTargetLs[i].IsActive() || CheckTargetAvailable(outTargetLs[i]) == null || Miscs.DistancForVec3IgnoreY(outTargetLs[i].entity.XZPosition, baseAbilityActor.entity.XZPosition) > instancedAbility.Evaluate(option.Range)) { outTargetLs[i] = null; } } break; } default: outTarget = null; outTargetLs = null; needHandleTargetOnNull = false; break; } } public bool EvaluateAbilityPredicate(ConfigAbilityPredicate predConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { return predConfig.Call(this, instancedAbility, instancedModifier, target, evt); } public bool EvaluateAbilityPredicate(ConfigAbilityPredicate[] predConfigs, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { bool flag = true; for (int i = 0; i < predConfigs.Length; i++) { flag &= EvaluateAbilityPredicate(predConfigs[i], instancedAbility, instancedModifier, target, evt); } return flag; } protected virtual void HandleAction(ConfigAbilityAction actionConfig, ActorAbility instancedAbility, ActorModifier instancedModifier, BaseAbilityActor target, BaseEvent evt) { if (EvaluateAbilityPredicate(actionConfig.Predicates, instancedAbility, instancedModifier, target, evt)) { actionConfig.Call(this, actionConfig, instancedAbility, instancedModifier, target, evt); } } private uint GetOtherID(BaseEvent evt) { IEvtWithOtherID evtWithOtherID = evt as IEvtWithOtherID; if (evtWithOtherID != null) { return evtWithOtherID.GetOtherID(); } return 0u; } private AttackResult GetAttackResult(BaseEvent evt) { IEvtWithAttackResult evtWithAttackResult = evt as IEvtWithAttackResult; if (evtWithAttackResult != null) { return evtWithAttackResult.GetAttackResult(); } return null; } private string GetAnimEventID(BaseEvent evt) { IEvtWithAnimEventID evtWithAnimEventID = evt as IEvtWithAnimEventID; if (evtWithAnimEventID != null) { return evtWithAnimEventID.GetAnimEventID(); } return null; } private AttackResult.HitCollsion GetHitCollision(BaseEvent evt) { IEvtWithHitCollision evtWithHitCollision = evt as IEvtWithHitCollision; if (evtWithHitCollision != null) { return evtWithHitCollision.GetHitCollision(); } return null; } public void RemoveAllDebuffModifiers() { for (int i = 0; i < _appliedModifiers.Count; i++) { if (_appliedModifiers[i] != null && AbilityData.IsModifierDebuff(_appliedModifiers[i].config)) { RemoveModifier(_appliedModifiers[i], i); } } } private bool IsModifierDurationed(ActorModifier modifier) { for (int i = 0; i < _modifierDurationTimers.Count; i++) { if (_modifierDurationTimers[i] != null && _modifierDurationTimers[i].Item1 == modifier) { return true; } } return false; } private void RemoveAllDurationedOrDebuffs() { for (int i = 0; i < _appliedModifiers.Count; i++) { if (_appliedModifiers[i] != null && (IsModifierDurationed(_appliedModifiers[i]) || AbilityData.IsModifierDebuff(_appliedModifiers[i].config))) { RemoveModifier(_appliedModifiers[i], i); } } } private int GetModifierIndexByState(AbilityState state) { for (int i = 0; i < _appliedModifiers.Count; i++) { if (_appliedModifiers[i] != null && _appliedModifiers[i].config.State == state) { return i; } } return -1; } public void RemoveModifierByState(AbilityState state) { for (int i = 0; i < _appliedModifiers.Count; i++) { if (_appliedModifiers[i] != null && _appliedModifiers[i].config.State == state) { RemoveModifier(_appliedModifiers[i], i); } } } public ActorModifier GetFirstUniqueModifier(string uniqueModifierName) { for (int i = 0; i < _appliedModifiers.Count; i++) { if (_appliedModifiers[i] != null && _appliedModifiers[i].config.IsUnique && _appliedModifiers[i].config.ModifierName == uniqueModifierName) { return _appliedModifiers[i]; } } return null; } public void AddOrGetAbilityAndTriggerOnTarget(ConfigAbility abilityConfig, uint targetID, object abilityArgument) { if (abilityConfig == null) { SuperDebug.VeryImportantError("AbilityConfig is Empty in AddOrGetAbilityAndTriggerOnTarget"); return; } if (string.IsNullOrEmpty(abilityConfig.AbilityName)) { SuperDebug.VeryImportantError("AbilityConfig should have a abilityName"); return; } if (!string.IsNullOrEmpty(abilityConfig.AbilityName) && !HasAbility(abilityConfig.AbilityName)) { AddAbility(abilityConfig); } EvtAbilityStart evtAbilityStart = new EvtAbilityStart(_owner.runtimeID, targetID); evtAbilityStart.abilityName = abilityConfig.AbilityName; evtAbilityStart.abilityArgument = abilityArgument; Singleton.Instance.FireEvent(evtAbilityStart); } public EntityTimer DebugGetModifierTimer(ActorModifier instancedModifier) { foreach (Tuple modifierDurationTimer in _modifierDurationTimers) { if (modifierDurationTimer == null || modifierDurationTimer.Item1 != instancedModifier) { continue; } return modifierDurationTimer.Item2; } return null; } [Conditional("NG_HSOD_DEBUG")] [Conditional("UNITY_EDITOR")] protected void DebugLogAbility(ActorAbility instancedAbility, string format, params object[] arguments) { } public virtual BaseAbilityMixin CreateInstancedAbilityMixin(ActorAbility instancedAbility, ActorModifier instancedModifier, ConfigAbilityMixin config) { return config.CreateInstancedMixin(instancedAbility, instancedModifier); } protected virtual void AddInstancedMixins(BaseAbilityMixin[] mixins) { for (int i = 0; i < mixins.Length; i++) { mixins[i].OnAdded(); } } protected virtual void RemoveInstancedMixins(BaseAbilityMixin[] mixins) { for (int i = 0; i < mixins.Length; i++) { mixins[i].OnRemoved(); } } protected virtual void AbilityStartInstancedMixin(BaseAbilityMixin mixin, EvtAbilityStart evt) { mixin.OnAbilityTriggered(evt); } protected virtual bool EventInstancedMixin(BaseAbilityMixin mixin, BaseEvent evt) { return mixin.OnEvent(evt); } protected virtual bool PostEventInstancedMixin(BaseAbilityMixin mixin, BaseEvent evt) { return mixin.OnPostEvent(evt); } protected virtual void CoreMixins(BaseAbilityMixin[] mixins) { for (int i = 0; i < mixins.Length; i++) { mixins[i].Core(); } } protected virtual ActorModifier AddModifierOnIndex(ActorAbility instancedAbility, ConfigAbilityModifier modifierConfig, int index) { string modifierName = modifierConfig.ModifierName; ActorModifier actorModifier = TryRecycleDeadModifier(instancedAbility, modifierConfig); if (actorModifier == null) { actorModifier = new ActorModifier(instancedAbility, _owner, instancedAbility.config.Modifiers[modifierName]); } _appliedModifiers.ExpandToInclude(index); _appliedModifiers[index] = actorModifier; actorModifier.instancedModifierID = index + 1; actorModifier.Attach(); AddInstancedMixins(actorModifier.instancedMixins); return actorModifier; } protected virtual void RemoveModifierOnIndex(ActorModifier modifier, int index) { RemoveInstancedMixins(modifier.instancedMixins); modifier.Detach(); _appliedModifiers[index] = null; int index2 = _deadModifiers.SeekAddPosition(); _deadModifiers[index2] = modifier; modifier.instancedModifierID = 0; } } }