/**@class BotTrigger **/ class BotTrigger { bool CheckTrigger () { return false; } }; class MyBotTrigger : BotTrigger { PlayerBase m_Owner; void MyBotTrigger (PlayerBase p) { m_Owner = p; } override bool CheckTrigger () { return null != m_Owner.GetInventory().FindAttachment(InventorySlots.GetSlotIdFromString("Headgear")); } }; /**@class Bot **/ class Bot { PlayerBase m_Owner = null; protected ref BotFSM m_FSM = null; protected DayZPlayerInstanceType m_InstanceType = DayZPlayerInstanceType.INSTANCETYPE_CLIENT; protected ref BotStateBase m_IdleState = null; void Bot (PlayerBase ow) { m_Owner = ow; } void SetInstanceType (DayZPlayerInstanceType t) { m_InstanceType = t; } void Start () { InitFSM(); } void Stop () { m_FSM.Terminate(); } void StartAction(int action) { switch (action) { case EActions.PLAYER_BOT_STOP_CURRENT: ProcessEvent(new BotEventStop(m_Owner, null)); return; } ProcessEvent(new BotEventStartDebug(m_Owner, null, action)); } void OnUpdate (float dt) { m_FSM.GetCurrentState().OnUpdate(dt); } // events ref BotEventBase ___Bgn__ = new BotEventStart; ref BotEventBase __Stop__ = new BotEventStop; ref BotEventBase ___OK___ = new BotEventEndOK; ref BotEventBase __Fail__ = new BotEventEndFail; ref BotEventBase __Tout__ = new BotEventEndTimeout; ref BotEventBase __IChg__ = new BotEventOnItemInHandsChanged; void AddTransition(BotStateBase state, int id) { BotEventStartDebug evt = new BotEventStartDebug(null, null, id); m_FSM.AddTransition(new BotTransition(m_IdleState, evt, state, null, new BotGuardDebugEventMatches(evt))); m_FSM.AddTransition(new BotTransition(state, ___OK___, m_IdleState)); m_FSM.AddTransition(new BotTransition(state, __Fail__, m_IdleState)); m_FSM.AddTransition(new BotTransition(state, __Tout__, m_IdleState)); m_FSM.AddTransition(new BotTransition(state, __Stop__, m_IdleState)); } void InitFSM () { m_FSM = new BotFSM(); // basic states m_IdleState = new BotStateIdle(this, NULL); ///@{ transition table AddTransition(new BotStanceRandomizer(this, NULL), EActions.PLAYER_BOT_RANDOMIZE_STANCE); AddTransition(new BotTestSpamUserActions(this, NULL), EActions.PLAYER_BOT_SPAM_USER_ACTIONS); AddTransition(new BotTestAttachAndDropCycle(this, NULL), EActions.PLAYER_BOT_TEST_ATTACH_AND_DROP_CYCLE); AddTransition(new BotTestItemMoveBackAndForth(this, NULL), EActions.PLAYER_BOT_TEST_ITEM_MOVE_BACK_AND_FORTH); AddTransition(new Bot_TestSpawnOpen(this, NULL), EActions.PLAYER_BOT_TEST_SPAWN_OPEN); AddTransition(new Bot_TestSpawnOpenDestroy(this, NULL), EActions.PLAYER_BOT_TEST_SPAWN_OPEN_DESTROY); AddTransition(new Bot_TestSpawnOpenEat(this, NULL), EActions.PLAYER_BOT_TEST_SPAWN_OPEN_EAT); AddTransition(new BotTestSwapG2H(this, NULL), EActions.PLAYER_BOT_TEST_SWAP_G2H); //AddTransition(new BotTestSwapC2H(this, NULL), EActions.PLAYER_BOT_TEST_SWAP_C2H); AddTransition(new BotTestSwapInternal(this, NULL), EActions.PLAYER_BOT_TEST_SWAP_INTERNAL); ///@} transition table m_FSM.SetInitialState(m_IdleState); m_FSM.Start(); } bool ProcessEvent (BotEventBase e) { if (m_FSM.ProcessEvent(e) == ProcessEventResult.FSM_OK) { botDebugSpam("[botfsm] Processed event e=" + e.ToString()); return true; } else { botDebugSpam("[botfsm] FSM refused to process event (no transition): src=" + m_FSM.GetCurrentState().ToString() + " event=" + e.ToString()); return false; } } }; void botDebugPrint (string s) { #ifdef BOT_DEBUG PrintToRPT("" + s); // comment/uncomment to hide/see debug logs #else //Print("" + s); // comment/uncomment to hide/see debug logs #endif } void botDebugSpam (string s) { #ifdef BOT_DEBUG_SPAM PrintToRPT("" + s); // comment/uncomment to hide/see debug logs #else //Print("" + s); // comment/uncomment to hide/see debug logs #endif }