SanAndreasUnity/Assets/Scripts/Behaviours/Ped/States/CrouchState.cs
2020-05-31 19:09:45 +02:00

92 lines
2.1 KiB
C#

using UnityEngine;
using SanAndreasUnity.Utilities;
using SanAndreasUnity.Importing.Animation;
namespace SanAndreasUnity.Behaviours.Peds.States
{
public class CrouchState : BaseMovementState
{
public override AnimId movementAnim { get { return new AnimId ("ped", "WEAPON_crouch"); } }
public override AnimId movementWeaponAnim { get { return this.movementAnim; } }
protected override void SwitchToMovementState ()
{
// can only switch to CrouchMove state
if( m_ped.Movement.sqrMagnitude > float.Epsilon )
{
m_ped.SwitchState<CrouchMoveState>();
}
}
protected override void SwitchToAimState ()
{
CrouchState.SwitchToAimState(m_ped);
}
public static void SwitchToAimState(Ped ped)
{
// can only switch to CrouchAim state
if( ped.IsAimOn && ped.IsHoldingWeapon )
{
ped.SwitchState<CrouchAimState>();
}
}
protected override void UpdateAnims ()
{
base.UpdateAnims();
// if( !this.IsActiveState )
// return;
CrouchState.AdjustRootFramePosition(m_ped);
}
public static void AdjustRootFramePosition(Ped ped)
{
// we need to adjust local position of some bones - root frame needs to be 0.5 units below the ped
var model = ped.PlayerModel;
if (null == model.RootFrame)
return;
if (null == model.UnnamedFrame)
return;
// for some reason, y position always remains 0.25
// m_model.UnnamedFrame.transform.localPosition = m_model.UnnamedFrame.transform.localPosition.WithXAndZ();
Vector3 pos = model.RootFrame.transform.localPosition;
pos.y = -0.5f - model.UnnamedFrame.transform.localPosition.y;
model.RootFrame.transform.localPosition = pos;
}
public override void OnJumpPressed ()
{
// switch to stand state
// it's better to do this event-based, because after switching to stand state, we may enter
// jump state right after it
// we can't switch to stand state, because that will cause ped to jump (jump button will be on)
// m_ped.SwitchState<StandState>();
}
public override void OnCrouchButtonPressed ()
{
// switch to stand state
if (m_isServer)
m_ped.SwitchState<StandState>();
else
base.OnCrouchButtonPressed();
}
}
}