actiontakeitemtohands.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. class ActionTakeItemToHands: ActionInteractBase
  2. {
  3. void ActionTakeItemToHands()
  4. {
  5. m_CommandUID = DayZPlayerConstants.CMD_ACTIONMOD_PICKUP_HANDS;
  6. m_CommandUIDProne = DayZPlayerConstants.CMD_ACTIONFB_PICKUP_HANDS;
  7. m_Text = "#take_to_hands";
  8. }
  9. override void CreateConditionComponents()
  10. {
  11. m_ConditionItem = new CCINone();
  12. m_ConditionTarget = new CCTObject(UAMaxDistances.DEFAULT);
  13. }
  14. override bool HasProneException()
  15. {
  16. return true;
  17. }
  18. override typename GetInputType()
  19. {
  20. return ContinuousInteractActionInput;
  21. }
  22. override bool HasProgress()
  23. {
  24. return false;
  25. }
  26. override bool ActionCondition(PlayerBase player, ActionTarget target, ItemBase item)
  27. {
  28. ItemBase targetItem = ItemBase.Cast(target.GetObject());
  29. if (!targetItem)
  30. return false;
  31. EntityAI targetParent = EntityAI.Cast(targetItem.GetHierarchyParent());
  32. if (!targetItem.IsTakeable() || targetItem.IsBeingPlaced() || targetItem.IsSetForDeletion() || ( targetItem.GetHierarchyParent() && !BaseBuildingBase.Cast(targetParent) ) || ((targetParent && !targetItem.CanDetachAttachment(targetParent)) || (targetParent && !targetParent.CanReleaseAttachment(targetItem))))
  33. return false;
  34. return player.GetInventory().CanAddEntityIntoHands(targetItem);
  35. }
  36. override bool CanContinue(ActionData action_data)
  37. {
  38. return true;
  39. }
  40. override void OnEndServer(ActionData action_data)
  41. {
  42. super.OnEndServer(action_data);
  43. EntityAI takenEntity = EntityAI.Cast(action_data.m_Target.GetObject());
  44. if (takenEntity && takenEntity.GetCompEM() && takenEntity.IsElectricAppliance())
  45. takenEntity.GetCompEM().UnplugThis();
  46. }
  47. override void OnExecute(ActionData action_data)
  48. {
  49. if (GetGame().IsDedicatedServer())
  50. {
  51. ClearActionJuncture(action_data);
  52. return;
  53. }
  54. ItemBase ntarget = ItemBase.Cast(action_data.m_Target.GetObject());
  55. ClearInventoryReservationEx(action_data);
  56. float stackable = ntarget.GetTargetQuantityMax(-1);
  57. if (stackable == 0 || stackable >= ntarget.GetQuantity())
  58. {
  59. action_data.m_Player.PredictiveTakeEntityToHands(ntarget);
  60. }
  61. else
  62. {
  63. InventoryLocation il = new InventoryLocation();
  64. il.SetHands(action_data.m_Player, ntarget);
  65. ntarget.SplitIntoStackMaxToInventoryLocationClient(il);
  66. }
  67. }
  68. override void CreateAndSetupActionCallback(ActionData action_data)
  69. {
  70. EntityAI target = EntityAI.Cast(action_data.m_Target.GetObject());
  71. if (!target)
  72. return;
  73. ActionBaseCB callback;
  74. if (target.IsHeavyBehaviour())
  75. {
  76. Class.CastTo(callback, action_data.m_Player.StartCommand_Action(DayZPlayerConstants.CMD_ACTIONFB_PICKUP_HEAVY,GetCallbackClassTypename(), DayZPlayerConstants.STANCEMASK_ERECT));
  77. }
  78. else
  79. {
  80. if (action_data.m_Player.IsPlayerInStance(DayZPlayerConstants.STANCEMASK_CROUCH | DayZPlayerConstants.STANCEMASK_ERECT))
  81. {
  82. Class.CastTo(callback, action_data.m_Player.AddCommandModifier_Action(m_CommandUID,GetCallbackClassTypename()));
  83. }
  84. else
  85. {
  86. Class.CastTo(callback, action_data.m_Player.StartCommand_Action(m_CommandUIDProne,GetCallbackClassTypename(),DayZPlayerConstants.STANCEMASK_PRONE));
  87. }
  88. }
  89. callback.SetActionData(action_data);
  90. callback.InitActionComponent();
  91. action_data.m_Callback = callback;
  92. }
  93. override bool CanBeUsedOnBack()
  94. {
  95. return true;
  96. }
  97. }
  98. class ActionSwapItemToHands: ActionTakeItemToHands
  99. {
  100. bool m_Executable;
  101. override bool ActionCondition(PlayerBase player, ActionTarget target, ItemBase item)
  102. {
  103. ItemBase targetItem = ItemBase.Cast(target.GetObject());
  104. if (!targetItem || !targetItem.IsTakeable() || targetItem.IsBeingPlaced())
  105. return false;
  106. return player.GetInventory().CanSwapEntitiesEx(targetItem,item);
  107. }
  108. override bool UseMainItem()
  109. {
  110. return true;
  111. }
  112. override bool MainItemAlwaysInHands()
  113. {
  114. return true;
  115. }
  116. override void CreateAndSetupActionCallback(ActionData action_data)
  117. {
  118. EntityAI target = EntityAI.Cast(action_data.m_Target.GetObject());
  119. if (!target)
  120. return;
  121. ActionBaseCB callback;
  122. if (target.IsHeavyBehaviour())
  123. {
  124. Class.CastTo(callback, action_data.m_Player.StartCommand_Action(DayZPlayerConstants.CMD_ACTIONFB_PICKUP_HEAVY,GetCallbackClassTypename(),DayZPlayerConstants.STANCEMASK_ERECT));
  125. }
  126. else
  127. {
  128. return;
  129. }
  130. callback.SetActionData(action_data);
  131. callback.InitActionComponent();
  132. action_data.m_Callback = callback;
  133. }
  134. override void Start(ActionData action_data)
  135. {
  136. super.Start(action_data);
  137. bool b1 = action_data.m_MainItem.ConfigGetString("physLayer") == "item_large";
  138. action_data.m_MainItem.m_ThrowItemOnDrop = b1;
  139. EntityAI object = EntityAI.Cast(action_data.m_Target.GetObject());
  140. if (!object || !object.IsHeavyBehaviour())
  141. {
  142. action_data.m_Player.GetActionManager().InterruptNoSync();
  143. }
  144. else
  145. m_Executable = true;
  146. }
  147. override void OnExecute(ActionData action_data)
  148. {
  149. if (!m_Executable)
  150. return;
  151. if (GetGame().IsDedicatedServer())
  152. {
  153. ClearActionJuncture(action_data);
  154. return;
  155. }
  156. PerformSwap(action_data);
  157. }
  158. override void OnEnd(ActionData action_data)
  159. {
  160. super.OnEnd(action_data);
  161. if (m_Executable)
  162. {
  163. m_Executable = false;
  164. return;
  165. }
  166. if (GetGame().IsDedicatedServer())
  167. {
  168. ClearActionJuncture(action_data);
  169. return;
  170. }
  171. PerformSwap(action_data);
  172. }
  173. void PerformSwap( ActionData action_data )
  174. {
  175. ClearInventoryReservationEx(action_data);
  176. EntityAI ntarget = EntityAI.Cast(action_data.m_Target.GetObject());
  177. if (action_data.m_Player)
  178. {
  179. InventoryMode invMode = InventoryMode.PREDICTIVE;
  180. if (!GetGame().IsMultiplayer())
  181. invMode = InventoryMode.LOCAL;
  182. else if (action_data.m_Player.NeedInventoryJunctureFromServer(ntarget, ntarget.GetHierarchyParent(), action_data.m_Player))
  183. invMode = InventoryMode.JUNCTURE;
  184. action_data.m_Player.TakeEntityToHandsImpl(invMode, ntarget);
  185. }
  186. }
  187. }