weaponunjamming.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. class WeaponChamberFromAttMag_W4T extends WeaponChamberFromAttMag
  2. {
  3. override bool IsWaitingForActionFinish () { return true; }
  4. };
  5. class WeaponChamberFromInnerMag_W4T extends WeaponChamberFromInnerMag
  6. {
  7. override bool IsWaitingForActionFinish () { return true; }
  8. };
  9. class WeaponUnjamming_Start extends WeaponStartAction
  10. {
  11. float m_dtAccumulator;
  12. float m_jamTime;
  13. void WeaponUnjamming_Start (Weapon_Base w = NULL, WeaponStateBase parent = NULL, WeaponActions action = WeaponActions.NONE, int actionType = -1)
  14. {
  15. m_dtAccumulator = 0.0;
  16. m_jamTime = 0.0;
  17. }
  18. override void OnEntry (WeaponEventBase e)
  19. {
  20. super.OnEntry(e);
  21. }
  22. override void OnUpdate (float dt)
  23. {
  24. m_dtAccumulator += dt;
  25. DayZPlayer p;
  26. Class.CastTo(p, m_weapon.GetHierarchyParent());
  27. if(p)
  28. {
  29. HumanInputController hic = p.GetInputController();
  30. HumanCommandWeapons hcw = p.GetCommandModifier_Weapons();
  31. if (m_dtAccumulator >= m_jamTime)
  32. {
  33. if (LogManager.IsWeaponLogEnable()) { wpnDebugPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " Unjammed!"); }
  34. hcw.StartAction(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_END);
  35. m_weapon.ProcessWeaponEvent(new WeaponEventUnjammingTimeout(p));
  36. return; // unjammed successfuly
  37. }
  38. if (hic.IsReloadOrMechanismContinuousUse())
  39. {
  40. if (LogManager.IsWeaponLogEnable()) { wpnDebugPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " Unjamming..."); }
  41. }
  42. #ifndef PLATFORM_CONSOLE
  43. #ifndef SERVER_FOR_CONSOLE
  44. else
  45. {
  46. if (LogManager.IsWeaponLogEnable()) { wpnDebugPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " Unjamming failed, weapon still jammed"); }
  47. hcw.StartAction(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_INTERRUPT);
  48. m_weapon.ProcessWeaponEvent(new WeaponEventUnjammingFailedTimeout(p));
  49. }
  50. #endif
  51. #endif
  52. }
  53. }
  54. override void OnExit (WeaponEventBase e)
  55. {
  56. m_dtAccumulator = 0.0;
  57. m_jamTime = 0.0;
  58. super.OnExit(e);
  59. }
  60. };
  61. class WeaponUnjamming_Cartridge extends WeaponStateBase
  62. {
  63. float m_damage;
  64. string m_type;
  65. override void OnEntry (WeaponEventBase e)
  66. {
  67. super.OnEntry(e);
  68. if (e)
  69. {
  70. m_type = string.Empty;
  71. float dmg;
  72. string type;
  73. m_weapon.SetJammed(false);
  74. int mi = m_weapon.GetCurrentMuzzle();
  75. if (m_weapon.IsChamberFiredOut(mi))
  76. {
  77. m_weapon.EjectCasing(mi);
  78. m_weapon.EffectBulletHide(mi);
  79. m_weapon.SelectionBulletHide();
  80. }
  81. if (!m_weapon.IsChamberEmpty(mi))
  82. {
  83. DayZPlayer p = e.m_player;
  84. m_weapon.CreateRound(mi);
  85. ejectBulletAndStoreInMagazine(m_weapon, mi, null, p);
  86. m_weapon.EffectBulletHide(mi);
  87. m_weapon.SelectionBulletHide();
  88. }
  89. }
  90. }
  91. override void OnExit (WeaponEventBase e)
  92. {
  93. m_type = string.Empty;
  94. super.OnExit(e);
  95. }
  96. override bool SaveCurrentFSMState (ParamsWriteContext ctx)
  97. {
  98. if (!super.SaveCurrentFSMState(ctx))
  99. return false;
  100. if (!ctx.Write(m_damage))
  101. {
  102. Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponUnjamming_Cartridge.SaveCurrentFSMState: cannot write m_damage for weapon=" + m_weapon);
  103. return false;
  104. }
  105. if (!ctx.Write(m_type))
  106. {
  107. Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponUnjamming_Cartridge.SaveCurrentFSMState: cannot write m_type for weapon=" + m_weapon);
  108. return false;
  109. }
  110. return true;
  111. }
  112. override bool LoadCurrentFSMState (ParamsReadContext ctx, int version)
  113. {
  114. if (!super.LoadCurrentFSMState(ctx, version))
  115. return false;
  116. if (!ctx.Read(m_damage))
  117. {
  118. Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponUnjamming_Cartridge.LoadCurrentFSMState: cannot read m_damage for weapon=" + m_weapon);
  119. return false;
  120. }
  121. if (!ctx.Read(m_type))
  122. {
  123. Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponUnjamming_Cartridge.LoadCurrentFSMState: cannot read m_type for weapon=" + m_weapon);
  124. return false;
  125. }
  126. return true;
  127. }
  128. };
  129. class WeaponUnjamming_Cartridge_W4T extends WeaponUnjamming_Cartridge
  130. {
  131. override bool IsWaitingForActionFinish () { return true; }
  132. };
  133. class WeaponUnjamming_W4T extends WeaponStateBase
  134. {
  135. override bool IsWaitingForActionFinish () { return true; }
  136. };
  137. /**@class WeaponUnjamming
  138. * @brief unjam submachine
  139. **/
  140. class WeaponUnjamming extends WeaponStateBase
  141. {
  142. WeaponActions m_action;
  143. int m_actionType;
  144. float m_dtAccumulator;
  145. float m_jamTime;
  146. ref WeaponUnjamming_Start m_start;
  147. ref WeaponUnjamming_Cartridge_W4T m_eject;
  148. ref WeaponUnjamming_W4T m_w4t;
  149. ref WeaponChamberFromAttMag_W4T m_chamber;
  150. void WeaponUnjamming (Weapon_Base w = NULL, WeaponStateBase parent = NULL, WeaponActions action = WeaponActions.NONE, int actionType = -1)
  151. {
  152. m_action = action;
  153. m_actionType = actionType;
  154. // setup nested state machine
  155. m_start = new WeaponUnjamming_Start(m_weapon, this, m_action, m_actionType);
  156. m_eject = new WeaponUnjamming_Cartridge_W4T(m_weapon, this);
  157. m_chamber = new WeaponChamberFromAttMag_W4T(m_weapon, this);
  158. m_w4t = new WeaponUnjamming_W4T(m_weapon, this);
  159. // events
  160. WeaponEventBase _uto_ = new WeaponEventUnjammingTimeout;
  161. WeaponEventBase _fto_ = new WeaponEventUnjammingFailedTimeout;
  162. WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
  163. WeaponEventBase __uj_ = new WeaponEventAnimUnjammed;
  164. m_fsm = new WeaponFSM(this); // @NOTE: set owner of the submachine fsm
  165. // transitions
  166. m_fsm.AddTransition(new WeaponTransition( m_start, _uto_, m_eject));
  167. m_fsm.AddTransition(new WeaponTransition( m_start, _fto_, m_w4t));
  168. m_fsm.AddTransition(new WeaponTransition( m_eject, __uj_, m_chamber, NULL, new WeaponGuardHasAmmo(m_weapon)));
  169. m_fsm.AddTransition(new WeaponTransition( m_eject, _fin_, NULL));
  170. m_fsm.AddTransition(new WeaponTransition( m_w4t, _fin_, NULL));
  171. m_fsm.AddTransition(new WeaponTransition(m_chamber, _fin_, NULL));
  172. // Safety exits
  173. m_fsm.AddTransition(new WeaponTransition(m_start, _fin_, null));
  174. m_fsm.SetInitialState(m_start);
  175. }
  176. override void OnEntry (WeaponEventBase e)
  177. {
  178. super.OnEntry(e);
  179. if (e)
  180. {
  181. m_dtAccumulator = 0.0;
  182. m_jamTime = 5.0; // @TODO: rand
  183. m_start.m_dtAccumulator = m_dtAccumulator;
  184. m_start.m_jamTime = m_jamTime;
  185. }
  186. }
  187. override void OnExit (WeaponEventBase e)
  188. {
  189. m_dtAccumulator = 0.0;
  190. m_jamTime = 0.0;
  191. super.OnExit(e);
  192. }
  193. };