class HandStartHidingAnimated extends HandStartAction
{
	void HandStartHidingAnimated(Man player = null, HandStateBase parent = null, WeaponActions action = WeaponActions.NONE, int actionType = -1)
	{ }

	override void OnEntry(HandEventBase e)
	{
		super.OnEntry(e);
	}

	override void OnAbort(HandEventBase e)
	{
		super.OnAbort(e);
	}

	override void OnExit(HandEventBase e)
	{
		super.OnExit(e);
	}
	
	override bool IsWaitingForActionFinish() { return m_ActionType == -1; }
};

// When editing this, take a look at HandAnimatedMoveToDst_W4T_Basic as well
// They can not be inherited from each other because of different inheritance
class HandAnimatedMoveToDst_W4T extends HandStartAction
{
	ref InventoryLocation m_Dst;

	override void OnEntry(HandEventBase e)
	{
		if (m_Dst && m_Dst.IsValid())
		{
			EntityAI item = m_Dst.GetItem();
			InventoryLocation src = new InventoryLocation;
			if (item.GetInventory().GetCurrentInventoryLocation(src))
			{
				if (!GetGame().IsDedicatedServer())
				{
					if (!GetGame().IsMultiplayer())
					{
						m_Player.GetHumanInventory().ClearInventoryReservationEx(m_Dst.GetItem(), m_Dst);
						GameInventory.LocationSyncMoveEntity(src, m_Dst);
						m_Player.OnItemInHandsChanged();
					}
					else
					{
						m_Player.GetHumanInventory().ClearInventoryReservationEx(m_Dst.GetItem(), m_Dst);
						m_Player.GetHumanInventory().PostDeferredEventTakeToDst(InventoryMode.JUNCTURE,src, m_Dst);
					}
				}
				else
				{
					GetGame().ClearJunctureEx(m_Player, m_Dst.GetItem());
				}
			}
			else
				Error("[hndfsm] " + Object.GetDebugName(m_Player) + " STS = " + m_Player.GetSimulationTimeStamp() + " HandAnimatedMoveToDst_W4T - item " + item + " has no Inventory or Location, inv=" + item.GetInventory());
		}
		else
			Error("[hndfsm] HandAnimatedMoveToDst_W4T - event has no valid m_Dst");

		super.OnEntry(e);
	}

	override void OnAbort(HandEventBase e)
	{
		m_Dst = null;
		super.OnAbort(e);
	}

	override void OnExit(HandEventBase e)
	{
		m_Dst = null;
		super.OnExit(e);
	}

	override bool IsWaitingForActionFinish() { return true; }
};

class HandAnimatedMovingToAtt extends HandStateBase
{
	EntityAI m_Entity; /// weapon to be taken

	ref HandStartHidingAnimated m_Hide;
	ref HandAnimatedMoveToDst_W4T m_Show;
	
	ref InventoryLocation m_ilEntity;

	void HandAnimatedMovingToAtt(Man player = null, HandStateBase parent = null)
	{
		// setup nested state machine
		m_Hide = new HandStartHidingAnimated(player, this, WeaponActions.HIDE, -1);
		m_Show = new HandAnimatedMoveToDst_W4T(player, this, WeaponActions.SHOW, -1);

		// events:
		HandEventBase _fin_ = new HandEventHumanCommandActionFinished;
		HandEventBase _AEh_ = new HandAnimEventChanged;

		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_Show, _fin_,     null ));
		
		m_FSM.SetInitialState(m_Hide);
	}

	override void OnEntry(HandEventBase e)
	{
		m_Entity = e.GetSrcEntity();
		HandEventMoveTo ev_move = HandEventMoveTo.Cast(e);
		if (ev_move)
		{
			m_Show.m_Dst = ev_move.GetDst();
			m_Hide.m_ActionType = ev_move.GetAnimationID();
			m_Show.m_ActionType = ev_move.GetAnimationID();
			
			m_ilEntity = m_Show.m_Dst;
			
			m_Player.GetHumanInventory().AddInventoryReservationEx(m_Entity, m_ilEntity, GameInventory.c_InventoryReservationTimeoutShortMS);
		}
		
		super.OnEntry(e); // @NOTE: super at the end (prevent override from submachine start)
	}

	override void OnAbort(HandEventBase e)
	{
		if ( !GetGame().IsDedicatedServer())
		{
			m_Player.GetHumanInventory().ClearInventoryReservationEx(m_Entity, m_ilEntity);
		}
		else
		{
			GetGame().ClearJunctureEx(m_Player, m_Entity);
		}
		
		m_Entity = null;
		m_ilEntity = null;
		
		super.OnAbort(e);
	}

	override void OnExit(HandEventBase e)
	{
		if ( !GetGame().IsDedicatedServer())
		{
			m_Player.GetHumanInventory().ClearInventoryReservationEx(m_Entity, m_ilEntity);
		}
		
		m_Entity = null;
		m_ilEntity = null;
		
		super.OnExit(e);
	}
};


