diff options
-rw-r--r-- | gamedata/gamelib.txt | 2 | ||||
-rw-r--r-- | src/l4dreset.c | 16 | ||||
-rw-r--r-- | src/sst.c | 1 |
3 files changed, 19 insertions, 0 deletions
diff --git a/gamedata/gamelib.txt b/gamedata/gamelib.txt index 615ecf4..486a216 100644 --- a/gamedata/gamelib.txt +++ b/gamedata/gamelib.txt @@ -42,6 +42,8 @@ vtidx_GameShutdown 7 vtidx_OnGameplayStart L4D2 11 # note: just happens to be the same on linux! L4D1 11 +off_FinaleEscapeState + L4D2 164 # only currently needed for 2000-2111 to fix the swamp 1 bug # CInput vtidx_CreateMove 3 diff --git a/src/l4dreset.c b/src/l4dreset.c index f5508e6..2de75cd 100644 --- a/src/l4dreset.c +++ b/src/l4dreset.c @@ -344,6 +344,8 @@ static int getffidx(const char *campaign) { DEF_FEAT_CVAR(sst_l4d_quickreset_fastfwd, "Fast-forward through cutscenes when quick-resetting", 1, CON_ARCHIVE) +static int *FinaleEscapeState; + DEF_FEAT_CCMD_HERE(sst_l4d_quickreset, "Reset (or switch) campaign and clear all vote cooldowns", 0) { if (cmd->argc > 2) { @@ -374,6 +376,7 @@ DEF_FEAT_CCMD_HERE(sst_l4d_quickreset, (ffidx = getffidx(campaign)) != -1) { ffdelay = 45; // 1.5s } + if (FinaleEscapeState) *FinaleEscapeState = 0; // see comment in INIT } // Note: this returns a pointer to subsequent bytes for find_voteissues() below @@ -497,6 +500,9 @@ ok: // Director::Update calls UnfreezeTeam after the first jmp instruction return false; } + +DECL_VFUNC_DYN(int, GetEngineBuildNumber) + INIT { struct con_cmd *cmd_listissues = con_findcmd("listissues"); if_cold (!cmd_listissues) { @@ -565,6 +571,16 @@ INIT { errmsg_errorx("couldn't find vote callers list offset"); nocd: errmsg_note("resetting a first map will not clear vote cooldowns"); } + // Additionally, unrelated to cooldown, get a pointer to the director + // member responsible for the infamous bug at the start of Swamp and + // Crash Course which gives god mode and prevents idling and voting. + // We clear the value at the end of the quickreset handler above to + // replicate Valve's own bugfix (introduced in 2112) which clears it in + // CDirector::Reset(). + if (has_vtidx_GetEngineBuildNumber && + GetEngineBuildNumber(engclient) < 2112) { + FinaleEscapeState = mem_offset(director, off_FinaleEscapeState); + } } return FEAT_OK; } @@ -277,6 +277,7 @@ static const char *updatenotes = "\ * Increased sst_mouse_factor limit from 20 to 100\n\ * sst_l4d_testwarp now performs the take-control unsticking step by default\n\ * Added sst_l4d_previewwarp to visualise warp unsticking logic\n\ +* sst_l4d_quickreset now fixes the Swamp Fever/Crash Course \"god mode glitch\"\n\ * Added a fix for lag/stuttering in newer L4D2 versions caused by addon loading\n\ * Added a fix for disabling all addons in L4D2 requiring a game restart\n\ * Removed multiplayer chat rate limit in L4D series and Portal 2\n\ |