From ec8a6247c22c8dff4178a252865bc891bce83826 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 27 Jun 2023 14:16:48 +0100 Subject: [PATCH] Z-vote is now server-authoriative - Only calls callback if you're the server (and not demo.playback, forward thinking for stored xcmd netreplays) - G_GamestateUsesExitLevel() for homogenising the conditions that permit XD_EXITLEVEL to be dispatched and recieved --- src/d_netcmd.c | 21 ++++++++++++++++++++- src/d_netcmd.h | 1 + src/k_zvote.c | 19 +++++++++++++------ 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index f391e83c1..63781835d 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -5646,6 +5646,22 @@ static void Command_Mapmd5_f(void) CONS_Printf(M_GetText("You must be in a level to use this.\n")); } +boolean G_GamestateUsesExitLevel(void) +{ + if (demo.playback) + return false; + + switch (gamestate) + { + case GS_LEVEL: + case GS_CREDITS: + return true; + + default: + return false; + } +} + static void Command_ExitLevel_f(void) { if (!(server || (IsPlayerAdmin(consoleplayer)))) @@ -5656,7 +5672,7 @@ static void Command_ExitLevel_f(void) { CONS_Printf(M_GetText("This cannot be used without cheats enabled.\n")); } - else if (( gamestate != GS_LEVEL && gamestate != GS_CREDITS ) || demo.playback) + else if (G_GamestateUsesExitLevel() == false) { CONS_Printf(M_GetText("You must be in a level to use this.\n")); } @@ -5682,6 +5698,9 @@ static void Got_ExitLevelcmd(UINT8 **cp, INT32 playernum) return; } + if (G_GamestateUsesExitLevel() == false) + return; + G_ExitLevel(); } diff --git a/src/d_netcmd.h b/src/d_netcmd.h index c9938b4e5..621179d86 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -241,6 +241,7 @@ void WeaponPref_Parse(UINT8 **cp, INT32 playernum); void D_SendPlayerConfig(UINT8 n); void Command_ExitGame_f(void); void Command_Retry_f(void); +boolean G_GamestateUsesExitLevel(void); void D_GameTypeChanged(INT32 lastgametype); // not a real _OnChange function anymore void D_MapChange(UINT16 pmapnum, INT32 pgametype, boolean pencoremode, boolean presetplayers, INT32 pdelay, boolean pskipprecutscene, boolean pforcespecialstage); void D_SetupVote(void); diff --git a/src/k_zvote.c b/src/k_zvote.c index 9958e58b7..9c933d734 100644 --- a/src/k_zvote.c +++ b/src/k_zvote.c @@ -57,10 +57,7 @@ static void K_MidVoteKick(void) return; } - if (server) - { - SendKick(g_midVote.victim - players, KICK_MSG_VOTE_KICK); - } + SendKick(g_midVote.victim - players, KICK_MSG_VOTE_KICK); } /*-------------------------------------------------- @@ -70,7 +67,13 @@ static void K_MidVoteKick(void) --------------------------------------------------*/ static void K_MidVoteRockTheVote(void) { - G_ExitLevel(); + if (G_GamestateUsesExitLevel() == false) + { + return; + } + + SendNetXCmd(XD_EXITLEVEL, NULL, 0); +} } static midVoteTypeDef_t g_midVoteTypeDefs[MVT__MAX] = @@ -630,7 +633,11 @@ void K_MidVoteFinalize(fixed_t delayMul) --------------------------------------------------*/ void K_MidVoteSuccess(void) { - if (g_midVoteTypeDefs[ g_midVote.type ].callback != NULL) + if ( + server == true + && demo.playback == false + && g_midVoteTypeDefs[ g_midVote.type ].callback != NULL + ) { g_midVoteTypeDefs[ g_midVote.type ].callback(); }