//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: Fires an output when the map spawns (or respawns if not set to // only fire once). It can be set to check a global state before firing. // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "entityinput.h" #include "entityoutput.h" #include "eventqueue.h" #include "mathlib/mathlib.h" #include "globalstate.h" #include "GameEventListener.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" const int SF_AUTO_FIREONCE = 0x01; const int SF_AUTO_FIREONRELOAD = 0x02; class CLogicAuto : public CBaseEntity, public CGameEventListener { public: DECLARE_CLASS( CLogicAuto, CBaseEntity ); void Activate(void); void Think(void); int ObjectCaps(void) { return BaseClass::ObjectCaps() & ~FCAP_ACROSS_TRANSITION; } virtual void FireGameEvent( IGameEvent *event ); // incoming event processing DECLARE_DATADESC(); private: // fired no matter why the map loaded COutputEvent m_OnMapSpawn; // fired for specified types of map loads COutputEvent m_OnNewGame; COutputEvent m_OnLoadGame; COutputEvent m_OnMapTransition; COutputEvent m_OnBackgroundMap; COutputEvent m_OnMultiNewMap; COutputEvent m_OnMultiNewRound; string_t m_globalstate; }; LINK_ENTITY_TO_CLASS(logic_auto, CLogicAuto); BEGIN_DATADESC( CLogicAuto ) DEFINE_KEYFIELD(m_globalstate, FIELD_STRING, "globalstate"), // Outputs DEFINE_OUTPUT(m_OnMapSpawn, "OnMapSpawn"), DEFINE_OUTPUT(m_OnNewGame, "OnNewGame"), DEFINE_OUTPUT(m_OnLoadGame, "OnLoadGame"), DEFINE_OUTPUT(m_OnMapTransition, "OnMapTransition"), DEFINE_OUTPUT(m_OnBackgroundMap, "OnBackgroundMap"), DEFINE_OUTPUT(m_OnMultiNewMap, "OnMultiNewMap" ), DEFINE_OUTPUT(m_OnMultiNewRound, "OnMultiNewRound" ), END_DATADESC() //------------------------------------------------------------------------------ // Purpose : Fire my outputs here if I fire on map reload //------------------------------------------------------------------------------ void CLogicAuto::Activate(void) { ListenForGameEvent( "round_start" ); ListenForGameEvent( "teamplay_round_start" ); BaseClass::Activate(); SetNextThink( gpGlobals->curtime + 0.2 ); } //----------------------------------------------------------------------------- // Purpose: Called shortly after level spawn. Checks the global state and fires // targets if the global state is set or if there is not global state // to check. //----------------------------------------------------------------------------- void CLogicAuto::Think(void) { if (!m_globalstate || GlobalEntity_GetState(m_globalstate) == GLOBAL_ON) { if (gpGlobals->eLoadType == MapLoad_Transition) { m_OnMapTransition.FireOutput(NULL, this); } else if (gpGlobals->eLoadType == MapLoad_NewGame) { m_OnNewGame.FireOutput(NULL, this); } else if (gpGlobals->eLoadType == MapLoad_LoadGame) { m_OnLoadGame.FireOutput(NULL, this); } else if (gpGlobals->eLoadType == MapLoad_Background) { m_OnBackgroundMap.FireOutput(NULL, this); } m_OnMapSpawn.FireOutput(NULL, this); if ( g_pGameRules->IsMultiplayer() ) { m_OnMultiNewMap.FireOutput(NULL, this); } if (m_spawnflags & SF_AUTO_FIREONCE) { UTIL_Remove(this); } } } void CLogicAuto::FireGameEvent( IGameEvent *gameEvent ) { if ( FStrEq( gameEvent->GetName(), "round_start" ) || FStrEq( gameEvent->GetName(), "teamplay_round_start" ) ) { if ( g_pGameRules->IsMultiplayer() ) { m_OnMultiNewRound.FireOutput(NULL, this); } } }