core/logic/intercom.h
author Nicholas Hastings <skamonkey@gmail.com>
Wed Apr 23 21:40:50 2014 -0400 (2014-04-23)
changeset 4332 75c299312bec
parent 4199 6e0c63e83c8a
permissions -rw-r--r--
Update CS:GO gamedata.
dvander@2726
     1
/**
dvander@3881
     2
 * vim: set ts=4 sw=4 tw=99 noet:
dvander@2726
     3
 * =============================================================================
dvander@2726
     4
 * SourceMod
dvander@2726
     5
 * Copyright (C) 2004-2009 AlliedModders LLC.  All rights reserved.
dvander@2726
     6
 * =============================================================================
dvander@2726
     7
 *
dvander@2726
     8
 * This program is free software; you can redistribute it and/or modify it under
dvander@2726
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
dvander@2726
    10
 * Free Software Foundation.
dvander@2726
    11
 * 
dvander@2726
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@2726
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@2726
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
dvander@2726
    15
 * details.
dvander@2726
    16
 *
dvander@2726
    17
 * You should have received a copy of the GNU General Public License along with
dvander@2726
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@2726
    19
 *
dvander@2726
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
dvander@2726
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@2726
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@2726
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
dvander@2726
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
dvander@2726
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
dvander@2726
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@2726
    27
 * or <http://www.sourcemod.net/license.php>.
dvander@2726
    28
 *
dvander@2726
    29
 * Version: $Id$
dvander@2726
    30
 */
dvander@2726
    31
dvander@3872
    32
#ifndef _INCLUDE_SOURCEMOD_INTERCOM_H_
dvander@3872
    33
#define _INCLUDE_SOURCEMOD_INTERCOM_H_
dvander@3872
    34
dvander@2726
    35
#include <sp_vm_api.h>
dvander@2726
    36
#include <IHandleSys.h>
dvander@2726
    37
#include <IShareSys.h>
dvander@3872
    38
#include <IPluginSys.h>
skamonkey@4138
    39
#include <IDBDriver.h>
dvander@3872
    40
#include <sh_string.h>
dvander@3872
    41
#include <sp_vm_api.h>
dvander@3872
    42
#include <sh_vector.h>
dvander@3872
    43
#include <IExtensionSys.h>
skamonkey@4139
    44
#include <IForwardSys.h>
dvander@2726
    45
dvander@2726
    46
using namespace SourceMod;
dvander@3872
    47
using namespace SourcePawn;
dvander@3872
    48
using namespace SourceHook;
dvander@2726
    49
dvander@2726
    50
/**
dvander@2726
    51
 * Add 1 to the RHS of this expression to bump the intercom file
dvander@2726
    52
 * This is to prevent mismatching core/logic binaries
dvander@2726
    53
 */
skamonkey@4199
    54
#define SM_LOGIC_MAGIC		(0x0F47C0DE - 27)
dvander@2726
    55
dvander@2726
    56
#if defined SM_LOGIC
dvander@2726
    57
class IVEngineServer
dvander@2726
    58
#else
dvander@2726
    59
class IVEngineServer_Logic
dvander@2726
    60
#endif
dvander@2726
    61
{
dvander@2726
    62
public:
dvander@2726
    63
	virtual bool IsMapValid(const char *map) = 0;
dvander@3001
    64
	virtual void ServerCommand(const char *cmd) = 0;
dvander@2726
    65
};
dvander@2726
    66
skamonkey@4196
    67
typedef void * FileHandle_t;
voidedweasel@3929
    68
typedef int FileFindHandle_t; 
voidedweasel@3929
    69
voidedweasel@3929
    70
#if defined SM_LOGIC
voidedweasel@3929
    71
class IFileSystem
voidedweasel@3929
    72
#else
voidedweasel@3929
    73
class IFileSystem_Logic
voidedweasel@3929
    74
#endif
voidedweasel@3929
    75
{
voidedweasel@3929
    76
public:
voidedweasel@3929
    77
	virtual const char *FindFirstEx(const char *pWildCard, const char *pPathID, FileFindHandle_t *pHandle) = 0;
voidedweasel@3929
    78
	virtual const char *FindNext(FileFindHandle_t handle) = 0;
voidedweasel@3929
    79
	virtual void FindClose(FileFindHandle_t handle) = 0;
skamonkey@4196
    80
	virtual FileHandle_t Open(const char *pFileName, const char *pOptions, const char *pathID = 0) = 0;
skamonkey@4196
    81
	virtual void Close(FileHandle_t file) = 0;
skamonkey@4196
    82
	virtual char *ReadLine(char *pOutput, int maxChars, FileHandle_t file) = 0;
skamonkey@4196
    83
	virtual bool EndOfFile(FileHandle_t file) = 0;
skamonkey@4196
    84
	virtual bool FileExists(const char *pFileName, const char *pPathID = 0) = 0;
skamonkey@4199
    85
	virtual unsigned int Size(const char *pFileName, const char *pPathID = 0) = 0;
voidedweasel@3929
    86
};
voidedweasel@3929
    87
dvander@2726
    88
namespace SourceMod
dvander@2726
    89
{
dvander@2726
    90
	class ISourceMod;
dvander@2726
    91
	class ILibrarySys;
dvander@2726
    92
	class ITextParsers;
dvander@2726
    93
	class IThreader;
dvander@2728
    94
	class IRootConsole;
dvander@2728
    95
	class IPluginManager;
dvander@2730
    96
	class IForwardManager;
dvander@2989
    97
	class ITimerSystem;
dvander@2996
    98
	class IPlayerManager;
dvander@3000
    99
	class IAdminSystem;
dvander@3001
   100
	class IGameHelpers;
dvander@3004
   101
	class IPhraseCollection;
dvander@3004
   102
	class ITranslator;
dvander@3010
   103
	class IGameConfig;
dvander@2726
   104
}
dvander@2726
   105
dvander@2726
   106
class IVEngineServer;
voidedweasel@3929
   107
class IFileSystem;
dvander@2726
   108
class ConVar;
skamonkey@4138
   109
class KeyValues;
dvander@3872
   110
class SMGlobalClass;
dvander@3872
   111
dvander@3872
   112
namespace SourceMod
dvander@3872
   113
{
dvander@3872
   114
	class IChangeableForward;
dvander@3872
   115
}
dvander@2726
   116
dvander@2989
   117
struct ServerGlobals
dvander@2989
   118
{
dvander@2989
   119
	const double *universalTime;
dvander@2989
   120
	float *interval_per_tick;
dvander@2989
   121
	float *frametime;
dvander@2989
   122
};
dvander@2989
   123
dvander@3872
   124
struct AutoConfig
dvander@3872
   125
{
dvander@3872
   126
	SourceHook::String autocfg;
dvander@3872
   127
	SourceHook::String folder;
dvander@3872
   128
	bool create;
dvander@3872
   129
};
dvander@3872
   130
dvander@3872
   131
enum LibraryAction
dvander@3872
   132
{
dvander@3872
   133
	LibraryAction_Removed,
dvander@3872
   134
	LibraryAction_Added
dvander@3872
   135
};
dvander@3872
   136
dvander@3872
   137
class CNativeOwner;
dvander@3872
   138
dvander@3872
   139
class SMPlugin : public IPlugin
dvander@3872
   140
{
dvander@3872
   141
public:
dvander@3872
   142
	virtual size_t GetConfigCount() = 0;
dvander@3872
   143
	virtual AutoConfig *GetConfig(size_t i) = 0;
dvander@3872
   144
	virtual void AddLibrary(const char *name) = 0;
dvander@3872
   145
	virtual void AddConfig(bool create, const char *cfg, const char *folder) = 0;
dvander@3872
   146
	virtual void SetErrorState(PluginStatus status, const char *fmt, ...) = 0;
dvander@3872
   147
};
dvander@3872
   148
dvander@3872
   149
class IScriptManager
dvander@3872
   150
{
dvander@3872
   151
public:
dvander@3872
   152
	virtual void LoadAll(const char *config_path, const char *plugins_path) = 0;
dvander@3872
   153
	virtual void RefreshAll() = 0;
dvander@3872
   154
	virtual void Shutdown() = 0;
dvander@3872
   155
	virtual IdentityToken_t *GetIdentity() = 0;
dvander@3872
   156
	virtual void SyncMaxClients(int maxClients) = 0;
dvander@3872
   157
	virtual void AddPluginsListener(IPluginsListener *listener) = 0;
dvander@3872
   158
	virtual void RemovePluginsListener(IPluginsListener *listener) = 0;
dvander@3872
   159
	virtual IPluginIterator *GetPluginIterator() = 0;
dvander@3872
   160
	virtual void OnLibraryAction(const char *name, LibraryAction action) = 0;
dvander@3872
   161
	virtual bool LibraryExists(const char *name) = 0;
dvander@3872
   162
	virtual SMPlugin *FindPluginByOrder(unsigned num) = 0;
dvander@3872
   163
	virtual SMPlugin *FindPluginByIdentity(IdentityToken_t *ident) = 0;
dvander@3872
   164
	virtual SMPlugin *FindPluginByContext(IPluginContext *ctx) = 0;
dvander@3872
   165
	virtual SMPlugin *FindPluginByContext(sp_context_t *ctx) = 0;
dvander@3872
   166
	virtual SMPlugin *FindPluginByConsoleArg(const char *text) = 0;
dvander@3872
   167
	virtual SMPlugin *FindPluginByHandle(Handle_t hndl, HandleError *errp) = 0;
dvander@3872
   168
	virtual bool UnloadPlugin(IPlugin *plugin) = 0;
dvander@3881
   169
	virtual const CVector<SMPlugin *> *ListPlugins() = 0;
dvander@3881
   170
	virtual void FreePluginList(const CVector<SMPlugin *> *list) = 0;
dvander@3872
   171
	virtual void AddFunctionsToForward(const char *name, IChangeableForward *fwd) = 0;
dvander@3872
   172
};
dvander@3872
   173
dvander@3872
   174
class IExtensionSys : public IExtensionManager
dvander@3872
   175
{
dvander@3872
   176
public:
systematicmania@4045
   177
	virtual IExtension *LoadAutoExtension(const char *name, bool bErrorOnMissing=true) = 0;
dvander@3872
   178
	virtual void TryAutoload() = 0;
dvander@3872
   179
	virtual void Shutdown() = 0;
dvander@3872
   180
	virtual IExtension *FindExtensionByFile(const char *name) = 0;
dvander@3872
   181
	virtual bool LibraryExists(const char *name) = 0;
dvander@3872
   182
	virtual void CallOnCoreMapStart(edict_t *edictList, int edictCount, int maxClients) = 0;
dvander@3872
   183
	virtual IExtension *GetExtensionFromIdent(IdentityToken_t *token) = 0;
dvander@3872
   184
	virtual void BindChildPlugin(IExtension *ext, SMPlugin *plugin) = 0;
dvander@3872
   185
	virtual void AddRawDependency(IExtension *myself, IdentityToken_t *token, void *iface) = 0;
dvander@3881
   186
	virtual const CVector<IExtension *> *ListExtensions() = 0;
dvander@3881
   187
	virtual void FreeExtensionList(const CVector<IExtension *> *list) = 0;
dvander@3881
   188
};
dvander@3881
   189
dvander@3881
   190
class AutoPluginList
dvander@3881
   191
{
dvander@3881
   192
public:
dvander@3881
   193
	AutoPluginList(IScriptManager *scripts)
dvander@3881
   194
		: scripts_(scripts), list_(scripts->ListPlugins())
dvander@3881
   195
	{
dvander@3881
   196
	}
dvander@3881
   197
	~AutoPluginList()
dvander@3881
   198
	{
dvander@3881
   199
		scripts_->FreePluginList(list_);
dvander@3881
   200
	}
dvander@3881
   201
	const CVector<SMPlugin *> *operator ->()
dvander@3881
   202
	{
dvander@3881
   203
		return list_;
dvander@3881
   204
	}
dvander@3881
   205
private:
dvander@3881
   206
	IScriptManager *scripts_;
dvander@3881
   207
	const CVector<SMPlugin *> *list_;
dvander@3881
   208
};
dvander@3881
   209
dvander@3881
   210
class AutoExtensionList
dvander@3881
   211
{
dvander@3881
   212
public:
dvander@3881
   213
	AutoExtensionList(IExtensionSys *extensions)
dvander@3881
   214
		: extensions_(extensions), list_(extensions_->ListExtensions())
dvander@3881
   215
	{
dvander@3881
   216
	}
dvander@3881
   217
	~AutoExtensionList()
dvander@3881
   218
	{
dvander@3881
   219
		extensions_->FreeExtensionList(list_);
dvander@3881
   220
	}
dvander@3881
   221
	const CVector<IExtension *> *operator ->()
dvander@3881
   222
	{
dvander@3881
   223
		return list_;
dvander@3881
   224
	}
dvander@3881
   225
private:
dvander@3881
   226
	IExtensionSys *extensions_;
dvander@3881
   227
	const CVector<IExtension *> *list_;
dvander@3872
   228
};
dvander@3872
   229
dvander@3872
   230
class CCommand;
dvander@3872
   231
dvander@2726
   232
struct sm_core_t
dvander@2726
   233
{
dvander@2726
   234
	/* Objects */
dvander@2726
   235
	ISourceMod		*sm;
dvander@2726
   236
	ILibrarySys		*libsys;
dvander@2726
   237
	IVEngineServer	*engine;
voidedweasel@3929
   238
	IFileSystem		*filesystem;
dvander@2728
   239
	IRootConsole	*rootmenu;
dvander@2989
   240
	ITimerSystem    *timersys;
dvander@2996
   241
	IPlayerManager  *playerhelpers;
dvander@3000
   242
	IAdminSystem	*adminsys;
dvander@3010
   243
	IGameHelpers    *gamehelpers;
skamonkey@3800
   244
	ISourcePawnEngine **spe1;
skamonkey@3800
   245
	ISourcePawnEngine2 **spe2;
dvander@2726
   246
	/* Functions */
dvander@2726
   247
	ConVar *		(*FindConVar)(const char*);
dvander@2726
   248
	unsigned int	(*strncopy)(char*, const char*, size_t);
dvander@2726
   249
	char *			(*TrimWhitespace)(char *, size_t &);
dvander@2726
   250
	void			(*LogError)(const char*, ...);
dvander@3872
   251
	void			(*LogFatal)(const char*, ...);
dvander@3791
   252
	void			(*Log)(const char*, ...);
dvander@3791
   253
	void			(*LogToFile)(FILE *fp, const char*, ...);
dvander@3791
   254
	void			(*LogToGame)(const char *message);
dvander@2726
   255
	const char *	(*GetCvarString)(ConVar*);
dvander@2726
   256
	size_t			(*Format)(char*, size_t, const char*, ...);
dvander@3792
   257
	size_t			(*FormatArgs)(char*, size_t, const char*,va_list ap);
dvander@3004
   258
	bool			(*gnprintf)(char *, size_t, const char *, IPhraseCollection *, void **,
dvander@3004
   259
	                            unsigned int, unsigned int &, size_t *, const char **);
dvander@3006
   260
	size_t			(*atcprintf)(char *, size_t, const char *, IPluginContext *, const cell_t *, int *);
dvander@3010
   261
	bool            (*GetGameName)(char *buffer, size_t maxlength);
dvander@3010
   262
	const char *    (*GetGameDescription)();
dvander@3010
   263
	const char *    (*GetSourceEngineName)();
dvander@3010
   264
	bool            (*SymbolsAreHidden)();
fyrenmoo@3366
   265
	const char *	(*GetCoreConfigValue)(const char*);
dvander@3872
   266
	bool			(*IsMapLoading)();
dvander@3872
   267
	bool			(*IsMapRunning)();
dvander@3872
   268
	int				(*Argc)(const CCommand &args);
dvander@3872
   269
	const char *	(*Arg)(const CCommand &args, int arg);
dvander@3872
   270
	int				(*LoadMMSPlugin)(const char *file, bool *ok, char *error, size_t maxlength);
dvander@3872
   271
	void			(*UnloadMMSPlugin)(int id);
dvander@3872
   272
	void			(*DoGlobalPluginLoads)();
dvander@3872
   273
	bool			(*AreConfigsExecuted)();
dvander@3872
   274
	void			(*ExecuteConfigs)(IPluginContext *ctx);
skamonkey@4138
   275
	DatabaseInfo	(*GetDBInfoFromKeyValues)(KeyValues *);
dvander@3882
   276
	const char		*gamesuffix;
dvander@2989
   277
	/* Data */
dvander@2989
   278
	ServerGlobals   *serverGlobals;
dvander@3010
   279
	void *          serverFactory;
dvander@3010
   280
	void *          engineFactory;
skamonkey@3320
   281
	void *          matchmakingDSFactory;
dvander@4029
   282
	SMGlobalClass *	listeners;
dvander@2726
   283
};
dvander@2726
   284
dvander@2726
   285
struct sm_logic_t
dvander@2726
   286
{
dvander@2726
   287
	SMGlobalClass	*head;
dvander@2726
   288
	IThreader		*threader;
dvander@2728
   289
	IProfiler		*profiler;
dvander@3004
   290
	ITranslator		*translator;
dvander@3002
   291
	const char      *(*stristr)(const char *, const char *);
dvander@3004
   292
	bool			(*CoreTranslate)(char *,  size_t, const char *, unsigned int, size_t *, ...);
dvander@3004
   293
	void            (*AddCorePhraseFile)(const char *filename);
dvander@3005
   294
	unsigned int	(*ReplaceAll)(char*, size_t, const char *, const char *, bool);
dvander@3005
   295
	char            *(*ReplaceEx)(char *, size_t, const char *, size_t, const char *, size_t, bool);
dvander@3010
   296
	size_t          (*DecodeHexString)(unsigned char *, size_t, const char *);
dvander@3010
   297
	IGameConfig *   (*GetCoreGameConfig)();
dvander@3791
   298
	bool			(*OnLogPrint)(const char *msg);	// true to supercede
dvander@3792
   299
	IDebugListener   *debugger;
dvander@3792
   300
	void			(*GenerateError)(IPluginContext *, cell_t, int, const char *, ...);
dvander@3872
   301
	void			(*AddNatives)(sp_nativeinfo_t *natives);
dvander@3872
   302
	void			(*DumpHandles)(void (*dumpfn)(const char *fmt, ...));
dvander@3872
   303
	IScriptManager	*scripts;
dvander@3872
   304
	IShareSys		*sharesys;
dvander@3872
   305
	IExtensionSys	*extsys;
dvander@3872
   306
	IHandleSys		*handlesys;
skamonkey@4139
   307
	IForwardManager	*forwardsys;
dvander@3872
   308
	IdentityToken_t *core_ident;
dvander@3872
   309
	float			sentinel;
dvander@2726
   310
};
dvander@2726
   311
dvander@2726
   312
typedef void (*LogicInitFunction)(const sm_core_t *core, sm_logic_t *logic);
dvander@2726
   313
typedef LogicInitFunction (*LogicLoadFunction)(uint32_t magic);
dvander@2726
   314
typedef ITextParsers *(*GetITextParsers)();
dvander@2726
   315
dvander@2726
   316
#endif /* _INCLUDE_SOURCEMOD_INTERCOM_H_ */