client-determined drift mode?

This commit is contained in:
minenice55 2026-01-26 13:36:35 -05:00
parent ea408ff188
commit 905ebe528a
7 changed files with 35 additions and 7 deletions

View file

@ -674,9 +674,6 @@ consvar_t cv_kartairsquish = CVAR_INIT ("kartairsquish", "None", CV_NETVAR, kart
consvar_t cv_kartdebugshrink = CVAR_INIT ("kartdebugshrink", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
consvar_t cv_kartdrift_operationorder = CVAR_INIT ("kartdriftoperationorder", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
consvar_t cv_kartdrift_snapshot = CVAR_INIT ("kartdriftsnapshot", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
consvar_t cv_kartdebugdistribution = CVAR_INIT ("kartdebugdistribution", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
consvar_t cv_kartdebughuddrop = CVAR_INIT ("kartdebughuddrop", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
static CV_PossibleValue_t kartdebugwaypoint_cons_t[] = {{0, "Off"}, {1, "Forwards"}, {2, "Backwards"}, {0, NULL}};
@ -2373,11 +2370,12 @@ void WeaponPref_Send(UINT8 ssplayer)
if (player->randomrestat)
prefs |= WP_RANDOMRESTAT;
UINT8 buf[4];
UINT8 buf[5];
buf[0] = prefs;
buf[1] = cv_mindelay.value;
buf[2] = player->kartspeedrestat;
buf[3] = player->kartweightrestat;
buf[4] = cv_driftmode[ssplayer].value;
SendNetXCmdForPlayer(ssplayer, XD_WEAPONPREF, buf, sizeof buf);
}
@ -2465,6 +2463,16 @@ static void Got_WeaponPref(UINT8 **cp,INT32 playernum)
player->kartspeedrestat = kartspeedrestat;
player->kartweightrestat = kartweightrestat;
UINT8 driftmode = READUINT8(*cp);
if (driftmode >= NUMDRIFTMODES)
{
CONS_Alert(CONS_WARNING, M_GetText("Illegal drift mode received from %s\n"), player_names[playernum]);
if (server)
SendKick(playernum, KICK_MSG_CON_FAIL);
return;
}
player->driftmode = driftmode;
// SEE ALSO g_demo.c
demo_extradata[playernum] |= DXD_WEAPONPREF;
}

View file

@ -243,7 +243,6 @@ extern consvar_t cv_votetime;
extern consvar_t cv_kartdebugitem, cv_kartdebugamount, cv_kartdebugdistribution, cv_kartdebughuddrop;
extern consvar_t cv_kartdebugshrink;
extern consvar_t cv_kartdrift_operationorder, cv_kartdrift_snapshot;
extern consvar_t cv_kartdebugcheckpoint, cv_kartdebugnodes, cv_kartdebugcolorize, cv_kartdebugdirector;
extern consvar_t cv_kartdebugwaypoints, cv_kartdebuglap, cv_kartdebugbot, cv_kartdebugcluster, cv_kartdebugrings;
extern consvar_t cv_gptest;

View file

@ -435,6 +435,15 @@ struct saltyhop_t
fixed_t momz, zoffset; // erm... the mechanism....
};
// this WILL conflict with a future commit I just need this to proto
typedef enum
{
DRIFTMODE_CLASSIC = 0,
DRIFTMODE_SNAPSHOT,
DRIFTMODE_INSTANT,
NUMDRIFTMODES
} driftmode_e;
// enum for saved lap times
typedef enum
{
@ -566,6 +575,7 @@ struct player_t
UINT8 justbumped; // Prevent players from endlessly bumping into each other
boolean noclip; // Fix Grow breaking the "noclip" cheat. Also applies noclip as a bonus.
driftmode_e driftmode;
SINT8 drift; // (-5 to 5) - Drifting Left or Right, plus a bigger counter = sharper turn
INT16 driftturnsnapshot;
SINT8 driftlock; // Prevents you from using drift angle for x tics. Used for zipper fix.

View file

@ -464,6 +464,15 @@ consvar_t cv_jitterlegacy[MAXSPLITSCREENPLAYERS] = {
CVAR_INIT ("driftjitter4", "Ring Racers", CV_SAVE|CV_CALL|CV_NOINIT, driftjitter_cons_t, weaponPrefChange)
};
static CV_PossibleValue_t driftmode_cons_t[] = {{DRIFTMODE_CLASSIC, "Classic"}, {DRIFTMODE_SNAPSHOT, "Snapshot"}, {DRIFTMODE_INSTANT, "Instant"}, {0, NULL}};
consvar_t cv_driftmode[MAXSPLITSCREENPLAYERS] = {
CVAR_INIT ("driftmode", "Classic", CV_SAVE|CV_CALL|CV_NOINIT, driftjitter_cons_t, weaponPrefChange),
CVAR_INIT ("driftmode2", "Classic", CV_SAVE|CV_CALL|CV_NOINIT, driftjitter_cons_t, weaponPrefChange),
CVAR_INIT ("driftmode3", "Classic", CV_SAVE|CV_CALL|CV_NOINIT, driftjitter_cons_t, weaponPrefChange),
CVAR_INIT ("driftmode4", "Classic", CV_SAVE|CV_CALL|CV_NOINIT, driftjitter_cons_t, weaponPrefChange)
};
static CV_PossibleValue_t zerotoone_cons_t[] = {{0, "MIN"}, {FRACUNIT, "MAX"}, {0, NULL}};
consvar_t cv_deadzonex[MAXSPLITSCREENPLAYERS] = {
CVAR_INIT ("xdeadzone", "0.25", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL),

View file

@ -80,6 +80,7 @@ extern consvar_t cv_invertmouse;
extern consvar_t cv_kickstartaccel[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_shrinkme[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_jitterlegacy[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_driftmode[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_deadzonex[MAXSPLITSCREENPLAYERS];
extern consvar_t cv_deadzoney[MAXSPLITSCREENPLAYERS];

View file

@ -7573,7 +7573,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
player->flamecamtime -= 1;
}
if (!cv_kartdrift_operationorder.value)
if (player->driftmode != DRIFTMODE_INSTANT)
{
if (cmd->buttons & BT_DRIFT)
{
@ -9372,7 +9372,7 @@ static void K_KartDrift(player_t *player, boolean onground)
}
// drift-turn snapshot experiment disabled, drop the snapshot and use the turning value from this tick
if (!cv_kartdrift_snapshot.value)
if (player->driftmode != DRIFTMODE_SNAPSHOT)
{
player->driftturnsnapshot = player->cmd.turning;
}

View file

@ -606,6 +606,7 @@ static void P_NetSyncPlayers(savebuffer_t *save)
SYNC(players[i].justbumped);
SYNCBOOLEAN(players[i].noclip);
SYNC(players[i].driftmode);
SYNC(players[i].drift);
SYNC(players[i].driftturnsnapshot);
SYNC(players[i].driftlock);