From 0901ea89de46bbbea9a98eab4245e82f2796d4a1 Mon Sep 17 00:00:00 2001 From: Anonimus Date: Sat, 18 Oct 2025 17:13:31 -0400 Subject: [PATCH] Anti-bump --- src/d_main.cpp | 2 +- src/d_netcmd.c | 31 +++++++++++++++++++++++++++++++ src/d_netcmd.h | 2 ++ src/doomstat.h | 1 + src/g_game.c | 1 + src/k_kart.c | 3 +++ src/p_map.c | 6 ++++++ src/p_saveg.c | 1 + src/p_setup.c | 3 +++ src/p_tick.c | 16 ++++++++++++++++ 10 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index 697ee1dbe..f497d96e9 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -93,7 +93,7 @@ #define ASSET_HASH_TEXTURES_KART 0xb4211b2f32b6a291 #define ASSET_HASH_CHARS_KART 0x1e68a3e01aa5c68b #define ASSET_HASH_MAPS_KART 0x38558ed00da41ce9 -#define ASSET_HASH_MAIN_PK3 0xc15d8361362b3ed7 +#define ASSET_HASH_MAIN_PK3 0xef23efdd239ac20d #define ASSET_HASH_MAPPATCH_PK3 0x7d1f6b96dd119296 #define ASSET_HASH_BONUSCHARS_KART 0x60e6f13d822a7461 #ifdef USE_PATCH_FILE diff --git a/src/d_netcmd.c b/src/d_netcmd.c index d9decd5e8..4dbead88d 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -162,6 +162,7 @@ static void KartSlopeBoost_OnChange(void); static void KartDrafting_OnChange(void); static void KartAirDrop_OnChange(void); static void KartItemLitter_OnChange(void); +static void KartAntiBump_OnChange(void); static void KartItemBreaker_OnChange(void); static void KartInvinType_OnChange(void); static void KartBumpSpark_OnChange(void); @@ -568,8 +569,14 @@ consvar_t cv_kartdrafting_closedeadzone = CVAR_INIT ("kartdrafting_closedeadzone consvar_t cv_kartdrafting_basedistance = CVAR_INIT ("kartdrafting_basedistance", "2560", CV_NETVAR|CV_CHEAT, CV_Unsigned, NULL); consvar_t cv_kartairdrop = CVAR_INIT ("kartairdrop", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartAirDrop_OnChange); + consvar_t cv_kartitemlitter = CVAR_INIT ("kartitemlitter", "On", CV_NETVAR|CV_CALL|CV_NOINIT, CV_OnOff, KartItemLitter_OnChange); +#define ANTIBUMP_MAX (UINT32_MAX / TICRATE) +static CV_PossibleValue_t antibump_cons_t[] = {{0, "MIN"}, {ANTIBUMP_MAX, "MAX"}, {0, NULL}}; +consvar_t cv_kartantibump = CVAR_INIT ("kartantibump", "0", CV_NETVAR|CV_CALL|CV_NOINIT, antibump_cons_t, KartAntiBump_OnChange); +#undef ANTIBUMP_MAX + // Odds distancing #define MAXODDSDIST ((INT32_MAX / FRACUNIT) / 2) static CV_PossibleValue_t distvar_cons_t[] = {{1, "MIN"}, {MAXODDSDIST, "MAX"}, {0, NULL}}; @@ -7695,6 +7702,30 @@ static void KartItemLitter_OnChange(void) } } +static void KartAntiBump_OnChange(void) +{ + if (K_CanChangeRules() == false) + { + return; + } + + if (leveltime < starttime) + { + CONS_Printf( + M_GetText("Player collision delay has been changed to \"%s\".\n"), + cv_kartantibump.string + ); + antibumptime = (tic_t)cv_kartantibump.value * TICRATE; + } + else + { + CONS_Printf( + M_GetText("Player collision delay will be changed to \"%s\" next round.\n"), + cv_kartantibump.string + ); + } +} + static void KartItemBreaker_OnChange(void) { if (K_CanChangeRules() == false) diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 1a8eb2119..f4f47c94c 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -210,6 +210,8 @@ extern consvar_t cv_kartairdrop; extern consvar_t cv_kartitemlitter; +extern consvar_t cv_kartantibump; + extern consvar_t cv_kartoddsdist; extern consvar_t cv_kartlegacyoddsdist; extern consvar_t cv_kartspbdist; diff --git a/src/doomstat.h b/src/doomstat.h index e869975c6..442c0d198 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -688,6 +688,7 @@ extern tic_t bombflashtimer; // Used to avoid causing seizures if multiple mines extern boolean legitimateexit; extern boolean comebackshowninfo; extern tic_t curlap, bestlap; +extern tic_t antibumptime; extern INT16 votelevels[12][2]; extern SINT8 votes[MAXPLAYERS]; diff --git a/src/g_game.c b/src/g_game.c index 56c6ac616..b3de9a5cb 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -313,6 +313,7 @@ boolean legitimateexit; // Did this client actually finish the match? boolean comebackshowninfo; // Have you already seen the "ATTACK OR PROTECT" message? tic_t curlap; // Current lap time tic_t bestlap; // Best lap time +tic_t antibumptime; // Delay before players start bumping into one another. typedef struct { diff --git a/src/k_kart.c b/src/k_kart.c index 655194358..0864acf95 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -376,8 +376,11 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_kartchainingsound); CV_RegisterVar(&cv_kartairdrop); + CV_RegisterVar(&cv_kartitemlitter); + CV_RegisterVar(&cv_kartantibump); + CV_RegisterVar(&cv_kartitembreaker); //CV_RegisterVar(&cv_kartwalltransfer); diff --git a/src/p_map.c b/src/p_map.c index a8ed2270f..e6a5df5b9 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1154,6 +1154,12 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing) if (g_tm.thing->z + g_tm.thing->height < thing->z) return BMIT_CONTINUE; // underneath + // If antibump is active, ignore player collisions. + if (leveltime < starttime + antibumptime) + { + return BMIT_CONTINUE; + } + if (thing->player->squishedtimer || thing->player->hyudorotimer || thing->player->justbumped || thing->scale > g_tm.thing->scale + (mapobjectscale/8) || g_tm.thing->player->squishedtimer || g_tm.thing->player->hyudorotimer diff --git a/src/p_saveg.c b/src/p_saveg.c index afad487c1..59b55baea 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -4177,6 +4177,7 @@ static boolean P_NetSyncMisc(savebuffer_t *save, boolean resending) SYNCBOOLEAN(itemlittering); SYNC(bumpsparkactive); SYNC(invintype); + SYNC(antibumptime); for (i = 0; i < sizeof(votelevels)/sizeof(*votelevels); i++) { diff --git a/src/p_setup.c b/src/p_setup.c index 63ba164f8..60a1e4db9 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -8044,6 +8044,7 @@ static void P_InitLevelSettings(boolean reloadinggamestate) airdropactive = false; itemlittering = false; bumpsparkactive = 0; + antibumptime = 0; if (cv_kartrings.value) ringsactive = true; @@ -8075,6 +8076,8 @@ static void P_InitLevelSettings(boolean reloadinggamestate) bumpsparkactive = (UINT8)cv_kartbumpspark.value; invintype = (UINT8)cv_kartinvintype.value; + antibumptime = (tic_t)cv_kartantibump.value * TICRATE; + // emerald hunt hunt1 = hunt2 = hunt3 = NULL; diff --git a/src/p_tick.c b/src/p_tick.c index e48ac83e2..0c5a96976 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -746,10 +746,26 @@ void P_Ticker(boolean run) K_UpdateAllPlayerPositions(); // OK! Now that we got all of that sorted, players can think! + UINT8 p = 0; for (i = 0; i < MAXPLAYERS; i++) + { if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo)) + { P_PlayerThink(&players[i]); + if (!players[i].spectator) + p++; + } + } + + if (p > (MAXPLAYERS / 2)) + { + // At the point where players spawn on top of one another, start silently + // adding a minimum to the antibump timer. + // This prevents annoying race-start bonks. + antibumptime = max(p, antibumptime); + } + ps_playerthink_time = I_GetPreciseTime() - ps_playerthink_time; }