added amb1235, added support for the IServer interface
added a native to retrieve the spray file of a client added a native to get the net traffic of the server --HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401775
This commit is contained in:
parent
04c0684879
commit
9ab9eba5d7
@ -64,6 +64,7 @@ IServerGameClients *serverClients = NULL;
|
||||
IVoiceServer *voiceserver = NULL;
|
||||
IPlayerInfoManager *playerinfomngr = NULL;
|
||||
ICvar *icvar = NULL;
|
||||
IServer *iserver = NULL;
|
||||
SourceHook::CallClass<IVEngineServer> *enginePatch = NULL;
|
||||
SourceHook::CallClass<IEngineSound> *enginesoundPatch = NULL;
|
||||
HandleType_t g_CallHandle = 0;
|
||||
@ -204,6 +205,7 @@ void SDKTools::SDK_OnAllLoaded()
|
||||
s_TempEntHooks.Initialize();
|
||||
s_SoundHooks.Initialize();
|
||||
InitializeValveGlobals();
|
||||
GetIServer();
|
||||
}
|
||||
|
||||
bool SDKTools::QueryRunning(char *error, size_t maxlength)
|
||||
|
@ -46,6 +46,8 @@
|
||||
#include <ivoiceserver.h>
|
||||
#include <iplayerinfo.h>
|
||||
#include <convar.h>
|
||||
#include <iserver.h>
|
||||
#include <cdll_int.h>
|
||||
#include <compat_wrappers.h>
|
||||
|
||||
/**
|
||||
@ -99,6 +101,7 @@ extern IServerGameClients *serverClients;
|
||||
extern IVoiceServer *voiceserver;
|
||||
extern IPlayerInfoManager *playerinfomngr;
|
||||
extern ICvar *icvar;
|
||||
extern IServer *iserver;
|
||||
/* Interfaces from SourceMod */
|
||||
extern IBinTools *g_pBinTools;
|
||||
extern IGameConfig *g_pGameConf;
|
||||
|
@ -82,3 +82,60 @@ void InitializeValveGlobals()
|
||||
g_pGameRules = reinterpret_cast<void **>(addr);
|
||||
}
|
||||
#endif
|
||||
|
||||
#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;
|
||||
|
||||
/* Get the offset into CreateFakeClient */
|
||||
if (!g_pGameConf->GetOffset("sv", &offset))
|
||||
{
|
||||
return;
|
||||
}
|
||||
#if defined METAMOD_PLAPI_VERSION
|
||||
/* Get the CreateFakeClient function pointer */
|
||||
if (!(vfunc=SH_GET_ORIG_VFNPTR_ENTRY(engine, &IVEngineServer::CreateFakeClient)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/* Finally we have the interface we were looking for */
|
||||
iserver = *reinterpret_cast<IServer **>(reinterpret_cast<unsigned char *>(vfunc) + offset);
|
||||
#else
|
||||
/* Get the interface manually */
|
||||
SourceHook::MemFuncInfo info = {true, -1, 0, 0};
|
||||
SourceHook::GetFuncInfo(&IVEngineServer::CreateFakeClient, info);
|
||||
|
||||
vfunc = enginePatch->GetOrigFunc(info.vtbloffs, info.vtblindex);
|
||||
if (!vfunc)
|
||||
{
|
||||
void **vtable = *reinterpret_cast<void ***>(enginePatch->GetThisPtr() + info.thisptroffs + info.vtbloffs);
|
||||
vfunc = vtable[info.vtblindex];
|
||||
}
|
||||
|
||||
iserver = *reinterpret_cast<IServer **>(reinterpret_cast<unsigned char *>(vfunc) + offset);
|
||||
#endif
|
||||
}
|
||||
#elif defined PLATFORM_POSIX
|
||||
void GetIServer()
|
||||
{
|
||||
void *addr;
|
||||
if (!g_pGameConf->GetMemSig("sv", &addr) || !addr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
iserver = *reinterpret_cast<IServer **>(addr);
|
||||
}
|
||||
#endif
|
||||
|
@ -36,5 +36,6 @@ extern void **g_pGameRules;
|
||||
extern void *g_EntList;
|
||||
|
||||
void InitializeValveGlobals();
|
||||
void GetIServer();
|
||||
|
||||
#endif // _INCLUDE_SDKTOOLS_VGLOBALS_H_
|
||||
|
@ -267,6 +267,15 @@ bool IsEyeAnglesSupported()
|
||||
return SetupGetEyeAngles();
|
||||
}
|
||||
|
||||
bool GetPlayerInfo(int client, player_info_t *info)
|
||||
{
|
||||
#if defined ORANGEBOX_BUILD
|
||||
return engine->GetPlayerInfo(client, info);
|
||||
#else
|
||||
return iserver->GetPlayerInfo(client, info);
|
||||
#endif
|
||||
}
|
||||
|
||||
void ShutdownHelpers()
|
||||
{
|
||||
s_Teleport.Shutdown();
|
||||
|
@ -68,6 +68,8 @@ bool IsEyeAnglesSupported();
|
||||
|
||||
int GetClientAimTarget(edict_t *pEdict, bool only_players);
|
||||
|
||||
bool GetPlayerInfo(int client, player_info_t *info);
|
||||
|
||||
void ShutdownHelpers();
|
||||
|
||||
#endif //_INCLUDE_SDKTOOLS_VHELPERS_H_
|
||||
|
@ -825,6 +825,47 @@ static cell_t sm_SetEntityModel(IPluginContext *pContext, const cell_t *params)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell_t GetPlayerDecalFile(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
IGamePlayer *player = playerhelpers->GetGamePlayer(params[1]);
|
||||
if (player == NULL)
|
||||
{
|
||||
return pContext->ThrowNativeError("Invalid client index %d", params[1]);
|
||||
}
|
||||
if (!player->IsInGame())
|
||||
{
|
||||
return pContext->ThrowNativeError("Client %d is not in game", params[1]);
|
||||
}
|
||||
|
||||
player_info_t info;
|
||||
char *buffer;
|
||||
|
||||
if (!GetPlayerInfo(params[1], &info) || !info.customFiles[0])
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
pContext->LocalToString(params[2], &buffer);
|
||||
Q_binarytohex((byte *)&info.customFiles[0], sizeof(info.customFiles[0]), buffer, params[3]);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell_t GetServerNetStats(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
float in, out;
|
||||
cell_t *pIn, *pOut;
|
||||
|
||||
pContext->LocalToPhysAddr(params[1], &pIn);
|
||||
pContext->LocalToPhysAddr(params[2], &pOut);
|
||||
iserver->GetNetStats(in, out);
|
||||
|
||||
*pIn = sp_ftoc(in);
|
||||
*pOut = sp_ftoc(out);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
sp_nativeinfo_t g_Natives[] =
|
||||
{
|
||||
{"ExtinguishPlayer", ExtinguishEntity},
|
||||
@ -850,5 +891,7 @@ sp_nativeinfo_t g_Natives[] =
|
||||
{"DispatchKeyValueVector", DispatchKeyValueVector},
|
||||
{"GetClientAimTarget", sm_GetClientAimTarget},
|
||||
{"SetEntityModel", sm_SetEntityModel},
|
||||
{"GetPlayerDecalFile", GetPlayerDecalFile},
|
||||
{"GetServerNetStats", GetServerNetStats},
|
||||
{NULL, NULL},
|
||||
};
|
||||
|
@ -178,6 +178,29 @@
|
||||
}
|
||||
}
|
||||
|
||||
/* IServer interface pointer */
|
||||
"#default"
|
||||
{
|
||||
"Offsets"
|
||||
{
|
||||
/* Offset into IVEngineServer::CreateFakeClient */
|
||||
"sv"
|
||||
{
|
||||
"windows" "6"
|
||||
}
|
||||
}
|
||||
|
||||
"Signatures"
|
||||
{
|
||||
/* CBaseServer object for IServer interface */
|
||||
"sv"
|
||||
{
|
||||
"library" "engine"
|
||||
"linux" "@sv"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Team Fortress 2 Offsets */
|
||||
"tf"
|
||||
{
|
||||
|
@ -216,6 +216,29 @@
|
||||
}
|
||||
}
|
||||
|
||||
/* IServer interface pointer */
|
||||
"#default"
|
||||
{
|
||||
"Offsets"
|
||||
{
|
||||
/* Offset into IVEngineServer::CreateFakeClient */
|
||||
"sv"
|
||||
{
|
||||
"windows" "6"
|
||||
}
|
||||
}
|
||||
|
||||
"Signatures"
|
||||
{
|
||||
/* CBaseServer object for IServer interface */
|
||||
"sv"
|
||||
{
|
||||
"library" "engine"
|
||||
"linux" "@sv"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Counter-Strike: Source */
|
||||
"cstrike"
|
||||
{
|
||||
|
@ -264,6 +264,26 @@ native GetTeamClientCount(index);
|
||||
*/
|
||||
native SetEntityModel(entity, const String:model[]);
|
||||
|
||||
/**
|
||||
* Retrieves the decal file name associated to a given client.
|
||||
*
|
||||
* @param client Player's index.
|
||||
* @param hex Buffer to store the logo filename.
|
||||
* @param maxlength Maximum length of string buffer.
|
||||
* @return True on success, otherwise false.
|
||||
* @error Invalid client or client not in game.
|
||||
*/
|
||||
native bool:GetPlayerDecalFile(client, String:hex[], maxlength);
|
||||
|
||||
/**
|
||||
* Returns the average server network traffic in bytes/sec.
|
||||
*
|
||||
* @param in Buffer to store the input traffic velocity.
|
||||
* @param out Buffer to store the output traffic velocity.
|
||||
* @noreturn
|
||||
*/
|
||||
native GetServerNetStats(&Float:in, &Float:out);
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user