actiontakearrowtohands.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. class ActionTakeArrowToHands: ActionInteractBase
  2. {
  3. void ActionTakeArrowToHands()
  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. EntityAI targetEntity = EntityAI.Cast(target.GetObject());
  29. if (!targetEntity || (targetEntity && targetEntity.IsManagingArrows() && !targetEntity.IsDamageDestroyed()))
  30. return false;
  31. ArrowManagerBase arrowManager = targetEntity.GetArrowManager();
  32. if (arrowManager)
  33. {
  34. ItemBase arrow = ItemBase.Cast(arrowManager.GetFirstArrow());
  35. if (arrow && !arrow.IsSetForDeletion())
  36. {
  37. if (player.GetInventory().CanAddEntityIntoHands(arrow))
  38. return true;
  39. }
  40. }
  41. return false;
  42. }
  43. override Object GetDisplayInteractObject(PlayerBase player, ActionTarget target)
  44. {
  45. EntityAI targetEntity = EntityAI.Cast(target.GetObject());
  46. if (!targetEntity || (targetEntity && targetEntity.IsManagingArrows() && !targetEntity.IsDamageDestroyed()))
  47. return null;
  48. ArrowManagerBase arrowManager = targetEntity.GetArrowManager();
  49. if (arrowManager)
  50. {
  51. return arrowManager.GetFirstArrow();
  52. }
  53. return null;
  54. }
  55. override bool CanContinue(ActionData action_data)
  56. {
  57. return true;
  58. }
  59. override bool InventoryReservation(ActionData action_data)
  60. {
  61. bool success = true;
  62. InventoryLocation il = new InventoryLocation();
  63. EntityAI targetEntity;
  64. if (EntityAI.CastTo(targetEntity, action_data.m_Target.GetObject()))
  65. {
  66. ArrowManagerBase arrowManager = targetEntity.GetArrowManager();
  67. if (arrowManager)
  68. {
  69. ItemBase targetArrow = ItemBase.Cast(arrowManager.GetFirstArrow());
  70. if (targetArrow)
  71. {
  72. il.SetHands(action_data.m_Player,targetArrow);
  73. if (action_data.m_Player.GetInventory().HasInventoryReservation(targetArrow, il))
  74. {
  75. success = false;
  76. }
  77. else
  78. {
  79. action_data.m_Player.GetInventory().AddInventoryReservationEx(targetArrow, il, GameInventory.c_InventoryReservationTimeoutMS);
  80. }
  81. }
  82. }
  83. }
  84. if (success)
  85. {
  86. if (il)
  87. action_data.m_ReservedInventoryLocations.Insert(il);
  88. }
  89. return success;
  90. }
  91. override void OnExecute(ActionData action_data)
  92. {
  93. if (GetGame().IsDedicatedServer())
  94. {
  95. ClearActionJuncture(action_data);
  96. return;
  97. }
  98. InventoryLocation il = action_data.m_ReservedInventoryLocations.Get(0);
  99. ItemBase arrow = ItemBase.Cast(il.GetItem());
  100. ClearInventoryReservationEx(action_data);
  101. float stackable = arrow.GetTargetQuantityMax(-1);
  102. if (stackable == 0 || stackable >= arrow.GetQuantity())
  103. {
  104. action_data.m_Player.PredictiveTakeEntityToHands(arrow);
  105. }
  106. else
  107. {
  108. arrow.SplitIntoStackMaxToInventoryLocationClient(il);
  109. }
  110. }
  111. override void CreateAndSetupActionCallback(ActionData action_data)
  112. {
  113. EntityAI target = EntityAI.Cast(action_data.m_Target.GetObject());
  114. if (!target)
  115. return;
  116. ActionBaseCB callback;
  117. if (target.IsHeavyBehaviour())
  118. {
  119. Class.CastTo(callback, action_data.m_Player.StartCommand_Action(DayZPlayerConstants.CMD_ACTIONFB_PICKUP_HEAVY,GetCallbackClassTypename(), DayZPlayerConstants.STANCEMASK_ERECT));
  120. }
  121. else
  122. {
  123. if (action_data.m_Player.IsPlayerInStance(DayZPlayerConstants.STANCEMASK_CROUCH | DayZPlayerConstants.STANCEMASK_ERECT))
  124. {
  125. Class.CastTo(callback, action_data.m_Player.AddCommandModifier_Action(m_CommandUID,GetCallbackClassTypename()));
  126. }
  127. else
  128. {
  129. Class.CastTo(callback, action_data.m_Player.StartCommand_Action(m_CommandUIDProne,GetCallbackClassTypename(),DayZPlayerConstants.STANCEMASK_PRONE));
  130. }
  131. }
  132. callback.SetActionData(action_data);
  133. callback.InitActionComponent();
  134. action_data.m_Callback = callback;
  135. }
  136. override bool CanBeUsedOnBack()
  137. {
  138. return true;
  139. }
  140. }