WeaponReChamber.c
// rechamber (== eject cartridge + load another + store the old one)
class WeaponRechamber extends WeaponStateBase
{
int m_actionEject;
int m_actionTypeEject;
int m_actionLoad;
int m_actionTypeLoad;
Magazine m_dstMagazine; /// destination of the ejected cartridge
Magazine m_srcMagazine; /// source of the loaded cartridge
ref WeaponEjectBullet m_eje;
ref WeaponChambering m_loa;
void WeaponRechamber (Weapon_Base w = NULL, WeaponStateBase parent = NULL, int actionEject = -1, int actionTypeEject = -1, int actionLoad = -1, int actionTypeLoad = -1)
{
m_actionEject = actionEject;
m_actionTypeEject = actionTypeEject;
m_actionLoad = actionLoad;
m_actionTypeLoad = actionTypeLoad;
// setup nested state machine
m_eje = new WeaponEjectBullet(m_weapon, this, m_actionEject, m_actionTypeEject);
m_loa = new WeaponChambering(m_weapon, this, m_actionLoad, m_actionTypeLoad);
// events
WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
m_fsm = new WeaponFSM(this); // @NOTE: set owner of the submachine fsm
m_fsm.AddTransition(new WeaponTransition(m_eje, _fin_, m_loa));
m_fsm.AddTransition(new WeaponTransition(m_loa, _fin_, NULL));
m_fsm.SetInitialState(m_eje);
}
override void OnEntry (WeaponEventBase e)
{
if (e)
{
if (LogManager.IsWeaponLogEnable()) { wpnDebugPrint("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponRechamber, mag=" + e.m_magazine.ToString()); }
m_srcMagazine = e.m_magazine;
m_loa.m_srcMagazine = m_srcMagazine;
// prepare magazine for ejected ammo
int mi = m_weapon.GetCurrentMuzzle();
string magazineTypeName = m_weapon.GetChamberedCartridgeMagazineTypeName(mi);
float damage = 0.0;
string type;
if (m_weapon.GetCartridgeInfo(mi, damage, type))
{
m_dstMagazine = DayZPlayerUtils.SelectStoreCartridge(e.m_player, m_weapon, mi, m_srcMagazine, damage, magazineTypeName);
if (!m_dstMagazine)
{
Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponRechamber - error, cannot prepare mag for catridge, magType=" + magazineTypeName);
}
}
e.m_magazine = m_dstMagazine; // @NOTE: override event mag - @TODO
}
super.OnEntry(e); // @NOTE: super after submachine init (prevent override from submachine start)
}
override void OnExit (WeaponEventBase e)
{
super.OnExit(e);
m_dstMagazine = NULL;
m_eje.m_dstMagazine = NULL;
m_loa.m_srcMagazine = NULL;
}
override bool SaveCurrentFSMState (ParamsWriteContext ctx)
{
if (!super.SaveCurrentFSMState(ctx))
return false;
if (!ctx.Write(m_dstMagazine))
{
Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponChambering.SaveCurrentFSMState: cannot save m_dstMagazine for weapon=" + m_weapon);
return false;
}
if (!ctx.Write(m_srcMagazine))
{
Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponChambering.SaveCurrentFSMState: cannot save m_srcMagazine 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) + " WeaponChambering.LoadCurrentFSMState: cannot read m_dstMagazine for weapon=" + m_weapon);
return false;
}
if (!ctx.Read(m_srcMagazine))
{
Error("[wpnfsm] " + Object.GetDebugName(m_weapon) + " WeaponChambering.LoadCurrentFSMState: cannot read m_srcMagazine for weapon=" + m_weapon);
return false;
}
return true;
}
};