actiondeployobject.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. class PlaceObjectActionReciveData : ActionReciveData
  2. {
  3. vector m_Position;
  4. vector m_Orientation;
  5. }
  6. class ActionDeployObject : ActionDeployBase
  7. {
  8. void ActionDeployObject()
  9. {
  10. m_CommandUID = 0;
  11. m_StanceMask = DayZPlayerConstants.STANCEMASK_CROUCH | DayZPlayerConstants.STANCEMASK_ERECT;
  12. }
  13. override bool ActionUsesHologram()
  14. {
  15. return true;
  16. }
  17. override bool HasAlternativeInterrupt()
  18. {
  19. return true;
  20. }
  21. override bool IsDeploymentAction()
  22. {
  23. return true;
  24. }
  25. override bool CanBeUsedWithBrokenLegs()
  26. {
  27. return false;
  28. }
  29. override bool ActionCondition(PlayerBase player, ActionTarget target, ItemBase item)
  30. {
  31. //Client
  32. if (!GetGame().IsDedicatedServer())
  33. {
  34. if (player.IsPlacingLocal())
  35. {
  36. if (!player.GetHologramLocal().IsColliding())
  37. {
  38. if (item.CanBePlaced(player, player.GetHologramLocal().GetProjectionEntity().GetPosition()))
  39. {
  40. return true;
  41. }
  42. }
  43. }
  44. return false;
  45. }
  46. //Server
  47. return true;
  48. }
  49. override bool ActionConditionContinue(ActionData action_data)
  50. {
  51. //Server
  52. if (GetGame().IsDedicatedServer())
  53. {
  54. if (action_data.m_Player.IsPlacingServer())
  55. {
  56. if (GetGame().IsMultiplayer())
  57. action_data.m_Player.GetHologramServer().EvaluateCollision(action_data.m_MainItem);
  58. if (!action_data.m_Player.GetHologramServer().IsColliding())
  59. {
  60. if (action_data.m_MainItem.CanBePlaced(action_data.m_Player, action_data.m_Player.GetHologramServer().GetProjectionEntity().GetPosition()))
  61. return true;
  62. }
  63. return false;
  64. }
  65. return false;
  66. }
  67. return true;
  68. }
  69. override bool SetupAction(PlayerBase player, ActionTarget target, ItemBase item, out ActionData action_data, Param extra_data = NULL)
  70. {
  71. if (super.SetupAction(player, target, item, action_data, extra_data))
  72. {
  73. PlaceObjectActionData poActionData = PlaceObjectActionData.Cast(action_data);
  74. if (!poActionData)
  75. return false;
  76. poActionData.m_AlreadyPlaced = false;
  77. if (!GetGame().IsDedicatedServer())
  78. {
  79. player.GetHologramLocal().SetUpdatePosition(false);
  80. Hologram hologram = player.GetHologramLocal();
  81. if (hologram)
  82. {
  83. poActionData.m_Position = hologram.GetProjectionPosition();
  84. poActionData.m_Orientation = hologram.GetProjectionOrientation();
  85. poActionData.m_Player.SetLocalProjectionPosition(poActionData.m_Position);
  86. poActionData.m_Player.SetLocalProjectionOrientation(poActionData.m_Orientation);
  87. }
  88. else
  89. {
  90. return false;
  91. }
  92. }
  93. if (!poActionData.m_MainItem)
  94. return false;
  95. SetupAnimation(poActionData.m_MainItem);
  96. return true;
  97. }
  98. return false;
  99. }
  100. override void OnStartClient(ActionData action_data)
  101. {
  102. PlaceObjectActionData poActionData = PlaceObjectActionData.Cast(action_data);
  103. if (!poActionData)
  104. return;
  105. if (GetGame().IsMultiplayer())
  106. poActionData.m_Player.PlacingCompleteLocal();
  107. }
  108. override void OnStartServer(ActionData action_data)
  109. {
  110. super.OnStartServer(action_data);
  111. PlaceObjectActionData poActionData = PlaceObjectActionData.Cast(action_data);
  112. if (!poActionData)
  113. return;
  114. if (GetGame().IsMultiplayer())
  115. {
  116. EntityAI entity_for_placing = poActionData.m_MainItem;
  117. poActionData.m_Player.SetLocalProjectionPosition(poActionData.m_Position);
  118. poActionData.m_Player.SetLocalProjectionOrientation(poActionData.m_Orientation);
  119. if (poActionData.m_MainItem)
  120. {
  121. poActionData.m_Player.PlacingStartServer(poActionData.m_MainItem);
  122. GetGame().AddActionJuncture(poActionData.m_Player, entity_for_placing, 10000);
  123. poActionData.m_MainItem.SetIsBeingPlaced(true);
  124. }
  125. }
  126. else
  127. {
  128. //local singleplayer
  129. poActionData.m_Player.PlacingStartServer(poActionData.m_MainItem);
  130. poActionData.m_MainItem.SetIsBeingPlaced(true);
  131. }
  132. if (poActionData.m_MainItem.GetPlaceSoundset() != string.Empty)
  133. poActionData.m_MainItem.StartItemSoundServer(SoundConstants.ITEM_PLACE);
  134. if (poActionData.m_MainItem.GetLoopDeploySoundset() != string.Empty)
  135. poActionData.m_MainItem.StartItemSoundServer(SoundConstants.ITEM_DEPLOY_LOOP);
  136. }
  137. override void OnFinishProgressClient(ActionData action_data)
  138. {
  139. PlaceObjectActionData poActionData = PlaceObjectActionData.Cast(action_data);
  140. if (!poActionData)
  141. return;
  142. EntityAI entity_for_placing = poActionData.m_MainItem;
  143. vector position = poActionData.m_Player.GetLocalProjectionPosition();
  144. vector orientation = poActionData.m_Player.GetLocalProjectionOrientation();
  145. poActionData.m_AlreadyPlaced = true;
  146. entity_for_placing.OnPlacementComplete(poActionData.m_Player, position, orientation);
  147. }
  148. override void OnFinishProgressServer(ActionData action_data)
  149. {
  150. super.OnFinishProgressServer(action_data);
  151. if (action_data.m_MainItem.GetDeploySoundset() != string.Empty)
  152. action_data.m_MainItem.StartItemSoundServer(SoundConstants.ITEM_DEPLOY);
  153. if (action_data.m_MainItem.GetLoopDeploySoundset() != string.Empty)
  154. action_data.m_MainItem.StopItemSoundServer(SoundConstants.ITEM_DEPLOY_LOOP);
  155. }
  156. override void OnEndClient(ActionData action_data)
  157. {
  158. super.OnEndClient(action_data);
  159. PlaceObjectActionData poActionData = PlaceObjectActionData.Cast(action_data);
  160. if (!poActionData)
  161. return;
  162. if (!poActionData.m_AlreadyPlaced)
  163. {
  164. poActionData.m_Player.PlacingCancelLocal();
  165. //action terminated locally, send cancel to server
  166. poActionData.m_Player.GetActionManager().RequestEndAction();
  167. if (poActionData.m_Player.GetHologramLocal())
  168. poActionData.m_Player.GetHologramLocal().SetUpdatePosition(true);
  169. InventoryLocation source = new InventoryLocation;
  170. if (poActionData.m_MainItem.GetInventory().GetCurrentInventoryLocation(source) && source.GetType() == InventoryLocationType.GROUND)
  171. {
  172. poActionData.m_Player.PredictiveTakeEntityToHands(poActionData.m_MainItem);
  173. }
  174. }
  175. }
  176. override void OnEndServer(ActionData action_data)
  177. {
  178. super.OnEndServer(action_data);
  179. PlaceObjectActionData poActionData = PlaceObjectActionData.Cast(action_data);
  180. if (!poActionData || !poActionData.m_MainItem)
  181. return;
  182. if (!poActionData.m_AlreadyPlaced)
  183. {
  184. GetGame().ClearJunctureEx(poActionData.m_Player, poActionData.m_MainItem);
  185. poActionData.m_MainItem.SetIsBeingPlaced(false);
  186. if (GetGame().IsMultiplayer())
  187. {
  188. poActionData.m_Player.PlacingCancelServer();
  189. }
  190. else
  191. {
  192. //local singleplayer
  193. poActionData.m_Player.PlacingCancelLocal();
  194. poActionData.m_Player.PlacingCancelServer();
  195. }
  196. }
  197. else
  198. {
  199. if (poActionData.m_MainItem.IsBasebuildingKit())
  200. {
  201. poActionData.m_MainItem.Delete();
  202. }
  203. else
  204. {
  205. GetGame().ClearJunctureEx(poActionData.m_Player, poActionData.m_MainItem);
  206. }
  207. }
  208. if (poActionData.m_MainItem.GetLoopDeploySoundset() != string.Empty)
  209. poActionData.m_MainItem.StopItemSoundServer(SoundConstants.ITEM_DEPLOY_LOOP);
  210. }
  211. override void OnStartAnimationLoop(ActionData action_data)
  212. {
  213. if (!GetGame().IsDedicatedServer())
  214. {
  215. if (action_data.m_Player.GetItemInHands())
  216. ActiondeployObjectCB.Cast(action_data.m_Callback).DropDuringPlacing(); //legacy stuff
  217. if (HasProgress()) // if object has no progress, it is moved directly when action finishes
  218. {
  219. ClearInventoryReservationEx(action_data); // Clear reservation as we put the main item from hands on ground
  220. DropDuringPlacing(action_data.m_Player);
  221. }
  222. }
  223. }
  224. override void WriteToContext(ParamsWriteContext ctx, ActionData action_data)
  225. {
  226. super.WriteToContext(ctx, action_data);
  227. PlaceObjectActionData poActionData = PlaceObjectActionData.Cast(action_data);
  228. if (!poActionData)
  229. return;
  230. ctx.Write(poActionData.m_Position);
  231. ctx.Write(poActionData.m_Orientation);
  232. }
  233. override bool ReadFromContext(ParamsReadContext ctx, out ActionReciveData action_recive_data)
  234. {
  235. if (!action_recive_data)
  236. action_recive_data = new PlaceObjectActionReciveData;
  237. super.ReadFromContext(ctx, action_recive_data);
  238. PlaceObjectActionReciveData recive_data_po = PlaceObjectActionReciveData.Cast(action_recive_data);
  239. vector entity_position = "0 0 0";
  240. vector entity_orientation = "0 0 0";
  241. if (!ctx.Read(entity_position))
  242. return false;
  243. if (!ctx.Read(entity_orientation))
  244. return false;
  245. recive_data_po.m_Position = entity_position;
  246. recive_data_po.m_Orientation = entity_orientation;
  247. return true;
  248. }
  249. override void HandleReciveData(ActionReciveData action_recive_data, ActionData action_data)
  250. {
  251. super.HandleReciveData(action_recive_data, action_data);
  252. PlaceObjectActionReciveData recive_data_po = PlaceObjectActionReciveData.Cast(action_recive_data);
  253. PlaceObjectActionData action_data_po = PlaceObjectActionData.Cast(action_data);
  254. action_data_po.m_Position = recive_data_po.m_Position;
  255. action_data_po.m_Orientation = recive_data_po.m_Orientation;
  256. #ifdef DEVELOPER
  257. if (IsCLIParam("hologramLogs"))
  258. {
  259. Debug.Log(string.Format("HandleReciveData | received pos: %1", action_data_po.m_Position), "hologramLogs");
  260. }
  261. #endif
  262. }
  263. void SetupAnimation(ItemBase item)
  264. {
  265. if (item.IsDeployable())
  266. {
  267. if (item.IsHeavyBehaviour())
  268. {
  269. m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DEPLOY_HEAVY;
  270. }
  271. else if (item.IsOneHandedBehaviour())
  272. {
  273. m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DEPLOY_1HD;
  274. }
  275. else if (item.IsTwoHandedBehaviour())
  276. {
  277. m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DEPLOY_2HD;
  278. }
  279. else
  280. {
  281. Debug.Log("Error: check " + item + " behaviour");
  282. }
  283. }
  284. else
  285. {
  286. if (item.IsHeavyBehaviour())
  287. {
  288. m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_PLACING_HEAVY;
  289. }
  290. else if (item.IsOneHandedBehaviour())
  291. {
  292. m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_PLACING_1HD;
  293. }
  294. else if (item.IsTwoHandedBehaviour())
  295. {
  296. m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_PLACING_2HD;
  297. }
  298. else
  299. {
  300. Debug.Log("Error: check " + item + " behaviour");
  301. }
  302. }
  303. }
  304. };