class HandTakingAnimated_Hide extends HandStartAction
{ };
class HandTakingAnimated_Show extends HandStartAction
{
ref InventoryLocation m_Src;
ref InventoryLocation m_Dst;
void HandTakingAnimated_Show(Man player = null, HandStateBase parent = null, WeaponActions action = WeaponActions.NONE, int actionType = -1)
{
m_Src = null;
m_Dst = null;
}
override void OnEntry(HandEventBase e)
{
super.OnEntry(e);
if (m_Src)
{
if (m_Src.IsValid())
{
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("Action - STS = " + e.m_Player.GetSimulationTimeStamp(), e.ToString() , "n/a", "OnEntry", e.m_Player.ToString() );
}
#endif
if (g_Game.IsDedicatedServer())
{
g_Game.ClearJunctureEx(e.m_Player, m_Dst.GetItem());
}
else
{
m_Player.GetHumanInventory().ClearInventoryReservationEx(m_Dst.GetItem(), m_Dst);
}
#ifdef DIAG_DEVELOPER
if (g_Game.IsMultiplayer() && InventoryDebug.IsHandAckEnable())
{
if (!g_Game.IsDedicatedServer())
{
m_Player.GetHumanInventory().PostDeferredEventTakeToDst(InventoryMode.JUNCTURE, m_Src, m_Dst);
}
}
else
{
#endif
if (GameInventory.LocationSyncMoveEntity(m_Src, m_Dst))
{
m_Player.OnItemInHandsChanged();
}
#ifdef DIAG_DEVELOPER
}
#endif
}
else
{
Error("[hndfsm] " + Object.GetDebugName(e.m_Player) + " STS = " + e.m_Player.GetSimulationTimeStamp() + " HandTakingAnimated_Show m_Src=invalid, item not in bubble?");
}
}
else
Error("[hndfsm] HandTakingAnimated_Show, error - m_Src not configured");
}
override void OnAbort(HandEventBase e)
{
m_Src = null;
m_Dst = null;
super.OnAbort(e);
}
override void OnExit(HandEventBase e)
{
m_Src = null;
m_Dst = null;
super.OnExit(e);
}
override bool IsWaitingForActionFinish() { return true; }
};
class HandAnimatedTakingFromAtt extends HandStateBase
{
ref HandTakingAnimated_Hide m_Hide;
ref HandTakingAnimated_Show m_Show;
ref InventoryLocation m_Dst;
void HandAnimatedTakingFromAtt(Man player = null, HandStateBase parent = null)
{
// setup nested state machine
m_Hide = new HandTakingAnimated_Hide(player, this, WeaponActions.HIDE, -1);
m_Show = new HandTakingAnimated_Show(player, this, WeaponActions.SHOW, -1);
// events:
HandEventBase _fin_ = new HandEventHumanCommandActionFinished;
HandEventBase _AEh_ = new HandAnimEventChanged;
HandEventBase __Xd_ = new HandEventDestroyed;
m_FSM = new HandFSM(this); // @NOTE: set owner of the submachine fsm
m_FSM.AddTransition(new HandTransition( m_Hide, _AEh_, m_Show ));
m_FSM.AddTransition(new HandTransition( m_Hide, __Xd_, null ));
m_FSM.AddTransition(new HandTransition( m_Show, _fin_, null ));
m_FSM.AddTransition(new HandTransition( m_Show, __Xd_, null ));
m_FSM.SetInitialState(m_Hide);
}
override void OnEntry(HandEventBase e)
{
m_Dst = e.GetDst();
m_Show.m_Src = e.GetSrc();
m_Show.m_Dst = e.GetDst();
m_Hide.m_ActionType = e.GetAnimationID();
m_Show.m_ActionType = e.GetAnimationID();
m_Player.GetHumanInventory().AddInventoryReservationEx(m_Dst.GetItem(), m_Dst, GameInventory.c_InventoryReservationTimeoutShortMS);
super.OnEntry(e); // @NOTE: super at the end (prevent override from submachine start)
}
override void OnAbort(HandEventBase e)
{
#ifdef ENABLE_LOGGING
if ( LogManager.IsInventoryHFSMLogEnable() )
{
Debug.InventoryHFSMLog("Action - STS = " + e.m_Player.GetSimulationTimeStamp(), e.ToString() , "n/a", "OnAbort", e.m_Player.ToString() );
}
#endif
if (m_Dst)
{
m_Player.GetHumanInventory().ClearInventoryReservationEx(m_Dst.GetItem(), m_Dst);
if ( g_Game.IsServer() )
g_Game.ClearJunctureEx(e.m_Player, m_Dst.GetItem());
}
m_Dst = null;
super.OnAbort(e);
}
override void OnExit(HandEventBase e)
{
m_Player.GetHumanInventory().ClearInventoryReservationEx(m_Dst.GetItem(), m_Dst);
m_Dst = null;
super.OnExit(e);
}
};