enum PistolAnimState { DEFAULT = 0, ///< default weapon state, closed and discharged OPENED_DISCHARGED = 1, ///< opened and discharged CLOSED_CHARGED = 2, ///< closed and charged JAMMED = 3 ///< jammed weapon }; // naming convention of the states respect following order: // closed/opened | charged/discharged | bullet/nobullet | magazine/nomag enum PistolStableStateID { UNKNOWN = 0, CLO_DIS_BU0_MA0 = 1, CLO_CHG_BU0_MA0 = 2, CLO_CHG_BU1_MA0 = 3, CLO_JAM_BU1_MA0 = 4, OPE_DIS_BU0_MA0 = 5, CLO_CHG_BU0_MA1 = 6, CLO_DIS_BU0_MA1 = 7, CLO_JAM_BU1_MA1 = 8, CLO_CHG_BU1_MA1 = 9, OPE_DIS_BU0_MA1 = 10, } class Pistol_CLO_DIS_BU0_MA0 extends WeaponStableState { override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { CD00 closed dischgd nobull nomag"); } super.OnEntry(e); } override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } CD00 closed dischgd nobull nomag"); } } override int GetCurrentStateID () { return PistolStableStateID.CLO_DIS_BU0_MA0; } override bool HasBullet () { return false; } override bool HasMagazine () { return false; } override bool IsJammed () { return false; } override bool IsDischarged () { return true; } override bool IsRepairEnabled () { return true; } override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; } }; class Pistol_CLO_CHG_BU0_MA0 extends WeaponStableState { override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { CC00 closed charged nobull nomag"); } super.OnEntry(e); } override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } CC00 closed charged nobull nomag"); } } override int GetCurrentStateID () { return PistolStableStateID.CLO_CHG_BU0_MA0; } override bool HasBullet () { return false; } override bool HasMagazine () { return false; } override bool IsJammed () { return false; } override bool IsRepairEnabled () { return true; } override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; } }; class Pistol_CLO_CHG_BU1_MA0 extends WeaponStableState { override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { CC10 closed charged bullet nomag"); } super.OnEntry(e); } override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } CC10 closed charged bullet nomag"); } } override int GetCurrentStateID () { return PistolStableStateID.CLO_CHG_BU1_MA0; } override bool HasBullet () { return true; } override bool HasMagazine () { return false; } override bool IsJammed () { return false; } override bool IsRepairEnabled () { return true; } override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.L}; } }; class Pistol_CLO_JAM_BU1_MA0 extends WeaponStableState { override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { CJF0 closed jammed bullet nomag"); } super.OnEntry(e); } override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } CJF0 closed jammed bullet nomag"); } } override int GetCurrentStateID () { return PistolStableStateID.CLO_JAM_BU1_MA0; } override bool HasBullet () { return true; } override bool HasMagazine () { return false; } override bool IsJammed () { return true; } override bool IsBoltOpen () { return true; } override bool IsRepairEnabled () { return true; } override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.F}; } }; class Pistol_OPE_DIS_BU0_MA0 extends WeaponStableState { override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { OD00 opened dischgd nobullet nomag"); } m_weapon.SetCharged(false); m_weapon.SetWeaponOpen(true); super.OnEntry(e); } override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } 0D00 opened dischgd nobullet nomag"); } } override int GetCurrentStateID () { return PistolStableStateID.OPE_DIS_BU0_MA0; } override bool HasBullet () { return false; } override bool HasMagazine () { return false; } override bool IsJammed () { return false; } override bool IsBoltOpen () { return true; } override bool IsDischarged () { return true; } override bool IsRepairEnabled () { return true; } override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; } }; class Pistol_CLO_CHG_BU0_MA1 extends WeaponStableState { override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { CC01 closed charged nobullet mag"); } super.OnEntry(e); } override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } CC01 closed charged nobullet mag"); } } override int GetCurrentStateID () { return PistolStableStateID.CLO_CHG_BU0_MA1; } override bool HasBullet () { return false; } override bool HasMagazine () { return true; } override bool IsJammed () { return false; } override bool IsRepairEnabled () { return true; } override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; } }; class Pistol_CLO_DIS_BU0_MA1 extends WeaponStableState { override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { CD01 closed dischgd nobullet mag"); } m_weapon.SetCharged(false); super.OnEntry(e); } override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } CD01 closed dischgd nobullet mag"); } } override int GetCurrentStateID () { return PistolStableStateID.CLO_DIS_BU0_MA1; } override bool HasBullet () { return false; } override bool HasMagazine () { return true; } override bool IsJammed () { return false; } override bool IsRepairEnabled () { return true; } override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; } }; class Pistol_CLO_JAM_BU1_MA1 extends WeaponStableState { override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { CJF1 closed jammed bullet mag"); } super.OnEntry(e); } override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } CJF1 closed jammed bullet mag"); } } override int GetCurrentStateID () { return PistolStableStateID.CLO_JAM_BU1_MA1; } override bool HasBullet () { return true; } override bool HasMagazine () { return true; } override bool IsJammed () { return true; } override bool IsBoltOpen () { return true; } override bool IsRepairEnabled () { return true; } override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.L}; } }; class Pistol_CLO_CHG_BU1_MA1 extends WeaponStableState { override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { CC11 closed charged bullet mag"); } super.OnEntry(e); } override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } CC11 closed charged bullet mag"); } } override int GetCurrentStateID () { return PistolStableStateID.CLO_CHG_BU1_MA1; } override bool HasBullet () { return true; } override bool HasMagazine () { return true; } override bool IsJammed () { return false; } override bool IsRepairEnabled () { return true; } override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.L}; } }; class Pistol_OPE_DIS_BU0_MA1 extends WeaponStableState { override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] { OD01 opened dischgd nobullet mag"); } m_weapon.SetWeaponOpen(true); super.OnEntry(e); } override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnstate] } 0D01 opened dischgd nobullet mag"); } } override int GetCurrentStateID () { return PistolStableStateID.OPE_DIS_BU0_MA1; } override bool HasBullet () { return false; } override bool HasMagazine () { return true; } override bool IsJammed () { return false; } override bool IsBoltOpen () { return true; } override bool IsRepairEnabled () { return true; } override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.E}; } }; /**@class Pistol_Base * @brief base for semi auto weapons * @NOTE name copies config base class **/ class Pistol_Base extends Weapon_Base { ref WeaponStableState CD00; ref WeaponStableState CC00; ref WeaponStableState CC10; ref WeaponStableState CJF0; ref WeaponStableState OD00; ref WeaponStableState CD01; ref WeaponStableState CC01; ref WeaponStableState CC11; ref WeaponStableState CJF1; ref WeaponStableState OD01; override bool CanChamberBullet (int muzzleIndex, Magazine mag) { return super.CanChamberBullet(muzzleIndex,mag) && IsChamberEmpty(muzzleIndex); } void Pistol_Base () { } override void InitStateMachine () { m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_MAGAZINE_BULLET_CLOSED)); m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_NOMAGAZINE_BULLET_CLOSED)); m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_MAGAZINE_NOBULLET_CLOSED_COCKED)); m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_NOMAGAZINE_NOBULLET_CLOSED_COCKED)); m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_MAGAZINE_NOBULLET_CLOSED_UNCOCKED)); m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_NOMAGAZINE_NOBULLET_CLOSED_UNCOCKED)); m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_NOMAGAZINE_NOBULLET_OPENED)); m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_MAGAZINE_NOBULLET_OPENED)); m_abilities.Insert(new AbilityRecord(WeaponActions.RELOAD, WeaponActionReloadTypes.RELOAD_MAGAZINE_DETACH)); m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED)); m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_OPENED)); m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED)); m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED)); m_abilities.Insert(new AbilityRecord(WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED_UNCOCKED)); m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START)); m_abilities.Insert(new AbilityRecord(WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_END)); m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL)); m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_LAST)); m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED)); m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_UNCOCKED)); m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM)); // setup state machine // basic weapon states // open-closed | discharged-charged | nobullet-bullet | nomag-mag // regexp: [OC][CDJ][01][01] CD00 = new Pistol_CLO_DIS_BU0_MA0(this, NULL, PistolAnimState.DEFAULT); CC00 = new Pistol_CLO_CHG_BU0_MA0(this, NULL, PistolAnimState.CLOSED_CHARGED); CC10 = new Pistol_CLO_CHG_BU1_MA0(this, NULL, PistolAnimState.CLOSED_CHARGED); CJF0 = new Pistol_CLO_JAM_BU1_MA0(this, NULL, PistolAnimState.JAMMED); OD00 = new Pistol_OPE_DIS_BU0_MA0(this, NULL, PistolAnimState.OPENED_DISCHARGED); CD01 = new Pistol_CLO_DIS_BU0_MA1(this, NULL, PistolAnimState.DEFAULT); CC01 = new Pistol_CLO_CHG_BU0_MA1(this, NULL, PistolAnimState.CLOSED_CHARGED); CC11 = new Pistol_CLO_CHG_BU1_MA1(this, NULL, PistolAnimState.CLOSED_CHARGED); CJF1 = new Pistol_CLO_JAM_BU1_MA1(this, NULL, PistolAnimState.JAMMED); OD01 = new Pistol_OPE_DIS_BU0_MA1(this, NULL, PistolAnimState.OPENED_DISCHARGED); // unstable (intermediate) states WeaponCharging Mech_CD00 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED_UNCOCKED); WeaponCharging Mech_CC00 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED); WeaponCharging Mech_CD01 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED_UNCOCKED); WeaponCharging Mech_CC01 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED); WeaponCharging Mech_OD00 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED); WeaponCharging Mech_OD01 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED); WeaponCharging Mech_CC10 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED); // eject with no mag WeaponCharging Mech_CC11 = new WeaponCharging(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED); // eject with mag WeaponDryFire Trigger_CC00 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED); // cock without clip WeaponDryFire Trigger_CD00 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED); WeaponDryFire Trigger_OD00 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_UNCOCKED); WeaponDryFire Trigger_CD01 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED); WeaponDryFire Trigger_OD01 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_UNCOCKED); WeaponDryFire Trigger_CC01 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_COCKED); // cock with clip WeaponDryFire Trigger_CJF0 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_UNCOCKED); WeaponDryFire Trigger_CJF1 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_UNCOCKED); WeaponFireAndChamberNext Trigger_CC11 = new WeaponFireAndChamberNext(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL); WeaponStateBase Trigger_CC10 = new WeaponFireLast(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL); // fire last no mag WeaponStateBase Trigger_CC11L = new WeaponFireLast(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_LAST); // fire last with mag WeaponStateBase Trigger_CC10J = new WeaponFireToJam(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM); WeaponStateBase Trigger_CC11J = new WeaponFireToJam(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM); WeaponStateBase Unjam_CJF0 = new WeaponUnjamming(this, NULL, WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START); WeaponStateBase Unjam_CJF1 = new WeaponUnjamming(this, NULL, WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START); WeaponChambering Chamber_CD00 = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED_UNCOCKED); WeaponChambering Chamber_CC00 = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED); WeaponChambering Chamber_OD00 = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_OPENED); WeaponChambering Chamber_CD01 = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED_UNCOCKED); WeaponChambering Chamber_CC01 = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_CLOSED); WeaponChambering Chamber_OD01 = new WeaponChambering(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ONEBULLET_OPENED); WeaponAttachMagazine Attach_CC10 = new WeaponAttachMagazine(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_NOMAGAZINE_BULLET_CLOSED); WeaponAttachMagazine Attach_CJF0 = new WeaponAttachMagazine(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_NOMAGAZINE_BULLET_CLOSED); WeaponAttachMagazine Attach_CD00 = new WeaponAttachMagazine(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_NOMAGAZINE_NOBULLET_CLOSED_UNCOCKED); WeaponAttachMagazine Attach_CC00 = new WeaponAttachMagazine(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_NOMAGAZINE_NOBULLET_CLOSED_COCKED); WeaponAttachMagazine Attach_OD00 = new WeaponAttachMagazine(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_NOMAGAZINE_NOBULLET_OPENED); WeaponReplacingMagAndChamberNext Reload_CD01 = new WeaponReplacingMagAndChamberNext(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_MAGAZINE_NOBULLET_CLOSED_UNCOCKED); WeaponReplacingMagAndChamberNext Reload_CC01 = new WeaponReplacingMagAndChamberNext(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_MAGAZINE_NOBULLET_CLOSED_COCKED); WeaponReplacingMagAndChamberNext Reload_CC11 = new WeaponReplacingMagAndChamberNext(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_MAGAZINE_BULLET_CLOSED); WeaponReplacingMagAndChamberNext Reload_CJF1 = new WeaponReplacingMagAndChamberNext(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_MAGAZINE_BULLET_CLOSED); WeaponReplacingMagAndChamberNext Reload_OD01 = new WeaponReplacingMagAndChamberNext(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOADPISTOL_MAGAZINE_NOBULLET_OPENED); WeaponDetachingMag Detach_CC11 = new WeaponDetachingMag(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOAD_MAGAZINE_DETACH); WeaponDetachingMag Detach_CC01 = new WeaponDetachingMag(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOAD_MAGAZINE_DETACH); WeaponDetachingMag Detach_CD01 = new WeaponDetachingMag(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOAD_MAGAZINE_DETACH); WeaponDetachingMag Detach_OD01 = new WeaponDetachingMag(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOAD_MAGAZINE_DETACH); WeaponDetachingMag Detach_CJF1 = new WeaponDetachingMag(this, NULL, WeaponActions.RELOAD, WeaponActionReloadTypes.RELOAD_MAGAZINE_DETACH); // events WeaponEventBase __M__ = new WeaponEventMechanism; WeaponEventBase __T__ = new WeaponEventTrigger; WeaponEventBase __TJ_ = new WeaponEventTriggerToJam; WeaponEventBase __U__ = new WeaponEventUnjam; WeaponEventBase __L__ = new WeaponEventLoad1Bullet; WeaponEventBase __A__ = new WeaponEventAttachMagazine; WeaponEventBase __D__ = new WeaponEventDetachMagazine; WeaponEventBase __S__ = new WeaponEventSwapMagazine; WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished; WeaponEventBase _rto_ = new WeaponEventReloadTimeout; WeaponEventBase _dto_ = new WeaponEventDryFireTimeout; WeaponEventBase _abt_ = new WeaponEventHumanCommandActionAborted; m_fsm = new WeaponFSM(); //WeaponGuardWeaponDischarged //WeaponGuardWeaponOpen // charging m_fsm.AddTransition(new WeaponTransition( CD00, __M__, Mech_CD00)); // charge from closed m_fsm.AddTransition(new WeaponTransition( Mech_CD00, _fin_, CC00, NULL, new WeaponGuardWeaponDischarged(this) )); m_fsm.AddTransition(new WeaponTransition( Mech_CD00, _fin_, CD00)); m_fsm.AddTransition(new WeaponTransition( Mech_CD00, _abt_, CC00, NULL, new WeaponGuardWeaponDischarged(this) )); m_fsm.AddTransition(new WeaponTransition( Mech_CD00, _abt_, CD00)); m_fsm.AddTransition(new WeaponTransition( CC00, __M__, Mech_CC00)); // charge from charged m_fsm.AddTransition(new WeaponTransition( Mech_CC00, _fin_, CC00)); m_fsm.AddTransition(new WeaponTransition( Mech_CC00, _abt_, CC00)); m_fsm.AddTransition(new WeaponTransition( OD00, __M__, Mech_OD00)); // charge from opened m_fsm.AddTransition(new WeaponTransition( Mech_OD00, _fin_, CD00, NULL, new WeaponGuardWeaponOpen(this) )); m_fsm.AddTransition(new WeaponTransition( Mech_OD00, _fin_, CC00)); m_fsm.AddTransition(new WeaponTransition( Mech_OD00, _abt_, CD00, NULL, new WeaponGuardWeaponOpen(this) )); m_fsm.AddTransition(new WeaponTransition( Mech_OD00, _abt_, CC00)); m_fsm.AddTransition(new WeaponTransition( OD01, __M__, Mech_OD01)); // charge from opened with mag m_fsm.AddTransition(new WeaponTransition( Mech_OD01, _fin_, OD01, NULL, new WeaponGuardWeaponOpen(this) )); m_fsm.AddTransition(new WeaponTransition( Mech_OD01, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this) )); m_fsm.AddTransition(new WeaponTransition( Mech_OD01, _fin_, CC11)); m_fsm.AddTransition(new WeaponTransition( Mech_OD01, _abt_, OD01, NULL, new WeaponGuardWeaponOpen(this) )); m_fsm.AddTransition(new WeaponTransition( Mech_OD01, _abt_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this) )); m_fsm.AddTransition(new WeaponTransition( Mech_OD01, _abt_, CC11)); m_fsm.AddTransition(new WeaponTransition( CD01, __M__, Mech_CD01)); // charge from closed=1 with mag m_fsm.AddTransition(new WeaponTransition( Mech_CD01, _fin_, CD01, NULL, new WeaponGuardWeaponDischarged(this))); m_fsm.AddTransition(new WeaponTransition( Mech_CD01, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Mech_CD01, _fin_, CC11)); m_fsm.AddTransition(new WeaponTransition( Mech_CD01, _abt_, CD01, NULL, new WeaponGuardWeaponDischarged(this))); m_fsm.AddTransition(new WeaponTransition( Mech_CD01, _abt_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Mech_CD01, _abt_, CC11)); m_fsm.AddTransition(new WeaponTransition( CC01, __M__, Mech_CC01)); // charge from closed/charged with mag m_fsm.AddTransition(new WeaponTransition( Mech_CC01, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Mech_CC01, _fin_, CC11)); m_fsm.AddTransition(new WeaponTransition( Mech_CC01, _abt_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Mech_CC01, _abt_, CC11)); // eject good cartridge m_fsm.AddTransition(new WeaponTransition( CC10, __M__, Mech_CC10)); // eject chamber nomag m_fsm.AddTransition(new WeaponTransition( Mech_CC10, _fin_, CC00, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Mech_CC10, _fin_, CC10)); m_fsm.AddTransition(new WeaponTransition( Mech_CC10, _abt_, CC00, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Mech_CC10, _abt_, CC10)); m_fsm.AddTransition(new WeaponTransition( CC11, __M__, Mech_CC11 )); // eject with mag with ammo m_fsm.AddTransition(new WeaponTransition( Mech_CC11, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Mech_CC11, _fin_, CC11)); m_fsm.AddTransition(new WeaponTransition( Mech_CC11, _abt_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Mech_CC11, _abt_, CC11)); // Trigger_CC11e m_fsm.AddTransition(new WeaponTransition( CC00, __T__, Trigger_CC00)); // fire.cocked m_fsm.AddTransition(new WeaponTransition( Trigger_CC00, _fin_, CD00)); m_fsm.AddTransition(new WeaponTransition( Trigger_CC00, _dto_, CD00)); m_fsm.AddTransition(new WeaponTransition( Trigger_CC00, _abt_, CD00)); m_fsm.AddTransition(new WeaponTransition( CD00, __T__, Trigger_CD00)); // fire.uncocked m_fsm.AddTransition(new WeaponTransition( Trigger_CD00, _fin_, CD00)); m_fsm.AddTransition(new WeaponTransition( Trigger_CD00, _dto_, CD00)); m_fsm.AddTransition(new WeaponTransition( Trigger_CD00, _abt_, CD00)); m_fsm.AddTransition(new WeaponTransition( OD00, __T__, Trigger_OD00)); // opened fire.uncocked m_fsm.AddTransition(new WeaponTransition( Trigger_OD00, _fin_, OD00)); m_fsm.AddTransition(new WeaponTransition( Trigger_OD00, _dto_, OD00)); m_fsm.AddTransition(new WeaponTransition( Trigger_OD00, _abt_, OD00)); m_fsm.AddTransition(new WeaponTransition( CD01, __T__, Trigger_CD01)); // fire.uncocked w mag m_fsm.AddTransition(new WeaponTransition( Trigger_CD01, _fin_, CD01)); m_fsm.AddTransition(new WeaponTransition( Trigger_CD01, _dto_, CD01)); m_fsm.AddTransition(new WeaponTransition( Trigger_CD01, _abt_, CD01)); m_fsm.AddTransition(new WeaponTransition( OD01, __T__, Trigger_OD01)); // opened fire.uncocked w mag m_fsm.AddTransition(new WeaponTransition( Trigger_OD01, _fin_, OD01)); m_fsm.AddTransition(new WeaponTransition( Trigger_OD01, _dto_, OD01)); m_fsm.AddTransition(new WeaponTransition( Trigger_OD01, _abt_, OD01)); m_fsm.AddTransition(new WeaponTransition( CJF0, __T__, Trigger_CJF0)); // opened fire.uncocked w mag m_fsm.AddTransition(new WeaponTransition( Trigger_CJF0, _fin_, CJF0)); m_fsm.AddTransition(new WeaponTransition( Trigger_CJF0, _dto_, CJF0)); m_fsm.AddTransition(new WeaponTransition( Trigger_CJF0, _abt_, CJF0)); m_fsm.AddTransition(new WeaponTransition( CJF1, __T__, Trigger_CJF1)); // opened fire.uncocked w mag m_fsm.AddTransition(new WeaponTransition( Trigger_CJF1, _fin_, CJF1)); m_fsm.AddTransition(new WeaponTransition( Trigger_CJF1, _dto_, CJF1)); m_fsm.AddTransition(new WeaponTransition( Trigger_CJF1, _abt_, CJF1)); m_fsm.AddTransition(new WeaponTransition( CC10, __T__, Trigger_CC10)); // or fire.last (if not jammed) m_fsm.AddTransition(new WeaponTransition( Trigger_CC10, _fin_, CC00)); m_fsm.AddTransition(new WeaponTransition( Trigger_CC10, _rto_, CC00)); m_fsm.AddTransition(new WeaponTransition( Trigger_CC10, _abt_, CC00)); m_fsm.AddTransition(new WeaponTransition( CC10, __TJ_, Trigger_CC10J)); // or fire.last (if not jammed) m_fsm.AddTransition(new WeaponTransition( Trigger_CC10J, _fin_, CJF0 )); m_fsm.AddTransition(new WeaponTransition( Trigger_CC10J, _rto_, CJF0 )); m_fsm.AddTransition(new WeaponTransition( Trigger_CC10J, _abt_, CJF0 )); m_fsm.AddTransition(new WeaponTransition( CC11, __T__, Trigger_CC11, NULL, new WeaponGuardHasAmmo(this))); // fire.normal + chamber next m_fsm.AddTransition(new WeaponTransition( Trigger_CC11, _fin_, CC11)); m_fsm.AddTransition(new WeaponTransition( Trigger_CC11, _rto_, CC11)); m_fsm.AddTransition(new WeaponTransition( Trigger_CC11, _abt_, CC11)); m_fsm.AddTransition(new WeaponTransition( CC11, __T__, Trigger_CC11L, NULL, new GuardNot(new WeaponGuardHasAmmo(this)))); // fire.last with mag m_fsm.AddTransition(new WeaponTransition( Trigger_CC11L, _fin_, OD01)); m_fsm.AddTransition(new WeaponTransition( Trigger_CC11L, _rto_, OD01)); m_fsm.AddTransition(new WeaponTransition( Trigger_CC11L, _abt_, OD01)); m_fsm.AddTransition(new WeaponTransition( CC11, __TJ_, Trigger_CC11J )); // fire.last with mag m_fsm.AddTransition(new WeaponTransition( Trigger_CC11J, _fin_, CJF1 )); m_fsm.AddTransition(new WeaponTransition( Trigger_CC11J, _rto_, CJF1 )); m_fsm.AddTransition(new WeaponTransition( Trigger_CC11J, _abt_, CJF1 )); m_fsm.AddTransition(new WeaponTransition( CC01, __T__, Trigger_CC01)); // fire.cocked with mag m_fsm.AddTransition(new WeaponTransition( Trigger_CC01, _fin_, CD01)); m_fsm.AddTransition(new WeaponTransition( Trigger_CC01, _dto_, CD01)); m_fsm.AddTransition(new WeaponTransition( Trigger_CC01, _abt_, CD01)); // load cartridge m_fsm.AddTransition(new WeaponTransition( CD00, __L__, Chamber_CD00)); // chamber from closed=1 m_fsm.AddTransition(new WeaponTransition( Chamber_CD00, _fin_, OD00, NULL, new WeaponGuardWeaponOpen(this))); m_fsm.AddTransition(new WeaponTransition( Chamber_CD00, _fin_, CD00, NULL, new WeaponGuardWeaponDischarged(this))); m_fsm.AddTransition(new WeaponTransition( Chamber_CD00, _fin_, CC10)); m_fsm.AddTransition(new WeaponTransition( Chamber_CD00, _abt_, OD00, NULL, new WeaponGuardWeaponOpen(this))); m_fsm.AddTransition(new WeaponTransition( Chamber_CD00, _abt_, CD00, NULL, new WeaponGuardWeaponDischarged(this))); m_fsm.AddTransition(new WeaponTransition( Chamber_CD00, _abt_, CC10)); m_fsm.AddTransition(new WeaponTransition( OD00, __L__, Chamber_OD00)); // chamber from opened m_fsm.AddTransition(new WeaponTransition( Chamber_OD00, _fin_, OD00, NULL, new WeaponGuardWeaponOpen(this))); m_fsm.AddTransition(new WeaponTransition( Chamber_OD00, _fin_, CC10)); m_fsm.AddTransition(new WeaponTransition( Chamber_OD00, _abt_, OD00, NULL, new WeaponGuardWeaponOpen(this))); m_fsm.AddTransition(new WeaponTransition( Chamber_OD00, _abt_, CC10)); m_fsm.AddTransition(new WeaponTransition( CC00, __L__, Chamber_CC00)); // chamber from closed charged m_fsm.AddTransition(new WeaponTransition( Chamber_CC00, _fin_, OD00, NULL, new WeaponGuardWeaponOpen(this))); m_fsm.AddTransition(new WeaponTransition( Chamber_CC00, _fin_, CC00, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Chamber_CC00, _fin_, CC10)); m_fsm.AddTransition(new WeaponTransition( Chamber_CC00, _abt_, OD00, NULL, new WeaponGuardWeaponOpen(this))); m_fsm.AddTransition(new WeaponTransition( Chamber_CC00, _abt_, CC00, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Chamber_CC00, _abt_, CC10)); // load cartridge with mag m_fsm.AddTransition(new WeaponTransition( CD01, __L__, Chamber_CD01, NULL, new WeaponGuardHasMag(this))); // chamber from closed=1 with mag m_fsm.AddTransition(new WeaponTransition( Chamber_CD01, _fin_, OD01, NULL, new WeaponGuardWeaponOpen(this))); m_fsm.AddTransition(new WeaponTransition( Chamber_CD01, _fin_, CD01, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Chamber_CD01, _fin_, CC11)); m_fsm.AddTransition(new WeaponTransition( Chamber_CD01, _abt_, OD01, NULL, new WeaponGuardWeaponOpen(this))); m_fsm.AddTransition(new WeaponTransition( Chamber_CD01, _abt_, CD01, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Chamber_CD01, _abt_, CC11)); m_fsm.AddTransition(new WeaponTransition( CC01, __L__, Chamber_CC01, NULL, new WeaponGuardHasMag(this))); // chamber from closed=1 with mag m_fsm.AddTransition(new WeaponTransition( Chamber_CC01, _fin_, OD01, NULL, new WeaponGuardWeaponOpen(this))); m_fsm.AddTransition(new WeaponTransition( Chamber_CC01, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Chamber_CC01, _fin_, CC11)); m_fsm.AddTransition(new WeaponTransition( Chamber_CC01, _abt_, OD01, NULL, new WeaponGuardWeaponOpen(this))); m_fsm.AddTransition(new WeaponTransition( Chamber_CC01, _abt_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Chamber_CC01, _abt_, CC11)); m_fsm.AddTransition(new WeaponTransition( OD01, __L__, Chamber_OD01, NULL, new WeaponGuardHasMag(this))); // chamber from opened with mag m_fsm.AddTransition(new WeaponTransition( Chamber_OD01, _fin_, OD01, NULL, new WeaponGuardCurrentChamberEmpty(this) )); m_fsm.AddTransition(new WeaponTransition( Chamber_OD01, _fin_, CC11)); m_fsm.AddTransition(new WeaponTransition( Chamber_OD01, _abt_, OD01, NULL, new WeaponGuardCurrentChamberEmpty(this) )); m_fsm.AddTransition(new WeaponTransition( Chamber_OD01, _abt_, CC11)); m_fsm.AddTransition(new WeaponTransition( CJF0, __A__, Attach_CJF0, NULL, new WeaponGuardCanAttachMag(this))); // attach from JAM/b1/m0 m_fsm.AddTransition(new WeaponTransition( Attach_CJF0, _fin_, CJF1, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Attach_CJF0, _fin_, CJF0)); m_fsm.AddTransition(new WeaponTransition( Attach_CJF0, _abt_, CJF1, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Attach_CJF0, _abt_, CJF0));; // zdokumentovano az sem // attach mag with no ammo m_fsm.AddTransition(new WeaponTransition( CD00, __A__, Attach_CD00, NULL, new WeaponGuardCanAttachMag(this))); // attach from CLO/b0/m0 m_fsm.AddTransition(new WeaponTransition( Attach_CD00, _fin_, CD00, NULL, new GuardNot(new WeaponGuardHasMag(this)))); m_fsm.AddTransition(new WeaponTransition( Attach_CD00, _fin_, CD01, NULL, new WeaponGuardWeaponDischarged(this))); m_fsm.AddTransition(new WeaponTransition( Attach_CD00, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Attach_CD00, _fin_, CC11)); m_fsm.AddTransition(new WeaponTransition( Attach_CD00, _abt_, CD00, NULL, new GuardNot(new WeaponGuardHasMag(this)))); m_fsm.AddTransition(new WeaponTransition( Attach_CD00, _abt_, CD00, NULL, new WeaponGuardWeaponDischarged(this))); m_fsm.AddTransition(new WeaponTransition( Attach_CD00, _abt_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Attach_CD00, _abt_, CC11)); m_fsm.AddTransition(new WeaponTransition( CC10, __A__, Attach_CC10, NULL, new WeaponGuardCanAttachMag(this))); // attach from CLO/b1/m0 m_fsm.AddTransition(new WeaponTransition( Attach_CC10, _fin_, CC11, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Attach_CC10, _fin_, CC10)); m_fsm.AddTransition(new WeaponTransition( Attach_CC10, _abt_, CC11, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Attach_CC10, _abt_, CC10)); m_fsm.AddTransition(new WeaponTransition( OD00, __A__, Attach_OD00, NULL, new WeaponGuardCanAttachMag(this))); // attach from OPE/b0/m0 m_fsm.AddTransition(new WeaponTransition( Attach_OD00, _fin_, OD00, NULL, new GuardNot(new WeaponGuardHasMag(this)))); m_fsm.AddTransition(new WeaponTransition( Attach_OD00, _fin_, OD01, NULL, new WeaponGuardWeaponOpen(this))); m_fsm.AddTransition(new WeaponTransition( Attach_OD00, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Attach_OD00, _fin_, CC11)); m_fsm.AddTransition(new WeaponTransition( Attach_OD00, _abt_, OD00, NULL, new GuardNot(new WeaponGuardHasMag(this)))); m_fsm.AddTransition(new WeaponTransition( Attach_OD00, _abt_, OD01, NULL, new WeaponGuardWeaponOpen(this))); m_fsm.AddTransition(new WeaponTransition( Attach_OD00, _abt_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Attach_OD00, _abt_, CC11)); m_fsm.AddTransition(new WeaponTransition( CC00, __A__, Attach_CC00, NULL, new WeaponGuardCanAttachMag(this))); // attach from CLO/b0/m0 charged m_fsm.AddTransition(new WeaponTransition( Attach_CC00, _fin_, CC11, NULL, new WeaponGuardCurrentChamberFull(this))); m_fsm.AddTransition(new WeaponTransition( Attach_CC00, _fin_, CC01, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Attach_CC00, _fin_, CC00)); m_fsm.AddTransition(new WeaponTransition( Attach_CC00, _abt_, CC11, NULL, new WeaponGuardCurrentChamberFull(this))); m_fsm.AddTransition(new WeaponTransition( Attach_CC00, _abt_, CC01, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Attach_CC00, _abt_, CC00)); // replace magazine m_fsm.AddTransition(new WeaponTransition( CD01, __S__, Reload_CD01, NULL, new WeaponGuardCanSwapMag(this))); // swap in CLO/b0/m1 m_fsm.AddTransition(new WeaponTransition( Reload_CD01, _fin_, CC11, NULL, new WeaponGuardCurrentChamberFull(this))); m_fsm.AddTransition(new WeaponTransition( Reload_CD01, _fin_, CC01, NULL, new WeaponGuardWeaponCharged(this))); m_fsm.AddTransition(new WeaponTransition( Reload_CD01, _fin_, CD01, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Reload_CD01, _fin_, CD00)); m_fsm.AddTransition(new WeaponTransition( Reload_CD01, _abt_, CC11, NULL, new WeaponGuardCurrentChamberFull(this))); m_fsm.AddTransition(new WeaponTransition( Reload_CD01, _abt_, CC01, NULL, new WeaponGuardWeaponCharged(this))); m_fsm.AddTransition(new WeaponTransition( Reload_CD01, _abt_, CD01, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Reload_CD01, _abt_, CD00)); m_fsm.AddTransition(new WeaponTransition( CC11, __S__, Reload_CC11, NULL, new WeaponGuardCanSwapMag(this))); // swap in CLO/b1/m1 m_fsm.AddTransition(new WeaponTransition( Reload_CC11, _fin_, CC11, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Reload_CC11, _fin_, CC10)); m_fsm.AddTransition(new WeaponTransition( Reload_CC11, _abt_, CC11, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Reload_CC11, _abt_, CC10)); m_fsm.AddTransition(new WeaponTransition( CC01, __S__, Reload_CC01, NULL, new WeaponGuardCanSwapMag(this))); // CLO/b0/m1 swap with empty mag (no chamber) m_fsm.AddTransition(new WeaponTransition( Reload_CC01, _fin_, CC11, NULL, new WeaponGuardCurrentChamberFull(this)) ); m_fsm.AddTransition(new WeaponTransition( Reload_CC01, _fin_, CC01, NULL, new WeaponGuardHasMag(this)) ); m_fsm.AddTransition(new WeaponTransition( Reload_CC01, _fin_, CC00)); m_fsm.AddTransition(new WeaponTransition( Reload_CC01, _abt_, CC11, NULL, new WeaponGuardCurrentChamberFull(this)) ); m_fsm.AddTransition(new WeaponTransition( Reload_CC01, _abt_, CC01, NULL, new WeaponGuardHasMag(this)) ); m_fsm.AddTransition(new WeaponTransition( Reload_CC01, _abt_, CC00)); m_fsm.AddTransition(new WeaponTransition( OD01, __S__, Reload_OD01, NULL, new WeaponGuardCanSwapMag(this))); // OPE/b0/m1 swap with empty mag (no chamber) m_fsm.AddTransition(new WeaponTransition( Reload_OD01, _fin_, OD00, NULL, new GuardNot(new WeaponGuardHasMag(this)))); m_fsm.AddTransition(new WeaponTransition( Reload_OD01, _fin_, OD01, NULL, new WeaponGuardWeaponOpen(this))); m_fsm.AddTransition(new WeaponTransition( Reload_OD01, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Reload_OD01, _fin_, CC11)); m_fsm.AddTransition(new WeaponTransition( Reload_OD01, _abt_, OD00, NULL, new GuardNot(new WeaponGuardHasMag(this)))); m_fsm.AddTransition(new WeaponTransition( Reload_OD01, _abt_, OD01, NULL, new WeaponGuardWeaponOpen(this))); m_fsm.AddTransition(new WeaponTransition( Reload_OD01, _abt_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Reload_OD01, _abt_, CC11)); m_fsm.AddTransition(new WeaponTransition( CJF1, __S__, Reload_CJF1, NULL, new WeaponGuardCanSwapMag(this))); // swap in JAM/b1/m1 m_fsm.AddTransition(new WeaponTransition( Reload_CJF1, _fin_, CJF1, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Reload_CJF1, _fin_, CJF0)); m_fsm.AddTransition(new WeaponTransition( Reload_CJF1, _abt_, CJF1, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Reload_CJF1, _abt_, CJF0)); // detach magazine m_fsm.AddTransition(new WeaponTransition( OD01, __D__, Detach_OD01, NULL, new WeaponGuardCanDetachMag(this))); // detach from OPE/b0/m1 m_fsm.AddTransition(new WeaponTransition( Detach_OD01, _fin_, OD01, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Detach_OD01, _fin_, OD00)); m_fsm.AddTransition(new WeaponTransition( Detach_OD01, _abt_, OD01, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Detach_OD01, _abt_, OD00)); m_fsm.AddTransition(new WeaponTransition( CC11, __D__, Detach_CC11, NULL, new WeaponGuardCanDetachMag(this))); // detach from CLO/b1/m1 m_fsm.AddTransition(new WeaponTransition( Detach_CC11, _fin_, CC11, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Detach_CC11, _fin_, CC10)); m_fsm.AddTransition(new WeaponTransition( Detach_CC11, _abt_, CC11, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Detach_CC11, _abt_, CC10)); m_fsm.AddTransition(new WeaponTransition( CC01, __D__, Detach_CC01, NULL, new WeaponGuardCanDetachMag(this))); // detach from CLO/b0/m1 m_fsm.AddTransition(new WeaponTransition( Detach_CC01, _fin_, CC01, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Detach_CC01, _fin_, CC00)); m_fsm.AddTransition(new WeaponTransition( Detach_CC01, _abt_, CC01, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Detach_CC01, _abt_, CC00)); m_fsm.AddTransition(new WeaponTransition( CD01, __D__, Detach_CD01, NULL, new WeaponGuardCanDetachMag(this))); // detach from CLO/b0/m1 dischg m_fsm.AddTransition(new WeaponTransition( Detach_CD01, _fin_, CD01, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Detach_CD01, _fin_, CD00)); m_fsm.AddTransition(new WeaponTransition( Detach_CD01, _abt_, CD01, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Detach_CD01, _abt_, CD00)); m_fsm.AddTransition(new WeaponTransition( CJF1, __D__, Detach_CJF1, NULL, new WeaponGuardCanDetachMag(this))); // detach from CLO/b1/m1 jammed m_fsm.AddTransition(new WeaponTransition( Detach_CJF1, _fin_, CJF1, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Detach_CJF1, _fin_, CJF0)); m_fsm.AddTransition(new WeaponTransition( Detach_CJF1, _abt_, CJF1, NULL, new WeaponGuardHasMag(this))); m_fsm.AddTransition(new WeaponTransition( Detach_CJF1, _abt_, CJF0)); // unjam m_fsm.AddTransition(new WeaponTransition( CJF0, __U__, Unjam_CJF0)); // unjam nomag m_fsm.AddTransition(new WeaponTransition( Unjam_CJF0, _fin_, CJF0, NULL, new WeaponGuardJammed(this))); m_fsm.AddTransition(new WeaponTransition( Unjam_CJF0, _fin_, CC00)); m_fsm.AddTransition(new WeaponTransition( Unjam_CJF0, _abt_, CJF0, NULL, new WeaponGuardJammed(this))); m_fsm.AddTransition(new WeaponTransition( Unjam_CJF0, _abt_, CC00)); m_fsm.AddTransition(new WeaponTransition( CJF1, __U__, Unjam_CJF1)); // unjam with mag with ammo m_fsm.AddTransition(new WeaponTransition( Unjam_CJF1, _fin_, CJF1, NULL, new WeaponGuardJammed(this))); m_fsm.AddTransition(new WeaponTransition( Unjam_CJF1, _fin_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Unjam_CJF1, _fin_, CC11)); m_fsm.AddTransition(new WeaponTransition( Unjam_CJF1, _abt_, CJF1, NULL, new WeaponGuardJammed(this))); m_fsm.AddTransition(new WeaponTransition( Unjam_CJF1, _abt_, CC01, NULL, new WeaponGuardCurrentChamberEmpty(this))); m_fsm.AddTransition(new WeaponTransition( Unjam_CJF1, _abt_, CC11)); SetInitialState(CD00); SelectionBulletHide(); HideMagazine(); m_fsm.Start(); } override float GetChanceToJam() { float chanceToJam = super.GetChanceToJam(); Magazine mag = GetMagazine(GetCurrentMuzzle()); if(mag) { chanceToJam = chanceToJam + ((1.0 - chanceToJam) * mag.GetChanceToJam()); } else { chanceToJam = chanceToJam + ((1.0 - chanceToJam) * 0.06); } return chanceToJam; } /*override bool GetInventoryHandAnimation(notnull InventoryLocation loc, out int value) { int id; string name = ""; if ( loc.GetParent() && loc.GetParent().GetInventory().GetCurrentAttachmentSlotInfo(id,name) && name == "Hips" ) { //value = WeaponHideShowTypes.HIDESHOW_SLOT_2HDRIGHTBACK; value = WeaponHideShowTypes.HIDESHOW_SLOT_PISTOLBELT; return true; } return false; }*/ override void SetActions() { super.SetActions(); AddAction(FirearmActionDetachMagazine); } //---------------------------------------------------------------------------------------- /* Computes/fills the provided `dst` with aim offsets relevant for the provided `characterStance`. Aiming angles are sampled as the normalized < -1.0, +1.0 > range. */ protected override void GetApproximateAimOffsets(Blend2DVector dst, int characterStance) { if (characterStance >= DayZPlayerConstants.STANCEIDX_RAISED) characterStance -= DayZPlayerConstants.STANCEIDX_RAISED; // All following values were set by inspecting the character with // a weapon in-game and adjusting the offsets as such that with // the weapon lift diagnostic enabled, the shapes would nearly // perfectly overlap an equipped RIFLE. if (characterStance == DayZPlayerConstants.STANCEIDX_CROUCH) { dst.Insert( 0.0, -1.0, "0.200 0.238 -0.050"); // fully down dst.Insert( 0.0, -0.5, "0.185 0.142 -0.030"); // halfway down dst.Insert( 0.0, 0.0, "0.170 0.046 -0.028"); // forward dst.Insert( 0.0, 0.5, "0.176 0.023 -0.048"); // halfway up dst.Insert( 0.0, 1.0, "0.182 0.006 -0.059"); // fully up } else if (characterStance == DayZPlayerConstants.STANCEIDX_PRONE) { dst.Insert( 0.0, -1.0, " 0.040 -0.080 -0.030"); // fully down dst.Insert( 0.0, -0.5, " 0.040 -0.040 -0.040"); // halfway down dst.Insert( 0.0, 0.0, " 0.045 0.040 -0.008"); // forward dst.Insert( 0.0, 0.5, " 0.070 -0.115 -0.150"); // halfway up dst.Insert( 0.0, 1.0, " 0.100 -0.160 -0.320"); // fully up dst.Insert(-0.3, 0.0, " 0.008 -0.048 -0.056"); dst.Insert(-0.5, 0.0, " 0.020 -0.002 0.052"); dst.Insert(-0.8, 0.0, " 0.100 0.001 0.075"); dst.Insert(-1.0, 0.0, " 0.094 0.110 0.080"); dst.Insert( 0.3, 0.0, " 0.020 0.030 0.018"); dst.Insert( 0.5, 0.0, "-0.040 0.070 0.094"); dst.Insert( 0.8, 0.0, "-0.118 0.188 0.050"); dst.Insert( 1.0, 0.0, " 0.094 0.110 0.080"); } else { dst.Insert( 0.0, -1.0, "0.135 0.155 0.065"); // fully down dst.Insert( 0.0, -0.5, "0.155 0.055 0.030"); // halfway down dst.Insert( 0.0, 0.0, "0.150 0.022 -0.017"); // forward dst.Insert( 0.0, 0.5, "0.140 0.003 -0.032"); // halfway up dst.Insert( 0.0, 1.0, "0.120 -0.026 -0.028"); // fully up } } //---------------------------------------------------------------------------------------- /* Computes approximate offset during movement for this weapon. */ protected override vector GetApproximateMovementOffset(vector localVelocity, int characterStance, float lean, float ud11, float lr11) { if (characterStance >= DayZPlayerConstants.STANCEIDX_RAISED) characterStance -= DayZPlayerConstants.STANCEIDX_RAISED; vector offset; if (lean != 0) { const float LEAN_VERT_OFFSET = -0.1; const float LEAN_HORIZ_OFFSET_L = 0.075; const float LEAN_HORIZ_OFFSET_R = -0.025; float aimStraightWeight = 1.0 - Math.AbsFloat(ud11); // 1 when aiming forward float leanOffset = lean * aimStraightWeight; offset += Vector( leanOffset * Math.Lerp(LEAN_HORIZ_OFFSET_L, LEAN_HORIZ_OFFSET_R, lean * 0.5 + 0.5), leanOffset * LEAN_VERT_OFFSET, 0); } float maxVelocity = Math.Max( Math.AbsFloat(localVelocity[0]), Math.AbsFloat(localVelocity[2]) ); float peakVelocity = 0.5; float moveAmount01 = Math.Clamp(maxVelocity / peakVelocity, 0.0, 1.0); if (moveAmount01 != 0.0) { vector moveOffset; if (characterStance == DayZPlayerConstants.STANCEIDX_CROUCH) moveOffset = "-0.1 -0.2 -0.1"; else moveOffset = "0.0 -0.12 -0.1"; float ud01 = (ud11 * 0.5) + 0.5; float aimWeight = Math.Clamp(1.0 - (ud01 * 2), 0, 1); // The issue is only apparent when looking down and the 2nd power seems // to follow the actual visual relatively accurately float moveWeight = moveAmount01 * Math.Pow(aimWeight, 2.0); offset = offset + (moveWeight * moveOffset); } return offset; } };