actionattachexplosivestrigger.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. class ActionAttachExplosivesTriggerCB : ActionContinuousBaseCB
  2. {
  3. override void CreateActionComponent()
  4. {
  5. m_ActionData.m_ActionComponent = new CAContinuousTime(UATimeSpent.EXPLOSIVE_ARM);
  6. }
  7. }
  8. class ActionAttachExplosivesTrigger : ActionContinuousBase
  9. {
  10. void ActionAttachExplosivesTrigger()
  11. {
  12. m_CallbackClass = ActionAttachExplosivesTriggerCB;
  13. m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_CRAFTING;
  14. m_FullBody = true;
  15. m_SpecialtyWeight = UASoftSkillsWeight.PRECISE_LOW;
  16. m_Text = "#STR_ArmExplosive";
  17. }
  18. override void CreateConditionComponents()
  19. {
  20. m_ConditionTarget = new CCTNonRuined(UAMaxDistances.DEFAULT);
  21. m_ConditionItem = new CCINonRuined();
  22. }
  23. override bool ActionConditionContinue(ActionData action_data)
  24. {
  25. return true;
  26. }
  27. override bool CanBeSetFromInventory()
  28. {
  29. return true;
  30. }
  31. override bool ActionCondition(PlayerBase player, ActionTarget target, ItemBase item)
  32. {
  33. if (target.GetParent())
  34. {
  35. return false;
  36. }
  37. if (ClaymoreMine.Cast(target.GetObject()))
  38. {
  39. return false;
  40. }
  41. ExplosivesBase explosive = ExplosivesBase.Cast(target.GetObject());
  42. if (explosive)
  43. {
  44. ClockBase timedTrigger;
  45. if (ClockBase.CastTo(timedTrigger, item))
  46. {
  47. return timedTrigger.IsAlarmOn() && explosive.IsTimerDetonable() && explosive.CanBeArmed();
  48. }
  49. return explosive.CanBeArmed();
  50. }
  51. return false;
  52. }
  53. override void OnFinishProgressServer(ActionData action_data)
  54. {
  55. ClearInventoryReservationEx(action_data);
  56. ExplosivesBase explosive = ExplosivesBase.Cast(action_data.m_Target.GetObject());
  57. if (explosive)
  58. {
  59. explosive.OnPlacementComplete(action_data.m_Player, explosive.GetPosition(), action_data.m_Player.GetOrientation());
  60. explosive.UnlockTriggerSlots();
  61. }
  62. if (action_data.m_MainItem.IsInherited(RemoteDetonator))
  63. {
  64. CreateRemoteDetonatorReceiverAsAttachment(action_data);
  65. return;
  66. }
  67. else
  68. {
  69. AttachItem(action_data);
  70. }
  71. }
  72. override void OnFinishProgressClient(ActionData action_data)
  73. {
  74. ClearInventoryReservationEx(action_data);
  75. ExplosivesBase explosive = ExplosivesBase.Cast(action_data.m_Target.GetObject());
  76. if (explosive)
  77. {
  78. explosive.UnlockTriggerSlots();
  79. }
  80. if (!action_data.m_MainItem.IsInherited(RemoteDetonator))
  81. {
  82. AttachItem(action_data);
  83. }
  84. }
  85. protected void CreateRemoteDetonatorReceiverAsAttachment(ActionData action_data)
  86. {
  87. ExplosivesBase explosive;
  88. if (action_data.m_Target.IsProxy())
  89. {
  90. explosive = ExplosivesBase.Cast(action_data.m_Target.GetParent());
  91. }
  92. else
  93. {
  94. explosive = ExplosivesBase.Cast(action_data.m_Target.GetObject());
  95. }
  96. if (explosive && action_data.m_MainItem)
  97. {
  98. explosive.UnlockTriggerSlots();
  99. RemoteDetonatorTrigger.SpawnInPlayerHands(action_data.m_Player, explosive);
  100. }
  101. }
  102. protected void AttachItem(ActionData action_data)
  103. {
  104. EntityAI targetEAI;
  105. if (action_data.m_Target.IsProxy())
  106. {
  107. targetEAI = EntityAI.Cast(action_data.m_Target.GetParent());
  108. }
  109. else
  110. {
  111. targetEAI = EntityAI.Cast(action_data.m_Target.GetObject());
  112. }
  113. if (targetEAI && action_data.m_MainItem)
  114. {
  115. int slotId = InventorySlots.GetSlotIdFromString(action_data.m_MainItem.GetExplosiveTriggerSlotName());
  116. action_data.m_Player.PredictiveTakeEntityToTargetAttachmentEx(targetEAI, action_data.m_MainItem, slotId);
  117. }
  118. }
  119. }