aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/l4dreset.c16
-rw-r--r--src/sst.c1
2 files changed, 17 insertions, 0 deletions
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;
}
diff --git a/src/sst.c b/src/sst.c
index 61c30b9..a60ad36 100644
--- a/src/sst.c
+++ b/src/sst.c
@@ -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\