public void OnAttachAsMain(Character target) { this.target = target; attachType = ModifierAttachType.Main; if (info.DelayToApply() == 0) { isAttachCalled = true; OnDelayedAttachAsMain(target); } ProcessVfx(0); }
public bool OnAttachAsSub(Character target) { attachType = ModifierAttachType.Sub; bool attachSuccess = false; try { Modifier highest = target.FindModifierOfHighestRank(); MType highestType = (MType)(int)highest.Type(); MType thisType = (MType)(int)Type(); List <Interaction> inters = modifierInteractionCollection.Find(highestType, thisType); if (inters.Count < 1) { return(attachSuccess); } Interaction inter = inters[0]; bool isStateQuerySuccess = false; MainModifierState mainState = MainModifierState.Ground; if (highest is BaseModifier) { bool justChanged; isStateQuerySuccess = ((BaseModifier)highest).TryQueryingState(out mainState, out justChanged); } if (!isStateQuerySuccess) { mainState = target.IsOnGround() ? MainModifierState.Ground : MainModifierState.Air; } List <ActionDetails> actions = inter.FindActions(mainState); if (actions.Count < 1) { return(attachSuccess); } for (int i = 0; i < actions.Count; i++) { ActionDetails ad = actions[i]; switch (ad.ShowActionType()) { case InteractionActionType.DoNothing: attachSuccess = false; break; case InteractionActionType.Vibrate: VibrateActionDetails vad = (VibrateActionDetails)ad; VibrateTarget( vad.xAmplitude, vad.duration, vad.frequency, vad.shouldDecay, vad.decayConstant, targetGameObject, () => subLifetime.End() ); attachSuccess = true; break; case InteractionActionType.PlayAnimation: PlayAnimationActionDetails paad = (PlayAnimationActionDetails)ad; if (targetAnimation.CurrentAnimationNames().Contains(paad.name)) { targetAnimation.Stop(); } targetAnimation.PlayAnimation(paad.name); targetAnimation.JumpToFrame(paad.startFrame); if (highest is StunModifier) { ((StunModifier)highest).OnAnimationPlayedBySubModifier(paad.name); } subLifetime.End(); attachSuccess = true; break; case InteractionActionType.Jump: JumpActionDetails jad = (JumpActionDetails)ad; movingJumpRequest = new MovingJumpRequest( jad.height, jad.timeToPeak, jad.timeToGround, jad.timeToFloat, jad.distance ); targetEntity.GetComponent <MovementComponent>().AddMovementRequest( movingJumpRequest ); attachSuccess = true; break; case InteractionActionType.Dash: MovementComponent casterMc = casterEntity.GetComponent <MovementComponent>(); Direction casterFacing = casterMc.FacingDirection; DashActionDetails dad = (DashActionDetails)ad; dashRequest = new DashRequest( casterFacing, dad.distance, dad.duration, 0, dad.constantSpeed ); targetEntity.GetComponent <MovementComponent>().AddMovementRequest( dashRequest ); attachSuccess = true; break; case InteractionActionType.OverrideMainModifier: attachType = ModifierAttachType.Main; target.RemoveModifier(highest); OnAttachAsMain(target); attachSuccess = true; break; case InteractionActionType.IncreaseLyingDuration: StunInfo si = (StunInfo)info; increaseLyingDuration = new IncreaseLyingDuration( subLifetime, si.ShowDuration(), targetEntity ); attachSuccess = true; break; default: throw new Exception( "Missing logic to handle SubModifier of ActionType " + ad.ShowActionType() ); } } return(attachSuccess); } catch (Exception e) { DLog.LogError(e); return(attachSuccess); } }