actionbuildpart.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. class BuildPartActionReciveData : ActionReciveData
  2. {
  3. string m_PartType;
  4. }
  5. class BuildPartActionData : ActionData
  6. {
  7. string m_PartType;
  8. };
  9. class ActionBuildPartCB : ActionContinuousBaseCB
  10. {
  11. override void CreateActionComponent()
  12. {
  13. float time = SetCallbackDuration(m_ActionData.m_MainItem);
  14. m_ActionData.m_ActionComponent = new CAContinuousTime(time);
  15. }
  16. float SetCallbackDuration(ItemBase item)
  17. {
  18. return UATimeSpent.BASEBUILDING_CONSTRUCT_MEDIUM;
  19. }
  20. };
  21. class ActionBuildPart: ActionContinuousBase
  22. {
  23. void ActionBuildPart()
  24. {
  25. m_CallbackClass = ActionBuildPartCB;
  26. m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_ASSEMBLE;
  27. m_FullBody = true;
  28. m_StanceMask = DayZPlayerConstants.STANCEMASK_ERECT;
  29. m_SpecialtyWeight = UASoftSkillsWeight.ROUGH_HIGH;
  30. m_Text = "#build";
  31. }
  32. override void CreateConditionComponents()
  33. {
  34. m_ConditionItem = new CCINonRuined;
  35. m_ConditionTarget = new CCTNone;
  36. }
  37. override void OnActionInfoUpdate(PlayerBase player, ActionTarget target, ItemBase item)
  38. {
  39. ConstructionActionData construction_action_data = player.GetConstructionActionData();
  40. ConstructionPart constrution_part = construction_action_data.GetBuildPartAtIndex(m_VariantID);
  41. if (constrution_part)
  42. {
  43. m_Text = "#build " + constrution_part.GetName();
  44. }
  45. }
  46. override bool CanBeUsedLeaning()
  47. {
  48. return false;
  49. }
  50. override bool CanBeUsedInFreelook()
  51. {
  52. return false;
  53. }
  54. override bool ActionCondition(PlayerBase player, ActionTarget target, ItemBase item)
  55. {
  56. if (player.IsPlacingLocal() || player.IsPlacingServer())
  57. return false;
  58. //Action not allowed if player has broken legs
  59. if (player.GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
  60. return false;
  61. //gate..
  62. if (target.GetObject() && (!target.GetObject().CanUseConstructionBuild() || target.GetObject().CanUseHandConstruction()))
  63. return false;
  64. if ((!GetGame().IsDedicatedServer()))
  65. {
  66. if (MiscGameplayFunctions.ComplexBuildCollideCheckClient(player, target, item, m_VariantID))
  67. {
  68. return true;
  69. }
  70. return false;
  71. }
  72. return true;
  73. }
  74. override bool ActionConditionContinue(ActionData action_data)
  75. {
  76. BaseBuildingBase base_building = BaseBuildingBase.Cast(action_data.m_Target.GetObject());
  77. Construction construction = base_building.GetConstruction();
  78. string part_name = BuildPartActionData.Cast(action_data).m_PartType;
  79. CollisionCheckData check_data = new CollisionCheckData;
  80. check_data.m_PartName = part_name;
  81. check_data.m_AdditionalExcludes.Insert(action_data.m_Player);
  82. bool canBuild = construction.CanBuildPart(part_name, action_data.m_MainItem, true);
  83. if (GetGame().IsServer())
  84. {
  85. bool collides = construction.IsCollidingEx(check_data);
  86. return !collides && canBuild;
  87. }
  88. else
  89. {
  90. return canBuild;
  91. }
  92. }
  93. override void OnFinishProgressServer(ActionData action_data)
  94. {
  95. BaseBuildingBase base_building = BaseBuildingBase.Cast(action_data.m_Target.GetObject());
  96. Construction construction = base_building.GetConstruction();
  97. string part_name = BuildPartActionData.Cast(action_data).m_PartType;
  98. CollisionCheckData check_data = new CollisionCheckData;
  99. check_data.m_PartName = part_name;
  100. check_data.m_AdditionalExcludes.Insert(action_data.m_Player);
  101. if (!construction.IsCollidingEx(check_data) && construction.CanBuildPart(part_name, action_data.m_MainItem, true)) //redundant at this point?
  102. {
  103. //build
  104. construction.BuildPartServer(action_data.m_Player, part_name, AT_BUILD_PART);
  105. //add damage to tool
  106. action_data.m_MainItem.DecreaseHealth(UADamageApplied.BUILD, false);
  107. }
  108. }
  109. override string GetSoundCategory(ActionData action_data)
  110. {
  111. return "Base_building";
  112. }
  113. override ActionData CreateActionData()
  114. {
  115. BuildPartActionData action_data = new BuildPartActionData;
  116. return action_data;
  117. }
  118. //setup
  119. override bool SetupAction(PlayerBase player, ActionTarget target, ItemBase item, out ActionData action_data, Param extra_data = NULL)
  120. {
  121. if (super.SetupAction(player, target, item, action_data, extra_data))
  122. {
  123. SetBuildingAnimation(item);
  124. if (!GetGame().IsDedicatedServer())
  125. {
  126. ConstructionActionData construction_action_data = action_data.m_Player.GetConstructionActionData();
  127. BuildPartActionData.Cast(action_data).m_PartType = construction_action_data.GetBuildPartAtIndex(m_VariantID).GetPartName();
  128. }
  129. return true;
  130. }
  131. return false;
  132. }
  133. protected void SetBuildingAnimation(ItemBase item)
  134. {
  135. switch (item.Type())
  136. {
  137. case Pickaxe:
  138. case Shovel:
  139. case FarmingHoe:
  140. case FieldShovel:
  141. m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DIG;
  142. break;
  143. case Pliers:
  144. m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_INTERACT;
  145. break;
  146. case SledgeHammer:
  147. m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_MINEROCK;
  148. break;
  149. default:
  150. m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_ASSEMBLE;
  151. break;
  152. }
  153. }
  154. override void WriteToContext(ParamsWriteContext ctx, ActionData action_data)
  155. {
  156. super.WriteToContext(ctx, action_data);
  157. ctx.Write(BuildPartActionData.Cast(action_data).m_PartType);
  158. }
  159. override bool ReadFromContext(ParamsReadContext ctx, out ActionReciveData action_recive_data)
  160. {
  161. action_recive_data = new BuildPartActionReciveData;
  162. super.ReadFromContext(ctx, action_recive_data);
  163. string part_type;
  164. if (ctx.Read(part_type))
  165. {
  166. BuildPartActionReciveData.Cast(action_recive_data).m_PartType = part_type;
  167. return true;
  168. }
  169. else
  170. {
  171. return false;
  172. }
  173. }
  174. override void HandleReciveData(ActionReciveData action_recive_data, ActionData action_data)
  175. {
  176. super.HandleReciveData(action_recive_data, action_data);
  177. BuildPartActionData.Cast(action_data).m_PartType = BuildPartActionReciveData.Cast(action_recive_data).m_PartType;
  178. }
  179. override string GetAdminLogMessage(ActionData action_data)
  180. {
  181. ConstructionActionData construction_action_data = action_data.m_Player.GetConstructionActionData();
  182. string partName = BuildPartActionData.Cast(action_data).m_PartType;
  183. string message = string.Format("Built %1 on %2 with %3", partName, action_data.m_Target.GetObject().GetDisplayName(), action_data.m_MainItem.GetDisplayName());
  184. return message;
  185. }
  186. }
  187. class ActionActionBuildPartNoTool: ActionBuildPart
  188. {
  189. override typename GetInputType()
  190. {
  191. return ContinuousInteractActionInput;
  192. }
  193. override bool UseMainItem()
  194. {
  195. return false;
  196. }
  197. override bool HasProgress()
  198. {
  199. return true;
  200. }
  201. override bool HasAlternativeInterrupt()
  202. {
  203. return false;
  204. }
  205. }