actionrestraintarget.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. class ActionRestrainTargetCB : ActionContinuousBaseCB
  2. {
  3. const float DEFAULT_RESTRAIN_TIME = 2;
  4. override void CreateActionComponent()
  5. {
  6. float time = DEFAULT_RESTRAIN_TIME;
  7. if ( m_ActionData.m_MainItem.ConfigIsExisting("RestrainTime") )
  8. {
  9. time = m_ActionData.m_MainItem.ConfigGetFloat("RestrainTime");
  10. }
  11. if ( m_ActionData.m_Player.IsQuickRestrain() )
  12. {
  13. time = DEBUG_QUICK_UNRESTRAIN_TIME;
  14. }
  15. m_ActionData.m_ActionComponent = new CAContinuousTime(time);
  16. }
  17. };
  18. class ActionRestrainTarget: ActionContinuousBase
  19. {
  20. void ActionRestrainTarget()
  21. {
  22. m_CallbackClass = ActionRestrainTargetCB;
  23. m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_RESTRAINTARGET;
  24. m_FullBody = true;
  25. m_StanceMask = DayZPlayerConstants.STANCEMASK_ERECT | DayZPlayerConstants.STANCEMASK_CROUCH;
  26. m_SpecialtyWeight = UASoftSkillsWeight.PRECISE_LOW;
  27. m_Text = "#restrain";
  28. }
  29. override void CreateConditionComponents()
  30. {
  31. m_ConditionTarget = new CCTMan(UAMaxDistances.DEFAULT);
  32. m_ConditionItem = new CCINonRuined;
  33. }
  34. override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
  35. {
  36. PlayerBase other_player = PlayerBase.Cast(target.GetObject());
  37. if (!other_player)
  38. return false;
  39. if ( player.GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_SERVER )
  40. {
  41. return other_player.CanBeRestrained();
  42. }
  43. else
  44. {
  45. return !other_player.IsRestrained();
  46. }
  47. }
  48. override int GetStanceMask(PlayerBase player)
  49. {
  50. if ( player.IsPlayerInStance(DayZPlayerConstants.STANCEMASK_CROUCH | DayZPlayerConstants.STANCEMASK_PRONE))
  51. return DayZPlayerConstants.STANCEMASK_CROUCH;
  52. else
  53. return DayZPlayerConstants.STANCEMASK_ERECT;
  54. }
  55. override bool ActionConditionContinue(ActionData action_data)
  56. {
  57. PlayerBase target_player = PlayerBase.Cast(action_data.m_Target.GetObject());
  58. if ( GetGame().IsServer() && GetGame().IsMultiplayer() )
  59. {
  60. if ( target_player.IsSurrendered() || !target_player.CanBeRestrained() )
  61. {
  62. return false;
  63. }
  64. }
  65. if ( GetGame().IsServer() )
  66. {
  67. ActionRestrainTargetCB callback = ActionRestrainTargetCB.Cast(action_data.m_Callback);
  68. if ( callback.GetActionComponentProgress() > 0.75 && !target_player.IsRestrainPrelocked() )
  69. {
  70. target_player.SetRestrainPrelocked(true);
  71. }
  72. return !GetGame().GetMission().IsPlayerDisconnecting(target_player);
  73. }
  74. return true;
  75. }
  76. override void OnStartServer(ActionData action_data)
  77. {
  78. super.OnStartServer(action_data);
  79. PlayerBase target_player = PlayerBase.Cast(action_data.m_Target.GetObject());
  80. if ( target_player.IsSurrendered() )
  81. {
  82. SurrenderDataRestrain sdr = new SurrenderDataRestrain;
  83. target_player.EndSurrenderRequest(sdr);
  84. }
  85. else if ( target_player.IsEmotePlaying() )
  86. {
  87. target_player.m_EmoteManager.ServerRequestEmoteCancel();
  88. }
  89. target_player.SetRestrainStarted(true);
  90. }
  91. override void OnEndServer(ActionData action_data)
  92. {
  93. super.OnEndServer(action_data);
  94. PlayerBase target_player = PlayerBase.Cast(action_data.m_Target.GetObject());
  95. if (target_player)
  96. {
  97. target_player.SetRestrainStarted(false);
  98. target_player.SetRestrainPrelocked(false);
  99. }
  100. }
  101. override void OnFinishProgressServer( ActionData action_data )
  102. {
  103. PlayerBase target_player = PlayerBase.Cast(action_data.m_Target.GetObject());
  104. PlayerBase source_player = PlayerBase.Cast(action_data.m_Player);
  105. if (CanReceiveAction(action_data.m_Target) && !target_player.IsRestrained())
  106. {
  107. EntityAI item_in_hands_target = target_player.GetHumanInventory().GetEntityInHands();
  108. EntityAI item_in_hands_source = source_player.GetHumanInventory().GetEntityInHands();
  109. if ( !item_in_hands_source )
  110. {
  111. Error("Restraining target failed, nothing in hands");
  112. return;
  113. }
  114. string new_item_name = MiscGameplayFunctions.ObtainRestrainItemTargetClassname(item_in_hands_source);
  115. if (item_in_hands_target)
  116. {
  117. ChainedDropAndRestrainLambda lambda2 = new ChainedDropAndRestrainLambda(item_in_hands_target, item_in_hands_target.GetType(), target_player, false, source_player);
  118. MiscGameplayFunctions.TurnItemInHandsIntoItemEx(target_player, lambda2);
  119. }
  120. else
  121. {
  122. RestrainTargetPlayerLambda lambda = new RestrainTargetPlayerLambda(item_in_hands_source, new_item_name, target_player);
  123. source_player.LocalReplaceItemInHandsWithNewElsewhere(lambda);
  124. }
  125. }
  126. }
  127. override void OnFinishProgressClient( ActionData action_data )
  128. {
  129. super.OnFinishProgressClient( action_data );
  130. GetGame().GetAnalyticsClient().OnActionRestrain();
  131. }
  132. };
  133. class ChainedDropAndRestrainLambda : DestroyItemInCorpsesHandsAndCreateNewOnGndLambda
  134. {
  135. PlayerBase m_SourcePlayer;
  136. ExplosivesBase m_PairedExplosive;
  137. void ChainedDropAndRestrainLambda (EntityAI old_item, string new_item_type, PlayerBase player, bool destroy = false, PlayerBase src_player = null)
  138. {
  139. m_SourcePlayer = src_player;
  140. }
  141. override void OnSuccess(EntityAI new_item)
  142. {
  143. super.OnSuccess(new_item);
  144. if (m_PairedExplosive)
  145. {
  146. m_PairedExplosive.UnpairRemote();
  147. ItemBase ib = ItemBase.Cast(new_item);
  148. ib.PairWithDevice(m_PairedExplosive);
  149. m_PairedExplosive.Arm();
  150. }
  151. // as soon as previous op is finish, start another one
  152. EntityAI item_in_hands_source = m_SourcePlayer.GetHumanInventory().GetEntityInHands();
  153. if (item_in_hands_source)
  154. {
  155. string new_item_name = MiscGameplayFunctions.ObtainRestrainItemTargetClassname(item_in_hands_source);
  156. RestrainTargetPlayerLambda lambda = new RestrainTargetPlayerLambda(item_in_hands_source, new_item_name, m_Player);
  157. if (m_SourcePlayer)
  158. m_SourcePlayer.LocalReplaceItemInHandsWithNewElsewhere(lambda);
  159. else
  160. Error("ChainedDropAndRestrainLambda: missing source player!");
  161. }
  162. else
  163. {
  164. Error("ChainedDropAndRestrainLambda: missing source item in hands!");
  165. }
  166. }
  167. override void CopyOldPropertiesToNew (notnull EntityAI old_item, EntityAI new_item)
  168. {
  169. super.CopyOldPropertiesToNew(old_item, new_item);
  170. RemoteDetonatorTrigger trigger = RemoteDetonatorTrigger.Cast(old_item);
  171. if (trigger)
  172. m_PairedExplosive = ExplosivesBase.Cast(trigger.GetControlledDevice());
  173. }
  174. }
  175. class RestrainTargetPlayerLambda : TurnItemIntoItemLambda
  176. {
  177. PlayerBase m_TargetPlayer;
  178. void RestrainTargetPlayerLambda (EntityAI old_item, string new_item_type, PlayerBase player)
  179. {
  180. m_TargetPlayer = player;
  181. InventoryLocation targetHnd = new InventoryLocation;
  182. targetHnd.SetHands(m_TargetPlayer, null);
  183. OverrideNewLocation(targetHnd);
  184. }
  185. override void OnSuccess(EntityAI new_item)
  186. {
  187. super.OnSuccess(new_item);
  188. m_TargetPlayer.SetRestrained(true);
  189. m_TargetPlayer.OnItemInHandsChanged();
  190. }
  191. };
  192. class SurrenderDataRestrain extends SurrenderData
  193. {
  194. override void End()
  195. {
  196. }
  197. }