actionbuildshelter.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. class ActionBuildShelter: ActionContinuousBase
  2. {
  3. string m_SoundsetBuildStart;
  4. string m_SoundsetBuildLoop;
  5. string m_SoundsetBuildFinish;
  6. ref protected EffectSound m_BuildLoopSound;
  7. void ActionBuildShelter()
  8. {
  9. m_CallbackClass = ActionBuildPartCB;
  10. m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DEPLOY_2HD;
  11. m_FullBody = true;
  12. m_StanceMask = DayZPlayerConstants.STANCEMASK_ERECT | DayZPlayerConstants.STANCEMASK_CROUCH;
  13. m_Text = "#build_shelter_leather";
  14. }
  15. void ~ActionBuildShelter()
  16. {
  17. DestroyActionLoopSound();
  18. }
  19. override void CreateConditionComponents()
  20. {
  21. m_ConditionItem = new CCINone;
  22. m_ConditionTarget = new CCTCursor;
  23. }
  24. override string GetText()
  25. {
  26. PlayerBase player = PlayerBase.Cast( GetGame().GetPlayer() );
  27. if ( player )
  28. {
  29. ConstructionActionData construction_action_data = player.GetConstructionActionData();
  30. ConstructionPart constrution_part = construction_action_data.GetBuildPartNoToolAtIndex(m_VariantID);
  31. if ( constrution_part )
  32. {
  33. string ret = "";
  34. switch (constrution_part.GetName())
  35. {
  36. case "leather":
  37. ret = "#build_shelter_leather";
  38. break;
  39. case "fabric":
  40. ret = "#build_shelter_fabric";
  41. break;
  42. case "stick":
  43. ret = "#build_shelter_stick";
  44. break;
  45. }
  46. }
  47. }
  48. return ret;
  49. }
  50. override void OnActionInfoUpdate( PlayerBase player, ActionTarget target, ItemBase item )
  51. {
  52. ConstructionActionData construction_action_data = player.GetConstructionActionData();
  53. ConstructionPart constrution_part = construction_action_data.GetBuildPartNoToolAtIndex(m_VariantID);
  54. if ( constrution_part )
  55. {
  56. switch (constrution_part.GetName())
  57. {
  58. case "leather":
  59. m_Text = "#build_shelter_leather";
  60. break;
  61. case "fabric":
  62. m_Text = "#build_shelter_fabric";
  63. break;
  64. case "stick":
  65. m_Text = "#build_shelter_stick";
  66. break;
  67. }
  68. }
  69. }
  70. override bool CanBeUsedLeaning()
  71. {
  72. return false;
  73. }
  74. override typename GetInputType()
  75. {
  76. return ContinuousInteractActionInput;
  77. }
  78. override bool UseMainItem()
  79. {
  80. return false;
  81. }
  82. override bool HasProgress()
  83. {
  84. return true;
  85. }
  86. override bool HasAlternativeInterrupt()
  87. {
  88. return false;
  89. }
  90. override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
  91. {
  92. //Action not allowed if player has broken legs
  93. if (player.GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
  94. return false;
  95. if (target.GetObject() && !target.GetObject().CanUseConstructionBuild())
  96. return false;
  97. if ( player.IsPlacingLocal() || player.IsPlacingServer() )
  98. return false;
  99. if ( (!GetGame().IsDedicatedServer()) )
  100. {
  101. if ( MiscGameplayFunctions.ComplexBuildCollideCheckClient(player, target, item, m_VariantID ) )
  102. {
  103. return true;
  104. }
  105. return false;
  106. }
  107. return true;
  108. }
  109. //setup
  110. override bool SetupAction( PlayerBase player, ActionTarget target, ItemBase item, out ActionData action_data, Param extra_data = NULL )
  111. {
  112. if ( super.SetupAction( player, target, item, action_data, extra_data ) )
  113. {
  114. if ( !GetGame().IsDedicatedServer() )
  115. {
  116. ConstructionActionData construction_action_data = action_data.m_Player.GetConstructionActionData();
  117. BuildPartActionData.Cast(action_data).m_PartType = construction_action_data.GetBuildPartNoToolAtIndex(m_VariantID).GetPartName();
  118. }
  119. return true;
  120. }
  121. return false;
  122. }
  123. override ActionData CreateActionData()
  124. {
  125. BuildPartActionData action_data = new BuildPartActionData;
  126. return action_data;
  127. }
  128. override void WriteToContext(ParamsWriteContext ctx, ActionData action_data)
  129. {
  130. super.WriteToContext(ctx, action_data);
  131. ctx.Write(BuildPartActionData.Cast(action_data).m_PartType);
  132. }
  133. override bool ReadFromContext(ParamsReadContext ctx, out ActionReciveData action_recive_data )
  134. {
  135. action_recive_data = new BuildPartActionReciveData;
  136. super.ReadFromContext(ctx, action_recive_data);
  137. string part_type;
  138. if ( ctx.Read(part_type) )
  139. {
  140. BuildPartActionReciveData.Cast( action_recive_data ).m_PartType = part_type;
  141. return true;
  142. }
  143. else
  144. {
  145. return false;
  146. }
  147. }
  148. override void HandleReciveData(ActionReciveData action_recive_data, ActionData action_data)
  149. {
  150. super.HandleReciveData(action_recive_data, action_data);
  151. BuildPartActionData.Cast(action_data).m_PartType = BuildPartActionReciveData.Cast( action_recive_data ).m_PartType;
  152. }
  153. override bool ActionConditionContinue( ActionData action_data )
  154. {
  155. BaseBuildingBase base_building = BaseBuildingBase.Cast( action_data.m_Target.GetObject() );
  156. Construction construction = base_building.GetConstruction();
  157. string part_name = BuildPartActionData.Cast(action_data).m_PartType;
  158. CollisionCheckData check_data = new CollisionCheckData;
  159. check_data.m_PartName = part_name;
  160. check_data.m_AdditionalExcludes.Insert(action_data.m_Player);
  161. return !construction.IsCollidingEx( check_data ) && construction.CanBuildPart( part_name, action_data.m_MainItem, false );
  162. }
  163. override void OnStart( ActionData action_data )
  164. {
  165. super.OnStart(action_data);
  166. action_data.m_Player.TryHideItemInHands(true);
  167. }
  168. override void OnStartClient( ActionData action_data )
  169. {
  170. super.OnStartClient(action_data);
  171. DetermineConstructionSounds(action_data);
  172. PlayActionStartSound(action_data);
  173. }
  174. override void OnStartAnimationLoopClient( ActionData action_data )
  175. {
  176. super.OnStartAnimationLoopClient(action_data);
  177. PlayActionLoopSound(action_data);
  178. }
  179. override void OnEnd( ActionData action_data )
  180. {
  181. super.OnEnd(action_data);
  182. action_data.m_Player.TryHideItemInHands(false);
  183. }
  184. override void OnEndClient( ActionData action_data )
  185. {
  186. super.OnEndClient(action_data);
  187. StopActionLoopSound();
  188. //DestroyActionLoopSound();
  189. }
  190. override void OnFinishProgressServer( ActionData action_data )
  191. {
  192. BaseBuildingBase base_building = BaseBuildingBase.Cast( action_data.m_Target.GetObject() );
  193. Construction construction = base_building.GetConstruction();
  194. string part_name = BuildPartActionData.Cast(action_data).m_PartType;
  195. if ( !construction.IsColliding( part_name ) && construction.CanBuildPart( part_name, action_data.m_MainItem, false ) )
  196. {
  197. //build
  198. construction.BuildPartServer( action_data.m_Player, part_name, AT_BUILD_PART );
  199. }
  200. }
  201. override void OnFinishProgressClient( ActionData action_data )
  202. {
  203. super.OnFinishProgressClient(action_data);
  204. PlayActionFinishSound(action_data);
  205. }
  206. void DetermineConstructionSounds( ActionData action_data )
  207. {
  208. ConstructionActionData construction_action_data = action_data.m_Player.GetConstructionActionData();
  209. ConstructionPart constrution_part = construction_action_data.GetBuildPartNoToolAtIndex(m_VariantID);;
  210. if (constrution_part)
  211. {
  212. switch (constrution_part.GetName())
  213. {
  214. case "leather":
  215. m_SoundsetBuildStart = "Shelter_Leather_Build_Start_SoundSet";
  216. m_SoundsetBuildLoop = "Shelter_Leather_Build_Loop_SoundSet";
  217. m_SoundsetBuildFinish = "Shelter_Leather_Build_Finish_SoundSet";
  218. break;
  219. case "fabric":
  220. m_SoundsetBuildStart = "Shelter_Fabric_Build_Start_SoundSet";
  221. m_SoundsetBuildLoop = "Shelter_Fabric_Build_Loop_SoundSet";
  222. m_SoundsetBuildFinish = "Shelter_Fabric_Build_Finish_SoundSet";
  223. break;
  224. case "stick":
  225. m_SoundsetBuildStart = "Shelter_Wooden_Stick_Build_Start_SoundSet";
  226. m_SoundsetBuildLoop = "Shelter_Wooden_Stick_Build_Loop_SoundSet";
  227. m_SoundsetBuildFinish = "Shelter_Wooden_Stick_Build_Finish_SoundSet";
  228. break;
  229. default:
  230. m_SoundsetBuildStart = "";
  231. m_SoundsetBuildLoop = "";
  232. m_SoundsetBuildFinish = "";
  233. break;
  234. }
  235. }
  236. }
  237. void PlayActionStartSound( ActionData action_data )
  238. {
  239. EffectSound sound = SEffectManager.PlaySound(m_SoundsetBuildStart, action_data.m_Target.GetObject().GetPosition());
  240. sound.SetAutodestroy( true );
  241. }
  242. void PlayActionLoopSound( ActionData action_data )
  243. {
  244. if ( !m_BuildLoopSound || !m_BuildLoopSound.IsSoundPlaying() )
  245. {
  246. m_BuildLoopSound = SEffectManager.PlaySound( m_SoundsetBuildLoop, action_data.m_Target.GetObject().GetPosition(), 0, 0, true );
  247. }
  248. }
  249. void StopActionLoopSound()
  250. {
  251. if (m_BuildLoopSound)
  252. {
  253. m_BuildLoopSound.SetSoundFadeOut(0.5);
  254. m_BuildLoopSound.SoundStop();
  255. }
  256. }
  257. void DestroyActionLoopSound()
  258. {
  259. SEffectManager.DestroyEffect( m_BuildLoopSound );
  260. }
  261. void PlayActionFinishSound( ActionData action_data )
  262. {
  263. EffectSound sound = SEffectManager.PlaySound(m_SoundsetBuildFinish, action_data.m_Target.GetObject().GetPosition());
  264. sound.SetAutodestroy( true );
  265. }
  266. override string GetSoundCategory(ActionData action_data)
  267. {
  268. return "Base_building";
  269. }
  270. }