mp133.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. enum PumpShotgunAnimState
  2. {
  3. DEFAULT = 0, ///< default weapon state, closed and discharged
  4. };
  5. enum PumpShotgunStableStateID
  6. {
  7. UNKNOWN = 0,
  8. Empty = 1,
  9. Fireout = 2,
  10. Loaded = 3,
  11. Jammed = 4,
  12. }
  13. class PumpShotgunEmpty extends WeaponStableState
  14. {
  15. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { Empty E"); } super.OnEntry(e); }
  16. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } Empty E"); } }
  17. override int GetCurrentStateID () { return PumpShotgunStableStateID.Empty; }
  18. override bool HasBullet () { return false; }
  19. override bool HasMagazine () { return false; }
  20. override bool IsJammed () { return false; }
  21. override bool IsRepairEnabled () { return true; }
  22. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; }
  23. };
  24. class PumpShotgunFireout extends WeaponStableState
  25. {
  26. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { Fireout F"); } super.OnEntry(e); }
  27. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } Fireout F"); } }
  28. override int GetCurrentStateID () { return PumpShotgunStableStateID.Fireout; }
  29. override bool HasBullet () { return true; }
  30. override bool HasMagazine () { return false; }
  31. override bool IsJammed () { return false; }
  32. override bool IsRepairEnabled () { return true; }
  33. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.F}; }
  34. };
  35. class PumpShotgunLoaded extends WeaponStableState
  36. {
  37. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { Loaded C"); } super.OnEntry(e); }
  38. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } Loaded C"); } }
  39. override int GetCurrentStateID () { return PumpShotgunStableStateID.Loaded; }
  40. override bool HasBullet () { return true; }
  41. override bool HasMagazine () { return false; }
  42. override bool IsJammed () { return false; }
  43. override bool IsRepairEnabled () { return true; }
  44. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.L}; }
  45. };
  46. class PumpShotgunJammed extends WeaponStateJammed
  47. {
  48. override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { Jammed L_J"); } super.OnEntry(e); }
  49. override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } Jammed L_J"); } }
  50. override int GetCurrentStateID () { return PumpShotgunStableStateID.Jammed; }
  51. override bool HasBullet () { return true; }
  52. override bool HasMagazine () { return false; }
  53. override bool IsJammed () { return true; }
  54. override bool IsBoltOpen () { return true; }
  55. override bool IsRepairEnabled () { return true; }
  56. override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.F}; }
  57. };
  58. /**@class Mp133Shotgun_Base
  59. * @brief basic mp5 submachine gun
  60. **/
  61. class Mp133Shotgun_Base : Rifle_Base
  62. {
  63. ref WeaponStableState E;
  64. ref WeaponStableState F;
  65. ref WeaponStableState L;
  66. ref WeaponStableState J;
  67. void Mp133Shotgun ()
  68. {
  69. }
  70. override RecoilBase SpawnRecoilObject()
  71. {
  72. return new Mp133Recoil(this);
  73. }
  74. override void InitStateMachine ()
  75. {
  76. // setup abilities
  77. m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
  78. m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START));
  79. m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_END));
  80. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL));
  81. m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
  82. m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_SHOTGUN_COCKED));
  83. m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_SHOTGUN_UNCOCKED));
  84. m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE));
  85. // basic weapon states
  86. E = new PumpShotgunEmpty(this, NULL, PumpShotgunAnimState.DEFAULT);
  87. F = new PumpShotgunFireout(this, NULL, PumpShotgunAnimState.DEFAULT);
  88. L = new PumpShotgunLoaded(this, NULL, PumpShotgunAnimState.DEFAULT);
  89. J = new PumpShotgunJammed(this, NULL, PumpShotgunAnimState.DEFAULT);
  90. //--------------------------------------------------------------------------------------
  91. WeaponStateBase Mech_E = new WeaponChargingInnerMag(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
  92. WeaponStateBase Mech_F = new WeaponChargingInnerMag(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
  93. WeaponStateBase Mech_L = new WeaponChargingInnerMag(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
  94. LoopedChamberingEjectLast Chamber_E = new LoopedChamberingEjectLast(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_SHOTGUN_UNCOCKED, WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE);
  95. LoopedChamberingEjectLast Chamber_F = new LoopedChamberingEjectLast(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_SHOTGUN_UNCOCKED, WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE);
  96. LoopedChamberingEjectLast Chamber_L = new LoopedChamberingEjectLast(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_SHOTGUN_COCKED, WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE);
  97. WeaponStateBase Unjam_J = new WeaponUnjamming(this, NULL, WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START);
  98. WeaponStateBase Trigger_E = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY);
  99. WeaponStateBase Trigger_F = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY);
  100. WeaponStateBase Trigger_L = new WeaponFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL);
  101. WeaponStateBase Trigger_J = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY);
  102. WeaponStateBase Trigger_LJ = new WeaponFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM);
  103. WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
  104. WeaponEventBase __L__ = new WeaponEventLoad1Bullet;
  105. WeaponEventBase __T__ = new WeaponEventTrigger;
  106. WeaponEventBase __TJ_ = new WeaponEventTriggerToJam;
  107. WeaponEventBase __U__ = new WeaponEventUnjam;
  108. WeaponEventBase __M__ = new WeaponEventMechanism;
  109. WeaponEventBase _abt_ = new WeaponEventHumanCommandActionAborted;
  110. WeaponEventBase _rto_ = new WeaponEventReloadTimeout;
  111. WeaponEventBase _dto_ = new WeaponEventDryFireTimeout;
  112. m_fsm = new WeaponFSM();
  113. // Mechanism
  114. m_fsm.AddTransition(new WeaponTransition( E, __M__, Mech_L));
  115. //----------------------------------------
  116. m_fsm.AddTransition(new WeaponTransition( L, __M__, Mech_L));
  117. m_fsm.AddTransition(new WeaponTransition( Mech_L, _fin_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  118. m_fsm.AddTransition(new WeaponTransition( Mech_L, _fin_, L));
  119. m_fsm.AddTransition(new WeaponTransition( Mech_L, _abt_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  120. m_fsm.AddTransition(new WeaponTransition( Mech_L, _abt_, L));
  121. m_fsm.AddTransition(new WeaponTransition( F, __M__, Mech_F));
  122. m_fsm.AddTransition(new WeaponTransition( Mech_F, _fin_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  123. m_fsm.AddTransition(new WeaponTransition( Mech_F, _fin_, F, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
  124. m_fsm.AddTransition(new WeaponTransition( Mech_F, _fin_, L));
  125. m_fsm.AddTransition(new WeaponTransition( Mech_F, _abt_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  126. m_fsm.AddTransition(new WeaponTransition( Mech_F, _abt_, F, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
  127. m_fsm.AddTransition(new WeaponTransition( Mech_F, _abt_, L));
  128. //----------------------------------------
  129. m_fsm.AddTransition(new WeaponTransition( E, __L__, Chamber_E));
  130. m_fsm.AddTransition(new WeaponTransition( Chamber_E, _fin_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  131. m_fsm.AddTransition(new WeaponTransition( Chamber_E, _fin_, L));
  132. m_fsm.AddTransition(new WeaponTransition( Chamber_E, _abt_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  133. m_fsm.AddTransition(new WeaponTransition( Chamber_E, _abt_, L));
  134. m_fsm.AddTransition(new WeaponTransition( L, __L__, Chamber_L, NULL, new GuardNot(new WeaponGuardInnerMagazineFull(this))));
  135. m_fsm.AddTransition(new WeaponTransition( Chamber_L, _fin_, L));
  136. m_fsm.AddTransition(new WeaponTransition( Chamber_L, _abt_, L));
  137. m_fsm.AddTransition(new WeaponTransition( F, __L__, Chamber_F, NULL, new GuardNot(new WeaponGuardInnerMagazineFull(this))));
  138. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _fin_, F, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
  139. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _fin_, L));
  140. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _abt_, F, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
  141. m_fsm.AddTransition(new WeaponTransition( Chamber_F, _abt_, L));
  142. //-------------------------------------------
  143. m_fsm.AddTransition(new WeaponTransition( J, __U__, Unjam_J));
  144. m_fsm.AddTransition(new WeaponTransition( Unjam_J, _fin_, J, NULL, new WeaponGuardJammed(this)));
  145. m_fsm.AddTransition(new WeaponTransition( Unjam_J, _fin_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  146. m_fsm.AddTransition(new WeaponTransition( Unjam_J, _fin_, L));
  147. m_fsm.AddTransition(new WeaponTransition( Unjam_J, _abt_, J, NULL, new WeaponGuardJammed(this)));
  148. m_fsm.AddTransition(new WeaponTransition( Unjam_J, _abt_, E, NULL, new WeaponGuardCurrentChamberEmpty(this)));
  149. m_fsm.AddTransition(new WeaponTransition( Unjam_J, _abt_, L));
  150. //-----------------------------------------
  151. // fire
  152. m_fsm.AddTransition(new WeaponTransition( E, __T__, Trigger_E)); // fire.cocked
  153. m_fsm.AddTransition(new WeaponTransition( Trigger_E, _fin_, E));
  154. m_fsm.AddTransition(new WeaponTransition( Trigger_E, _dto_, E));
  155. m_fsm.AddTransition(new WeaponTransition( Trigger_E, _abt_, E));
  156. m_fsm.AddTransition(new WeaponTransition( L, __T__, Trigger_L)); // fire.cocked
  157. m_fsm.AddTransition(new WeaponTransition( Trigger_L, _fin_, F));
  158. m_fsm.AddTransition(new WeaponTransition( Trigger_L, _rto_, F));
  159. m_fsm.AddTransition(new WeaponTransition( Trigger_L, _abt_, F));
  160. m_fsm.AddTransition(new WeaponTransition( L, __TJ_, Trigger_LJ)); // fire.cocked
  161. m_fsm.AddTransition(new WeaponTransition( Trigger_LJ, _fin_, J));
  162. m_fsm.AddTransition(new WeaponTransition( Trigger_LJ, _rto_, J));
  163. m_fsm.AddTransition(new WeaponTransition( Trigger_LJ, _abt_, J));
  164. m_fsm.AddTransition(new WeaponTransition( F, __T__, Trigger_F)); // fire.cocked
  165. m_fsm.AddTransition(new WeaponTransition( Trigger_F, _fin_, F));
  166. m_fsm.AddTransition(new WeaponTransition( Trigger_F, _dto_, F));
  167. m_fsm.AddTransition(new WeaponTransition( Trigger_F, _abt_, F));
  168. m_fsm.AddTransition(new WeaponTransition( J, __T__, Trigger_J)); // fire.cocked
  169. m_fsm.AddTransition(new WeaponTransition( Trigger_J, _fin_, J));
  170. m_fsm.AddTransition(new WeaponTransition( Trigger_J, _dto_, J));
  171. m_fsm.AddTransition(new WeaponTransition( Trigger_J, _abt_, J));
  172. //-----------------------------------------
  173. SetInitialState(E);
  174. SelectionBulletHide();
  175. HideMagazine();
  176. m_fsm.Start();
  177. }
  178. override bool CanChamberBullet (int muzzleIndex, Magazine mag)
  179. {
  180. return CanChamberFromMag(muzzleIndex, mag) && !IsInternalMagazineFull(muzzleIndex);
  181. }
  182. override void SetActions()
  183. {
  184. super.SetActions();
  185. AddAction(FirearmActionLoadMultiBullet);
  186. RemoveAction(FirearmActionLoadBulletQuick); // Easy reload
  187. AddAction(FirearmActionLoadMultiBulletQuick); // Easy reload
  188. }
  189. //Debug menu Spawn Ground Special
  190. override void OnDebugSpawn()
  191. {
  192. super.OnDebugSpawn();
  193. GameInventory inventory = GetInventory();
  194. inventory.CreateInInventory( "FNP45_MRDSOptic" );
  195. inventory.CreateInInventory( "Battery9V" );
  196. EntityAI entity;
  197. if ( Class.CastTo(entity, this) )
  198. {
  199. entity.SpawnEntityOnGroundPos("Ammo_12gaPellets", entity.GetPosition());
  200. }
  201. }
  202. };