DayZPlayerImplementJumpClimb.c
class DayZPlayerImplementJumpClimb
{
bool m_bIsJumpInProgress;
private DayZPlayerImplement m_Player;
private bool m_bWasClimb;
void DayZPlayerImplementJumpClimb(DayZPlayerImplement pPlayer)
{
m_Player = pPlayer;
}
//! Only valid immediately after 'JumpOrClimb' is called
bool WasSuccessful()
{
return m_bIsJumpInProgress || m_bWasClimb;
}
//! Can't change to bool return
void JumpOrClimb()
{
//! Reset states
m_bWasClimb = false;
//! Early exit if the player is being heavy damaged so the stagger animation can't be skipped
if (m_Player.IsInFullbodyDamageAnimation())
return;
SHumanCommandClimbSettings hcls = m_Player.GetDayZPlayerType().CommandClimbSettingsW();
if (m_Player.m_MovementState.m_iMovement != DayZPlayerConstants.MOVEMENTIDX_IDLE)
hcls.m_fFwMaxDistance = 2.5;
else
hcls.m_fFwMaxDistance = 1.2;
if (m_Player.m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_SWIM)
hcls.m_fBackwardsCheckDist = 0.35;
else
hcls.m_fBackwardsCheckDist = 0;
SHumanCommandClimbResult climbRes = new SHumanCommandClimbResult();
HumanCommandClimb.DoPerformClimbTest(m_Player, climbRes, 0);
if (climbRes.m_bIsClimb || climbRes.m_bIsClimbOver)
{
int climbType = GetClimbType(climbRes.m_fClimbHeight);
if (!m_Player.CanClimb(climbType, climbRes))
return;
if (Climb(climbRes))
{
if (climbType == 1)
m_Player.DepleteStamina(EStaminaModifiers.VAULT);
else if (climbType == 2)
m_Player.DepleteStamina(EStaminaModifiers.CLIMB);
return;
}
}
if (m_Player.CanJump())
{
Jump();
m_Player.DepleteStamina(EStaminaModifiers.JUMP);
}
}
void CheckAndFinishJump(int pLandType = 0)
{
if ( m_bIsJumpInProgress )
{
m_bIsJumpInProgress = false;
m_Player.OnJumpEnd(pLandType);
}
}
private bool Climb(SHumanCommandClimbResult pClimbRes)
{
int climbType = GetClimbType(pClimbRes.m_fClimbHeight);
if (climbType != -1)
{
m_Player.StartCommand_Climb(pClimbRes, climbType);
m_Player.StopHandEvent();
m_bWasClimb = true;
}
return climbType != -1;
}
private void Jump()
{
m_bIsJumpInProgress = true;
m_Player.SetFallYDiff(m_Player.PhysicsGetPositionWS()[1]);
m_Player.OnJumpStart();
m_Player.StartCommand_Fall(2.6);
m_Player.StopHandEvent();
}
private int GetClimbType(float pHeight)
{
int climbType = -1;
if (pHeight < 1.1)
climbType = 0;
else if (pHeight >= 1.1 && pHeight < 1.7)
climbType = 1;
else if (pHeight >= 1.7 && pHeight < 2.75)
climbType = 2;
return climbType;
}
}