actionpushobject.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. class ActionPushObjectDataReceiveData : ActionReciveData
  2. {
  3. Object m_PushTarget;
  4. }
  5. class ActionPushObjectData : ActionData
  6. {
  7. bool m_NeedUpdate;
  8. int m_EndType = 0;
  9. vector m_Origin = "0 0 0";
  10. Object m_Object;
  11. }
  12. class CAContinuousRepeatPushObject : CAContinuousRepeat
  13. {
  14. void CAContinuousRepeatPushObject(float time_to_complete_action)
  15. {
  16. m_DefaultTimeToComplete = time_to_complete_action;
  17. }
  18. override int Execute(ActionData action_data)
  19. {
  20. if (!action_data.m_Player)
  21. return UA_ERROR;
  22. if (m_TimeElpased < m_TimeToComplete)
  23. {
  24. m_TimeElpased += action_data.m_Player.GetDeltaT();
  25. m_TotalTimeElpased += action_data.m_Player.GetDeltaT();
  26. return UA_PROCESSING;
  27. }
  28. else
  29. {
  30. m_SpentUnits.param1 = m_TimeElpased;
  31. SetACData(m_SpentUnits);
  32. m_TimeElpased = m_TimeToComplete - m_TimeElpased;
  33. OnCompletePogress(action_data);
  34. return UA_CANCEL;
  35. }
  36. return UA_FINISHED;
  37. }
  38. }
  39. class ActionPushObjectCB : ActionContinuousBaseCB
  40. {
  41. protected float PUSH_FORCE_INCREMENT = 3000.0;
  42. protected ActionPushObjectData m_ActionDataPushObject;
  43. override void CreateActionComponent()
  44. {
  45. m_ActionData.m_ActionComponent = new CAContinuousRepeatPushObject(10);
  46. }
  47. override void ProgressActionComponent()
  48. {
  49. super.ProgressActionComponent();
  50. ActionPushObjectData data = ActionPushObjectData.Cast(m_ActionData);
  51. ApplyForce(data);
  52. }
  53. override void EndActionComponent()
  54. {
  55. m_ActionDataPushObject = ActionPushObjectData.Cast(m_ActionData);
  56. if (!m_ActionDataPushObject)
  57. {
  58. super.EndActionComponent();
  59. return;
  60. }
  61. if (m_ActionDataPushObject.m_State == UA_FINISHED)
  62. {
  63. if (m_ActionDataPushObject.m_EndType == 1)
  64. SetCommand(DayZPlayerConstants.CMD_ACTIONINT_FINISH);
  65. else if (m_ActionDataPushObject.m_EndType == 0)
  66. SetCommand(DayZPlayerConstants.CMD_ACTIONINT_END);
  67. }
  68. else if (m_ActionDataPushObject.m_State == UA_CANCEL)
  69. {
  70. ActionContinuousBase action = ActionContinuousBase.Cast(m_ActionDataPushObject.m_Action);
  71. if (action.HasAlternativeInterrupt())
  72. SetCommand(DayZPlayerConstants.CMD_ACTIONINT_FINISH);
  73. else
  74. SetCommand(DayZPlayerConstants.CMD_ACTIONINT_END);
  75. return;
  76. }
  77. m_ActionDataPushObject.m_State = UA_FINISHED;
  78. }
  79. protected void ApplyForce(ActionPushObjectData actionData)
  80. {
  81. Object entity = actionData.m_Object;
  82. float bodyMass = dBodyGetMass(entity);
  83. float invBodyMass = 1.0 / bodyMass;
  84. float force = bodyMass * PUSH_FORCE_INCREMENT;
  85. float easedProgress = Easing.EaseInOutSine(actionData.m_ActionComponent.GetProgress());
  86. vector impulse = force * actionData.m_Player.GetDirection() * invBodyMass * easedProgress;
  87. actionData.m_Player.DepleteStamina(EStaminaModifiers.PUSH_CAR);
  88. dBodyApplyImpulseAt(entity, impulse, entity.ModelToWorld(vector.Zero));
  89. }
  90. }
  91. class ActionPushObject : ActionContinuousBase
  92. {
  93. override typename GetInputType()
  94. {
  95. return ContinuousInteractActionInput;
  96. }
  97. override void CreateConditionComponents()
  98. {
  99. m_ConditionItem = new CCINotPresent();
  100. m_ConditionTarget = new CCTCursorNoRuinCheck(UAMaxDistances.DEFAULT);
  101. }
  102. override bool HasAlternativeInterrupt()
  103. {
  104. return true;
  105. }
  106. override ActionData CreateActionData()
  107. {
  108. ActionPushObjectData data = new ActionPushObjectData();
  109. return data;
  110. }
  111. override bool ActionCondition(PlayerBase player, ActionTarget target, ItemBase item)
  112. {
  113. if (!player.IsPlayerInStance(DayZPlayerConstants.STANCEMASK_ERECT|DayZPlayerConstants.STANCEMASK_CROUCH))
  114. return false;
  115. if (player.PhysicsGetLinkedEntity() == target.GetObject())
  116. return false;
  117. if (!player.GetSurfaceType())
  118. return false;
  119. if (!player.CanConsumeStamina(EStaminaConsumers.PUSH))
  120. return false;
  121. return true;
  122. }
  123. override void OnUpdate(ActionData action_data)
  124. {
  125. super.OnUpdate(action_data);
  126. ActionPushObjectData data = ActionPushObjectData.Cast(action_data);
  127. if (data.m_NeedUpdate)
  128. {
  129. if (!data.m_Player.CanConsumeStamina(EStaminaConsumers.PUSH))
  130. {
  131. data.m_State = UA_CANCEL;
  132. data.m_NeedUpdate = false;
  133. return;
  134. }
  135. if (vector.Distance(data.m_Object.GetPosition(), data.m_Origin) > 0.5)
  136. {
  137. data.m_State = UA_FINISHED;
  138. data.m_EndType = 0;
  139. data.m_NeedUpdate = false;
  140. }
  141. }
  142. }
  143. override void OnStart(ActionData action_data)
  144. {
  145. super.OnStart(action_data);
  146. ActionPushObjectData data = ActionPushObjectData.Cast(action_data);
  147. data.m_Object = GetPushObject(action_data.m_Target);
  148. data.m_Origin = data.m_Object.GetPosition();
  149. data.m_NeedUpdate = true;
  150. }
  151. override void OnEndInput(ActionData action_data)
  152. {
  153. super.OnEndInput(action_data);
  154. ActionPushObjectData data = ActionPushObjectData.Cast(action_data);
  155. data.m_State = UA_CANCEL;
  156. data.m_EndType = 1;
  157. data.m_NeedUpdate = false;
  158. }
  159. protected Object GetPushObject(ActionTarget target)
  160. {
  161. if (target.IsProxy())
  162. return target.GetParent();
  163. return target.GetObject();
  164. }
  165. }