Anti-bump

This commit is contained in:
Anonimus 2025-10-18 17:13:31 -04:00
parent 5ef24abba4
commit 0901ea89de
10 changed files with 65 additions and 1 deletions

View file

@ -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

View file

@ -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)

View file

@ -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;

View file

@ -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];

View file

@ -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
{

View file

@ -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);

View file

@ -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

View file

@ -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++)
{

View file

@ -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;

View file

@ -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;
}