// eject
//TODO MW delete this file
class WeaponEjectBullet_Start extends WeaponStartAction
{ };
/*
class WeaponEjectBullet_Cartridge extends WeaponStateBase
{
Magazine m_dstMagazine; /// destination of the cartridge
override void OnEntry (WeaponEventBase e)
{
super.OnEntry(e);
DayZPlayer p = e.m_player;
int mi = m_weapon.GetCurrentMuzzle();
ejectBulletAndStoreInMagazine(m_weapon, mi, m_dstMagazine, p); // MP-safe
}
override void OnAbort (WeaponEventBase e)
{
m_dstMagazine = NULL;
super.OnAbort(e);
}
override void OnExit (WeaponEventBase e)
{
m_dstMagazine = NULL;
super.OnExit(e);
}
};
*/
/*
class WeaponEjectBullet_Cartridge_W4T extends WeaponEjectBullet_Cartridge
{
override bool IsWaitingForActionFinish () { return true; }
};
*/
class WeaponEjectBullet extends WeaponStateBase
{
WeaponActions m_action;
int m_actionType;
Magazine m_dstMagazine; /// destination of the cartridge
ref WeaponEjectBullet_Start m_start;
ref WeaponEjectBullet_Cartridge_W4T m_eject; // @TODO: workaround for missing BH event
ref BulletHide_W4T m_hideB;
ref WeaponChamberFromAttMag_W4T m_chamber;
void WeaponEjectBullet (Weapon_Base w = NULL, WeaponStateBase parent = NULL, WeaponActions action = WeaponActions.NONE, int actionType = -1)
{
m_action = action;
m_actionType = actionType;
// setup nested state machine
m_start = new WeaponEjectBullet_Start(m_weapon, this, m_action, m_actionType);
m_eject = new WeaponEjectBullet_Cartridge_W4T(m_weapon, this); // @TODO: workaround for missing BH event (_W4T)
m_hideB = new BulletHide_W4T(m_weapon, this);
m_chamber = new WeaponChamberFromAttMag_W4T(m_weapon, this);
// events
WeaponEventBase __be_ = new WeaponEventAnimBulletEject;
WeaponEventBase __bh_ = new WeaponEventAnimBulletHide;
WeaponEventBase __ck_ = new WeaponEventAnimCocked;
WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
m_fsm = new WeaponFSM(this); // @NOTE: set owner of the submachine fsm
// transitions
m_fsm.AddTransition(new WeaponTransition( m_start, __be_, m_eject));
m_fsm.AddTransition(new WeaponTransition( m_eject, __bh_, m_hideB));
m_fsm.AddTransition(new WeaponTransition( m_eject, __ck_, m_chamber, NULL, new WeaponGuardHasAmmo(m_weapon)));
m_fsm.AddTransition(new WeaponTransition( m_hideB, __ck_, m_chamber, NULL, new WeaponGuardHasAmmo(m_weapon)));
m_fsm.AddTransition(new WeaponTransition( m_hideB, _fin_, NULL));
m_fsm.AddTransition(new WeaponTransition( m_eject, _fin_, NULL)); // @TODO: workaround for missing BH event
m_fsm.AddTransition(new WeaponTransition(m_chamber, _fin_, NULL));
// Safety exits
m_fsm.AddTransition(new WeaponTransition(m_start , _fin_, null));
m_fsm.SetInitialState(m_start);
}
override void OnEntry (WeaponEventBase e)
{
if (e)
{
if (e.m_magazine)
m_dstMagazine = e.m_magazine;
m_eject.m_dstMagazine = m_dstMagazine;
if (LogManager.IsWeaponLogEnable()) { wpnDebugPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponEjectBullet m_mag=" + m_dstMagazine.ToString() + ", e.mag=" + e.m_magazine.ToString()); }
}
super.OnEntry(e); // @NOTE: super after submachine init (prevent override from submachine start)
}
override void OnAbort (WeaponEventBase e)
{
m_dstMagazine = NULL;
super.OnAbort(e);
}
override void OnExit (WeaponEventBase e)
{
m_dstMagazine = NULL;
super.OnExit(e);
}
override bool SaveCurrentFSMState (ParamsWriteContext ctx)
{
if (!super.SaveCurrentFSMState(ctx))
return false;
if (!ctx.Write(m_dstMagazine))
{
Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponEjectBullet.LoadCurrentFSMState: cannot write m_dstMagazine for weapon=" + m_weapon);
return false;
}
return true;
}
override bool LoadCurrentFSMState (ParamsReadContext ctx, int version)
{
if (!super.LoadCurrentFSMState(ctx, version))
return false;
if (!ctx.Read(m_dstMagazine))
{
Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponEjectBullet.LoadCurrentFSMState: cannot read m_dstMagazine for weapon=" + m_weapon);
return false;
}
return true;
}
};