actionrepairtent.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. class RepairTentActionReciveData : ActionReciveData
  2. {
  3. string m_DamageZoneRecived;
  4. }
  5. class RepairTentActionData : ActionData
  6. {
  7. string m_DamageZone;
  8. }
  9. class ActionRepairTentCB : ActionContinuousBaseCB
  10. {
  11. override void CreateActionComponent()
  12. {
  13. m_ActionData.m_ActionComponent = new CAContinuousTime(UATimeSpent.BASEBUILDING_REPAIR_FAST);
  14. }
  15. };
  16. class ActionRepairTent: ActionContinuousBase
  17. {
  18. typename m_LastValidType; //legacy stuff
  19. string m_CurrentDamageZone = "";
  20. int m_LastValidComponentIndex = -1; //legacy stuff
  21. void ActionRepairTent()
  22. {
  23. m_CallbackClass = ActionRepairTentCB;
  24. m_SpecialtyWeight = UASoftSkillsWeight.PRECISE_LOW;
  25. m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_INTERACT;
  26. m_FullBody = true;
  27. m_StanceMask = DayZPlayerConstants.STANCEMASK_ERECT | DayZPlayerConstants.STANCEMASK_CROUCH;
  28. m_Text = "#repair";
  29. }
  30. override void CreateConditionComponents()
  31. {
  32. m_ConditionItem = new CCINonRuined; //?
  33. m_ConditionTarget = new CCTCursorParent(UAMaxDistances.SMALL);
  34. }
  35. override bool IsUsingProxies()
  36. {
  37. return true;
  38. }
  39. override bool HasTarget()
  40. {
  41. return true;
  42. }
  43. override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
  44. {
  45. Object targetObject = target.GetObject();
  46. Object targetParent = target.GetParent();
  47. if ( !targetParent || !targetParent.IsInherited(TentBase) )
  48. return false;
  49. if ( player && targetObject && targetParent )
  50. {
  51. array<string> selections = new array<string>;
  52. PluginRepairing module_repairing;
  53. Class.CastTo(module_repairing, GetPlugin(PluginRepairing));
  54. targetObject.GetActionComponentNameList(target.GetComponentIndex(), selections, "view");
  55. TentBase tent = TentBase.Cast( targetParent );
  56. string damageZone = "";
  57. for (int s = 0; s < selections.Count(); s++)
  58. {
  59. if ( DamageSystem.GetDamageZoneFromComponentName(tent, selections[s], damageZone) ) //NOTE: relevant fire geometry and view geometry selection names MUST match in order to get a valid damage zone
  60. {
  61. //Print("selections[s]: " + selections[s] + " | damageZone: " + damageZone);
  62. break;
  63. }
  64. }
  65. if ( damageZone != "" )
  66. {
  67. if (module_repairing.CanRepair(item,tent,damageZone))
  68. {
  69. m_CurrentDamageZone = damageZone;
  70. return true;
  71. }
  72. }
  73. }
  74. return false;
  75. }
  76. override void OnFinishProgressServer( ActionData action_data )
  77. {
  78. Object targetObject = action_data.m_Target.GetObject();
  79. Object targetParent = action_data.m_Target.GetParent();
  80. string damageZone = RepairTentActionData.Cast(action_data).m_DamageZone;
  81. if (!GetGame().IsMultiplayer())
  82. damageZone = m_CurrentDamageZone;
  83. if ( targetParent && targetParent.IsInherited(TentBase) && damageZone != "" )
  84. {
  85. TentBase tent = TentBase.Cast( targetParent );
  86. PluginRepairing module_repairing;
  87. Class.CastTo(module_repairing, GetPlugin(PluginRepairing));
  88. RepairDamageTransfer(action_data.m_Player,action_data.m_MainItem,tent,m_SpecialtyWeight,damageZone);
  89. module_repairing.Repair(action_data.m_Player,action_data.m_MainItem,tent,m_SpecialtyWeight,damageZone);
  90. }
  91. }
  92. override ActionData CreateActionData()
  93. {
  94. RepairTentActionData action_data = new RepairTentActionData;
  95. return action_data;
  96. }
  97. override void WriteToContext(ParamsWriteContext ctx, ActionData action_data)
  98. {
  99. super.WriteToContext(ctx, action_data);
  100. RepairTentActionData repair_action_data;
  101. if( HasTarget() && Class.CastTo(repair_action_data,action_data) )
  102. {
  103. repair_action_data.m_DamageZone = m_CurrentDamageZone;
  104. ctx.Write(repair_action_data.m_DamageZone);
  105. }
  106. }
  107. override bool ReadFromContext(ParamsReadContext ctx, out ActionReciveData action_recive_data )
  108. {
  109. if(!action_recive_data)
  110. {
  111. action_recive_data = new RepairTentActionReciveData;
  112. }
  113. super.ReadFromContext(ctx, action_recive_data);
  114. RepairTentActionReciveData recive_data_repair = RepairTentActionReciveData.Cast(action_recive_data);
  115. if( HasTarget() )
  116. {
  117. string zone;
  118. if ( !ctx.Read(zone) )
  119. return false;
  120. recive_data_repair.m_DamageZoneRecived = zone;
  121. }
  122. return true;
  123. }
  124. override void HandleReciveData(ActionReciveData action_recive_data, ActionData action_data)
  125. {
  126. super.HandleReciveData(action_recive_data, action_data);
  127. RepairTentActionReciveData recive_data_repair = RepairTentActionReciveData.Cast(action_recive_data);
  128. RepairTentActionData.Cast(action_data).m_DamageZone = recive_data_repair.m_DamageZoneRecived;
  129. }
  130. void RepairDamageTransfer(PlayerBase player, ItemBase repair_kit, ItemBase item, float specialty_weight, string damage_zone = "") //hack; mirrors current config setup, replace with either native DamageSystem methods, or script-side DamageSystem systemic solution
  131. {
  132. float transfer_to_global_coef = 0;
  133. array<string> transfer_zones = new array<string>;
  134. string path = "" + CFG_VEHICLESPATH + " " + item.GetType() + " DamageSystem DamageZones " + damage_zone;
  135. PluginRepairing module_repairing;
  136. Class.CastTo(module_repairing, GetPlugin(PluginRepairing));
  137. GetGame().ConfigGetTextArray("" + path + " transferToZonesNames", transfer_zones);
  138. for (int i = 0; i < transfer_zones.Count(); i++)
  139. {
  140. transfer_to_global_coef += GetGame().ConfigGetFloat("" + path + " Health transferToGlobalCoef");
  141. if (transfer_zones.Get(i) == damage_zone)
  142. continue;
  143. module_repairing.Repair(player,repair_kit,item,specialty_weight,transfer_zones.Get(i),false);
  144. }
  145. //finally, repairs global
  146. if (transfer_to_global_coef > 0)
  147. {
  148. module_repairing.Repair(player,repair_kit,item,specialty_weight,"",false);
  149. }
  150. }
  151. };