diff --git a/public/IExtensionSys.h b/public/IExtensionSys.h index 9667095d..31b8d647 100644 --- a/public/IExtensionSys.h +++ b/public/IExtensionSys.h @@ -368,6 +368,28 @@ namespace SourceMod */ virtual bool UnloadExtension(IExtension *pExt) =0; }; + + #define SM_IFACEPAIR(name) SMINTERFACE_##name##_NAME, SMINTERFACE_##name##_VERSION + + #define SM_FIND_IFACE_OR_FAIL(prefix, variable, errbuf, errsize) \ + if (!sharesys->RequestInterface(SM_IFACEPAIR(prefix), myself, (SMInterface **)&variable)) \ + { \ + if (errbuf) \ + { \ + size_t len = snprintf(errbuf, \ + errsize, \ + "Could not find interface: %s (version: %d)", \ + SM_IFACEPAIR(prefix)); \ + if (len >= errsize) \ + { \ + buffer[errsize - 1] = '\0'; \ + } \ + } \ + return false; \ + } + + #define SM_FIND_IFACE(prefix, variable) \ + sharesys->RequestInterface(SM_IFACEPAIR(prefix), myself, (SMInterface **)&variable)); } #endif //_INCLUDE_SOURCEMOD_MODULE_INTERFACE_H_ diff --git a/public/sample_ext/sdk/smsdk_ext.cpp b/public/sample_ext/sdk/smsdk_ext.cpp index 618ce3b8..9934974f 100644 --- a/public/sample_ext/sdk/smsdk_ext.cpp +++ b/public/sample_ext/sdk/smsdk_ext.cpp @@ -280,7 +280,11 @@ IServerGameDLL *gamedll = NULL; /**< IServerGameDLL pointer */ /** Exposes the extension to Metamod */ SMM_API void *PL_EXPOSURE(const char *name, int *code) { +#if defined METAMOD_PLAPI_VERSION + if (name && !strcmp(name, METAMOD_PLAPI_NAME)) +#else if (name && !strcmp(name, PLAPI_NAME)) +#endif { if (code) { @@ -301,8 +305,13 @@ bool SDKExtension::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, { PLUGIN_SAVEVARS(); +#if defined METAMOD_PLAPI_VERSION GET_V_IFACE_ANY(serverFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL); GET_V_IFACE_CURRENT(engineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER); +#else + GET_V_IFACE_ANY(GetServerFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL); + GET_V_IFACE_CURRENT(GetEngineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER); +#endif m_SourceMMLoaded = true; diff --git a/public/sample_ext/sdk/smsdk_ext.h b/public/sample_ext/sdk/smsdk_ext.h index 83038a72..b37ce03f 100644 --- a/public/sample_ext/sdk/smsdk_ext.h +++ b/public/sample_ext/sdk/smsdk_ext.h @@ -290,11 +290,15 @@ extern IServerGameDLL *gamedll; #define SM_GET_IFACE(prefix, addr) \ if (!g_pShareSys->RequestInterface(SM_MKIFACE(prefix), myself, (SMInterface **)&addr)) \ { \ - if (error) \ + if (error != NULL && maxlength) \ { \ - snprintf(error, maxlength, "Could not find interface: %s (version: %d)", SMINTERFACE_##prefix##_NAME, SMINTERFACE_##prefix##_VERSION); \ - return false; \ + size_t len = snprintf(error, maxlength, "Could not find interface: %s", SMINTERFACE_##prefix##_NAME); \ + if (len >= maxlength) \ + { \ + error[maxlength - 1] = '\0'; \ + } \ } \ + return false; \ } /** Automates retrieving SourceMod interfaces when needed outside of SDK_OnLoad() */ #define SM_GET_LATE_IFACE(prefix, addr) \ @@ -303,11 +307,15 @@ extern IServerGameDLL *gamedll; #define SM_CHECK_IFACE(prefix, addr) \ if (!addr) \ { \ - if (error) \ + if (error != NULL && maxlength) \ { \ - snprintf(error, maxlength, "Could not find interface: %s", SMINTERFACE_##prefix##_NAME); \ - return false; \ + size_t len = snprintf(error, maxlength, "Could not find interface: %s", SMINTERFACE_##prefix##_NAME); \ + if (len >= maxlength) \ + { \ + error[maxlength - 1] = '\0'; \ + } \ } \ + return false; \ } #endif // _INCLUDE_SOURCEMOD_EXTENSION_BASESDK_H_