diff options
Diffstat (limited to 'game/server/monstermaker.h')
| -rw-r--r-- | game/server/monstermaker.h | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/game/server/monstermaker.h b/game/server/monstermaker.h new file mode 100644 index 0000000..e866662 --- /dev/null +++ b/game/server/monstermaker.h @@ -0,0 +1,184 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#ifndef MONSTERMAKER_H +#define MONSTERMAKER_H +#ifdef _WIN32 +#pragma once +#endif + +#include "cbase.h" + + +//----------------------------------------------------------------------------- +// Spawnflags +//----------------------------------------------------------------------------- +#define SF_NPCMAKER_START_ON 1 // start active ( if has targetname ) +#define SF_NPCMAKER_NPCCLIP 8 // Children are blocked by NPCclip +#define SF_NPCMAKER_FADE 16 // Children's corpses fade +#define SF_NPCMAKER_INF_CHILD 32 // Infinite number of children +#define SF_NPCMAKER_NO_DROP 64 // Do not adjust for the ground's position when checking for spawn +#define SF_NPCMAKER_HIDEFROMPLAYER 128 // Don't spawn if the player's looking at me +#define SF_NPCMAKER_ALWAYSUSERADIUS 256 // Use radius spawn whenever spawning +#define SF_NPCMAKER_NOPRELOADMODELS 512 // Suppress preloading into the cache of all referenced .mdl files + +//========================================================= +//========================================================= +class CNPCSpawnDestination : public CPointEntity +{ + DECLARE_CLASS( CNPCSpawnDestination, CPointEntity ); + +public: + CNPCSpawnDestination(); + bool IsAvailable(); // Is this spawn destination available for selection? + void OnSpawnedNPC( CAI_BaseNPC *pNPC ); // Notify this spawn destination that an NPC has spawned here. + + float m_ReuseDelay; // How long to be unavailable after being selected + string_t m_RenameNPC; // If not NULL, rename the NPC that spawns here to this. + float m_TimeNextAvailable;// The time at which this destination will be available again. + + COutputEvent m_OnSpawnNPC; + + DECLARE_DATADESC(); +}; + +abstract_class CBaseNPCMaker : public CBaseEntity +{ +public: + DECLARE_CLASS( CBaseNPCMaker, CBaseEntity ); + + void Spawn( void ); + virtual int ObjectCaps( void ) { return BaseClass::ObjectCaps() & ~FCAP_ACROSS_TRANSITION; } + void MakerThink( void ); + bool HumanHullFits( const Vector &vecLocation ); + bool CanMakeNPC( bool bIgnoreSolidEntities = false ); + + virtual void DeathNotice( CBaseEntity *pChild );// NPC maker children use this to tell the NPC maker that they have died. + virtual void MakeNPC( void ) = 0; + + virtual void ChildPreSpawn( CAI_BaseNPC *pChild ) {}; + virtual void ChildPostSpawn( CAI_BaseNPC *pChild ); + + CBaseNPCMaker(void) {} + + // Input handlers + void InputSpawnNPC( inputdata_t &inputdata ); + void InputEnable( inputdata_t &inputdata ); + void InputDisable( inputdata_t &inputdata ); + void InputToggle( inputdata_t &inputdata ); + void InputSetMaxChildren( inputdata_t &inputdata ); + void InputAddMaxChildren( inputdata_t &inputdata ); + void InputSetMaxLiveChildren( inputdata_t &inputdata ); + void InputSetSpawnFrequency( inputdata_t &inputdata ); + + // State changers + void Toggle( void ); + virtual void Enable( void ); + virtual void Disable( void ); + + virtual bool IsDepleted( void ); + + DECLARE_DATADESC(); + + int m_nMaxNumNPCs; // max number of NPCs this ent can create + float m_flSpawnFrequency; // delay (in secs) between spawns + + COutputEHANDLE m_OnSpawnNPC; + COutputEvent m_OnAllSpawned; + COutputEvent m_OnAllSpawnedDead; + COutputEvent m_OnAllLiveChildrenDead; + + int m_nLiveChildren; // how many NPCs made by this NPC maker that are currently alive + int m_nMaxLiveChildren; // max number of NPCs that this maker may have out at one time. + + bool m_bDisabled; + + EHANDLE m_hIgnoreEntity; + string_t m_iszIngoreEnt; +}; + + +class CNPCMaker : public CBaseNPCMaker +{ +public: + DECLARE_CLASS( CNPCMaker, CBaseNPCMaker ); + + CNPCMaker( void ); + + void Precache( void ); + + virtual void MakeNPC( void ); + + DECLARE_DATADESC(); + + string_t m_iszNPCClassname; // classname of the NPC(s) that will be created. + string_t m_SquadName; + string_t m_strHintGroup; + string_t m_spawnEquipment; + string_t m_RelationshipString; // Used to load up relationship keyvalues + string_t m_ChildTargetName; +}; + +class CTemplateNPCMaker : public CBaseNPCMaker +{ +public: + DECLARE_CLASS( CTemplateNPCMaker, CBaseNPCMaker ); + + CTemplateNPCMaker( void ) + { + m_iMinSpawnDistance = 0; + } + + virtual void Precache(); + + virtual CNPCSpawnDestination *FindSpawnDestination(); + virtual void MakeNPC( void ); + void MakeNPCInRadius( void ); + void MakeNPCInLine( void ); + virtual void MakeMultipleNPCS( int nNPCs ); + +protected: + virtual void PrecacheTemplateEntity( CBaseEntity *pEntity ); + + bool PlaceNPCInRadius( CAI_BaseNPC *pNPC ); + bool PlaceNPCInLine( CAI_BaseNPC *pNPC ); + + // Inputs + void InputSpawnInRadius( inputdata_t &inputdata ) { MakeNPCInRadius(); } + void InputSpawnInLine( inputdata_t &inputdata ) { MakeNPCInLine(); } + void InputSpawnMultiple( inputdata_t &inputdata ); + void InputChangeDestinationGroup( inputdata_t &inputdata ); + void InputSetMinimumSpawnDistance( inputdata_t &inputdata ); + + float m_flRadius; + + DECLARE_DATADESC(); + + string_t m_iszTemplateName; // The name of the NPC that will be used as the template. + string_t m_iszTemplateData; // The keyvalue data blob from the template NPC that will be used to spawn new ones. + string_t m_iszDestinationGroup; + + int m_iMinSpawnDistance; + + enum ThreeStateYesNo_t + { + TS_YN_YES = 0, + TS_YN_NO, + TS_YN_DONT_CARE, + }; + + enum ThreeStateDist_t + { + TS_DIST_NEAREST = 0, + TS_DIST_FARTHEST, + TS_DIST_DONT_CARE, + }; + + ThreeStateYesNo_t m_CriterionVisibility; + ThreeStateDist_t m_CriterionDistance; +}; + +#endif // MONSTERMAKER_H |