37 override bool HasBullet () {
return true; }
39 override bool IsJammed () {
return false; }
48 override bool HasBullet () {
return true; }
50 override bool IsJammed () {
return false; }
59 override bool HasBullet () {
return false; }
61 override bool IsJammed () {
return false; }
70 override bool HasBullet () {
return false; }
72 override bool IsJammed () {
return false; }
82 override bool HasBullet () {
return false; }
84 override bool IsJammed () {
return false; }
94 override bool HasBullet () {
return true; }
96 override bool IsJammed () {
return true; }
106 override bool HasBullet () {
return true; }
108 override bool IsJammed () {
return true; }
130 void RifleBoltLock_Base ()
134 override void InitStateMachine()
136 m_abilities.Insert(
new AbilityRecord(WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_BULLET)));
137 m_abilities.Insert(
new AbilityRecord(WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_BULLET)));
138 m_abilities.Insert(
new AbilityRecord(WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_NOBULLET)));
139 m_abilities.Insert(
new AbilityRecord(WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_NOBULLET)));
140 m_abilities.Insert(
new AbilityRecord(WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_NOBULLET_OPEN)));
141 m_abilities.Insert(
new AbilityRecord(WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_NOBULLET_OPEN)));
142 m_abilities.Insert(
new AbilityRecord(WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH)));
144 m_abilities.Insert(
new AbilityRecord(WeaponActions.CHAMBERING, GetWeaponSpecificCommand(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED)));
145 m_abilities.Insert(
new AbilityRecord(WeaponActions.CHAMBERING, GetWeaponSpecificCommand(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_UNIQUE_CLOSED)));
147 m_abilities.Insert(
new AbilityRecord(WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED)));
148 m_abilities.Insert(
new AbilityRecord(WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED)));
150 m_abilities.Insert(
new AbilityRecord(WeaponActions.UNJAMMING, GetWeaponSpecificCommand(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START)));
151 m_abilities.Insert(
new AbilityRecord(WeaponActions.UNJAMMING, GetWeaponSpecificCommand(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_END)));
153 m_abilities.Insert(
new AbilityRecord(WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL)));
154 m_abilities.Insert(
new AbilityRecord(WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_LAST)));
155 m_abilities.Insert(
new AbilityRecord(WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM)));
156 m_abilities.Insert(
new AbilityRecord(WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY)));
174 WeaponCharging Mech_C00 =
new WeaponCharging(
this, NULL, WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
175 WeaponCharging Mech_C01 =
new WeaponCharging(
this, NULL, WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
176 WeaponCharging Mech_O00 =
new WeaponCharging(
this, NULL, WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED));
177 WeaponCharging Mech_O01 =
new WeaponCharging(
this, NULL, WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED));
179 WeaponCharging Mech_C10 =
new WeaponCharging(
this, NULL, WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
180 WeaponCharging Mech_C11 =
new WeaponCharging(
this, NULL, WeaponActions.MECHANISM, GetWeaponSpecificCommand(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED));
182 WeaponStateBase Trigger_C00 =
new WeaponDryFire(
this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
183 WeaponStateBase Trigger_C10 =
new WeaponFireLast(
this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL));
184 WeaponFireAndChamberNext Trigger_C11 =
new WeaponFireAndChamberNext(
this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL));
185 WeaponStateBase Trigger_C11L =
new WeaponFireLast(
this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_LAST));
186 WeaponStateBase Trigger_C01 =
new WeaponDryFire(
this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
187 WeaponStateBase Trigger_O00 =
new WeaponDryFire(
this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
188 WeaponStateBase Trigger_O01 =
new WeaponDryFire(
this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
189 WeaponStateBase Trigger_JF0 =
new WeaponDryFire(
this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
190 WeaponStateBase Trigger_JF1 =
new WeaponDryFire(
this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
193 WeaponStateBase Trigger_C10J =
new WeaponFireToJam(
this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM));
194 WeaponStateBase Trigger_C11J =
new WeaponFireToJam(
this, NULL, WeaponActions.FIRE, GetWeaponSpecificCommand(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM));
198 WeaponStateBase Unjam_JF0 =
new WeaponUnjamming(
this, NULL, WeaponActions.UNJAMMING, GetWeaponSpecificCommand(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START));
199 WeaponStateBase Unjam_JF1 =
new WeaponUnjamming(
this, NULL, WeaponActions.UNJAMMING, GetWeaponSpecificCommand(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START));
201 WeaponChambering Chamber_C00 =
new WeaponChambering(
this, NULL, WeaponActions.CHAMBERING, GetWeaponSpecificCommand(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED));
202 WeaponChambering Chamber_C01 =
new WeaponChambering(
this, NULL, WeaponActions.CHAMBERING, GetWeaponSpecificCommand(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED));
203 WeaponChambering Chamber_O00 =
new WeaponChambering(
this, NULL, WeaponActions.CHAMBERING, GetWeaponSpecificCommand(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_UNIQUE_CLOSED));
204 WeaponChambering Chamber_O01 =
new WeaponChambering(
this, NULL, WeaponActions.CHAMBERING, GetWeaponSpecificCommand(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_UNIQUE_CLOSED));
206 WeaponAttachMagazine Attach_C00 =
new WeaponAttachMagazine(
this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_NOBULLET));
207 WeaponAttachMagazine Attach_C10 =
new WeaponAttachMagazine(
this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_BULLET));
208 WeaponAttachMagazine Attach_O00 =
new WeaponAttachMagazine(
this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_NOBULLET_OPEN));
209 WeaponAttachMagazine Attach_JF0 =
new WeaponAttachMagazine(
this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_NOMAGAZINE_BULLET));
216 WeaponDetachingMag Detach_C11 =
new WeaponDetachingMag(
this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH));
217 WeaponDetachingMag Detach_C01 =
new WeaponDetachingMag(
this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH));
218 WeaponDetachingMag Detach_O01 =
new WeaponDetachingMag(
this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH));
219 WeaponDetachingMag Detach_JF1 =
new WeaponDetachingMag(
this, NULL, WeaponActions.RELOAD, GetWeaponSpecificCommand(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADRIFLE_MAGAZINE_DETACH));
246 m_fsm.AddTransition(
new WeaponTransition( Mech_C10, _fin_, C00, NULL,
new WeaponGuardCurrentChamberEmpty(
this) ));
248 m_fsm.AddTransition(
new WeaponTransition( Mech_C10, _abt_, C00, NULL,
new WeaponGuardCurrentChamberEmpty(
this) ));
252 m_fsm.AddTransition(
new WeaponTransition( Mech_C11, _fin_, C01, NULL,
new WeaponGuardCurrentChamberEmpty(
this) ));
254 m_fsm.AddTransition(
new WeaponTransition( Mech_C11, _abt_, C01, NULL,
new WeaponGuardCurrentChamberEmpty(
this) ));
259 m_fsm.AddTransition(
new WeaponTransition( Mech_C01, _fin_, C01, NULL,
new WeaponGuardCurrentChamberEmpty(
this) ));
261 m_fsm.AddTransition(
new WeaponTransition( Mech_C01, _abt_, C01, NULL,
new WeaponGuardCurrentChamberEmpty(
this) ));
272 m_fsm.AddTransition(
new WeaponTransition( Mech_O01, _fin_, C01, NULL,
new WeaponGuardCurrentChamberEmpty(
this) ));
275 m_fsm.AddTransition(
new WeaponTransition( Mech_O01, _abt_, C01, NULL,
new WeaponGuardCurrentChamberEmpty(
this) ));
339 m_fsm.AddTransition(
new WeaponTransition( Chamber_C00, _fin_, C00, NULL,
new WeaponGuardChamberEmpty(
this)));
342 m_fsm.AddTransition(
new WeaponTransition( Chamber_C00, _abt_, C00, NULL,
new WeaponGuardChamberEmpty(
this)));
347 m_fsm.AddTransition(
new WeaponTransition( Chamber_C01, _fin_, C01, NULL,
new WeaponGuardChamberEmpty(
this)));
350 m_fsm.AddTransition(
new WeaponTransition( Chamber_C01, _abt_, C01, NULL,
new WeaponGuardChamberEmpty(
this)));
354 m_fsm.AddTransition(
new WeaponTransition( Chamber_O00, _fin_ , O00, NULL,
new WeaponGuardCurrentChamberEmpty(
this) ));
356 m_fsm.AddTransition(
new WeaponTransition( Chamber_O00, _abt_ , O00, NULL,
new WeaponGuardCurrentChamberEmpty(
this) ));
360 m_fsm.AddTransition(
new WeaponTransition( Chamber_O01, _fin_, O01, NULL,
new WeaponGuardCurrentChamberEmpty(
this) ));
362 m_fsm.AddTransition(
new WeaponTransition( Chamber_O01, _abt_, O01, NULL,
new WeaponGuardCurrentChamberEmpty(
this) ));
366 m_fsm.AddTransition(
new WeaponTransition( C00, __A__, Attach_C00, NULL,
new WeaponGuardCanAttachMag(
this)));
367 m_fsm.AddTransition(
new WeaponTransition( Attach_C00, _fin_, C00, NULL,
new GuardNot(
new WeaponGuardHasMag(
this))) );
368 m_fsm.AddTransition(
new WeaponTransition( Attach_C00, _fin_, C01, NULL,
new WeaponGuardCurrentChamberEmpty(
this)) );
370 m_fsm.AddTransition(
new WeaponTransition( Attach_C00, _abt_, C00, NULL,
new GuardNot(
new WeaponGuardHasMag(
this))) );
371 m_fsm.AddTransition(
new WeaponTransition( Attach_C00, _abt_, C01, NULL,
new WeaponGuardCurrentChamberEmpty(
this)) );
374 m_fsm.AddTransition(
new WeaponTransition( C10, __A__, Attach_C10, NULL,
new WeaponGuardCanAttachMag(
this)));
375 m_fsm.AddTransition(
new WeaponTransition( Attach_C10, _fin_, C11, NULL,
new WeaponGuardHasMag(
this)) );
377 m_fsm.AddTransition(
new WeaponTransition( Attach_C10, _abt_, C11, NULL,
new WeaponGuardHasMag(
this)) );
380 m_fsm.AddTransition(
new WeaponTransition( O00, __A__, Attach_O00, NULL,
new WeaponGuardCanAttachMag(
this)));
381 m_fsm.AddTransition(
new WeaponTransition( Attach_O00, _fin_, O00, NULL,
new GuardNot(
new WeaponGuardHasMag(
this))));
383 m_fsm.AddTransition(
new WeaponTransition( Attach_O00, _fin_, C01, NULL,
new WeaponGuardCurrentChamberEmpty(
this)));
385 m_fsm.AddTransition(
new WeaponTransition( Attach_O00, _abt_, O00, NULL,
new GuardNot(
new WeaponGuardHasMag(
this))));
387 m_fsm.AddTransition(
new WeaponTransition( Attach_O00, _abt_, C01, NULL,
new WeaponGuardCurrentChamberEmpty(
this)));
390 m_fsm.AddTransition(
new WeaponTransition( JF0, __A__, Attach_JF0, NULL,
new WeaponGuardCanAttachMag(
this)));
391 m_fsm.AddTransition(
new WeaponTransition( Attach_JF0, _fin_, JF1, NULL,
new WeaponGuardHasMag(
this)));
393 m_fsm.AddTransition(
new WeaponTransition( Attach_JF0, _abt_, JF1, NULL,
new WeaponGuardHasMag(
this)));
398 m_fsm.AddTransition(
new WeaponTransition( C11, __S__, Reload_C11, NULL,
new WeaponGuardCanSwapMag(
this)));
399 m_fsm.AddTransition(
new WeaponTransition( Reload_C11, _fin_, C11, NULL,
new WeaponGuardHasMag(
this)));
401 m_fsm.AddTransition(
new WeaponTransition( Reload_C11, _abt_, C11, NULL,
new WeaponGuardHasMag(
this)));
405 m_fsm.AddTransition(
new WeaponTransition( C01, __S__, Reload_C01, NULL,
new WeaponGuardCanSwapMag(
this)));
406 m_fsm.AddTransition(
new WeaponTransition( Reload_C01, _fin_, C11, NULL,
new WeaponGuardCurrentChamberFull(
this)) );
407 m_fsm.AddTransition(
new WeaponTransition( Reload_C01, _fin_, C01, NULL,
new WeaponGuardHasMag(
this)) );
409 m_fsm.AddTransition(
new WeaponTransition( Reload_C01, _abt_, C11, NULL,
new WeaponGuardCurrentChamberFull(
this)) );
410 m_fsm.AddTransition(
new WeaponTransition( Reload_C01, _abt_, C01, NULL,
new WeaponGuardHasMag(
this)) );
414 m_fsm.AddTransition(
new WeaponTransition( O01, __S__, Reload_O01, NULL,
new WeaponGuardCanSwapMag(
this)));
415 m_fsm.AddTransition(
new WeaponTransition( Reload_O01, _fin_, O00, NULL,
new GuardNot(
new WeaponGuardHasMag(
this))) );
417 m_fsm.AddTransition(
new WeaponTransition( Reload_O01, _fin_, C01, NULL,
new WeaponGuardCurrentChamberEmpty(
this)));
419 m_fsm.AddTransition(
new WeaponTransition( Reload_O01, _abt_, O00, NULL,
new GuardNot(
new WeaponGuardHasMag(
this))) );
421 m_fsm.AddTransition(
new WeaponTransition( Reload_O01, _abt_, C01, NULL,
new WeaponGuardCurrentChamberEmpty(
this)));
424 m_fsm.AddTransition(
new WeaponTransition( JF1, __S__, Reload_JF1, NULL,
new WeaponGuardCanSwapMag(
this)));
425 m_fsm.AddTransition(
new WeaponTransition( Reload_JF1, _fin_, JF1, NULL,
new WeaponGuardHasMag(
this)));
427 m_fsm.AddTransition(
new WeaponTransition( Reload_JF1, _abt_, JF1, NULL,
new WeaponGuardHasMag(
this)));
433 m_fsm.AddTransition(
new WeaponTransition( C11, __D__, Detach_C11, NULL,
new WeaponGuardCanDetachMag(
this)));
434 m_fsm.AddTransition(
new WeaponTransition( Detach_C11, _fin_, C11, NULL,
new WeaponGuardHasMag(
this)));
436 m_fsm.AddTransition(
new WeaponTransition( Detach_C11, _abt_, C11, NULL,
new WeaponGuardHasMag(
this)));
439 m_fsm.AddTransition(
new WeaponTransition( C01, __D__, Detach_C01, NULL,
new WeaponGuardCanDetachMag(
this)));
440 m_fsm.AddTransition(
new WeaponTransition( Detach_C01, _fin_, C01, NULL,
new WeaponGuardHasMag(
this)));
442 m_fsm.AddTransition(
new WeaponTransition( Detach_C01, _abt_, C01, NULL,
new WeaponGuardHasMag(
this)));
445 m_fsm.AddTransition(
new WeaponTransition( O01, __D__, Detach_O01, NULL,
new WeaponGuardCanDetachMag(
this)));
446 m_fsm.AddTransition(
new WeaponTransition( Detach_O01, _fin_, O01, NULL,
new WeaponGuardHasMag(
this)));
448 m_fsm.AddTransition(
new WeaponTransition( Detach_O01, _abt_, O01, NULL,
new WeaponGuardHasMag(
this)));
451 m_fsm.AddTransition(
new WeaponTransition( JF1, __D__, Detach_JF1, NULL,
new WeaponGuardCanDetachMag(
this)));
452 m_fsm.AddTransition(
new WeaponTransition( Detach_JF1, _fin_, JF1, NULL,
new WeaponGuardHasMag(
this)));
454 m_fsm.AddTransition(
new WeaponTransition( Detach_JF1, _abt_, JF1, NULL,
new WeaponGuardHasMag(
this)));
461 m_fsm.AddTransition(
new WeaponTransition( Unjam_JF0, _fin_, JF0, NULL,
new WeaponGuardJammed(
this)));
463 m_fsm.AddTransition(
new WeaponTransition( Unjam_JF0, _abt_, JF0, NULL,
new WeaponGuardJammed(
this)));
467 m_fsm.AddTransition(
new WeaponTransition( Unjam_JF1, _fin_, JF1, NULL,
new WeaponGuardJammed(
this)));
468 m_fsm.AddTransition(
new WeaponTransition( Unjam_JF1, _fin_, C01, NULL,
new WeaponGuardCurrentChamberEmpty(
this)));
470 m_fsm.AddTransition(
new WeaponTransition( Unjam_JF1, _abt_, JF1, NULL,
new WeaponGuardJammed(
this)));
471 m_fsm.AddTransition(
new WeaponTransition( Unjam_JF1, _abt_, C01, NULL,
new WeaponGuardCurrentChamberEmpty(
this)));
474 SetInitialState(C00);
476 SelectionBulletHide();
482 override float GetChanceToJam()
484 float chanceToJam = super.GetChanceToJam();
485 Magazine mag = GetMagazine(GetCurrentMuzzle());
489 chanceToJam = chanceToJam + ((1.0 - chanceToJam) * mag.GetChanceToJam());
493 chanceToJam = chanceToJam + ((1.0 - chanceToJam) * 0.06);
void AddAction(typename actionName)
pair ( action, actionType )
base for rifles @NOTE name copies config base class
charging of weapon without ammo to be chambered
signalize mechanism manipulation
weapon finite state machine
replace current magazine with new one
represents weapon's stable state (i.e. the basic states that the weapon will spend the most time in)
represent weapon state base
override bool IsRepairEnabled()
override bool HasBullet()
override void InitMuzzleArray()
override bool HasMagazine()
class WeaponGuardIsDestroyed extends WeaponGuardBase m_weapon
void WeaponGuardHasAmmo(Weapon_Base w=NULL)
void WeaponGuardWeaponOpen(Weapon_Base w=NULL)
override int GetCurrentStateID()
override bool IsBoltOpen()
@ DEFAULT
default weapon state, closed and discharged
class SSPFireout extends WeaponStableState OnEntry
enum FSMTransition WeaponTransition
class WeaponChambering_Chamber_OnEntry extends WeaponChambering_Base OnExit
ref array< MuzzleState > m_muzzleHasBullet