aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/server/globalstate.cpp
diff options
context:
space:
mode:
authorJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
committerJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
commit39ed87570bdb2f86969d4be821c94b722dc71179 (patch)
treeabc53757f75f40c80278e87650ea92808274aa59 /mp/src/game/server/globalstate.cpp
downloadsource-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz
source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/game/server/globalstate.cpp')
-rw-r--r--mp/src/game/server/globalstate.cpp325
1 files changed, 325 insertions, 0 deletions
diff --git a/mp/src/game/server/globalstate.cpp b/mp/src/game/server/globalstate.cpp
new file mode 100644
index 00000000..43390d90
--- /dev/null
+++ b/mp/src/game/server/globalstate.cpp
@@ -0,0 +1,325 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+#include "cbase.h"
+#include "basetypes.h"
+#include "saverestore.h"
+#include "saverestore_utlvector.h"
+#include "saverestore_utlsymbol.h"
+#include "globalstate.h"
+#include "igamesystem.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+struct globalentity_t
+{
+ DECLARE_SIMPLE_DATADESC();
+
+ CUtlSymbol name;
+ CUtlSymbol levelName;
+ GLOBALESTATE state;
+ int counter;
+};
+
+
+class CGlobalState : public CAutoGameSystem
+{
+public:
+ CGlobalState( char const *name ) : CAutoGameSystem( name ), m_disableStateUpdates(false)
+ {
+ }
+
+ // IGameSystem
+ virtual void LevelShutdownPreEntity()
+ {
+ // don't allow state updates during shutdowns
+ Assert( !m_disableStateUpdates );
+ m_disableStateUpdates = true;
+ }
+
+ virtual void LevelShutdownPostEntity()
+ {
+ Assert( m_disableStateUpdates );
+ m_disableStateUpdates = false;
+ }
+
+ void EnableStateUpdates( bool bEnable )
+ {
+ m_disableStateUpdates = !bEnable;
+ }
+
+ void SetState( int globalIndex, GLOBALESTATE state )
+ {
+ if ( m_disableStateUpdates || !m_list.IsValidIndex(globalIndex) )
+ return;
+ m_list[globalIndex].state = state;
+ }
+
+ GLOBALESTATE GetState( int globalIndex )
+ {
+ if ( !m_list.IsValidIndex(globalIndex) )
+ return GLOBAL_OFF;
+ return m_list[globalIndex].state;
+ }
+
+ void SetCounter( int globalIndex, int counter )
+ {
+ if ( m_disableStateUpdates || !m_list.IsValidIndex(globalIndex) )
+ return;
+ m_list[globalIndex].counter = counter;
+ }
+
+ int AddToCounter( int globalIndex, int delta )
+ {
+ if ( m_disableStateUpdates || !m_list.IsValidIndex(globalIndex) )
+ return 0;
+ return ( m_list[globalIndex].counter += delta );
+ }
+
+ int GetCounter( int globalIndex )
+ {
+ if ( !m_list.IsValidIndex(globalIndex) )
+ return 0;
+ return m_list[globalIndex].counter;
+ }
+
+ void SetMap( int globalIndex, string_t mapname )
+ {
+ if ( !m_list.IsValidIndex(globalIndex) )
+ return;
+ m_list[globalIndex].levelName = m_nameList.AddString( STRING(mapname) );
+ }
+
+ const char *GetMap( int globalIndex )
+ {
+ if ( !m_list.IsValidIndex(globalIndex) )
+ return NULL;
+ return m_nameList.String( m_list[globalIndex].levelName );
+ }
+
+ const char *GetName( int globalIndex )
+ {
+ if ( !m_list.IsValidIndex(globalIndex) )
+ return NULL;
+ return m_nameList.String( m_list[globalIndex].name );
+ }
+
+ int GetIndex( const char *pGlobalname )
+ {
+ CUtlSymbol symName = m_nameList.Find( pGlobalname );
+
+ if ( symName.IsValid() )
+ {
+ for ( int i = m_list.Count() - 1; i >= 0; --i )
+ {
+ if ( m_list[i].name == symName )
+ return i;
+ }
+ }
+
+ return -1;
+ }
+
+ int AddEntity( const char *pGlobalname, const char *pMapName, GLOBALESTATE state )
+ {
+ globalentity_t entity;
+ entity.name = m_nameList.AddString( pGlobalname );
+ entity.levelName = m_nameList.AddString( pMapName );
+ entity.state = state;
+
+ int index = GetIndex( m_nameList.String( entity.name ) );
+ if ( index >= 0 )
+ return index;
+ return m_list.AddToTail( entity );
+ }
+
+ int GetNumGlobals( void )
+ {
+ return m_list.Count();
+ }
+
+ void Reset( void );
+ int Save( ISave &save );
+ int Restore( IRestore &restore );
+ DECLARE_SIMPLE_DATADESC();
+
+//#ifdef _DEBUG
+ void DumpGlobals( void );
+//#endif
+
+public:
+ CUtlSymbolTable m_nameList;
+private:
+ bool m_disableStateUpdates;
+ CUtlVector<globalentity_t> m_list;
+};
+
+static CGlobalState gGlobalState( "CGlobalState" );
+
+static CUtlSymbolDataOps g_GlobalSymbolDataOps( gGlobalState.m_nameList );
+
+
+void GlobalEntity_SetState( int globalIndex, GLOBALESTATE state )
+{
+ gGlobalState.SetState( globalIndex, state );
+}
+
+void GlobalEntity_SetCounter( int globalIndex, int counter )
+{
+ gGlobalState.SetCounter( globalIndex, counter );
+}
+
+int GlobalEntity_AddToCounter( int globalIndex, int delta )
+{
+ return gGlobalState.AddToCounter( globalIndex, delta );
+}
+
+void GlobalEntity_EnableStateUpdates( bool bEnable )
+{
+ gGlobalState.EnableStateUpdates( bEnable );
+}
+
+
+void GlobalEntity_SetMap( int globalIndex, string_t mapname )
+{
+ gGlobalState.SetMap( globalIndex, mapname );
+}
+
+int GlobalEntity_Add( const char *pGlobalname, const char *pMapName, GLOBALESTATE state )
+{
+ return gGlobalState.AddEntity( pGlobalname, pMapName, state );
+}
+
+int GlobalEntity_GetIndex( const char *pGlobalname )
+{
+ return gGlobalState.GetIndex( pGlobalname );
+}
+
+GLOBALESTATE GlobalEntity_GetState( int globalIndex )
+{
+ return gGlobalState.GetState( globalIndex );
+}
+
+int GlobalEntity_GetCounter( int globalIndex )
+{
+ return gGlobalState.GetCounter( globalIndex );
+}
+
+const char *GlobalEntity_GetMap( int globalIndex )
+{
+ return gGlobalState.GetMap( globalIndex );
+}
+
+const char *GlobalEntity_GetName( int globalIndex )
+{
+ return gGlobalState.GetName( globalIndex );
+}
+
+int GlobalEntity_GetNumGlobals( void )
+{
+ return gGlobalState.GetNumGlobals();
+}
+
+CON_COMMAND(dump_globals, "Dump all global entities/states")
+{
+ if ( !UTIL_IsCommandIssuedByServerAdmin() )
+ return;
+
+ gGlobalState.DumpGlobals();
+}
+
+// This is available all the time now on impulse 104, remove later
+//#ifdef _DEBUG
+void CGlobalState::DumpGlobals( void )
+{
+ static const char *estates[] = { "Off", "On", "Dead" };
+
+ Msg( "-- Globals --\n" );
+ for ( int i = 0; i < m_list.Count(); i++ )
+ {
+ Msg( "%s: %s (%s) = %d\n", m_nameList.String( m_list[i].name ), m_nameList.String( m_list[i].levelName ), estates[m_list[i].state], m_list[i].counter );
+ }
+}
+//#endif
+
+
+// Global state Savedata
+BEGIN_SIMPLE_DATADESC( CGlobalState )
+ DEFINE_UTLVECTOR( m_list, FIELD_EMBEDDED ),
+ // DEFINE_FIELD( m_nameList, CUtlSymbolTable ),
+ // DEFINE_FIELD( m_disableStateUpdates, FIELD_BOOLEAN ),
+END_DATADESC()
+
+BEGIN_SIMPLE_DATADESC( globalentity_t )
+ DEFINE_CUSTOM_FIELD( name, &g_GlobalSymbolDataOps ),
+ DEFINE_CUSTOM_FIELD( levelName, &g_GlobalSymbolDataOps ),
+ DEFINE_FIELD( state, FIELD_INTEGER ),
+ DEFINE_FIELD( counter, FIELD_INTEGER ),
+END_DATADESC()
+
+
+int CGlobalState::Save( ISave &save )
+{
+ if ( !save.WriteFields( "GLOBAL", this, NULL, m_DataMap.dataDesc, m_DataMap.dataNumFields ) )
+ return 0;
+
+ return 1;
+}
+
+int CGlobalState::Restore( IRestore &restore )
+{
+ Reset();
+ if ( !restore.ReadFields( "GLOBAL", this, NULL, m_DataMap.dataDesc, m_DataMap.dataNumFields ) )
+ return 0;
+
+ return 1;
+}
+
+void CGlobalState::Reset( void )
+{
+ m_list.Purge();
+ m_nameList.RemoveAll();
+}
+
+
+void SaveGlobalState( CSaveRestoreData *pSaveData )
+{
+ CSave saveHelper( pSaveData );
+ gGlobalState.Save( saveHelper );
+}
+
+
+void RestoreGlobalState( CSaveRestoreData *pSaveData )
+{
+ CRestore restoreHelper( pSaveData );
+ gGlobalState.Restore( restoreHelper );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: This gets called when a level is shut down
+//-----------------------------------------------------------------------------
+
+void ResetGlobalState( void )
+{
+ gGlobalState.Reset();
+}
+
+
+void ShowServerGameTime()
+{
+ Msg( "Server game time: %f\n", gpGlobals->curtime );
+}
+
+CON_COMMAND(server_game_time, "Gives the game time in seconds (server's curtime)")
+{
+ if ( !UTIL_IsCommandIssuedByServerAdmin() )
+ return;
+
+ ShowServerGameTime();
+}