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_ */