core/logic/intercom.h
author Nicholas Hastings <skamonkey@gmail.com>
Wed Aug 14 14:20:57 2013 -0400 (2013-08-14)
changeset 4008 490b01aa0683
parent 3929 0bc0ffdb2eba
child 4029 cf8bdfcf6503
permissions -rw-r--r--
Updated some 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>
dvander@3872
    39
#include <sh_string.h>
dvander@3872
    40
#include <sp_vm_api.h>
dvander@3872
    41
#include <sh_vector.h>
dvander@3872
    42
#include <IExtensionSys.h>
dvander@2726
    43
dvander@2726
    44
using namespace SourceMod;
dvander@3872
    45
using namespace SourcePawn;
dvander@3872
    46
using namespace SourceHook;
dvander@2726
    47
dvander@2726
    48
/**
dvander@2726
    49
 * Add 1 to the RHS of this expression to bump the intercom file
dvander@2726
    50
 * This is to prevent mismatching core/logic binaries
dvander@2726
    51
 */
voidedweasel@3929
    52
#define SM_LOGIC_MAGIC		(0x0F47C0DE - 22)
dvander@2726
    53
dvander@2726
    54
#if defined SM_LOGIC
dvander@2726
    55
class IVEngineServer
dvander@2726
    56
#else
dvander@2726
    57
class IVEngineServer_Logic
dvander@2726
    58
#endif
dvander@2726
    59
{
dvander@2726
    60
public:
dvander@2726
    61
	virtual bool IsMapValid(const char *map) = 0;
dvander@3001
    62
	virtual void ServerCommand(const char *cmd) = 0;
dvander@2726
    63
};
dvander@2726
    64
voidedweasel@3929
    65
typedef int FileFindHandle_t; 
voidedweasel@3929
    66
voidedweasel@3929
    67
#if defined SM_LOGIC
voidedweasel@3929
    68
class IFileSystem
voidedweasel@3929
    69
#else
voidedweasel@3929
    70
class IFileSystem_Logic
voidedweasel@3929
    71
#endif
voidedweasel@3929
    72
{
voidedweasel@3929
    73
public:
voidedweasel@3929
    74
	virtual const char *FindFirstEx(const char *pWildCard, const char *pPathID, FileFindHandle_t *pHandle) = 0;
voidedweasel@3929
    75
	virtual const char *FindNext(FileFindHandle_t handle) = 0;
voidedweasel@3929
    76
	virtual void FindClose(FileFindHandle_t handle) = 0;
voidedweasel@3929
    77
};
voidedweasel@3929
    78
dvander@2726
    79
namespace SourceMod
dvander@2726
    80
{
dvander@2726
    81
	class ISourceMod;
dvander@2726
    82
	class ILibrarySys;
dvander@2726
    83
	class ITextParsers;
dvander@2726
    84
	class IThreader;
dvander@2728
    85
	class IRootConsole;
dvander@2728
    86
	class IPluginManager;
dvander@2730
    87
	class IForwardManager;
dvander@2989
    88
	class ITimerSystem;
dvander@2996
    89
	class IPlayerManager;
dvander@3000
    90
	class IAdminSystem;
dvander@3001
    91
	class IGameHelpers;
dvander@3004
    92
	class IPhraseCollection;
dvander@3004
    93
	class ITranslator;
dvander@3010
    94
	class IGameConfig;
dvander@2726
    95
}
dvander@2726
    96
dvander@2726
    97
class IVEngineServer;
voidedweasel@3929
    98
class IFileSystem;
dvander@2726
    99
class ConVar;
dvander@3872
   100
class SMGlobalClass;
dvander@3872
   101
dvander@3872
   102
namespace SourceMod
dvander@3872
   103
{
dvander@3872
   104
	class IChangeableForward;
dvander@3872
   105
}
dvander@2726
   106
dvander@2989
   107
struct ServerGlobals
dvander@2989
   108
{
dvander@2989
   109
	const double *universalTime;
dvander@2989
   110
	float *interval_per_tick;
dvander@2989
   111
	float *frametime;
dvander@2989
   112
};
dvander@2989
   113
dvander@3872
   114
struct AutoConfig
dvander@3872
   115
{
dvander@3872
   116
	SourceHook::String autocfg;
dvander@3872
   117
	SourceHook::String folder;
dvander@3872
   118
	bool create;
dvander@3872
   119
};
dvander@3872
   120
dvander@3872
   121
enum LibraryAction
dvander@3872
   122
{
dvander@3872
   123
	LibraryAction_Removed,
dvander@3872
   124
	LibraryAction_Added
dvander@3872
   125
};
dvander@3872
   126
dvander@3872
   127
class CNativeOwner;
dvander@3872
   128
dvander@3872
   129
class SMPlugin : public IPlugin
dvander@3872
   130
{
dvander@3872
   131
public:
dvander@3872
   132
	virtual size_t GetConfigCount() = 0;
dvander@3872
   133
	virtual AutoConfig *GetConfig(size_t i) = 0;
dvander@3872
   134
	virtual void AddLibrary(const char *name) = 0;
dvander@3872
   135
	virtual void AddConfig(bool create, const char *cfg, const char *folder) = 0;
dvander@3872
   136
	virtual void SetErrorState(PluginStatus status, const char *fmt, ...) = 0;
dvander@3872
   137
};
dvander@3872
   138
dvander@3872
   139
class IScriptManager
dvander@3872
   140
{
dvander@3872
   141
public:
dvander@3872
   142
	virtual void LoadAll(const char *config_path, const char *plugins_path) = 0;
dvander@3872
   143
	virtual void RefreshAll() = 0;
dvander@3872
   144
	virtual void Shutdown() = 0;
dvander@3872
   145
	virtual IdentityToken_t *GetIdentity() = 0;
dvander@3872
   146
	virtual void SyncMaxClients(int maxClients) = 0;
dvander@3872
   147
	virtual void AddPluginsListener(IPluginsListener *listener) = 0;
dvander@3872
   148
	virtual void RemovePluginsListener(IPluginsListener *listener) = 0;
dvander@3872
   149
	virtual IPluginIterator *GetPluginIterator() = 0;
dvander@3872
   150
	virtual void OnLibraryAction(const char *name, LibraryAction action) = 0;
dvander@3872
   151
	virtual bool LibraryExists(const char *name) = 0;
dvander@3872
   152
	virtual SMPlugin *FindPluginByOrder(unsigned num) = 0;
dvander@3872
   153
	virtual SMPlugin *FindPluginByIdentity(IdentityToken_t *ident) = 0;
dvander@3872
   154
	virtual SMPlugin *FindPluginByContext(IPluginContext *ctx) = 0;
dvander@3872
   155
	virtual SMPlugin *FindPluginByContext(sp_context_t *ctx) = 0;
dvander@3872
   156
	virtual SMPlugin *FindPluginByConsoleArg(const char *text) = 0;
dvander@3872
   157
	virtual SMPlugin *FindPluginByHandle(Handle_t hndl, HandleError *errp) = 0;
dvander@3872
   158
	virtual bool UnloadPlugin(IPlugin *plugin) = 0;
dvander@3881
   159
	virtual const CVector<SMPlugin *> *ListPlugins() = 0;
dvander@3881
   160
	virtual void FreePluginList(const CVector<SMPlugin *> *list) = 0;
dvander@3872
   161
	virtual void AddFunctionsToForward(const char *name, IChangeableForward *fwd) = 0;
dvander@3872
   162
};
dvander@3872
   163
dvander@3872
   164
class IExtensionSys : public IExtensionManager
dvander@3872
   165
{
dvander@3872
   166
public:
dvander@3872
   167
	virtual IExtension *LoadAutoExtension(const char *name) = 0;
dvander@3872
   168
	virtual void TryAutoload() = 0;
dvander@3872
   169
	virtual void Shutdown() = 0;
dvander@3872
   170
	virtual IExtension *FindExtensionByFile(const char *name) = 0;
dvander@3872
   171
	virtual bool LibraryExists(const char *name) = 0;
dvander@3872
   172
	virtual void CallOnCoreMapStart(edict_t *edictList, int edictCount, int maxClients) = 0;
dvander@3872
   173
	virtual IExtension *GetExtensionFromIdent(IdentityToken_t *token) = 0;
dvander@3872
   174
	virtual void BindChildPlugin(IExtension *ext, SMPlugin *plugin) = 0;
dvander@3872
   175
	virtual void AddRawDependency(IExtension *myself, IdentityToken_t *token, void *iface) = 0;
dvander@3881
   176
	virtual const CVector<IExtension *> *ListExtensions() = 0;
dvander@3881
   177
	virtual void FreeExtensionList(const CVector<IExtension *> *list) = 0;
dvander@3881
   178
};
dvander@3881
   179
dvander@3881
   180
class AutoPluginList
dvander@3881
   181
{
dvander@3881
   182
public:
dvander@3881
   183
	AutoPluginList(IScriptManager *scripts)
dvander@3881
   184
		: scripts_(scripts), list_(scripts->ListPlugins())
dvander@3881
   185
	{
dvander@3881
   186
	}
dvander@3881
   187
	~AutoPluginList()
dvander@3881
   188
	{
dvander@3881
   189
		scripts_->FreePluginList(list_);
dvander@3881
   190
	}
dvander@3881
   191
	const CVector<SMPlugin *> *operator ->()
dvander@3881
   192
	{
dvander@3881
   193
		return list_;
dvander@3881
   194
	}
dvander@3881
   195
private:
dvander@3881
   196
	IScriptManager *scripts_;
dvander@3881
   197
	const CVector<SMPlugin *> *list_;
dvander@3881
   198
};
dvander@3881
   199
dvander@3881
   200
class AutoExtensionList
dvander@3881
   201
{
dvander@3881
   202
public:
dvander@3881
   203
	AutoExtensionList(IExtensionSys *extensions)
dvander@3881
   204
		: extensions_(extensions), list_(extensions_->ListExtensions())
dvander@3881
   205
	{
dvander@3881
   206
	}
dvander@3881
   207
	~AutoExtensionList()
dvander@3881
   208
	{
dvander@3881
   209
		extensions_->FreeExtensionList(list_);
dvander@3881
   210
	}
dvander@3881
   211
	const CVector<IExtension *> *operator ->()
dvander@3881
   212
	{
dvander@3881
   213
		return list_;
dvander@3881
   214
	}
dvander@3881
   215
private:
dvander@3881
   216
	IExtensionSys *extensions_;
dvander@3881
   217
	const CVector<IExtension *> *list_;
dvander@3872
   218
};
dvander@3872
   219
dvander@3872
   220
class CCommand;
dvander@3872
   221
dvander@2726
   222
struct sm_core_t
dvander@2726
   223
{
dvander@2726
   224
	/* Objects */
dvander@2726
   225
	ISourceMod		*sm;
dvander@2726
   226
	ILibrarySys		*libsys;
dvander@2726
   227
	IVEngineServer	*engine;
voidedweasel@3929
   228
	IFileSystem		*filesystem;
dvander@2728
   229
	IRootConsole	*rootmenu;
dvander@2730
   230
	IForwardManager	*forwardsys;
dvander@2989
   231
	ITimerSystem    *timersys;
dvander@2996
   232
	IPlayerManager  *playerhelpers;
dvander@3000
   233
	IAdminSystem	*adminsys;
dvander@3010
   234
	IGameHelpers    *gamehelpers;
skamonkey@3800
   235
	ISourcePawnEngine **spe1;
skamonkey@3800
   236
	ISourcePawnEngine2 **spe2;
dvander@2726
   237
	/* Functions */
dvander@2726
   238
	ConVar *		(*FindConVar)(const char*);
dvander@2726
   239
	unsigned int	(*strncopy)(char*, const char*, size_t);
dvander@2726
   240
	char *			(*TrimWhitespace)(char *, size_t &);
dvander@2726
   241
	void			(*LogError)(const char*, ...);
dvander@3872
   242
	void			(*LogFatal)(const char*, ...);
dvander@3791
   243
	void			(*Log)(const char*, ...);
dvander@3791
   244
	void			(*LogToFile)(FILE *fp, const char*, ...);
dvander@3791
   245
	void			(*LogToGame)(const char *message);
dvander@3791
   246
	bool			(*FileExists)(const char *path);
dvander@2726
   247
	const char *	(*GetCvarString)(ConVar*);
dvander@2726
   248
	size_t			(*Format)(char*, size_t, const char*, ...);
dvander@3792
   249
	size_t			(*FormatArgs)(char*, size_t, const char*,va_list ap);
dvander@3004
   250
	bool			(*gnprintf)(char *, size_t, const char *, IPhraseCollection *, void **,
dvander@3004
   251
	                            unsigned int, unsigned int &, size_t *, const char **);
dvander@3006
   252
	size_t			(*atcprintf)(char *, size_t, const char *, IPluginContext *, const cell_t *, int *);
dvander@3010
   253
	bool            (*GetGameName)(char *buffer, size_t maxlength);
dvander@3010
   254
	const char *    (*GetGameDescription)();
dvander@3010
   255
	const char *    (*GetSourceEngineName)();
dvander@3010
   256
	bool            (*SymbolsAreHidden)();
fyrenmoo@3366
   257
	const char *	(*GetCoreConfigValue)(const char*);
dvander@3872
   258
	bool			(*IsMapLoading)();
dvander@3872
   259
	bool			(*IsMapRunning)();
dvander@3872
   260
	int				(*Argc)(const CCommand &args);
dvander@3872
   261
	const char *	(*Arg)(const CCommand &args, int arg);
dvander@3872
   262
	int				(*LoadMMSPlugin)(const char *file, bool *ok, char *error, size_t maxlength);
dvander@3872
   263
	void			(*UnloadMMSPlugin)(int id);
dvander@3872
   264
	void			(*DoGlobalPluginLoads)();
dvander@3872
   265
	bool			(*AreConfigsExecuted)();
dvander@3872
   266
	void			(*ExecuteConfigs)(IPluginContext *ctx);
dvander@3882
   267
	const char		*gamesuffix;
dvander@2989
   268
	/* Data */
dvander@2989
   269
	ServerGlobals   *serverGlobals;
dvander@3010
   270
	void *          serverFactory;
dvander@3010
   271
	void *          engineFactory;
skamonkey@3320
   272
	void *          matchmakingDSFactory;
dvander@2726
   273
};
dvander@2726
   274
dvander@2726
   275
struct sm_logic_t
dvander@2726
   276
{
dvander@2726
   277
	SMGlobalClass	*head;
dvander@2726
   278
	IThreader		*threader;
dvander@2728
   279
	IProfiler		*profiler;
dvander@3004
   280
	ITranslator		*translator;
dvander@3002
   281
	const char      *(*stristr)(const char *, const char *);
dvander@3004
   282
	bool			(*CoreTranslate)(char *,  size_t, const char *, unsigned int, size_t *, ...);
dvander@3004
   283
	void            (*AddCorePhraseFile)(const char *filename);
dvander@3005
   284
	unsigned int	(*ReplaceAll)(char*, size_t, const char *, const char *, bool);
dvander@3005
   285
	char            *(*ReplaceEx)(char *, size_t, const char *, size_t, const char *, size_t, bool);
dvander@3010
   286
	size_t          (*DecodeHexString)(unsigned char *, size_t, const char *);
dvander@3010
   287
	IGameConfig *   (*GetCoreGameConfig)();
dvander@3791
   288
	bool			(*OnLogPrint)(const char *msg);	// true to supercede
dvander@3792
   289
	IDebugListener   *debugger;
dvander@3792
   290
	void			(*GenerateError)(IPluginContext *, cell_t, int, const char *, ...);
dvander@3872
   291
	void			(*AddNatives)(sp_nativeinfo_t *natives);
dvander@3872
   292
	void			(*DumpHandles)(void (*dumpfn)(const char *fmt, ...));
dvander@3872
   293
	IScriptManager	*scripts;
dvander@3872
   294
	IShareSys		*sharesys;
dvander@3872
   295
	IExtensionSys	*extsys;
dvander@3872
   296
	IHandleSys		*handlesys;
dvander@3872
   297
	IdentityToken_t *core_ident;
dvander@3872
   298
	float			sentinel;
dvander@2726
   299
};
dvander@2726
   300
dvander@2726
   301
typedef void (*LogicInitFunction)(const sm_core_t *core, sm_logic_t *logic);
dvander@2726
   302
typedef LogicInitFunction (*LogicLoadFunction)(uint32_t magic);
dvander@2726
   303
typedef ITextParsers *(*GetITextParsers)();
dvander@2726
   304
dvander@2726
   305
#endif /* _INCLUDE_SOURCEMOD_INTERCOM_H_ */