1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
//========= Copyright 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"
// 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:
DECLARE_CLASS( CLogicAuto, CBaseEntity );
void Activate(void);
void Think(void);
int ObjectCaps(void) { return BaseClass::ObjectCaps() & ~FCAP_ACROSS_TRANSITION; }
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)
{
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() )
{
// In multiplayer, fire the new map / round events.
if ( g_pGameRules->InRoundRestart() )
{
m_OnMultiNewRound.FireOutput(NULL, this);
}
else
{
m_OnMultiNewMap.FireOutput(NULL, this);
}
}
if (m_spawnflags & SF_AUTO_FIREONCE)
{
UTIL_Remove(this);
}
}
}
|