dvander@2726: /**
dvander@3881: * vim: set ts=4 sw=4 tw=99 noet:
dvander@2726: * =============================================================================
dvander@2726: * SourceMod
dvander@2726: * Copyright (C) 2004-2009 AlliedModders LLC. All rights reserved.
dvander@2726: * =============================================================================
dvander@2726: *
dvander@2726: * This program is free software; you can redistribute it and/or modify it under
dvander@2726: * the terms of the GNU General Public License, version 3.0, as published by the
dvander@2726: * Free Software Foundation.
dvander@2726: *
dvander@2726: * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@2726: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@2726: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
dvander@2726: * details.
dvander@2726: *
dvander@2726: * You should have received a copy of the GNU General Public License along with
dvander@2726: * this program. If not, see .
dvander@2726: *
dvander@2726: * As a special exception, AlliedModders LLC gives you permission to link the
dvander@2726: * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@2726: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@2726: * by the Valve Corporation. You must obey the GNU General Public License in
dvander@2726: * all respects for all other code used. Additionally, AlliedModders LLC grants
dvander@2726: * this exception to all derivative works. AlliedModders LLC defines further
dvander@2726: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@2726: * or .
dvander@2726: *
dvander@2726: * Version: $Id$
dvander@2726: */
dvander@2726:
dvander@3872: #ifndef _INCLUDE_SOURCEMOD_INTERCOM_H_
dvander@3872: #define _INCLUDE_SOURCEMOD_INTERCOM_H_
dvander@3872:
dvander@2726: #include
dvander@2726: #include
dvander@2726: #include
dvander@3872: #include
dvander@3872: #include
dvander@3872: #include
dvander@3872: #include
dvander@3872: #include
dvander@2726:
dvander@2726: using namespace SourceMod;
dvander@3872: using namespace SourcePawn;
dvander@3872: using namespace SourceHook;
dvander@2726:
dvander@2726: /**
dvander@2726: * Add 1 to the RHS of this expression to bump the intercom file
dvander@2726: * This is to prevent mismatching core/logic binaries
dvander@2726: */
voidedweasel@3929: #define SM_LOGIC_MAGIC (0x0F47C0DE - 22)
dvander@2726:
dvander@2726: #if defined SM_LOGIC
dvander@2726: class IVEngineServer
dvander@2726: #else
dvander@2726: class IVEngineServer_Logic
dvander@2726: #endif
dvander@2726: {
dvander@2726: public:
dvander@2726: virtual bool IsMapValid(const char *map) = 0;
dvander@3001: virtual void ServerCommand(const char *cmd) = 0;
dvander@2726: };
dvander@2726:
voidedweasel@3929: typedef int FileFindHandle_t;
voidedweasel@3929:
voidedweasel@3929: #if defined SM_LOGIC
voidedweasel@3929: class IFileSystem
voidedweasel@3929: #else
voidedweasel@3929: class IFileSystem_Logic
voidedweasel@3929: #endif
voidedweasel@3929: {
voidedweasel@3929: public:
voidedweasel@3929: virtual const char *FindFirstEx(const char *pWildCard, const char *pPathID, FileFindHandle_t *pHandle) = 0;
voidedweasel@3929: virtual const char *FindNext(FileFindHandle_t handle) = 0;
voidedweasel@3929: virtual void FindClose(FileFindHandle_t handle) = 0;
voidedweasel@3929: };
voidedweasel@3929:
dvander@2726: namespace SourceMod
dvander@2726: {
dvander@2726: class ISourceMod;
dvander@2726: class ILibrarySys;
dvander@2726: class ITextParsers;
dvander@2726: class IThreader;
dvander@2728: class IRootConsole;
dvander@2728: class IPluginManager;
dvander@2730: class IForwardManager;
dvander@2989: class ITimerSystem;
dvander@2996: class IPlayerManager;
dvander@3000: class IAdminSystem;
dvander@3001: class IGameHelpers;
dvander@3004: class IPhraseCollection;
dvander@3004: class ITranslator;
dvander@3010: class IGameConfig;
dvander@2726: }
dvander@2726:
dvander@2726: class IVEngineServer;
voidedweasel@3929: class IFileSystem;
dvander@2726: class ConVar;
dvander@3872: class SMGlobalClass;
dvander@3872:
dvander@3872: namespace SourceMod
dvander@3872: {
dvander@3872: class IChangeableForward;
dvander@3872: }
dvander@2726:
dvander@2989: struct ServerGlobals
dvander@2989: {
dvander@2989: const double *universalTime;
dvander@2989: float *interval_per_tick;
dvander@2989: float *frametime;
dvander@2989: };
dvander@2989:
dvander@3872: struct AutoConfig
dvander@3872: {
dvander@3872: SourceHook::String autocfg;
dvander@3872: SourceHook::String folder;
dvander@3872: bool create;
dvander@3872: };
dvander@3872:
dvander@3872: enum LibraryAction
dvander@3872: {
dvander@3872: LibraryAction_Removed,
dvander@3872: LibraryAction_Added
dvander@3872: };
dvander@3872:
dvander@3872: class CNativeOwner;
dvander@3872:
dvander@3872: class SMPlugin : public IPlugin
dvander@3872: {
dvander@3872: public:
dvander@3872: virtual size_t GetConfigCount() = 0;
dvander@3872: virtual AutoConfig *GetConfig(size_t i) = 0;
dvander@3872: virtual void AddLibrary(const char *name) = 0;
dvander@3872: virtual void AddConfig(bool create, const char *cfg, const char *folder) = 0;
dvander@3872: virtual void SetErrorState(PluginStatus status, const char *fmt, ...) = 0;
dvander@3872: };
dvander@3872:
dvander@3872: class IScriptManager
dvander@3872: {
dvander@3872: public:
dvander@3872: virtual void LoadAll(const char *config_path, const char *plugins_path) = 0;
dvander@3872: virtual void RefreshAll() = 0;
dvander@3872: virtual void Shutdown() = 0;
dvander@3872: virtual IdentityToken_t *GetIdentity() = 0;
dvander@3872: virtual void SyncMaxClients(int maxClients) = 0;
dvander@3872: virtual void AddPluginsListener(IPluginsListener *listener) = 0;
dvander@3872: virtual void RemovePluginsListener(IPluginsListener *listener) = 0;
dvander@3872: virtual IPluginIterator *GetPluginIterator() = 0;
dvander@3872: virtual void OnLibraryAction(const char *name, LibraryAction action) = 0;
dvander@3872: virtual bool LibraryExists(const char *name) = 0;
dvander@3872: virtual SMPlugin *FindPluginByOrder(unsigned num) = 0;
dvander@3872: virtual SMPlugin *FindPluginByIdentity(IdentityToken_t *ident) = 0;
dvander@3872: virtual SMPlugin *FindPluginByContext(IPluginContext *ctx) = 0;
dvander@3872: virtual SMPlugin *FindPluginByContext(sp_context_t *ctx) = 0;
dvander@3872: virtual SMPlugin *FindPluginByConsoleArg(const char *text) = 0;
dvander@3872: virtual SMPlugin *FindPluginByHandle(Handle_t hndl, HandleError *errp) = 0;
dvander@3872: virtual bool UnloadPlugin(IPlugin *plugin) = 0;
dvander@3881: virtual const CVector *ListPlugins() = 0;
dvander@3881: virtual void FreePluginList(const CVector *list) = 0;
dvander@3872: virtual void AddFunctionsToForward(const char *name, IChangeableForward *fwd) = 0;
dvander@3872: };
dvander@3872:
dvander@3872: class IExtensionSys : public IExtensionManager
dvander@3872: {
dvander@3872: public:
dvander@3872: virtual IExtension *LoadAutoExtension(const char *name) = 0;
dvander@3872: virtual void TryAutoload() = 0;
dvander@3872: virtual void Shutdown() = 0;
dvander@3872: virtual IExtension *FindExtensionByFile(const char *name) = 0;
dvander@3872: virtual bool LibraryExists(const char *name) = 0;
dvander@3872: virtual void CallOnCoreMapStart(edict_t *edictList, int edictCount, int maxClients) = 0;
dvander@3872: virtual IExtension *GetExtensionFromIdent(IdentityToken_t *token) = 0;
dvander@3872: virtual void BindChildPlugin(IExtension *ext, SMPlugin *plugin) = 0;
dvander@3872: virtual void AddRawDependency(IExtension *myself, IdentityToken_t *token, void *iface) = 0;
dvander@3881: virtual const CVector *ListExtensions() = 0;
dvander@3881: virtual void FreeExtensionList(const CVector *list) = 0;
dvander@3881: };
dvander@3881:
dvander@3881: class AutoPluginList
dvander@3881: {
dvander@3881: public:
dvander@3881: AutoPluginList(IScriptManager *scripts)
dvander@3881: : scripts_(scripts), list_(scripts->ListPlugins())
dvander@3881: {
dvander@3881: }
dvander@3881: ~AutoPluginList()
dvander@3881: {
dvander@3881: scripts_->FreePluginList(list_);
dvander@3881: }
dvander@3881: const CVector *operator ->()
dvander@3881: {
dvander@3881: return list_;
dvander@3881: }
dvander@3881: private:
dvander@3881: IScriptManager *scripts_;
dvander@3881: const CVector *list_;
dvander@3881: };
dvander@3881:
dvander@3881: class AutoExtensionList
dvander@3881: {
dvander@3881: public:
dvander@3881: AutoExtensionList(IExtensionSys *extensions)
dvander@3881: : extensions_(extensions), list_(extensions_->ListExtensions())
dvander@3881: {
dvander@3881: }
dvander@3881: ~AutoExtensionList()
dvander@3881: {
dvander@3881: extensions_->FreeExtensionList(list_);
dvander@3881: }
dvander@3881: const CVector *operator ->()
dvander@3881: {
dvander@3881: return list_;
dvander@3881: }
dvander@3881: private:
dvander@3881: IExtensionSys *extensions_;
dvander@3881: const CVector *list_;
dvander@3872: };
dvander@3872:
dvander@3872: class CCommand;
dvander@3872:
dvander@2726: struct sm_core_t
dvander@2726: {
dvander@2726: /* Objects */
dvander@2726: ISourceMod *sm;
dvander@2726: ILibrarySys *libsys;
dvander@2726: IVEngineServer *engine;
voidedweasel@3929: IFileSystem *filesystem;
dvander@2728: IRootConsole *rootmenu;
dvander@2730: IForwardManager *forwardsys;
dvander@2989: ITimerSystem *timersys;
dvander@2996: IPlayerManager *playerhelpers;
dvander@3000: IAdminSystem *adminsys;
dvander@3010: IGameHelpers *gamehelpers;
skamonkey@3800: ISourcePawnEngine **spe1;
skamonkey@3800: ISourcePawnEngine2 **spe2;
dvander@2726: /* Functions */
dvander@2726: ConVar * (*FindConVar)(const char*);
dvander@2726: unsigned int (*strncopy)(char*, const char*, size_t);
dvander@2726: char * (*TrimWhitespace)(char *, size_t &);
dvander@2726: void (*LogError)(const char*, ...);
dvander@3872: void (*LogFatal)(const char*, ...);
dvander@3791: void (*Log)(const char*, ...);
dvander@3791: void (*LogToFile)(FILE *fp, const char*, ...);
dvander@3791: void (*LogToGame)(const char *message);
dvander@3791: bool (*FileExists)(const char *path);
dvander@2726: const char * (*GetCvarString)(ConVar*);
dvander@2726: size_t (*Format)(char*, size_t, const char*, ...);
dvander@3792: size_t (*FormatArgs)(char*, size_t, const char*,va_list ap);
dvander@3004: bool (*gnprintf)(char *, size_t, const char *, IPhraseCollection *, void **,
dvander@3004: unsigned int, unsigned int &, size_t *, const char **);
dvander@3006: size_t (*atcprintf)(char *, size_t, const char *, IPluginContext *, const cell_t *, int *);
dvander@3010: bool (*GetGameName)(char *buffer, size_t maxlength);
dvander@3010: const char * (*GetGameDescription)();
dvander@3010: const char * (*GetSourceEngineName)();
dvander@3010: bool (*SymbolsAreHidden)();
fyrenmoo@3366: const char * (*GetCoreConfigValue)(const char*);
dvander@3872: bool (*IsMapLoading)();
dvander@3872: bool (*IsMapRunning)();
dvander@3872: int (*Argc)(const CCommand &args);
dvander@3872: const char * (*Arg)(const CCommand &args, int arg);
dvander@3872: int (*LoadMMSPlugin)(const char *file, bool *ok, char *error, size_t maxlength);
dvander@3872: void (*UnloadMMSPlugin)(int id);
dvander@3872: void (*DoGlobalPluginLoads)();
dvander@3872: bool (*AreConfigsExecuted)();
dvander@3872: void (*ExecuteConfigs)(IPluginContext *ctx);
dvander@3882: const char *gamesuffix;
dvander@2989: /* Data */
dvander@2989: ServerGlobals *serverGlobals;
dvander@3010: void * serverFactory;
dvander@3010: void * engineFactory;
skamonkey@3320: void * matchmakingDSFactory;
dvander@2726: };
dvander@2726:
dvander@2726: struct sm_logic_t
dvander@2726: {
dvander@2726: SMGlobalClass *head;
dvander@2726: IThreader *threader;
dvander@2728: IProfiler *profiler;
dvander@3004: ITranslator *translator;
dvander@3002: const char *(*stristr)(const char *, const char *);
dvander@3004: bool (*CoreTranslate)(char *, size_t, const char *, unsigned int, size_t *, ...);
dvander@3004: void (*AddCorePhraseFile)(const char *filename);
dvander@3005: unsigned int (*ReplaceAll)(char*, size_t, const char *, const char *, bool);
dvander@3005: char *(*ReplaceEx)(char *, size_t, const char *, size_t, const char *, size_t, bool);
dvander@3010: size_t (*DecodeHexString)(unsigned char *, size_t, const char *);
dvander@3010: IGameConfig * (*GetCoreGameConfig)();
dvander@3791: bool (*OnLogPrint)(const char *msg); // true to supercede
dvander@3792: IDebugListener *debugger;
dvander@3792: void (*GenerateError)(IPluginContext *, cell_t, int, const char *, ...);
dvander@3872: void (*AddNatives)(sp_nativeinfo_t *natives);
dvander@3872: void (*DumpHandles)(void (*dumpfn)(const char *fmt, ...));
dvander@3872: IScriptManager *scripts;
dvander@3872: IShareSys *sharesys;
dvander@3872: IExtensionSys *extsys;
dvander@3872: IHandleSys *handlesys;
dvander@3872: IdentityToken_t *core_ident;
dvander@3872: float sentinel;
dvander@2726: };
dvander@2726:
dvander@2726: typedef void (*LogicInitFunction)(const sm_core_t *core, sm_logic_t *logic);
dvander@2726: typedef LogicInitFunction (*LogicLoadFunction)(uint32_t magic);
dvander@2726: typedef ITextParsers *(*GetITextParsers)();
dvander@2726:
dvander@2726: #endif /* _INCLUDE_SOURCEMOD_INTERCOM_H_ */