actionpushcar.c 3.2 KB

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