summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMichael Smith <mikesmiffy128@gmail.com>2022-05-06 00:49:53 +0100
committerMichael Smith <mikesmiffy128@gmail.com>2022-05-06 00:49:53 +0100
commit1ed84a25c2db8ade2b2162b429b30e9138eb5d16 (patch)
treee77be1d1c25cfed145916cb1c482c48b47a3b15d
parentcc9785e38cd1414d6d675364e5089f907b7b0a30 (diff)
HOTFIX: Fix L4D2 2.0.0.0 crashingv0.3-HOTFIX
Idiotic problems require idiotic solutions.
-rw-r--r--gamedata/engine.kv6
-rw-r--r--gamedata/gamelib.kv4
-rw-r--r--src/engineapi.c17
-rw-r--r--src/gametype.h2
-rw-r--r--src/os.h1
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 <errno.h>
#include <fcntl.h>
#ifdef _WIN32
+#include <direct.h>
#include <io.h>
#include <wchar.h>
// DUMB HACK: noreturn.h is alphabetically before os.h so including it after