WeaponFireAndChamberNext.c
class WeaponFireAndChamberNext extends WeaponStateBase
{
WeaponActions m_action;
int m_actionType;
float m_dtAccumulator;
ref WeaponFire m_fire;
void WeaponFireAndChamberNext (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_fire = new WeaponFireAndChamber(m_weapon, this, m_action, m_actionType);
// events
WeaponEventBase _fin_ = new WeaponEventHumanCommandActionFinished;
WeaponEventAnimBulletEject __be_ = new WeaponEventAnimBulletEject;
WeaponEventReloadTimeout __to_ = new WeaponEventReloadTimeout;
m_fsm = new WeaponFSM(this); // @NOTE: set owner of the submachine fsm
// transitions
m_fsm.AddTransition(new WeaponTransition(m_fire, _fin_, NULL));
m_fsm.AddTransition(new WeaponTransition(m_fire, __to_, NULL));
m_fsm.SetInitialState(m_fire);
}
override void OnEntry (WeaponEventBase e)
{
super.OnEntry(e);
if (e)
m_dtAccumulator = 0;
}
override void OnUpdate (float dt)
{
m_dtAccumulator += dt;
DayZPlayerImplement p;
Class.CastTo(p, m_weapon.GetHierarchyParent());
if( p )
{
HumanInputController hic = p.GetInputController();
int muzzleIndex = m_weapon.GetCurrentMuzzle();
float reloadTime = m_weapon.GetReloadTime(muzzleIndex);
if ( m_dtAccumulator >= reloadTime && ( hic.IsAttackButton() || (m_weapon.GetBurstCount() < m_weapon.GetCurrentModeBurstSize(muzzleIndex))))
{
if (m_weapon.CanProcessWeaponEvents())
{
m_weapon.ProcessWeaponEvent(new WeaponEventReloadTimeout(p));
}
}
}
}
override void OnExit (WeaponEventBase e)
{
//m_weapon.ResetBurstCount();
m_dtAccumulator = 0;
super.OnExit(e);
}
override void OnAbort (WeaponEventBase e)
{
m_weapon.SetCoolDown(GetCoolDown());
m_weapon.ResetBurstCount();
super.OnAbort(e);
}
override float GetCoolDown()
{
int muzzleIndex = m_weapon.GetCurrentMuzzle();
float reloadTime = m_weapon.GetReloadTime(muzzleIndex);
return reloadTime - m_dtAccumulator;
}
};