fixed amb1252, GetPlayerInfo wouldnt work for the last player index

fixed iserver crashing on linux

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401779
This commit is contained in:
Borja Ferrer 2007-12-07 00:17:24 +00:00
parent 6151b89b94
commit 1ad8e34181
3 changed files with 34 additions and 8 deletions

View File

@ -83,18 +83,28 @@ void InitializeValveGlobals()
}
#endif
bool vcmp(const void *_addr1, const void *_addr2, size_t len)
{
unsigned char *addr1 = (unsigned char *)_addr1;
unsigned char *addr2 = (unsigned char *)_addr2;
for (size_t i=0; i<len; i++)
{
if (addr2[i] == '*')
continue;
if (addr1[i] != addr2[i])
return false;
}
return true;
}
#if defined PLATFORM_WINDOWS
/* Thanks to DS for the sigs */
#define ISERVER_WIN_SIG "\x8B\x44\x24\x2A\x50\xB9\x2A\x2A\x2A\x2A\xE8"
#define ISERVER_WIN_SIG_LEN 11
void GetIServer()
{
/* First check that the IVEngineServer::CreateFakeClient exists */
if (!memutils->FindPattern(engine, ISERVER_WIN_SIG, ISERVER_WIN_SIG_LEN))
{
return;
}
int offset;
void *vfunc = NULL;
@ -110,6 +120,12 @@ void GetIServer()
return;
}
/* Check if we're on the expected function */
if (!vcmp(vfunc, ISERVER_WIN_SIG, ISERVER_WIN_SIG_LEN))
{
return;
}
/* Finally we have the interface we were looking for */
iserver = *reinterpret_cast<IServer **>(reinterpret_cast<unsigned char *>(vfunc) + offset);
#else
@ -123,6 +139,11 @@ void GetIServer()
void **vtable = *reinterpret_cast<void ***>(enginePatch->GetThisPtr() + info.thisptroffs + info.vtbloffs);
vfunc = vtable[info.vtblindex];
}
/* Check if we're on the expected function */
if (!vcmp(vfunc, ISERVER_WIN_SIG, ISERVER_WIN_SIG_LEN))
{
return;
}
iserver = *reinterpret_cast<IServer **>(reinterpret_cast<unsigned char *>(vfunc) + offset);
#endif
@ -136,6 +157,6 @@ void GetIServer()
return;
}
iserver = *reinterpret_cast<IServer **>(addr);
iserver = reinterpret_cast<IServer *>(addr);
}
#endif

View File

@ -272,7 +272,7 @@ bool GetPlayerInfo(int client, player_info_t *info)
#if defined ORANGEBOX_BUILD
return engine->GetPlayerInfo(client, info);
#else
return iserver->GetPlayerInfo(client, info);
return (iserver) ? iserver->GetPlayerInfo(client-1, info) : false;
#endif
}

View File

@ -853,6 +853,11 @@ static cell_t GetPlayerDecalFile(IPluginContext *pContext, const cell_t *params)
static cell_t GetServerNetStats(IPluginContext *pContext, const cell_t *params)
{
if (iserver == NULL)
{
return pContext->ThrowNativeError("IServer interface not supported, file a bug report.");
}
float in, out;
cell_t *pIn, *pOut;