aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/server/hl2/ai_behavior_actbusy.h
diff options
context:
space:
mode:
authorJørgen P. Tjernø <[email protected]>2013-12-02 19:31:46 -0800
committerJørgen P. Tjernø <[email protected]>2013-12-02 19:46:31 -0800
commitf56bb35301836e56582a575a75864392a0177875 (patch)
treede61ddd39de3e7df52759711950b4c288592f0dc /mp/src/game/server/hl2/ai_behavior_actbusy.h
parentMark some more files as text. (diff)
downloadsource-sdk-2013-f56bb35301836e56582a575a75864392a0177875.tar.xz
source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.zip
Fix line endings. WHAMMY.
Diffstat (limited to 'mp/src/game/server/hl2/ai_behavior_actbusy.h')
-rw-r--r--mp/src/game/server/hl2/ai_behavior_actbusy.h636
1 files changed, 318 insertions, 318 deletions
diff --git a/mp/src/game/server/hl2/ai_behavior_actbusy.h b/mp/src/game/server/hl2/ai_behavior_actbusy.h
index bfb5c17a..750b600f 100644
--- a/mp/src/game/server/hl2/ai_behavior_actbusy.h
+++ b/mp/src/game/server/hl2/ai_behavior_actbusy.h
@@ -1,318 +1,318 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-//=============================================================================//
-
-#ifndef AI_BEHAVIOR_ACTBUSY_H
-#define AI_BEHAVIOR_ACTBUSY_H
-#ifdef _WIN32
-#pragma once
-#endif
-
-#include "ai_behavior.h"
-#include "ai_goalentity.h"
-
-//-----------------------------------------------------------------------------
-enum
-{
- ACTBUSY_TYPE_DEFAULT = 0,
- ACTBUSY_TYPE_COMBAT,
-};
-
-enum busyinterrupt_t
-{
- BA_INT_NONE, // Nothing breaks us out of this
- BA_INT_DANGER, // Only danger signals interrupts this busy anim. The player will be ignored.
- BA_INT_PLAYER, // The Player's presence interrupts this busy anim
- BA_INT_AMBUSH, // We're waiting to ambush enemies. Don't break on danger sounds in front of us.
- BA_INT_COMBAT, // Only break out if we're shot at.
- BA_INT_ZOMBIESLUMP, // Zombies who are slumped on the ground.
- BA_INT_SIEGE_DEFENSE,
-};
-
-enum busyanimparts_t
-{
- BA_BUSY,
- BA_ENTRY,
- BA_EXIT,
-
- BA_MAX_ANIMS,
-};
-
-struct busyanim_t
-{
- string_t iszName;
- Activity iActivities[BA_MAX_ANIMS];
- string_t iszSequences[BA_MAX_ANIMS];
- string_t iszSounds[BA_MAX_ANIMS];
- float flMinTime; // Min time spent in this busy animation
- float flMaxTime; // Max time spent in this busy animation. 0 means continue until interrupted.
- busyinterrupt_t iBusyInterruptType;
- bool bUseAutomovement;
-};
-
-struct busysafezone_t
-{
- Vector vecMins;
- Vector vecMaxs;
-};
-
-#define NO_MAX_TIME -1
-
-class CAI_ActBusyGoal;
-
-//-----------------------------------------------------------------------------
-// Purpose:
-//-----------------------------------------------------------------------------
-class CAI_ActBusyBehavior : public CAI_SimpleBehavior
-{
- DECLARE_CLASS( CAI_ActBusyBehavior, CAI_SimpleBehavior );
-public:
- DECLARE_DATADESC();
- CAI_ActBusyBehavior();
-
- enum
- {
- // Schedules
- SCHED_ACTBUSY_START_BUSYING = BaseClass::NEXT_SCHEDULE,
- SCHED_ACTBUSY_BUSY,
- SCHED_ACTBUSY_STOP_BUSYING,
- SCHED_ACTBUSY_LEAVE,
- SCHED_ACTBUSY_TELEPORT_TO_BUSY,
- NEXT_SCHEDULE,
-
- // Tasks
- TASK_ACTBUSY_PLAY_BUSY_ANIM = BaseClass::NEXT_TASK,
- TASK_ACTBUSY_PLAY_ENTRY,
- TASK_ACTBUSY_PLAY_EXIT,
- TASK_ACTBUSY_TELEPORT_TO_BUSY,
- TASK_ACTBUSY_WALK_PATH_TO_BUSY,
- TASK_ACTBUSY_GET_PATH_TO_ACTBUSY,
- TASK_ACTBUSY_VERIFY_EXIT,
- NEXT_TASK,
-
- // Conditions
- COND_ACTBUSY_LOST_SEE_ENTITY = BaseClass::NEXT_CONDITION,
- COND_ACTBUSY_AWARE_OF_ENEMY_IN_SAFE_ZONE,
- COND_ACTBUSY_ENEMY_TOO_CLOSE,
- NEXT_CONDITION,
- };
-
- virtual const char *GetName() { return "ActBusy"; }
-
- void Enable( CAI_ActBusyGoal *pGoal, float flRange, bool bVisibleOnly );
- void OnRestore();
- void SetBusySearchRange( float flRange );
- void Disable( void );
- void ForceActBusy( CAI_ActBusyGoal *pGoal, CAI_Hint *pHintNode = NULL, float flMaxTime = NO_MAX_TIME, bool bVisibleOnly = false, bool bTeleportToBusy = false, bool bUseNearestBusy = false, CBaseEntity *pSeeEntity = NULL, Activity activity = ACT_INVALID );
- void ForceActBusyLeave( bool bVisibleOnly = false );
- void StopBusying( void );
- bool IsStopBusying();
- CAI_Hint *FindActBusyHintNode( void );
- CAI_Hint *FindCombatActBusyHintNode( void );
- CAI_Hint *FindCombatActBusyTeleportHintNode( void );
- bool CanSelectSchedule( void );
- bool IsCurScheduleOverridable( void );
- bool ShouldIgnoreSound( CSound *pSound );
- void OnFriendDamaged( CBaseCombatCharacter *pSquadmate, CBaseEntity *pAttacker );
- int OnTakeDamage_Alive( const CTakeDamageInfo &info );
- void GatherConditions( void );
- void BuildScheduleTestBits( void );
- void EndScheduleSelection( void );
- Activity NPC_TranslateActivity( Activity nActivity );
- void HandleAnimEvent( animevent_t *pEvent );
- void CheckAndCleanupOnExit( void );
- bool FValidateHintType( CAI_Hint *pHint );
- bool ActBusyNodeStillActive( void );
- bool IsMovingToBusy( void ) { return m_bMovingToBusy; }
- bool IsEnabled( void ) { return m_bEnabled; }
- float GetReasonableFacingDist( void ) { return 0; } // Actbusy ignores reasonable facing
- bool IsInterruptable( void );
- bool ShouldPlayerAvoid( void );
- void SetUseRenderBounds( bool bUseBounds ) { m_bUseRenderBoundsForCollision = bUseBounds; }
- void ComputeAndSetRenderBounds();
- bool CanFlinch( void );
- bool CanRunAScriptedNPCInteraction( bool bForced );
- void OnScheduleChange();
- bool QueryHearSound( CSound *pSound );
- void OnSeeEntity( CBaseEntity *pEntity );
- bool NeedsToPlayExitAnim() { return m_bNeedsToPlayExitAnim; }
-
- // Returns true if the current NPC is acting busy, or moving to an actbusy
- bool IsActive( void );
- // Returns true if the current NPC is actually acting busy (i.e. inside an act busy anim)
- bool IsInsideActBusy( void ) { return m_bBusy; }
-
- // Combat act busy stuff
- bool IsCombatActBusy();
- void CollectSafeZoneVolumes( CAI_ActBusyGoal *pActBusyGoal );
- bool IsInSafeZone( CBaseEntity *pEntity );
- int CountEnemiesInSafeZone();
-
-private:
- virtual int SelectSchedule( void );
- int SelectScheduleForLeaving( void );
- int SelectScheduleWhileNotBusy( int iBase );
- int SelectScheduleWhileBusy( void );
- virtual void StartTask( const Task_t *pTask );
- virtual void RunTask( const Task_t *pTask );
- void NotifyBusyEnding( void );
- bool HasAnimForActBusy( int iActBusy, busyanimparts_t AnimPart );
- bool PlayAnimForActBusy( busyanimparts_t AnimPart );
- void PlaySoundForActBusy( busyanimparts_t AnimPart );
-
-private:
- bool m_bEnabled;
- bool m_bForceActBusy;
- Activity m_ForcedActivity;
- bool m_bTeleportToBusy;
- bool m_bUseNearestBusy;
- bool m_bLeaving;
- bool m_bVisibleOnly;
- bool m_bUseRenderBoundsForCollision;
- float m_flForcedMaxTime;
- bool m_bBusy;
- bool m_bMovingToBusy;
- bool m_bNeedsToPlayExitAnim;
- float m_flNextBusySearchTime;
- float m_flEndBusyAt;
- float m_flBusySearchRange;
- bool m_bInQueue;
- int m_iCurrentBusyAnim;
- CHandle<CAI_ActBusyGoal> m_hActBusyGoal;
- bool m_bNeedToSetBounds;
- EHANDLE m_hSeeEntity;
- float m_fTimeLastSawSeeEntity;
- bool m_bExitedBusyToDueLostSeeEntity;
- bool m_bExitedBusyToDueSeeEnemy;
-
- int m_iNumConsecutivePathFailures; // Count how many times we failed to find a path to a node, so we can consider teleporting.
- bool m_bAutoFireWeapon;
- float m_flDeferUntil;
- int m_iNumEnemiesInSafeZone;
-
- CUtlVector<busysafezone_t>m_SafeZones;
-
- DEFINE_CUSTOM_SCHEDULE_PROVIDER;
-};
-
-
-//-----------------------------------------------------------------------------
-// Purpose: A level tool to control the actbusy behavior.
-//-----------------------------------------------------------------------------
-class CAI_ActBusyGoal : public CAI_GoalEntity
-{
- DECLARE_CLASS( CAI_ActBusyGoal, CAI_GoalEntity );
-public:
- CAI_ActBusyGoal()
- {
- // Support legacy maps, where this value used to be set from a constant (with a value of 1).
- // Now designers can specify whatever they want in Hammer. Take care of old maps by setting
- // this in the constructor. (sjb)
- m_flSeeEntityTimeout = 1;
- }
-
- virtual void NPCMovingToBusy( CAI_BaseNPC *pNPC );
- virtual void NPCAbortedMoveTo( CAI_BaseNPC *pNPC );
- virtual void NPCStartedBusy( CAI_BaseNPC *pNPC );
- virtual void NPCStartedLeavingBusy( CAI_BaseNPC *pNPC );
- virtual void NPCFinishedBusy( CAI_BaseNPC *pNPC );
- virtual void NPCLeft( CAI_BaseNPC *pNPC );
- virtual void NPCLostSeeEntity( CAI_BaseNPC *pNPC );
- virtual void NPCSeeEnemy( CAI_BaseNPC *pNPC );
-
- int GetType() { return m_iType; }
- bool IsCombatActBusyTeleportAllowed() { return m_bAllowCombatActBusyTeleport; }
-
-protected:
- CAI_ActBusyBehavior *GetBusyBehaviorForNPC( const char *pszActorName, CBaseEntity *pActivator, CBaseEntity *pCaller, const char *sInputName );
- CAI_ActBusyBehavior *GetBusyBehaviorForNPC( CBaseEntity *pEntity, const char *sInputName );
-
- void EnableGoal( CAI_BaseNPC *pAI );
-
- // Inputs
- virtual void InputActivate( inputdata_t &inputdata );
- virtual void InputDeactivate( inputdata_t &inputdata );
- void InputSetBusySearchRange( inputdata_t &inputdata );
- void InputForceNPCToActBusy( inputdata_t &inputdata );
- void InputForceThisNPCToActBusy( inputdata_t &inputdata );
- void InputForceThisNPCToLeave( inputdata_t &inputdata );
-
- DECLARE_DATADESC();
-
-protected:
- float m_flBusySearchRange;
- bool m_bVisibleOnly;
- int m_iType;
- bool m_bAllowCombatActBusyTeleport;
-
-public:
- // Let the actbusy behavior query these so we don't have to duplicate the data.
- string_t m_iszSeeEntityName;
- float m_flSeeEntityTimeout;
- string_t m_iszSafeZoneVolume;
- int m_iSightMethod;
-
-protected:
- COutputEHANDLE m_OnNPCStartedBusy;
- COutputEHANDLE m_OnNPCFinishedBusy;
- COutputEHANDLE m_OnNPCLeft;
- COutputEHANDLE m_OnNPCLostSeeEntity;
- COutputEHANDLE m_OnNPCSeeEnemy;
-};
-
-// Maximum number of nodes allowed in an actbusy queue
-#define MAX_QUEUE_NODES 20
-
-//-----------------------------------------------------------------------------
-// Purpose: A level tool to control the actbusy behavior to create NPC queues
-//-----------------------------------------------------------------------------
-class CAI_ActBusyQueueGoal : public CAI_ActBusyGoal
-{
- DECLARE_CLASS( CAI_ActBusyQueueGoal, CAI_ActBusyGoal );
-public:
- virtual void Spawn( void );
- virtual void DrawDebugGeometryOverlays( void );
- virtual void NPCMovingToBusy( CAI_BaseNPC *pNPC );
- virtual void NPCStartedBusy( CAI_BaseNPC *pNPC );
- virtual void NPCAbortedMoveTo( CAI_BaseNPC *pNPC );
- virtual void NPCFinishedBusy( CAI_BaseNPC *pNPC );
- virtual void NPCStartedLeavingBusy( CAI_BaseNPC *pNPC );
-
- virtual void InputActivate( inputdata_t &inputdata );
- void InputPlayerStartedBlocking( inputdata_t &inputdata );
- void InputPlayerStoppedBlocking( inputdata_t &inputdata );
- void InputMoveQueueUp( inputdata_t &inputdata );
-
- void PushNPCBackInQueue( CAI_BaseNPC *pNPC, int iStartingNode );
- void RemoveNPCFromQueue( CAI_BaseNPC *pNPC );
- void RecalculateQueueCount( void );
- void QueueThink( void );
- void MoveQueueUp( void );
- void MoveQueueUpThink( void );
- bool NodeIsOccupied( int i );
- CAI_BaseNPC *GetNPCOnNode( int iNode );
- CAI_ActBusyBehavior *GetQueueBehaviorForNPC( CAI_BaseNPC *pNPC );
-
- DECLARE_DATADESC();
-
-private:
- int m_iCurrentQueueCount;
- CHandle<CAI_Hint> m_hNodes[ MAX_QUEUE_NODES ];
- bool m_bPlayerBlockedNodes[ MAX_QUEUE_NODES ];
- EHANDLE m_hExitNode;
- EHANDLE m_hExitingNPC;
- bool m_bForceReachFront;
-
- // Read from mapdata
- string_t m_iszNodes[ MAX_QUEUE_NODES ];
- string_t m_iszExitNode;
-
- // Outputs
- COutputInt m_OnQueueMoved;
- COutputEHANDLE m_OnNPCLeftQueue;
- COutputEHANDLE m_OnNPCStartedLeavingQueue;
-};
-
-#endif // AI_BEHAVIOR_ACTBUSY_H
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#ifndef AI_BEHAVIOR_ACTBUSY_H
+#define AI_BEHAVIOR_ACTBUSY_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "ai_behavior.h"
+#include "ai_goalentity.h"
+
+//-----------------------------------------------------------------------------
+enum
+{
+ ACTBUSY_TYPE_DEFAULT = 0,
+ ACTBUSY_TYPE_COMBAT,
+};
+
+enum busyinterrupt_t
+{
+ BA_INT_NONE, // Nothing breaks us out of this
+ BA_INT_DANGER, // Only danger signals interrupts this busy anim. The player will be ignored.
+ BA_INT_PLAYER, // The Player's presence interrupts this busy anim
+ BA_INT_AMBUSH, // We're waiting to ambush enemies. Don't break on danger sounds in front of us.
+ BA_INT_COMBAT, // Only break out if we're shot at.
+ BA_INT_ZOMBIESLUMP, // Zombies who are slumped on the ground.
+ BA_INT_SIEGE_DEFENSE,
+};
+
+enum busyanimparts_t
+{
+ BA_BUSY,
+ BA_ENTRY,
+ BA_EXIT,
+
+ BA_MAX_ANIMS,
+};
+
+struct busyanim_t
+{
+ string_t iszName;
+ Activity iActivities[BA_MAX_ANIMS];
+ string_t iszSequences[BA_MAX_ANIMS];
+ string_t iszSounds[BA_MAX_ANIMS];
+ float flMinTime; // Min time spent in this busy animation
+ float flMaxTime; // Max time spent in this busy animation. 0 means continue until interrupted.
+ busyinterrupt_t iBusyInterruptType;
+ bool bUseAutomovement;
+};
+
+struct busysafezone_t
+{
+ Vector vecMins;
+ Vector vecMaxs;
+};
+
+#define NO_MAX_TIME -1
+
+class CAI_ActBusyGoal;
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CAI_ActBusyBehavior : public CAI_SimpleBehavior
+{
+ DECLARE_CLASS( CAI_ActBusyBehavior, CAI_SimpleBehavior );
+public:
+ DECLARE_DATADESC();
+ CAI_ActBusyBehavior();
+
+ enum
+ {
+ // Schedules
+ SCHED_ACTBUSY_START_BUSYING = BaseClass::NEXT_SCHEDULE,
+ SCHED_ACTBUSY_BUSY,
+ SCHED_ACTBUSY_STOP_BUSYING,
+ SCHED_ACTBUSY_LEAVE,
+ SCHED_ACTBUSY_TELEPORT_TO_BUSY,
+ NEXT_SCHEDULE,
+
+ // Tasks
+ TASK_ACTBUSY_PLAY_BUSY_ANIM = BaseClass::NEXT_TASK,
+ TASK_ACTBUSY_PLAY_ENTRY,
+ TASK_ACTBUSY_PLAY_EXIT,
+ TASK_ACTBUSY_TELEPORT_TO_BUSY,
+ TASK_ACTBUSY_WALK_PATH_TO_BUSY,
+ TASK_ACTBUSY_GET_PATH_TO_ACTBUSY,
+ TASK_ACTBUSY_VERIFY_EXIT,
+ NEXT_TASK,
+
+ // Conditions
+ COND_ACTBUSY_LOST_SEE_ENTITY = BaseClass::NEXT_CONDITION,
+ COND_ACTBUSY_AWARE_OF_ENEMY_IN_SAFE_ZONE,
+ COND_ACTBUSY_ENEMY_TOO_CLOSE,
+ NEXT_CONDITION,
+ };
+
+ virtual const char *GetName() { return "ActBusy"; }
+
+ void Enable( CAI_ActBusyGoal *pGoal, float flRange, bool bVisibleOnly );
+ void OnRestore();
+ void SetBusySearchRange( float flRange );
+ void Disable( void );
+ void ForceActBusy( CAI_ActBusyGoal *pGoal, CAI_Hint *pHintNode = NULL, float flMaxTime = NO_MAX_TIME, bool bVisibleOnly = false, bool bTeleportToBusy = false, bool bUseNearestBusy = false, CBaseEntity *pSeeEntity = NULL, Activity activity = ACT_INVALID );
+ void ForceActBusyLeave( bool bVisibleOnly = false );
+ void StopBusying( void );
+ bool IsStopBusying();
+ CAI_Hint *FindActBusyHintNode( void );
+ CAI_Hint *FindCombatActBusyHintNode( void );
+ CAI_Hint *FindCombatActBusyTeleportHintNode( void );
+ bool CanSelectSchedule( void );
+ bool IsCurScheduleOverridable( void );
+ bool ShouldIgnoreSound( CSound *pSound );
+ void OnFriendDamaged( CBaseCombatCharacter *pSquadmate, CBaseEntity *pAttacker );
+ int OnTakeDamage_Alive( const CTakeDamageInfo &info );
+ void GatherConditions( void );
+ void BuildScheduleTestBits( void );
+ void EndScheduleSelection( void );
+ Activity NPC_TranslateActivity( Activity nActivity );
+ void HandleAnimEvent( animevent_t *pEvent );
+ void CheckAndCleanupOnExit( void );
+ bool FValidateHintType( CAI_Hint *pHint );
+ bool ActBusyNodeStillActive( void );
+ bool IsMovingToBusy( void ) { return m_bMovingToBusy; }
+ bool IsEnabled( void ) { return m_bEnabled; }
+ float GetReasonableFacingDist( void ) { return 0; } // Actbusy ignores reasonable facing
+ bool IsInterruptable( void );
+ bool ShouldPlayerAvoid( void );
+ void SetUseRenderBounds( bool bUseBounds ) { m_bUseRenderBoundsForCollision = bUseBounds; }
+ void ComputeAndSetRenderBounds();
+ bool CanFlinch( void );
+ bool CanRunAScriptedNPCInteraction( bool bForced );
+ void OnScheduleChange();
+ bool QueryHearSound( CSound *pSound );
+ void OnSeeEntity( CBaseEntity *pEntity );
+ bool NeedsToPlayExitAnim() { return m_bNeedsToPlayExitAnim; }
+
+ // Returns true if the current NPC is acting busy, or moving to an actbusy
+ bool IsActive( void );
+ // Returns true if the current NPC is actually acting busy (i.e. inside an act busy anim)
+ bool IsInsideActBusy( void ) { return m_bBusy; }
+
+ // Combat act busy stuff
+ bool IsCombatActBusy();
+ void CollectSafeZoneVolumes( CAI_ActBusyGoal *pActBusyGoal );
+ bool IsInSafeZone( CBaseEntity *pEntity );
+ int CountEnemiesInSafeZone();
+
+private:
+ virtual int SelectSchedule( void );
+ int SelectScheduleForLeaving( void );
+ int SelectScheduleWhileNotBusy( int iBase );
+ int SelectScheduleWhileBusy( void );
+ virtual void StartTask( const Task_t *pTask );
+ virtual void RunTask( const Task_t *pTask );
+ void NotifyBusyEnding( void );
+ bool HasAnimForActBusy( int iActBusy, busyanimparts_t AnimPart );
+ bool PlayAnimForActBusy( busyanimparts_t AnimPart );
+ void PlaySoundForActBusy( busyanimparts_t AnimPart );
+
+private:
+ bool m_bEnabled;
+ bool m_bForceActBusy;
+ Activity m_ForcedActivity;
+ bool m_bTeleportToBusy;
+ bool m_bUseNearestBusy;
+ bool m_bLeaving;
+ bool m_bVisibleOnly;
+ bool m_bUseRenderBoundsForCollision;
+ float m_flForcedMaxTime;
+ bool m_bBusy;
+ bool m_bMovingToBusy;
+ bool m_bNeedsToPlayExitAnim;
+ float m_flNextBusySearchTime;
+ float m_flEndBusyAt;
+ float m_flBusySearchRange;
+ bool m_bInQueue;
+ int m_iCurrentBusyAnim;
+ CHandle<CAI_ActBusyGoal> m_hActBusyGoal;
+ bool m_bNeedToSetBounds;
+ EHANDLE m_hSeeEntity;
+ float m_fTimeLastSawSeeEntity;
+ bool m_bExitedBusyToDueLostSeeEntity;
+ bool m_bExitedBusyToDueSeeEnemy;
+
+ int m_iNumConsecutivePathFailures; // Count how many times we failed to find a path to a node, so we can consider teleporting.
+ bool m_bAutoFireWeapon;
+ float m_flDeferUntil;
+ int m_iNumEnemiesInSafeZone;
+
+ CUtlVector<busysafezone_t>m_SafeZones;
+
+ DEFINE_CUSTOM_SCHEDULE_PROVIDER;
+};
+
+
+//-----------------------------------------------------------------------------
+// Purpose: A level tool to control the actbusy behavior.
+//-----------------------------------------------------------------------------
+class CAI_ActBusyGoal : public CAI_GoalEntity
+{
+ DECLARE_CLASS( CAI_ActBusyGoal, CAI_GoalEntity );
+public:
+ CAI_ActBusyGoal()
+ {
+ // Support legacy maps, where this value used to be set from a constant (with a value of 1).
+ // Now designers can specify whatever they want in Hammer. Take care of old maps by setting
+ // this in the constructor. (sjb)
+ m_flSeeEntityTimeout = 1;
+ }
+
+ virtual void NPCMovingToBusy( CAI_BaseNPC *pNPC );
+ virtual void NPCAbortedMoveTo( CAI_BaseNPC *pNPC );
+ virtual void NPCStartedBusy( CAI_BaseNPC *pNPC );
+ virtual void NPCStartedLeavingBusy( CAI_BaseNPC *pNPC );
+ virtual void NPCFinishedBusy( CAI_BaseNPC *pNPC );
+ virtual void NPCLeft( CAI_BaseNPC *pNPC );
+ virtual void NPCLostSeeEntity( CAI_BaseNPC *pNPC );
+ virtual void NPCSeeEnemy( CAI_BaseNPC *pNPC );
+
+ int GetType() { return m_iType; }
+ bool IsCombatActBusyTeleportAllowed() { return m_bAllowCombatActBusyTeleport; }
+
+protected:
+ CAI_ActBusyBehavior *GetBusyBehaviorForNPC( const char *pszActorName, CBaseEntity *pActivator, CBaseEntity *pCaller, const char *sInputName );
+ CAI_ActBusyBehavior *GetBusyBehaviorForNPC( CBaseEntity *pEntity, const char *sInputName );
+
+ void EnableGoal( CAI_BaseNPC *pAI );
+
+ // Inputs
+ virtual void InputActivate( inputdata_t &inputdata );
+ virtual void InputDeactivate( inputdata_t &inputdata );
+ void InputSetBusySearchRange( inputdata_t &inputdata );
+ void InputForceNPCToActBusy( inputdata_t &inputdata );
+ void InputForceThisNPCToActBusy( inputdata_t &inputdata );
+ void InputForceThisNPCToLeave( inputdata_t &inputdata );
+
+ DECLARE_DATADESC();
+
+protected:
+ float m_flBusySearchRange;
+ bool m_bVisibleOnly;
+ int m_iType;
+ bool m_bAllowCombatActBusyTeleport;
+
+public:
+ // Let the actbusy behavior query these so we don't have to duplicate the data.
+ string_t m_iszSeeEntityName;
+ float m_flSeeEntityTimeout;
+ string_t m_iszSafeZoneVolume;
+ int m_iSightMethod;
+
+protected:
+ COutputEHANDLE m_OnNPCStartedBusy;
+ COutputEHANDLE m_OnNPCFinishedBusy;
+ COutputEHANDLE m_OnNPCLeft;
+ COutputEHANDLE m_OnNPCLostSeeEntity;
+ COutputEHANDLE m_OnNPCSeeEnemy;
+};
+
+// Maximum number of nodes allowed in an actbusy queue
+#define MAX_QUEUE_NODES 20
+
+//-----------------------------------------------------------------------------
+// Purpose: A level tool to control the actbusy behavior to create NPC queues
+//-----------------------------------------------------------------------------
+class CAI_ActBusyQueueGoal : public CAI_ActBusyGoal
+{
+ DECLARE_CLASS( CAI_ActBusyQueueGoal, CAI_ActBusyGoal );
+public:
+ virtual void Spawn( void );
+ virtual void DrawDebugGeometryOverlays( void );
+ virtual void NPCMovingToBusy( CAI_BaseNPC *pNPC );
+ virtual void NPCStartedBusy( CAI_BaseNPC *pNPC );
+ virtual void NPCAbortedMoveTo( CAI_BaseNPC *pNPC );
+ virtual void NPCFinishedBusy( CAI_BaseNPC *pNPC );
+ virtual void NPCStartedLeavingBusy( CAI_BaseNPC *pNPC );
+
+ virtual void InputActivate( inputdata_t &inputdata );
+ void InputPlayerStartedBlocking( inputdata_t &inputdata );
+ void InputPlayerStoppedBlocking( inputdata_t &inputdata );
+ void InputMoveQueueUp( inputdata_t &inputdata );
+
+ void PushNPCBackInQueue( CAI_BaseNPC *pNPC, int iStartingNode );
+ void RemoveNPCFromQueue( CAI_BaseNPC *pNPC );
+ void RecalculateQueueCount( void );
+ void QueueThink( void );
+ void MoveQueueUp( void );
+ void MoveQueueUpThink( void );
+ bool NodeIsOccupied( int i );
+ CAI_BaseNPC *GetNPCOnNode( int iNode );
+ CAI_ActBusyBehavior *GetQueueBehaviorForNPC( CAI_BaseNPC *pNPC );
+
+ DECLARE_DATADESC();
+
+private:
+ int m_iCurrentQueueCount;
+ CHandle<CAI_Hint> m_hNodes[ MAX_QUEUE_NODES ];
+ bool m_bPlayerBlockedNodes[ MAX_QUEUE_NODES ];
+ EHANDLE m_hExitNode;
+ EHANDLE m_hExitingNPC;
+ bool m_bForceReachFront;
+
+ // Read from mapdata
+ string_t m_iszNodes[ MAX_QUEUE_NODES ];
+ string_t m_iszExitNode;
+
+ // Outputs
+ COutputInt m_OnQueueMoved;
+ COutputEHANDLE m_OnNPCLeftQueue;
+ COutputEHANDLE m_OnNPCStartedLeavingQueue;
+};
+
+#endif // AI_BEHAVIOR_ACTBUSY_H