186 lines
7.1 KiB
C++
186 lines
7.1 KiB
C++
//========= 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
|