96 lines
3.6 KiB
C#
96 lines
3.6 KiB
C#
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<BattleActionParameters> 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;
|
|
}
|
|
}
|
|
}
|
|
} |