mirror of
https://github.com/alliedmodders/metamod-source.git
synced 2024-12-01 13:24:25 +01:00
fixed the VInterfaceMatch API
--HG-- extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/trunk%40282
This commit is contained in:
parent
6b30a4f852
commit
3b6dee2782
@ -357,10 +357,11 @@ void *CSmmAPI::InterfaceSearch(CreateInterfaceFn fn, const char *iface, int max,
|
||||
return pf;
|
||||
}
|
||||
|
||||
void *CSmmAPI::VInterfaceMatch(CreateInterfaceFn fn, const char *iface, bool chop)
|
||||
void *CSmmAPI::VInterfaceMatch(CreateInterfaceFn fn, const char *iface, int min)
|
||||
{
|
||||
char buffer[256]; /* assume no interface will go beyond this */
|
||||
int len = static_cast<int>(strlen(iface));
|
||||
int ret; /* just in case something doesn't handle NULL properly */
|
||||
|
||||
if (len > static_cast<int>(sizeof(buffer) - 4))
|
||||
{
|
||||
@ -369,7 +370,7 @@ void *CSmmAPI::VInterfaceMatch(CreateInterfaceFn fn, const char *iface, bool cho
|
||||
|
||||
strcpy(buffer, iface);
|
||||
|
||||
if (chop)
|
||||
if (min != -1)
|
||||
{
|
||||
char *ptr = &buffer[len-1];
|
||||
int digits = 0;
|
||||
@ -383,12 +384,15 @@ void *CSmmAPI::VInterfaceMatch(CreateInterfaceFn fn, const char *iface, bool cho
|
||||
{
|
||||
/* for now, assume this is an error */
|
||||
strcpy(buffer, iface);
|
||||
} else {
|
||||
char num[4];
|
||||
min = (min == 0) ? 1 : min;
|
||||
snprintf(num, sizeof(num), "%03d", min);
|
||||
strcat(buffer, num);
|
||||
}
|
||||
}
|
||||
|
||||
strcat(buffer, "001");
|
||||
|
||||
return InterfaceSearch(fn, buffer, IFACE_MAXNUM, NULL);
|
||||
return InterfaceSearch(fn, buffer, IFACE_MAXNUM, &ret);
|
||||
}
|
||||
|
||||
const char *CSmmAPI::GetBaseDir()
|
||||
|
@ -55,7 +55,7 @@ namespace SourceMM
|
||||
virtual const char *GetBaseDir();
|
||||
virtual void PathFormat(char *buffer, size_t len, const char *fmt, ...);
|
||||
void ClientConPrintf(edict_t *client, const char *fmt, ...);
|
||||
void *VInterfaceMatch(CreateInterfaceFn fn, const char *iface, bool chop=true);
|
||||
void *VInterfaceMatch(CreateInterfaceFn fn, const char *iface, int min=-1);
|
||||
public:
|
||||
bool CacheCmds();
|
||||
private:
|
||||
|
@ -254,11 +254,14 @@ public: // Added in 1.3 (1:4)
|
||||
*
|
||||
* @param fn Interface factory function.
|
||||
* @param iface Interface string.
|
||||
* @param chop If true, chops an interface version number off and searches
|
||||
* from the beginning.
|
||||
* @param min Minimum value to search from. If zero, searching begins from the
|
||||
* first available version regardless of the interface.
|
||||
* Note that this can return interfaces EARLIER than the version specified.
|
||||
* A value of -1 (default) specifies the string version as the minimum.
|
||||
* Any other value specifices the minimum value to search from.
|
||||
* @return Interface pointer, or NULL if not found.
|
||||
*/
|
||||
virtual void *VInterfaceMatch(CreateInterfaceFn fn, const char *iface, bool chop=true) =0;
|
||||
virtual void *VInterfaceMatch(CreateInterfaceFn fn, const char *iface, int min=-1) =0;
|
||||
};
|
||||
|
||||
|
||||
|
@ -248,4 +248,43 @@ public:
|
||||
#endif
|
||||
#endif //!defined SMM_API
|
||||
|
||||
/**
|
||||
* @brief Macro for automatically getting a current or newer Valve interface.
|
||||
*
|
||||
* @param v_factory Factory method to use from ISmmAPI (such as engineFactory).
|
||||
* @param v_var Variable name to store into.
|
||||
* @param v_type Interface type (do not include the pointer/asterisk).
|
||||
* @param v_name Inteface name.
|
||||
*/
|
||||
#define GET_V_IFACE_CURRENT(v_factory, v_var, v_type, v_name) \
|
||||
v_var = (v_type *)ismm->VInterfaceMatch(ismm->v_factory(), v_name); \
|
||||
if (!v_var) \
|
||||
{ \
|
||||
if (error && maxlen) \
|
||||
{ \
|
||||
snprintf(error, maxlen, "Could not find interface: %s", v_name); \
|
||||
} \
|
||||
return false; \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Same as GET_V_IFACE, except searches for any.
|
||||
*
|
||||
* @param v_factory Factory method to use from ISmmAPI (such as engineFactory).
|
||||
* @param v_var Variable name to store into.
|
||||
* @param v_type Interface type (do not include the pointer/asterisk).
|
||||
* @param v_name Inteface name.
|
||||
*/
|
||||
#define GET_V_IFACE_ANY(v_factory, v_var, v_type, v_name) \
|
||||
v_var = (v_type *)ismm->VInterfaceMatch(ismm->v_factory(), v_name, 0); \
|
||||
if (!v_var) \
|
||||
{ \
|
||||
if (error && maxlen) \
|
||||
{ \
|
||||
snprintf(error, maxlen, "Could not find interface: %s", v_name); \
|
||||
} \
|
||||
return false; \
|
||||
}
|
||||
|
||||
|
||||
#endif //_INCLUDE_ISMM_PLUGIN_H
|
||||
|
@ -61,7 +61,7 @@ bool GetFileOfAddress(void *pAddr, char *buffer, size_t maxlength);
|
||||
#if defined __WIN32__ || defined _WIN32 || defined WIN32
|
||||
#define SMM_API extern "C" __declspec(dllexport)
|
||||
#elif defined __GNUC__
|
||||
#if (__GNUC__ == 4) && (__GNUC_MINOR__ >= 1)
|
||||
#if (__GNUC__ == 4)
|
||||
#define SMM_API extern "C" __attribute__ ((visibility("default")))
|
||||
#else
|
||||
#define SMM_API extern "C"
|
||||
|
@ -125,26 +125,14 @@ bool FireEvent_Handler(IGameEvent *event, bool bDontBroadcast)
|
||||
RETURN_META_VALUE(MRES_IGNORED, true);
|
||||
}
|
||||
|
||||
#define GET_V_IFACE(v_factory, v_var, v_type, v_name) \
|
||||
v_var = (v_type *)ismm->VInterfaceMatch(ismm->v_factory(), v_name); \
|
||||
if (!v_var) \
|
||||
{ \
|
||||
if (error && maxlen) \
|
||||
{ \
|
||||
snprintf(error, maxlen, "Could not find interface: %s", v_name); \
|
||||
} \
|
||||
return false; \
|
||||
}
|
||||
|
||||
|
||||
bool SamplePlugin::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)
|
||||
{
|
||||
PLUGIN_SAVEVARS();
|
||||
|
||||
GET_V_IFACE(serverFactory, m_ServerDll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
|
||||
GET_V_IFACE(engineFactory, m_Engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
|
||||
GET_V_IFACE(serverFactory, m_ServerClients, IServerGameClients, INTERFACEVERSION_SERVERGAMECLIENTS);
|
||||
GET_V_IFACE(engineFactory, m_GameEventManager, IGameEventManager2, INTERFACEVERSION_GAMEEVENTSMANAGER2);
|
||||
GET_V_IFACE_ANY(serverFactory, m_ServerDll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
|
||||
GET_V_IFACE_CURRENT(engineFactory, m_Engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
|
||||
GET_V_IFACE_ANY(serverFactory, m_ServerClients, IServerGameClients, INTERFACEVERSION_SERVERGAMECLIENTS);
|
||||
GET_V_IFACE_CURRENT(engineFactory, m_GameEventManager, IGameEventManager2, INTERFACEVERSION_GAMEEVENTSMANAGER2);
|
||||
|
||||
META_LOG(g_PLAPI, "Starting plugin.\n");
|
||||
|
||||
|
@ -23,20 +23,11 @@ void ServerActivate_handler(edict_t *pEdictList, int edictCount, int clientMax)
|
||||
RETURN_META(MRES_IGNORED);
|
||||
}
|
||||
|
||||
#define GET_V_IFACE(v_factory, v_var, v_type, v_name) \
|
||||
v_var = (v_type *)ismm->VInterfaceMatch(ismm->v_factory(), v_name); \
|
||||
if (!v_var) { \
|
||||
if (error && maxlen) { \
|
||||
snprintf(error, maxlen, "Could not find interface: %s", v_name); \
|
||||
} \
|
||||
return false; \
|
||||
}
|
||||
|
||||
bool StubPlugin::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)
|
||||
{
|
||||
PLUGIN_SAVEVARS();
|
||||
|
||||
GET_V_IFACE(serverFactory, m_ServerDll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
|
||||
GET_V_IFACE_ANY(serverFactory, m_ServerDll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
|
||||
|
||||
SH_ADD_HOOK_STATICFUNC(IServerGameDLL, ServerActivate, m_ServerDll, ServerActivate_handler, true);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user