using System.Linq; using Code.Game.Entities; using Code.Infrastructure.Utils; using Code.OfficeGame.BattleMode.Actions.Deciders; using Code.OfficeGame.BattleMode.Timeline; using UnityEngine; namespace Code.OfficeGame.BattleMode.Actions { public class BattleActionStugger : BattleAction { private int EntryStateHash => Animator.StringToHash("WalkBlend"); private int StuggerStateHash => Animator.StringToHash("Stugger"); private BattleActionParameters _actionParameters; public BattleActionStugger(MultipleConfig actionData) { _actionParameters = actionData.Configs.SingleOrDefault(x => x.ActionType == ActionType); } public override BattleActionType ActionType => BattleActionType.Stugger; public override DeciderType DeciderType => DeciderType.AsIs; public override BattleActionData MountAndGetFrames(EntityProperties entity, BattleActionDecisionResult result) { return new StuggerActionData { TotalFrames = _actionParameters.TotalFrames, TransitionFrames = _actionParameters.TransitionFrames, Finished = false }; } public override void Finish(EntityProperties entity, BattleActionData actionData, BattleActionDecisionResult result) { entity.KinematicCharacterMotor.BaseVelocity = Vector3.zero; entity.MovementController.Freeze = true; } public override void Tick( float tickDelta, EntityProperties entity, BattleActionDecisionResult battleActionDecisionResult, BattleActionData battleActionData) { if (battleActionData is not StuggerActionData stuggerActionData) { Debug.Log($"WrongData {battleActionData.GetType()}"); battleActionData.Finished = true; return; } if (stuggerActionData.CurrentFrame == 0) { if (stuggerActionData.TotalFrames <= 0) stuggerActionData.TotalFrames = _actionParameters.TotalFrames; if (stuggerActionData.TransitionFrames <= 0) stuggerActionData.TransitionFrames = _actionParameters.TransitionFrames; var transitionTime = stuggerActionData.TransitionFrames * BattleTimeline.TickDelta; entity.SyncRootMotionToMotor(); entity.animator.applyRootMotion = false; entity.animator.CrossFadeInFixedTime(StuggerStateHash, transitionTime); } if (stuggerActionData.KnockbackDistance > 0f && stuggerActionData.KnockbackSpeed > 0f && stuggerActionData.KnockbackDirection.sqrMagnitude > 0.0001f) { float stepDistance = Mathf.Min( stuggerActionData.KnockbackSpeed * tickDelta, stuggerActionData.KnockbackDistance); stuggerActionData.KnockbackDistance -= stepDistance; Vector3 step = stuggerActionData.KnockbackDirection * stepDistance; entity.KinematicCharacterMotor.MoveCharacter( entity.KinematicCharacterMotor.TransientPosition + step); } stuggerActionData.CurrentFrame++; if (stuggerActionData.CurrentFrame >= stuggerActionData.TotalFrames) { entity.SyncRootMotionToMotor(); entity.animator.Play(EntryStateHash, 0, 0f); entity.animator.Update(0f); battleActionData.Finished = true; } } } }