summaryrefslogtreecommitdiff
path: root/src/autojump.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/autojump.c')
-rw-r--r--src/autojump.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/src/autojump.c b/src/autojump.c
index a8a21ca..6d0fbda 100644
--- a/src/autojump.c
+++ b/src/autojump.c
@@ -24,7 +24,6 @@
#include "hook.h"
#include "intdefs.h"
#include "langext.h"
-#include "mem.h"
#include "os.h"
#include "vcall.h"
@@ -33,20 +32,21 @@ REQUIRE_GAMEDATA(off_mv)
REQUIRE_GAMEDATA(vtidx_CheckJumpButton)
REQUIRE_GLOBAL(factory_client) // note: server will never be null
-DEF_ACCESSORS(struct CMoveData *, mv)
+struct CGameMovement { void **vtable; };
+DEF_ACCESSORS(struct CGameMovement, struct CMoveData *, mv)
-DEF_FEAT_CVAR(sst_autojump, "Jump upon hitting the ground while holding space", 0,
- CON_REPLICATE | CON_DEMO)
+DEF_FEAT_CVAR(sst_autojump, "Jump upon hitting the ground while holding space",
+ 0, CON_REPLICATE | CON_DEMO)
#define NIDX 256 // *completely* arbitrary lol
static bool justjumped[NIDX] = {0};
static inline int handleidx(ulong h) { return h & (1 << 11) - 1; }
-static void *gmsv = 0, *gmcl = 0;
-typedef bool (*VCALLCONV CheckJumpButton_func)(void *);
+static struct CGameMovement *gmsv = 0, *gmcl = 0;
+typedef bool (*VCALLCONV CheckJumpButton_func)(struct CGameMovement *);
static CheckJumpButton_func origsv, origcl;
-static bool VCALLCONV hooksv(void *this) {
+static bool VCALLCONV hooksv(struct CGameMovement *this) {
struct CMoveData *mv = get_mv(this);
int idx = handleidx(mv->playerhandle);
if (con_getvari(sst_autojump) && mv->firstrun && !justjumped[idx]) {
@@ -57,7 +57,7 @@ static bool VCALLCONV hooksv(void *this) {
return ret;
}
-static bool VCALLCONV hookcl(void *this) {
+static bool VCALLCONV hookcl(struct CGameMovement *this) {
struct CMoveData *mv = get_mv(this);
// FIXME: this will stutter in the rare case where justjumped is true.
// currently doing clientside justjumped handling makes multiplayer
@@ -68,9 +68,8 @@ static bool VCALLCONV hookcl(void *this) {
return justjumped[0] = origcl(this);
}
-static bool unprot(void *gm) {
- void **vtable = mem_loadptr(gm);
- bool ret = os_mprot(vtable + vtidx_CheckJumpButton, sizeof(void *),
+static bool unprot(struct CGameMovement *gm) {
+ bool ret = os_mprot(gm->vtable + vtidx_CheckJumpButton, sizeof(void *),
PAGE_READWRITE);
if (!ret) errmsg_errorsys("couldn't make virtual table writable");
return ret;
@@ -99,9 +98,9 @@ INIT {
return FEAT_FAIL;
}
if_cold (!unprot(gmcl)) return FEAT_FAIL;
- origsv = (CheckJumpButton_func)hook_vtable(*(void ***)gmsv,
+ origsv = (CheckJumpButton_func)hook_vtable(gmsv->vtable,
vtidx_CheckJumpButton, (void *)&hooksv);
- origcl = (CheckJumpButton_func)hook_vtable(*(void ***)gmcl,
+ origcl = (CheckJumpButton_func)hook_vtable(gmcl->vtable,
vtidx_CheckJumpButton, (void *)&hookcl);
if (GAMETYPE_MATCHES(Portal1)) {
@@ -119,8 +118,8 @@ INIT {
}
END {
- unhook_vtable(*(void ***)gmsv, vtidx_CheckJumpButton, (void *)origsv);
- unhook_vtable(*(void ***)gmcl, vtidx_CheckJumpButton, (void *)origcl);
+ unhook_vtable(gmsv->vtable, vtidx_CheckJumpButton, (void *)origsv);
+ unhook_vtable(gmcl->vtable, vtidx_CheckJumpButton, (void *)origcl);
}
// vi: sw=4 ts=4 noet tw=80 cc=80