//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ // //=============================================================================// #ifndef ISERVERPLUGIN_H #define ISERVERPLUGIN_H #ifdef _WIN32 #pragma once #endif #include "edict.h" #include "tier1/KeyValues.h" #include "tier1/interface.h" class CCommand; // // you will also want to listen for game events via // IGameEventManager::AddListener() // typedef enum { PLUGIN_CONTINUE = 0, // keep going PLUGIN_OVERRIDE, // run the game dll function but use our return value // instead PLUGIN_STOP, // don't run the game dll function at all } PLUGIN_RESULT; typedef enum { eQueryCvarValueStatus_ValueIntact = 0, // It got the value fine. eQueryCvarValueStatus_CvarNotFound = 1, eQueryCvarValueStatus_NotACvar = 2, // There's a ConCommand, but it's not a ConVar. eQueryCvarValueStatus_CvarProtected = 3 // The cvar was marked with FCVAR_SERVER_CAN_NOT_QUERY, so the server // is not allowed to have its value. } EQueryCvarValueStatus; typedef int QueryCvarCookie_t; #define InvalidQueryCvarCookie -1 #define INTERFACEVERSION_ISERVERPLUGINCALLBACKS_VERSION_1 \ "ISERVERPLUGINCALLBACKS001" #define INTERFACEVERSION_ISERVERPLUGINCALLBACKS_VERSION_2 \ "ISERVERPLUGINCALLBACKS002" #define INTERFACEVERSION_ISERVERPLUGINCALLBACKS "ISERVERPLUGINCALLBACKS003" //----------------------------------------------------------------------------- // Purpose: callbacks the engine exposes to the 3rd party plugins (ala MetaMod) //----------------------------------------------------------------------------- abstract_class IServerPluginCallbacks { public: // Initialize the plugin to run // Return false if there is an error during startup. virtual bool Load(CreateInterfaceFn interfaceFactory, CreateInterfaceFn gameServerFactory) = 0; // Called when the plugin should be shutdown virtual void Unload(void) = 0; // called when a plugins execution is stopped but the plugin is not unloaded virtual void Pause(void) = 0; // called when a plugin should start executing again (sometime after a // Pause() call) virtual void UnPause(void) = 0; // Returns string describing current plugin. e.g., Admin-Mod. virtual const char *GetPluginDescription(void) = 0; // Called any time a new level is started (after GameInit() also on level // transitions within a game) virtual void LevelInit(char const *pMapName) = 0; // The server is about to activate virtual void ServerActivate(edict_t * pEdictList, int edictCount, int clientMax) = 0; // The server should run physics/think on all edicts virtual void GameFrame(bool simulating) = 0; // Called when a level is shutdown (including changing levels) virtual void LevelShutdown(void) = 0; // Client is going active virtual void ClientActive(edict_t * pEntity) = 0; // Client is disconnecting from server virtual void ClientDisconnect(edict_t * pEntity) = 0; // Client is connected and should be put in the game virtual void ClientPutInServer(edict_t * pEntity, char const *playername) = 0; // Sets the client index for the client who typed the command into their // console virtual void SetCommandClient(int index) = 0; // A player changed one/several replicated cvars (name etc) virtual void ClientSettingsChanged(edict_t * pEdict) = 0; // Client is connecting to server ( set retVal to false to reject the // connection ) // You can specify a rejection message by writing it into reject virtual PLUGIN_RESULT ClientConnect( bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen) = 0; // The client has typed a command at the console virtual PLUGIN_RESULT ClientCommand(edict_t * pEntity, const CCommand &args) = 0; // A user has had their network id setup and validated virtual PLUGIN_RESULT NetworkIDValidated(const char *pszUserName, const char *pszNetworkID) = 0; // This is called when a query from // IServerPluginHelpers::StartQueryCvarValue is finished. iCookie is the // value returned by IServerPluginHelpers::StartQueryCvarValue. Added with // version 2 of the interface. virtual void OnQueryCvarValueFinished( QueryCvarCookie_t iCookie, edict_t * pPlayerEntity, EQueryCvarValueStatus eStatus, const char *pCvarName, const char *pCvarValue) = 0; // added with version 3 of the interface. virtual void OnEdictAllocated(edict_t * edict) = 0; virtual void OnEdictFreed(const edict_t *edict) = 0; }; #define INTERFACEVERSION_ISERVERPLUGINHELPERS "ISERVERPLUGINHELPERS001" typedef enum { DIALOG_MSG = 0, // just an on screen message DIALOG_MENU, // an options menu DIALOG_TEXT, // a richtext dialog DIALOG_ENTRY, // an entry box DIALOG_ASKCONNECT // Ask the client to connect to a specified IP address. // Only the "time" and "title" keys are used. } DIALOG_TYPE; //----------------------------------------------------------------------------- // Purpose: functions that only 3rd party plugins need //----------------------------------------------------------------------------- abstract_class IServerPluginHelpers { public: // creates an onscreen menu with various option buttons // The keyvalues param can contain these fields: // "title" - (string) the title to show in the hud and in the title bar // "msg" - (string) a longer message shown in the GameUI // "color" - (color) the color to display the message in the hud (white by // default) // "level" - (int) the priority of this message (closer to 0 is higher), //only 1 message can be outstanding at a time "time" - (int) the time in //seconds this message should stay active in the GameUI (min 10 sec, max 200 //sec) // // For DIALOG_MENU add sub keys for each option with these fields: // "command" - (string) client command to run if selected // "msg" - (string) button text for this option // virtual void CreateMessage(edict_t * pEntity, DIALOG_TYPE type, KeyValues * data, IServerPluginCallbacks * plugin) = 0; virtual void ClientCommand(edict_t * pEntity, const char *cmd) = 0; // Call this to find out the value of a cvar on the client. // // It is an asynchronous query, and it will call // IServerPluginCallbacks::OnQueryCvarValueFinished when the value comes in // from the client. // // Store the return value if you want to match this specific query to the // OnQueryCvarValueFinished call. Returns InvalidQueryCvarCookie if the // entity is invalid. virtual QueryCvarCookie_t StartQueryCvarValue(edict_t * pEntity, const char *pName) = 0; }; #endif // ISERVERPLUGIN_H