Fix logical entity support for Dota 2 and CS:GO on Windows.
This commit is contained in:
parent
f457362f18
commit
6e40168f79
@ -72,8 +72,23 @@ CHalfLife2 g_HL2;
|
||||
ConVar *sv_lan = NULL;
|
||||
|
||||
static void *g_EntList = NULL;
|
||||
static void **g_pEntInfoList = NULL;
|
||||
static int entInfoOffset = -1;
|
||||
|
||||
static CEntInfo *EntInfoArray()
|
||||
{
|
||||
if (g_EntList != NULL)
|
||||
{
|
||||
return (CEntInfo *)((intp)g_EntList + entInfoOffset);
|
||||
}
|
||||
else if (g_pEntInfoList)
|
||||
{
|
||||
return *(CEntInfo **)g_pEntInfoList;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
namespace SourceHook
|
||||
{
|
||||
template<>
|
||||
@ -192,40 +207,39 @@ void CHalfLife2::InitLogicalEntData()
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
if (!g_EntList)
|
||||
{
|
||||
if (!g_pGameConf->GetMemSig("LevelShutdown", (void **)&addr))
|
||||
if (g_pGameConf->GetMemSig("LevelShutdown", (void **) &addr) && addr)
|
||||
{
|
||||
g_Logger.LogError("Logical Entities not supported by this mod (LevelShutdown) - Reverting to networkable entities only");
|
||||
return;
|
||||
}
|
||||
int offset;
|
||||
if (!g_pGameConf->GetOffset("gEntList", &offset))
|
||||
{
|
||||
g_Logger.LogError("Logical Entities not supported by this mod (gEntList) - Reverting to networkable entities only");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!addr)
|
||||
{
|
||||
g_Logger.LogError("Failed lookup of LevelShutdown - Reverting to networkable entities only");
|
||||
return;
|
||||
}
|
||||
g_EntList = *reinterpret_cast<void **>(addr + offset);
|
||||
|
||||
int offset;
|
||||
if (!g_pGameConf->GetOffset("gEntList", &offset))
|
||||
{
|
||||
g_Logger.LogError("Logical Entities not supported by this mod (gEntList) - Reverting to networkable entities only");
|
||||
return;
|
||||
}
|
||||
|
||||
g_EntList = *reinterpret_cast<void **>(addr + offset);
|
||||
}
|
||||
|
||||
if (!g_EntList)
|
||||
|
||||
// If we have g_EntList from either of the above methods, make sure we can get the offset from it to EntInfo as well
|
||||
if (g_EntList && !g_pGameConf->GetOffset("EntInfo", &entInfoOffset))
|
||||
{
|
||||
g_Logger.LogError("Failed lookup of gEntList - Reverting to networkable entities only");
|
||||
g_Logger.LogError("Logical Entities not supported by this mod (EntInfo) - Reverting to networkable entities only");
|
||||
g_EntList = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!g_pGameConf->GetOffset("EntInfo", &entInfoOffset))
|
||||
// If we don't have g_EntList or have it but don't know where EntInfo is on it, use fallback.
|
||||
if (!g_EntList || entInfoOffset == -1)
|
||||
{
|
||||
g_Logger.LogError("Logical Entities not supported by this mod (EntInfo) - Reverting to networkable entities only");
|
||||
g_pGameConf->GetAddress("EntInfosPtr", (void **)&g_pEntInfoList);
|
||||
}
|
||||
|
||||
if (!g_EntList && !g_pEntInfoList)
|
||||
{
|
||||
g_Logger.LogError("Failed lookup of gEntList - Reverting to networkable entities only");
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -993,7 +1007,9 @@ CEntInfo *CHalfLife2::LookupEntity(int entIndex)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!g_EntList || entInfoOffset == -1)
|
||||
CEntInfo *entInfos = EntInfoArray();
|
||||
|
||||
if (!entInfos)
|
||||
{
|
||||
/* Attempt to use engine interface instead */
|
||||
static CEntInfo tempInfo;
|
||||
@ -1020,8 +1036,7 @@ CEntInfo *CHalfLife2::LookupEntity(int entIndex)
|
||||
return &tempInfo;
|
||||
}
|
||||
|
||||
CEntInfo *pArray = (CEntInfo *)(((unsigned char *)g_EntList) + entInfoOffset);
|
||||
return &pArray[entIndex];
|
||||
return &entInfos[entIndex];
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -19,17 +19,22 @@
|
||||
"game" "csgo"
|
||||
}
|
||||
|
||||
"Addresses"
|
||||
{
|
||||
"EntInfosPtr"
|
||||
{
|
||||
"windows"
|
||||
{
|
||||
"signature" "EntInfosFinder"
|
||||
"read" "36"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
"Offsets"
|
||||
{
|
||||
/* Offset into LevelShutdown */
|
||||
"gEntList"
|
||||
{
|
||||
"windows" "11"
|
||||
}
|
||||
|
||||
"EntInfo"
|
||||
{
|
||||
"windows" "4"
|
||||
"linux" "4"
|
||||
"mac" "4"
|
||||
}
|
||||
@ -37,10 +42,10 @@
|
||||
|
||||
"Signatures"
|
||||
{
|
||||
"LevelShutdown"
|
||||
"EntInfosFinder"
|
||||
{
|
||||
"library" "server"
|
||||
"windows" "\xE8\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\xE8"
|
||||
"windows" "\x55\x8B\xEC\x8B\x4D\x08\x53\x56\x57\x85\xC9\x74\x2A\x8B\x01\xFF\x2A\x2A\x8B\x00\x83\xF8\xFF\x75\x11\xB8\x2A\x2A\x2A\x2A\x8D\x34\x40\x8B"
|
||||
}
|
||||
|
||||
"gEntList"
|
||||
|
Loading…
Reference in New Issue
Block a user