actionpushcar.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. class ActionPushCarData : ActionPushObjectData
  2. {
  3. int m_PushDirection = -1;
  4. float m_HorizontalDirectionRandom = 1.0;
  5. float m_VerticalDirectionRandom = 1.0;
  6. // deprecated
  7. CarScript m_Car;
  8. }
  9. class CAContinuousRepeatPushCar : CAContinuousRepeatPushObject
  10. {
  11. override float GetProgressWidgetMultiplier()
  12. {
  13. return 2.5;
  14. }
  15. }
  16. class ActionPushCarCB : ActionPushObjectCB
  17. {
  18. protected float PUSH_FORCE_IMPULSE_INCREMENT = 200.0;
  19. private ActionPushCarData m_ActionDataPushCar;
  20. override void CreateActionComponent()
  21. {
  22. m_ActionData.m_ActionComponent = new CAContinuousRepeatPushCar(UATimeSpent.PUSH_CAR);
  23. }
  24. override protected void ApplyForce(ActionPushObjectData actionData)
  25. {
  26. m_ActionDataPushCar = ActionPushCarData.Cast(m_ActionData);
  27. CarScript car = CarScript.Cast(actionData.m_Object);
  28. m_ActionDataPushCar.m_HorizontalDirectionRandom = Math.RandomFloat(1.0, 3.5);
  29. m_ActionDataPushCar.m_VerticalDirectionRandom = Math.RandomFloat(-0.5, 0.5);
  30. float bodyMass = dBodyGetMass(car);
  31. float invBodyMass = 1.0 / bodyMass;
  32. float force = bodyMass * PUSH_FORCE_IMPULSE_INCREMENT * car.GetPushForceCoefficientMultiplier();
  33. float easedProgress = Easing.EaseInOutSine(actionData.m_ActionComponent.GetProgress());
  34. vector impulse = car.GetDirection() * force * (float)m_ActionDataPushCar.m_PushDirection;
  35. impulse = impulse * invBodyMass;
  36. impulse[0] = impulse[0] * m_ActionDataPushCar.m_HorizontalDirectionRandom;
  37. impulse[1] = impulse[1] * m_ActionDataPushCar.m_VerticalDirectionRandom;
  38. impulse = impulse * easedProgress;
  39. actionData.m_Player.DepleteStamina(EStaminaModifiers.PUSH_CAR);
  40. dBodyApplyImpulseAt(car, impulse, car.ModelToWorld(car.GetEnginePos()));
  41. }
  42. }
  43. class ActionPushCar : ActionPushObject
  44. {
  45. void ActionPushCar()
  46. {
  47. m_CallbackClass = ActionPushCarCB;
  48. m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_VEHICLE_PUSH;
  49. m_FullBody = true;
  50. m_StanceMask = DayZPlayerConstants.STANCEMASK_ERECT;
  51. m_Text = "#push_car";
  52. }
  53. override bool ActionCondition(PlayerBase player, ActionTarget target, ItemBase item)
  54. {
  55. if (!super.ActionCondition(player, target, item))
  56. return false;
  57. if (!IsInReach(player, target, UAMaxDistances.SMALL))
  58. return false;
  59. return true;
  60. }
  61. override ActionData CreateActionData()
  62. {
  63. ActionPushObjectData data = new ActionPushCarData();
  64. return data;
  65. }
  66. override void OnStartServer(ActionData action_data)
  67. {
  68. super.OnStartServer(action_data);
  69. ActionPushCarData data = ActionPushCarData.Cast(action_data);
  70. Car carObj = Car.Cast(data.m_Object);
  71. if (carObj)
  72. {
  73. carObj.SetBrake(0.0);
  74. carObj.SetHandbrake(0.0);
  75. carObj.SetBrakesActivateWithoutDriver(false);
  76. }
  77. data.m_PushDirection = -1;
  78. if (GetDirectionDot(data.m_Object, data.m_Player) > 0)
  79. data.m_PushDirection = 1;
  80. }
  81. override void OnEndServer(ActionData action_data)
  82. {
  83. super.OnEndServer(action_data);
  84. ActionPushObjectData data = ActionPushObjectData.Cast(action_data);
  85. Car carObj = Car.Cast(data.m_Object);
  86. if (carObj)
  87. carObj.SetBrakesActivateWithoutDriver(true);
  88. }
  89. protected float GetDirectionDot(Object target, EntityAI player)
  90. {
  91. return vector.Dot(target.GetDirection(), player.GetDirection());
  92. }
  93. //! DEPRECATED
  94. private CarScript GetCar(ActionTarget target)
  95. {
  96. return CarScript.Cast(GetPushObject(target));
  97. }
  98. }
  99. // deprecated
  100. class ActionPushCarDataReceiveData : ActionPushObjectDataReceiveData
  101. {
  102. CarScript m_Car;
  103. }