All pastes #596755 Raw Edit

Miscellany

public cpp v1 · immutable
#596755 ·published 2007-06-30 05:01 UTC
rendered paste body
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============////// Purpose: //// $NoKeywords: $////=============================================================================//#include <stdio.h>#include "interface.h"#include "filesystem.h"#include "engine/iserverplugin.h"#include "dlls/iplayerinfo.h"#include "eiface.h"#include "igameevents.h"#include "convar.h"#include "Color.h"#include "vstdlib/random.h"#include "engine/IEngineTrace.h"//My Includes//#include "addict/CServerMan.h"#include "addict/CTimer.h"// memdbgon must be the last include file in a .cpp file!!!#include "tier0/memdbgon.h"// Interfaces from the engineIVEngineServer	*engine = NULL; // helper functions (messaging clients, loading content, making entities, running commands, etc)IFileSystem		*filesystem = NULL; // file I/O IGameEventManager *gameeventmanager = NULL; // game events interfaceIPlayerInfoManager *playerinfomanager = NULL; // game dll interface to interact with playersIBotManager *botmanager = NULL; // game dll interface to interact with botsIServerPluginHelpers *helpers = NULL; // special 3rd party plugin helpers from the engineIUniformRandomStream *randomStr = NULL;IEngineTrace *enginetrace = NULL;CGlobalVars *gpGlobals = NULL;// function to initialize any cvars/command in this pluginvoid InitCVars( CreateInterfaceFn cvarFactory );void Bot_RunAll( void ); //Pointers to managament, this is NEVER set using newCServerMan * pServerMan = NULL;CTimerMan * pTimerMan = NULL;// useful helper funcinline bool FStrEq(const char *sz1, const char *sz2){	return(Q_stricmp(sz1, sz2) == 0);}//---------------------------------------------------------------------------------// Purpose: a sample 3rd party plugin class//---------------------------------------------------------------------------------class CEmptyServerPlugin: public IServerPluginCallbacks, public IGameEventListener{public:	CEmptyServerPlugin();	~CEmptyServerPlugin();	// IServerPluginCallbacks methods	virtual bool			Load(	CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory );	virtual void			Unload( void );	virtual void			Pause( void );	virtual void			UnPause( void );	virtual const char     *GetPluginDescription( void );      	virtual void			LevelInit( char const *pMapName );	virtual void			ServerActivate( edict_t *pEdictList, int edictCount, int clientMax );	virtual void			GameFrame( bool simulating );	virtual void			LevelShutdown( void );	virtual void			ClientActive( edict_t *pEntity );	virtual void			ClientDisconnect( edict_t *pEntity );	virtual void			ClientPutInServer( edict_t *pEntity, char const *playername );	virtual void			SetCommandClient( int index );	virtual void			ClientSettingsChanged( edict_t *pEdict );	virtual PLUGIN_RESULT	ClientConnect( bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen );	virtual PLUGIN_RESULT	ClientCommand( edict_t *pEntity );	virtual PLUGIN_RESULT	NetworkIDValidated( const char *pszUserName, const char *pszNetworkID );	// IGameEventListener Interface	virtual void FireGameEvent( KeyValues * event );	//Start all our management tools	CServerMan ServerMan; 	CTimerMan TimerMan;	virtual int GetCommandIndex() { return m_iClientCommandIndex; }private:	int m_iClientCommandIndex;};// // The plugin is a static singleton that is exported as an interface//CEmptyServerPlugin g_EmtpyServerPlugin;EXPOSE_SINGLE_INTERFACE_GLOBALVAR(CEmptyServerPlugin, IServerPluginCallbacks, INTERFACEVERSION_ISERVERPLUGINCALLBACKS, g_EmtpyServerPlugin );//---------------------------------------------------------------------------------// Purpose: constructor/destructor//---------------------------------------------------------------------------------CEmptyServerPlugin::CEmptyServerPlugin(){	m_iClientCommandIndex = 0;}CEmptyServerPlugin::~CEmptyServerPlugin(){}//---------------------------------------------------------------------------------// Purpose: called when the plugin is loaded, load the interface we need from the engine//---------------------------------------------------------------------------------bool CEmptyServerPlugin::Load(	CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory ){	playerinfomanager = (IPlayerInfoManager *)gameServerFactory(INTERFACEVERSION_PLAYERINFOMANAGER,NULL);	if ( !playerinfomanager )	{		Warning( "Unable to load playerinfomanager, ignoring\n" ); // this isn't fatal, we just won't be able to access specific player data	}	botmanager = (IBotManager *)gameServerFactory(INTERFACEVERSION_PLAYERBOTMANAGER, NULL);	if ( !botmanager )	{		Warning( "Unable to load botcontroller, ignoring\n" ); // this isn't fatal, we just won't be able to access specific bot functions	}	// get the interfaces we want to use	if(	!(engine = (IVEngineServer*)interfaceFactory(INTERFACEVERSION_VENGINESERVER, NULL)) ||		!(gameeventmanager = (IGameEventManager *)interfaceFactory(INTERFACEVERSION_GAMEEVENTSMANAGER,NULL)) ||		!(filesystem = (IFileSystem*)interfaceFactory(FILESYSTEM_INTERFACE_VERSION, NULL)) ||		!(helpers = (IServerPluginHelpers*)interfaceFactory(INTERFACEVERSION_ISERVERPLUGINHELPERS, NULL)) || 		!(enginetrace = (IEngineTrace *)interfaceFactory(INTERFACEVERSION_ENGINETRACE_SERVER,NULL)) ||		!(randomStr = (IUniformRandomStream *)interfaceFactory(VENGINE_SERVER_RANDOM_INTERFACE_VERSION, NULL))		)	{		return false; // we require all these interface to function	}	if ( playerinfomanager )	{		gpGlobals = playerinfomanager->GetGlobalVars();	}	//Set up global pointer to use in other classes	pServerMan = &ServerMan;	pTimerMan = &TimerMan;	Msg("AddictMod 1.0 has been loaded, now prepare for action.\n");	InitCVars( interfaceFactory ); // register any cvars we have defined	MathLib_Init( 2.2f, 2.2f, 0.0f, 2.0f );	return true;}//---------------------------------------------------------------------------------// Purpose: called when the plugin is unloaded (turned off)//---------------------------------------------------------------------------------void CEmptyServerPlugin::Unload( void ){	gameeventmanager->RemoveListener( this ); // make sure we are unloaded from the event system}//---------------------------------------------------------------------------------// Purpose: called when the plugin is paused (i.e should stop running but isn't unloaded)//---------------------------------------------------------------------------------void CEmptyServerPlugin::Pause( void ){}//---------------------------------------------------------------------------------// Purpose: called when the plugin is unpaused (i.e should start executing again)//---------------------------------------------------------------------------------void CEmptyServerPlugin::UnPause( void ){}//---------------------------------------------------------------------------------// Purpose: the name of this plugin, returned in "plugin_print" command//---------------------------------------------------------------------------------const char *CEmptyServerPlugin::GetPluginDescription( void ){	return "Addict Mod: Obviously made by Addict. This plugin does things. At least I think it does.";}//---------------------------------------------------------------------------------// Purpose: called on level start//---------------------------------------------------------------------------------void CEmptyServerPlugin::LevelInit( char const *pMapName ){	ServerMan.levelInit(pMapName);}//---------------------------------------------------------------------------------// Purpose: called on level start, when the server is ready to accept client connections//		edictCount is the number of entities in the level, clientMax is the max client count//---------------------------------------------------------------------------------void CEmptyServerPlugin::ServerActivate( edict_t *pEdictList, int edictCount, int clientMax ){	ServerMan.serverActivate(clientMax);}//---------------------------------------------------------------------------------// Purpose: called once per server frame, do recurring work here (like checking for timeouts)//---------------------------------------------------------------------------------void CEmptyServerPlugin::GameFrame( bool simulating ){	//Activate our counter	pTimerMan->gameFrame(gpGlobals->curtime);	if ( simulating )	{		Bot_RunAll();	}}//---------------------------------------------------------------------------------// Purpose: called on level end (as the server is shutting down or going to a new map)//---------------------------------------------------------------------------------void CEmptyServerPlugin::LevelShutdown( void ) // !!!!this can get called multiple times per map change{	gameeventmanager->RemoveListener( this );}//---------------------------------------------------------------------------------// Purpose: called when a client spawns into a server (i.e as they begin to play)//---------------------------------------------------------------------------------void CEmptyServerPlugin::ClientActive( edict_t *pEntity ){	//Bot Detection	if(ServerMan.entityToSlot(pEntity) == -1 && !pEntity->IsFree())	{		IPlayerInfo * botCheck = playerinfomanager->GetPlayerInfo(pEntity);		int newBot = ServerMan.playerConnect(pEntity,botCheck->GetName(),"1.B.O.T",true);		ServerMan.PlayerList[newBot]->setPlayerState(2);	}}//---------------------------------------------------------------------------------// Purpose: called when a client leaves a server (or is timed out)//---------------------------------------------------------------------------------void CEmptyServerPlugin::ClientDisconnect( edict_t *pEntity ){	ServerMan.playerDisconnect(pEntity);}//---------------------------------------------------------------------------------// Purpose: called on //---------------------------------------------------------------------------------void CEmptyServerPlugin::ClientPutInServer( edict_t *pEntity, char const *playername ){	int index = ServerMan.entityToSlot(pEntity);	if(index != -1)	{		ServerMan.PlayerList[index]->setPlayerState(2);	}}//---------------------------------------------------------------------------------// Purpose: called on level start//---------------------------------------------------------------------------------void CEmptyServerPlugin::SetCommandClient( int index ){	m_iClientCommandIndex = index;}//---------------------------------------------------------------------------------// Purpose: called on level start//---------------------------------------------------------------------------------void CEmptyServerPlugin::ClientSettingsChanged( edict_t *pEdict ){}//---------------------------------------------------------------------------------// Purpose: called when a client joins a server//---------------------------------------------------------------------------------PLUGIN_RESULT CEmptyServerPlugin::ClientConnect( bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen ){	ServerMan.playerConnect(pEntity,pszName,pszAddress,false);	return PLUGIN_CONTINUE;}//---------------------------------------------------------------------------------// Purpose: called when a client types in a command (only a subset of commands however, not CON_COMMAND's)//---------------------------------------------------------------------------------PLUGIN_RESULT CEmptyServerPlugin::ClientCommand( edict_t *pEntity ){	return PLUGIN_CONTINUE;}//---------------------------------------------------------------------------------// Purpose: called when a client is authenticated//---------------------------------------------------------------------------------PLUGIN_RESULT CEmptyServerPlugin::NetworkIDValidated( const char *pszUserName, const char *pszNetworkID ){	ServerMan.networkIdVerified(pszUserName,pszNetworkID);	return PLUGIN_CONTINUE;}//---------------------------------------------------------------------------------// Purpose: called when an event is fired//---------------------------------------------------------------------------------void CEmptyServerPlugin::FireGameEvent( KeyValues * event ){	ServerMan.serverGameEvent(anEvent); //This feeds info so player array can be up to date}