class HandSwappingAnimated_Show extends HandForceSwappingAnimated_Show { }; class HandAnimatedSwapping extends HandStateBase { ref InventoryLocation m_Src1 = null; ref InventoryLocation m_Src2 = null; ref InventoryLocation m_Dst1 = null; ref InventoryLocation m_Dst2 = null; ref HandStartHidingAnimated m_Hide; ref HandSwappingAnimated_Show m_Show; void HandAnimatedSwapping(Man player = null, HandStateBase parent = null) { // setup nested state machine m_Hide = new HandStartHidingAnimated(player, this, WeaponActions.HIDE, -1); m_Show = new HandSwappingAnimated_Show(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) { HandEventSwap es = HandEventSwap.Cast(e); if (es) { m_Src1 = es.m_Src2; m_Src2 = es.GetSrc(); m_Dst1 = es.m_Dst2; m_Dst2 = es.GetDst(); m_Show.m_Src1 = m_Src1; m_Show.m_Src2 = m_Src2; m_Show.m_Dst1 = m_Dst1; m_Show.m_Dst2 = m_Dst2; m_Hide.m_ActionType = es.m_AnimationID; m_Show.m_ActionType = es.m_Animation2ID; if (!GetGame().IsDedicatedServer()) { m_Player.GetHumanInventory().AddInventoryReservationEx(m_Dst2.GetItem(), m_Dst2, GameInventory.c_InventoryReservationTimeoutShortMS); m_Player.GetHumanInventory().AddInventoryReservationEx(m_Dst1.GetItem(), m_Dst1, GameInventory.c_InventoryReservationTimeoutShortMS); } } super.OnEntry(e); // @NOTE: super at the end (prevent override from submachine start) } override void OnAbort(HandEventBase e) { if ( !GetGame().IsDedicatedServer()) { if (m_Dst2) { m_Player.GetHumanInventory().ClearInventoryReservationEx(m_Dst2.GetItem(), m_Dst2); } if (m_Dst1) { m_Player.GetHumanInventory().ClearInventoryReservationEx(m_Dst1.GetItem(), m_Dst1); } } else { if (m_Dst2) { GetGame().ClearJunctureEx(m_Player, m_Dst2.GetItem()); } if (m_Dst1) { GetGame().ClearJunctureEx(m_Player, m_Dst1.GetItem()); } } m_Src1 = null; m_Src2 = null; m_Dst1 = null; m_Dst2 = null; super.OnAbort(e); } override void OnExit(HandEventBase e) { if ( !GetGame().IsDedicatedServer()) { m_Player.GetHumanInventory().ClearInventoryReservationEx(m_Dst2.GetItem(), m_Dst2); m_Player.GetHumanInventory().ClearInventoryReservationEx(m_Dst1.GetItem(), m_Dst1); } m_Src1 = null; m_Src2 = null; m_Dst1 = null; m_Dst2 = null; super.OnExit(e); } };