From 1ed84a25c2db8ade2b2162b429b30e9138eb5d16 Mon Sep 17 00:00:00 2001 From: Michael Smith Date: Fri, 6 May 2022 00:49:53 +0100 Subject: HOTFIX: Fix L4D2 2.0.0.0 crashing Idiotic problems require idiotic solutions. --- gamedata/engine.kv | 6 +++++- gamedata/gamelib.kv | 4 +--- src/engineapi.c | 17 ++++++++++------- src/gametype.h | 2 ++ src/os.h | 1 + 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/gamedata/engine.kv b/gamedata/engine.kv index 8ee8161..414a584 100644 --- a/gamedata/engine.kv +++ b/gamedata/engine.kv @@ -18,7 +18,11 @@ vtidx_GetGameDirectory { } Client012 37 // dmomm, ep1, ... } -vtidx_GetEngineBuildNumber { L4D2 99 } +// TODO(compat): apparently this changed, in early versions it's NOT 99! +// Come up with some way to detect it properly!? +vtidx_GetEngineBuildNumber { + //L4D2 99 +} vtidx_PEntityOfEntIndex { OrangeBox 19 } // probably OE too but??? sz_edict { diff --git a/gamedata/gamelib.kv b/gamedata/gamelib.kv index e7a4302..7db228f 100644 --- a/gamedata/gamelib.kv +++ b/gamedata/gamelib.kv @@ -26,9 +26,7 @@ vtidx_Teleport { L4D "104 + NVDTOR" L4D2 { default "116 + NVDTOR" // TODO(linux): might actually be 119!?!? - // TODO(compat): would like to be able to specify this here. - // see also engineapi.c - //TLS "117 + NVDTOR" + TheLastStand "117 + NVDTOR" // I dunno why JAiZ changed this } } diff --git a/src/engineapi.c b/src/engineapi.c index 6ba178f..5113883 100644 --- a/src/engineapi.c +++ b/src/engineapi.c @@ -22,7 +22,11 @@ #include "gametype.h" #include "intdefs.h" #include "mem.h" // " +#include "os.h" #include "vcall.h" +#include "x86.h" + +#include "con_.h" u64 _gametype_tag = 0; // declared in gametype.h but seems sensible enough here @@ -73,18 +77,17 @@ void engineapi_init(void) { _gametype_tag |= _gametype_tag_SrvDLL005; } + // TERRIBLE HACK: TODO(compat): come up with a better method later + if (GAMETYPE_MATCHES(L4D2) && os_access(OS_LIT( + "update/maps/c14m1_junkyard.bsp"), R_OK) != -1) { + _gametype_tag |= _gametype_tag_TheLastStand; + } + // need to do this now; ServerClass network table iteration requires // SendProp offsets gamedata_init(); // TODO(compat): we need this terrible hack for now because TLS somehow - // changed the entity vtable layout and I've yet to think of a way to make - // gamedata more flexible to handle that properly. I blame JAiZ. - if (engclient && has_vtidx_GetEngineBuildNumber && - VCALL(engclient, GetEngineBuildNumber) >= 2200) { - ++vtidx_Teleport; - } - if (has_vtidx_GetAllServerClasses && has_sz_SendProp && has_off_SP_varname && has_off_SP_offset) { initentprops(VCALL(srvdll, GetAllServerClasses)); diff --git a/src/gametype.h b/src/gametype.h index d7d0b3e..c825ee6 100644 --- a/src/gametype.h +++ b/src/gametype.h @@ -49,6 +49,8 @@ extern u64 _gametype_tag; #define _gametype_tag_SrvDLL009 (1 << 14) // 2013-ish #define _gametype_tag_SrvDLL005 (1 << 15) // mostly everything else, it seems +#define _gametype_tag_TheLastStand (1 << 16) /* The JAiZ update */ + /* Matches for any multiple possible tags */ #define _gametype_tag_L4D (_gametype_tag_L4D1 | _gametype_tag_L4D2) // XXX: *stupid* naming, refactor later (damn Survivors ruining everything) diff --git a/src/os.h b/src/os.h index d789717..c00eaf3 100644 --- a/src/os.h +++ b/src/os.h @@ -28,6 +28,7 @@ #include #include #ifdef _WIN32 +#include #include #include // DUMB HACK: noreturn.h is alphabetically before os.h so including it after -- cgit v1.2.3