You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.5 KiB
135 lines
3.5 KiB
//========= 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);
|
|
}
|
|
}
|
|
}
|