dayzplayerimplementjumpclimb.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. class DayZPlayerImplementJumpClimb
  2. {
  3. bool m_bIsJumpInProgress;
  4. private DayZPlayerImplement m_Player;
  5. private bool m_bWasClimb;
  6. void DayZPlayerImplementJumpClimb(DayZPlayerImplement pPlayer)
  7. {
  8. m_Player = pPlayer;
  9. }
  10. //! Only valid immediately after 'JumpOrClimb' is called
  11. bool WasSuccessful()
  12. {
  13. return m_bIsJumpInProgress || m_bWasClimb;
  14. }
  15. //! Can't change to bool return
  16. void JumpOrClimb()
  17. {
  18. //! Reset states
  19. m_bWasClimb = false;
  20. //! Early exit if the player is being heavy damaged so the stagger animation can't be skipped
  21. if (m_Player.IsInFullbodyDamageAnimation())
  22. return;
  23. SHumanCommandClimbSettings hcls = m_Player.GetDayZPlayerType().CommandClimbSettingsW();
  24. if (m_Player.m_MovementState.m_iMovement != DayZPlayerConstants.MOVEMENTIDX_IDLE)
  25. hcls.m_fFwMaxDistance = 2.5;
  26. else
  27. hcls.m_fFwMaxDistance = 1.2;
  28. if (m_Player.m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_SWIM)
  29. hcls.m_fBackwardsCheckDist = 0.35;
  30. else
  31. hcls.m_fBackwardsCheckDist = 0;
  32. SHumanCommandClimbResult climbRes = new SHumanCommandClimbResult();
  33. HumanCommandClimb.DoPerformClimbTest(m_Player, climbRes, 0);
  34. if (climbRes.m_bIsClimb || climbRes.m_bIsClimbOver)
  35. {
  36. int climbType = GetClimbType(climbRes.m_fClimbHeight);
  37. if (!m_Player.CanClimb(climbType, climbRes))
  38. return;
  39. if (Climb(climbRes))
  40. {
  41. if (climbType == 1)
  42. m_Player.DepleteStamina(EStaminaModifiers.VAULT);
  43. else if (climbType == 2)
  44. m_Player.DepleteStamina(EStaminaModifiers.CLIMB);
  45. return;
  46. }
  47. }
  48. if (m_Player.CanJump())
  49. {
  50. Jump();
  51. m_Player.DepleteStamina(EStaminaModifiers.JUMP);
  52. }
  53. }
  54. void CheckAndFinishJump(int pLandType = 0)
  55. {
  56. if ( m_bIsJumpInProgress )
  57. {
  58. m_bIsJumpInProgress = false;
  59. m_Player.OnJumpEnd(pLandType);
  60. }
  61. }
  62. private bool Climb(SHumanCommandClimbResult pClimbRes)
  63. {
  64. int climbType = GetClimbType(pClimbRes.m_fClimbHeight);
  65. if (climbType != -1)
  66. {
  67. m_Player.StartCommand_Climb(pClimbRes, climbType);
  68. m_Player.StopHandEvent();
  69. m_bWasClimb = true;
  70. }
  71. return climbType != -1;
  72. }
  73. private void Jump()
  74. {
  75. m_bIsJumpInProgress = true;
  76. m_Player.SetFallYDiff(m_Player.PhysicsGetPositionWS()[1]);
  77. m_Player.OnJumpStart();
  78. m_Player.StartCommand_Fall(2.6);
  79. m_Player.StopHandEvent();
  80. }
  81. private int GetClimbType(float pHeight)
  82. {
  83. int climbType = -1;
  84. if (pHeight < 1.1)
  85. climbType = 0;
  86. else if (pHeight >= 1.1 && pHeight < 1.7)
  87. climbType = 1;
  88. else if (pHeight >= 1.7 && pHeight < 2.75)
  89. climbType = 2;
  90. return climbType;
  91. }
  92. }