actionrepaircarpart.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. class RepairCarPartActionReciveData : RepairVehiclePartActionReciveData
  2. {}
  3. class RepairCarPartActionData : RepairVehiclePartActionData
  4. {}
  5. class ActionRepairCarPartCB : ActionContinuousBaseCB
  6. {
  7. override void CreateActionComponent()
  8. {
  9. m_ActionData.m_ActionComponent = new CAContinuousTime(UATimeSpent.BASEBUILDING_REPAIR_FAST);
  10. }
  11. }
  12. class ActionRepairCarPart : ActionContinuousBase
  13. {
  14. typename m_LastValidType;
  15. string m_CurrentDamageZone = "";
  16. int m_LastValidComponentIndex = -1;
  17. void ActionRepairCarPart()
  18. {
  19. m_CallbackClass = ActionRepairCarPartCB;
  20. m_SpecialtyWeight = UASoftSkillsWeight.PRECISE_LOW;
  21. m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_INTERACT;
  22. m_StanceMask = DayZPlayerConstants.STANCEMASK_ERECT;
  23. m_FullBody = true;
  24. m_LockTargetOnUse = false;
  25. m_Text = "#repair";
  26. }
  27. override void CreateConditionComponents()
  28. {
  29. m_ConditionItem = new CCINonRuined();
  30. m_ConditionTarget = new CCTCursor(UAMaxDistances.REPAIR);
  31. }
  32. override bool ActionCondition(PlayerBase player, ActionTarget target, ItemBase item)
  33. {
  34. if (player.GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
  35. return false;
  36. Object targetObject = target.GetObject();
  37. Object targetParent = target.GetParent();
  38. CarDoor carDoor = CarDoor.Cast(targetObject);
  39. if (!carDoor || !player)
  40. return false;
  41. if (GetGame().IsMultiplayer() && GetGame().IsServer())
  42. return true;
  43. if (carDoor)
  44. {
  45. //Check if item is attached to car -> If so, block repair if door is closed
  46. if (targetParent != null)
  47. {
  48. InventoryLocation loc = new InventoryLocation();
  49. bool isPresent = carDoor.GetInventory().GetCurrentInventoryLocation(loc);
  50. if (!isPresent || loc.GetSlot() == -1)
  51. return false;
  52. string slotName = InventorySlots.GetSlotName(loc.GetSlot());
  53. if (slotName && CarScript.Cast(targetParent).GetCarDoorsState(slotName) != CarDoorState.DOORS_OPEN)
  54. return false;
  55. }
  56. //Check health level of door
  57. int zoneHP = carDoor.GetHealthLevel("");
  58. return zoneHP > GameConstants.STATE_WORN && zoneHP < GameConstants.STATE_RUINED);
  59. }
  60. return false;
  61. }
  62. override void OnFinishProgressServer(ActionData action_data)
  63. {
  64. Object tgObject = action_data.m_Target.GetObject();
  65. string damageZone = RepairCarPartActionData.Cast(action_data).m_DamageZone;
  66. if (!GetGame().IsMultiplayer())
  67. damageZone = m_CurrentDamageZone;
  68. if (tgObject)
  69. {
  70. CarDoor carDoor = CarDoor.Cast(tgObject);
  71. if (carDoor)
  72. {
  73. int newDmgLevel = Math.Clamp(carDoor.GetHealthLevel(damageZone) - 1, GameConstants.STATE_WORN, GameConstants.STATE_RUINED);
  74. float zoneMax = carDoor.GetMaxHealth("", "");
  75. float randomValue = Math.RandomFloatInclusive(zoneMax * 0.05, zoneMax * 0.15);
  76. switch (newDmgLevel)
  77. {
  78. case GameConstants.STATE_BADLY_DAMAGED:
  79. carDoor.SetHealth("", "", (zoneMax * GameConstants.DAMAGE_RUINED_VALUE) + randomValue);
  80. break;
  81. case GameConstants.STATE_DAMAGED:
  82. carDoor.SetHealth("", "", (zoneMax * GameConstants.DAMAGE_BADLY_DAMAGED_VALUE) + randomValue);
  83. break;
  84. case GameConstants.STATE_WORN:
  85. carDoor.SetHealth("", "", (zoneMax * GameConstants.DAMAGE_DAMAGED_VALUE) + randomValue);
  86. break;
  87. default:
  88. break;
  89. }
  90. if (action_data.m_MainItem.HasQuantity())
  91. {
  92. if (action_data.m_MainItem.GetQuantity() > 1)
  93. {
  94. int qnt = action_data.m_MainItem.GetQuantity();
  95. qnt -= action_data.m_MainItem.GetQuantityMax() * 0.25;
  96. action_data.m_MainItem.SetQuantity(qnt);
  97. }
  98. else
  99. action_data.m_MainItem.Delete();
  100. }
  101. }
  102. }
  103. }
  104. override ActionData CreateActionData()
  105. {
  106. RepairCarPartActionData actionData = new RepairCarPartActionData();
  107. return actionData;
  108. }
  109. override void WriteToContext(ParamsWriteContext ctx, ActionData action_data)
  110. {
  111. super.WriteToContext(ctx, action_data);
  112. RepairCarPartActionData repairActionData;
  113. if (HasTarget() && Class.CastTo(repairActionData, action_data))
  114. {
  115. repairActionData.m_DamageZone = m_CurrentDamageZone;
  116. ctx.Write(repairActionData.m_DamageZone);
  117. }
  118. }
  119. override bool ReadFromContext(ParamsReadContext ctx, out ActionReciveData action_recive_data)
  120. {
  121. if (!action_recive_data)
  122. action_recive_data = new RepairCarPartActionReciveData();
  123. super.ReadFromContext(ctx, action_recive_data);
  124. RepairCarPartActionReciveData reciveDataRepair = RepairCarPartActionReciveData.Cast(action_recive_data);
  125. if (HasTarget())
  126. {
  127. string zone;
  128. if (!ctx.Read(zone))
  129. return false;
  130. reciveDataRepair.m_DamageZoneRecived = zone;
  131. }
  132. return true;
  133. }
  134. override void HandleReciveData(ActionReciveData action_recive_data, ActionData action_data)
  135. {
  136. super.HandleReciveData(action_recive_data, action_data);
  137. RepairCarPartActionReciveData reciveDataRepair = RepairCarPartActionReciveData.Cast(action_recive_data);
  138. RepairCarPartActionData.Cast(action_data).m_DamageZone = reciveDataRepair.m_DamageZoneRecived;
  139. }
  140. }