Repeater.c
class RPTEmptyDischargedclass RPTLoadedChargedclass RPTLoadedDischargedclass RPTLoadedJammedclass Repeater_Baseclass Repeaterenum RPTAnimStateenum RPTStableStateID
enum RPTAnimState
{
DEFAULT = 0, ///< default weapon state, closed and discharged
CHARGED = 1,
JAMMED = 2,
};
enum RPTStableStateID
{
UNKNOWN = 0,
EmptyDischarged = 1,
LoadedCharged = 2,
LoadedDischarged = 3,
LoadedJammed = 4,
}
class RPTEmptyDischarged extends WeaponStableState
{
override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { EmptyDischarged C0"); } super.OnEntry(e); }
override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } EmptyDischarged C0"); } }
override int GetCurrentStateID () { return RPTStableStateID.EmptyDischarged; }
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 RPTLoadedCharged extends WeaponStableState
{
override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { LoadedCharged C1"); } super.OnEntry(e); }
override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } LoadedCharged C1"); } }
override int GetCurrentStateID () { return RPTStableStateID.LoadedCharged; }
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 RPTLoadedDischarged extends WeaponStableState
{
override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { LoadedDischarged D1"); } super.OnEntry(e); }
override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } LoadedDischarged D1"); } }
override int GetCurrentStateID () { return RPTStableStateID.LoadedDischarged; }
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.F}; }
};
class RPTLoadedJammed extends WeaponStableState
{
override void OnEntry (WeaponEventBase e) { if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " { LoadedJammed JF"); } super.OnEntry(e); }
override void OnExit (WeaponEventBase e) { super.OnExit(e); if (LogManager.IsWeaponLogEnable()) { wpnPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " } LoadedJammed JF"); } }
override int GetCurrentStateID () { return RPTStableStateID.LoadedJammed; }
override bool HasBullet () { return true; }
override bool HasMagazine () { return false; }
override bool IsJammed () { return true; }
override bool IsRepairEnabled () { return true; }
override void InitMuzzleArray () { m_muzzleHasBullet = {MuzzleState.F}; }
};
/**@class Mp133Shotgun_Base
* @brief basic mp5 submachine gun
**/
class Repeater_Base extends Rifle_Base
{
ref WeaponStableState D0;
ref WeaponStableState C0;
ref WeaponStableState C1;
ref WeaponStableState DF;
ref WeaponStableState JF;
override void InitStateMachine ()
{
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.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_SHOTGUN_COCKED));
m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_SHOTGUN_UNCOCKED));
m_abilities.Insert(new AbilityRecord(WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE));
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_COCKED));
m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_UNCOCKED));
m_abilities.Insert(new AbilityRecord(WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY));
D0 = new RPTEmptyDischarged(this, NULL, RPTAnimState.DEFAULT);
C0 = new RPTEmptyDischarged(this, NULL, RPTAnimState.CHARGED);
DF = new RPTLoadedDischarged(this, NULL, RPTAnimState.DEFAULT);
C1 = new RPTLoadedCharged(this, NULL, RPTAnimState.CHARGED);
JF = new RPTLoadedJammed(this, NULL, RPTAnimState.JAMMED);
//WeaponStateBase Mech_D0 = new WeaponChargingInnerMag(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
WeaponStateBase Mech_C1 = new WeaponChargingInnerMag(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_OPENED);
WeaponStateBase Mech_DF = new WeaponChargingInnerMag(this, NULL, WeaponActions.MECHANISM, WeaponActionMechanismTypes.MECHANISM_CLOSED);
LoopedChamberingEjectLast Chamber_D0 = new LoopedChamberingEjectLast(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_SHOTGUN_UNCOCKED, WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE);
LoopedChamberingEjectLast Chamber_C0 = new LoopedChamberingEjectLast(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_SHOTGUN_UNCOCKED, WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE);
LoopedChamberingEjectLast Chamber_C1 = new LoopedChamberingEjectLast(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_SHOTGUN_COCKED, WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE);
LoopedChamberingEjectLast Chamber_DF = new LoopedChamberingEjectLast(this, NULL, WeaponActions.CHAMBERING, WeaponActionChamberingTypes.CHAMBERING_STARTLOOPABLE_SHOTGUN_UNCOCKED, WeaponActionChamberingTypes.CHAMBERING_ENDLOOPABLE);
WeaponStateBase Unjam_JF = new WeaponUnjamming(this, NULL, WeaponActions.UNJAMMING, WeaponActionUnjammingTypes.UNJAMMING_START);
WeaponStateBase Trigger_D0 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY);
WeaponStateBase Trigger_C0 = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL);
WeaponStateBase Trigger_C1 = new WeaponFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_NORMAL);
WeaponStateBase Trigger_DF = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY);
WeaponStateBase Trigger_JF = new WeaponDryFire(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_DRY);
WeaponStateBase Trigger_C1J = new WeaponFireToJam(this, NULL, WeaponActions.FIRE, WeaponActionFireTypes.FIRE_JAM);
WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
WeaponEventBase __L__ = new WeaponEventLoad1Bullet;
WeaponEventBase __T__ = new WeaponEventTrigger;
WeaponEventBase __TJ_ = new WeaponEventTriggerToJam;
WeaponEventBase __U__ = new WeaponEventUnjam;
WeaponEventBase __M__ = new WeaponEventMechanism;
WeaponEventBase _abt_ = new WeaponEventHumanCommandActionAborted;
WeaponEventBase _rto_ = new WeaponEventReloadTimeout;
WeaponEventBase _dto_ = new WeaponEventDryFireTimeout;
m_fsm = new WeaponFSM();
// Mechanism
//----------------------------------------
m_fsm.AddTransition(new WeaponTransition( D0, __M__, Mech_DF));
m_fsm.AddTransition(new WeaponTransition( C0, __M__, Mech_C1));
m_fsm.AddTransition(new WeaponTransition( C1, __M__, Mech_C1));
m_fsm.AddTransition(new WeaponTransition( Mech_C1, _fin_, C0, NULL, new WeaponGuardCurrentChamberEmpty(this)));
m_fsm.AddTransition(new WeaponTransition( Mech_C1, _fin_, C1));
m_fsm.AddTransition(new WeaponTransition( Mech_C1, _abt_, C0, NULL, new WeaponGuardCurrentChamberEmpty(this)));
m_fsm.AddTransition(new WeaponTransition( Mech_C1, _abt_, C1));
m_fsm.AddTransition(new WeaponTransition( DF, __M__, Mech_DF));
m_fsm.AddTransition(new WeaponTransition( Mech_DF, _fin_, C0, NULL, new WeaponGuardCurrentChamberEmpty(this)));
m_fsm.AddTransition(new WeaponTransition( Mech_DF, _fin_, DF, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
m_fsm.AddTransition(new WeaponTransition( Mech_DF, _fin_, C1));
m_fsm.AddTransition(new WeaponTransition( Mech_DF, _abt_, C0, NULL, new WeaponGuardCurrentChamberEmpty(this)));
m_fsm.AddTransition(new WeaponTransition( Mech_DF, _abt_, DF, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
m_fsm.AddTransition(new WeaponTransition( Mech_DF, _abt_, C1));
//----------------------------------------
m_fsm.AddTransition(new WeaponTransition( C0, __L__, Chamber_D0));
m_fsm.AddTransition(new WeaponTransition( D0, __L__, Chamber_D0));
m_fsm.AddTransition(new WeaponTransition( Chamber_D0, _fin_, C1));
m_fsm.AddTransition(new WeaponTransition( Chamber_D0, _abt_, C0, NULL, new WeaponGuardCurrentChamberEmpty(this)));
m_fsm.AddTransition(new WeaponTransition( Chamber_D0, _abt_, C1));
m_fsm.AddTransition(new WeaponTransition( C1, __L__, Chamber_C1, NULL, new GuardNot(new WeaponGuardInnerMagazineFull(this))));
m_fsm.AddTransition(new WeaponTransition( Chamber_C1, _fin_, C1));
m_fsm.AddTransition(new WeaponTransition( Chamber_C1, _abt_, C1));
m_fsm.AddTransition(new WeaponTransition( DF, __L__, Chamber_DF, NULL, new GuardNot(new WeaponGuardInnerMagazineFull(this))));
m_fsm.AddTransition(new WeaponTransition( Chamber_DF, _fin_, C1));
m_fsm.AddTransition(new WeaponTransition( Chamber_DF, _abt_, DF, NULL, new WeaponGuardCurrentChamberFiredOut(this)));
m_fsm.AddTransition(new WeaponTransition( Chamber_DF, _abt_, C1));
//------------------------------------------
m_fsm.AddTransition(new WeaponTransition( JF, __U__, Unjam_JF));
m_fsm.AddTransition(new WeaponTransition( Unjam_JF, _fin_, JF, NULL, new WeaponGuardJammed(this)));
m_fsm.AddTransition(new WeaponTransition( Unjam_JF, _fin_, C0, NULL, new WeaponGuardCurrentChamberEmpty(this)));
m_fsm.AddTransition(new WeaponTransition( Unjam_JF, _fin_, C1));
m_fsm.AddTransition(new WeaponTransition( Unjam_JF, _abt_, JF, NULL, new WeaponGuardJammed(this)));
m_fsm.AddTransition(new WeaponTransition( Unjam_JF, _abt_, C0, NULL, new WeaponGuardCurrentChamberEmpty(this)));
m_fsm.AddTransition(new WeaponTransition( Unjam_JF, _abt_, C1));
//-----------------------------------------
// fire
m_fsm.AddTransition(new WeaponTransition( D0, __T__, Trigger_D0)); // fire.cocked
m_fsm.AddTransition(new WeaponTransition( Trigger_D0, _fin_, D0));
m_fsm.AddTransition(new WeaponTransition( Trigger_D0, _dto_, D0));
m_fsm.AddTransition(new WeaponTransition( Trigger_D0, _abt_, D0));
m_fsm.AddTransition(new WeaponTransition( C0, __T__, Trigger_C0)); // fire.cocked
m_fsm.AddTransition(new WeaponTransition( Trigger_C0, _fin_, D0));
m_fsm.AddTransition(new WeaponTransition( Trigger_C0, _dto_, D0));
m_fsm.AddTransition(new WeaponTransition( Trigger_C0, _abt_, D0));
m_fsm.AddTransition(new WeaponTransition( C1, __T__, Trigger_C1)); // fire.cocked
m_fsm.AddTransition(new WeaponTransition( Trigger_C1, _fin_, DF));
m_fsm.AddTransition(new WeaponTransition( Trigger_C1, _rto_, DF));
m_fsm.AddTransition(new WeaponTransition( Trigger_C1, _abt_, DF));
m_fsm.AddTransition(new WeaponTransition( DF, __T__, Trigger_DF)); // fire.cocked
m_fsm.AddTransition(new WeaponTransition( Trigger_DF, _fin_, DF));
m_fsm.AddTransition(new WeaponTransition( Trigger_DF, _dto_, DF));
m_fsm.AddTransition(new WeaponTransition( Trigger_DF, _abt_, DF));
m_fsm.AddTransition(new WeaponTransition( JF, __T__, Trigger_JF)); // fire.cocked
m_fsm.AddTransition(new WeaponTransition( Trigger_JF, _fin_, JF));
m_fsm.AddTransition(new WeaponTransition( Trigger_JF, _dto_, JF));
m_fsm.AddTransition(new WeaponTransition( Trigger_JF, _abt_, JF));
m_fsm.AddTransition(new WeaponTransition( JF, __TJ_, Trigger_C1J)); // fire.cocked
m_fsm.AddTransition(new WeaponTransition( Trigger_C1J, _fin_, JF));
m_fsm.AddTransition(new WeaponTransition( Trigger_C1J, _rto_, JF));
m_fsm.AddTransition(new WeaponTransition( Trigger_C1J, _abt_, JF));
//---------------------------------------------
SetInitialState(D0);
SelectionBulletHide();
HideMagazine();
m_fsm.Start();
}
override bool CanChamberBullet (int muzzleIndex, Magazine mag)
{
return CanChamberFromMag(muzzleIndex, mag) && !IsInternalMagazineFull(muzzleIndex);
}
override void SetActions()
{
AddAction(FirearmActionLoadMultiBulletQuick);
super.SetActions();
AddAction(FirearmActionLoadMultiBullet);
}
};
class Repeater : Repeater_Base
{
override RecoilBase SpawnRecoilObject()
{
return new RepeaterRecoil(this);
}
//Debug menu Spawn Ground Special
override void OnDebugSpawn()
{
super.OnDebugSpawn();
EntityAI entity;
if ( Class.CastTo(entity, this) )
{
entity.SpawnEntityOnGroundPos("Ammo_357", entity.GetPosition());
}
}
};