From 459f0d9da70161ad2b2a2acac62cd05e051e0aa3 Mon Sep 17 00:00:00 2001 From: GenericHeroGuy Date: Sun, 19 Oct 2025 01:13:14 +0200 Subject: [PATCH] Add CV_GUARD flag --- src/command.c | 31 ++++++++++++++ src/command.h | 7 +++ src/d_netcmd.c | 114 ++++++++++++++++++++++++------------------------- src/g_demo.c | 8 +++- src/g_game.c | 44 +++++++++++++++---- src/g_game.h | 1 + src/k_kart.c | 31 -------------- src/k_kart.h | 102 ++++++++++++++++++++++--------------------- src/k_odds.h | 7 ++- 9 files changed, 190 insertions(+), 155 deletions(-) diff --git a/src/command.c b/src/command.c index f1b07a2fb..8614d9fd4 100644 --- a/src/command.c +++ b/src/command.c @@ -1534,6 +1534,9 @@ void CV_RegisterVar(consvar_t *variable) } } + if ((variable->flags & (CV_NETVAR|CV_GUARD)) == CV_GUARD) + I_Error("%s has CV_GUARD but not CV_NETVAR", variable->name); + // link the variable in if (!(variable->flags & CV_HIDEN)) { @@ -2322,6 +2325,34 @@ void CV_AddValue(consvar_t *var, INT32 increment) var->changed = 1; // user has changed it now } +// a GETTER for cvars!? +// used along with CV_GUARD to protect cvar values +INT32 CV_Get(consvar_t *cvar) +{ + if (!(cvar->flags & CV_GUARD)) + I_Error("CV_Get used with non-CV_GUARD variable %s", cvar->name); + + if (modeattacking != ATTACKING_NONE /*|| !K_CanChangeRules()*/) + { + const char *string = cvar->defaultvalue; + INT32 value; + if (CV_CompleteValue(cvar, &string, &value)) + return value; + else + I_Error("CV_Get oops"); + } + + return cvar->value; +} + +// reset all CV_GUARD cvars to defaults +void CV_ResetGuardVars(void) +{ + for (consvar_t *cvar = consvar_vars; cvar; cvar = cvar->next) + if (cvar->flags & CV_GUARD) + Setvalue(cvar, cvar->defaultvalue, true); +} + void CV_InitFilterVar(void) { #if 0 diff --git a/src/command.h b/src/command.h index 784986ec3..fc81aeb1e 100644 --- a/src/command.h +++ b/src/command.h @@ -129,6 +129,7 @@ typedef enum // used on menus CV_CHEAT = 2048, // Don't let this be used in multiplayer unless cheats are on. CV_NOLUA = 4096,/* don't let this be called from Lua */ + CV_GUARD = 8192, // protect this cvar's value in singleplayer modes } cvflags_t; struct CV_PossibleValue_t @@ -232,6 +233,12 @@ void CV_StealthSet(consvar_t *var, const char *value); // it a setvalue but with a modulo at the maximum void CV_AddValue(consvar_t *var, INT32 increment); +// returns the filtered value of a variable +INT32 CV_Get(consvar_t *cvar); + +// reset all guarded vars to default +void CV_ResetGuardVars(void); + // write all CV_SAVE variables to config file void CV_SaveVariables(FILE *f); diff --git a/src/d_netcmd.c b/src/d_netcmd.c index a058693e1..bb1723d51 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -457,7 +457,7 @@ consvar_t cv_kartbot_basetrackcomplexity = CVAR_INIT ("kartbot_basetrackcomplexi consvar_t cv_karteliminatelast = CVAR_INIT ("karteliminatelast", "Yes", CV_NETVAR|CV_CALL, CV_YesNo, KartEliminateLast_OnChange); // Toggles for new features -consvar_t cv_kartrings = CVAR_INIT ("kartrings", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartRings_OnChange); +consvar_t cv_kartrings = CVAR_INIT ("kartrings", "No", CV_NETVAR|CV_CALL|CV_NOINIT|CV_GUARD, CV_YesNo, KartRings_OnChange); static CV_PossibleValue_t ringsmin_cons_t[] = {{INT8_MIN, "MIN"}, {0, "MAX"}, {0, NULL}}; static CV_PossibleValue_t ringsmax_cons_t[] = {{0, "MIN"}, {INT8_MAX, "MAX"}, {0, NULL}}; @@ -469,71 +469,71 @@ static CV_PossibleValue_t ringsstart_cons_t[] = {{INT8_MIN, "MIN"}, {INT8_MAX, " consvar_t cv_kartringsstart = CVAR_INIT ("kartringsstart", "5", CV_NETVAR, ringsstart_cons_t, NULL); // Stacking related -consvar_t cv_kartstacking = CVAR_INIT ("kartstacking", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartStacking_OnChange); -consvar_t cv_kartstacking_diminishparam = CVAR_INIT ("kartstacking_diminishparam", "0.32", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_maxvanillaboost = CVAR_INIT ("kartstacking_maxvanillaboost", "0.375", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_speedboostdropoff = CVAR_INIT ("kartstacking_speedboostdropoff", "0.01", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_speedboostdropoff_brake = CVAR_INIT ("kartstacking_speedboostdropoff_brake", "0.05", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking = CVAR_INIT ("kartstacking", "No", CV_NETVAR|CV_CALL|CV_NOINIT|CV_GUARD, CV_YesNo, KartStacking_OnChange); +consvar_t cv_kartstacking_diminishparam = CVAR_INIT ("kartstacking_diminishparam", "0.32", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_maxvanillaboost = CVAR_INIT ("kartstacking_maxvanillaboost", "0.375", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_speedboostdropoff = CVAR_INIT ("kartstacking_speedboostdropoff", "0.01", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_speedboostdropoff_brake = CVAR_INIT ("kartstacking_speedboostdropoff_brake", "0.05", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); // V recreates neptunes old ass misread of stacking code lmao -consvar_t cv_kartstacking_accelstack = CVAR_INIT ("kartstacking_accelstack", "Off", CV_NETVAR, CV_OnOff, NULL); +consvar_t cv_kartstacking_accelstack = CVAR_INIT ("kartstacking_accelstack", "Off", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); // Vanilla Stacking boosts. -consvar_t cv_kartstacking_sneaker_easyspeedboost = CVAR_INIT ("vanillaboost_sneaker_easyspeedboost", "0.8317", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_sneaker_normalspeedboost = CVAR_INIT ("vanillaboost_sneaker_normalspeedboost", "0.5", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_sneaker_hardspeedboost = CVAR_INIT ("vanillaboost_sneaker_hardspeedboost", "0.2756", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_sneaker_expertspeedboost = CVAR_INIT ("vanillaboost_sneaker_expertspeedboost", "0.25", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_sneaker_accelboost = CVAR_INIT ("vanillaboost_sneaker_accelboost", "8.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_sneaker_maxgrade = CVAR_INIT ("vanillaboost_sneaker_maxgrade", "3", CV_NETVAR|CV_CHEAT, CV_Natural, NULL); -consvar_t cv_kartstacking_sneaker_stackable = CVAR_INIT ("vanillaboost_sneaker_stackable", "On", CV_NETVAR, CV_OnOff, NULL); +consvar_t cv_kartstacking_sneaker_easyspeedboost = CVAR_INIT ("vanillaboost_sneaker_easyspeedboost", "0.8317", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_sneaker_normalspeedboost = CVAR_INIT ("vanillaboost_sneaker_normalspeedboost", "0.5", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_sneaker_hardspeedboost = CVAR_INIT ("vanillaboost_sneaker_hardspeedboost", "0.2756", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_sneaker_expertspeedboost = CVAR_INIT ("vanillaboost_sneaker_expertspeedboost", "0.25", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_sneaker_accelboost = CVAR_INIT ("vanillaboost_sneaker_accelboost", "8.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_sneaker_maxgrade = CVAR_INIT ("vanillaboost_sneaker_maxgrade", "3", CV_NETVAR|CV_CHEAT|CV_GUARD, CV_Natural, NULL); +consvar_t cv_kartstacking_sneaker_stackable = CVAR_INIT ("vanillaboost_sneaker_stackable", "On", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); -consvar_t cv_kartstacking_invincibility_legacyspeedboost = CVAR_INIT ("vanillaboost_invincibility_legacyspeedboost", "0.375", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_invincibility_legacyaccelboost = CVAR_INIT ("vanillaboost_invincibility_legacyaccelboost", "3.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_invincibility_alternatespeedboost = CVAR_INIT ("vanillaboost_invincibility_alternatespeedboost", "0.68", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_invincibility_alternateaccelboost = CVAR_INIT ("vanillaboost_invincibility_alternateaccelboost", "3.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_invincibility_stackable = CVAR_INIT ("vanillaboost_invincibility_stackable", "Off", CV_NETVAR, CV_OnOff, NULL); +consvar_t cv_kartstacking_invincibility_legacyspeedboost = CVAR_INIT ("vanillaboost_invincibility_legacyspeedboost", "0.375", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_invincibility_legacyaccelboost = CVAR_INIT ("vanillaboost_invincibility_legacyaccelboost", "3.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_invincibility_alternatespeedboost = CVAR_INIT ("vanillaboost_invincibility_alternatespeedboost", "0.68", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_invincibility_alternateaccelboost = CVAR_INIT ("vanillaboost_invincibility_alternateaccelboost", "3.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_invincibility_stackable = CVAR_INIT ("vanillaboost_invincibility_stackable", "Off", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); -consvar_t cv_kartstacking_grow_speedboost = CVAR_INIT ("vanillaboost_grow_speedboost", "0.2", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_grow_accelboost = CVAR_INIT ("vanillaboost_grow_accelboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_grow_stackable = CVAR_INIT ("vanillaboost_grow_stackable", "Off", CV_NETVAR, CV_OnOff, NULL); +consvar_t cv_kartstacking_grow_speedboost = CVAR_INIT ("vanillaboost_grow_speedboost", "0.2", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_grow_accelboost = CVAR_INIT ("vanillaboost_grow_accelboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_grow_stackable = CVAR_INIT ("vanillaboost_grow_stackable", "Off", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); -consvar_t cv_kartstacking_bubble_speedboost = CVAR_INIT ("vanillaboost_bubble_speedboost", "0.3", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_bubble_accelboost = CVAR_INIT ("vanillaboost_bubble_accelboost", "4.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_bubble_stackable = CVAR_INIT ("vanillaboost_bubble_stackable", "Off", CV_NETVAR, CV_OnOff, NULL); +consvar_t cv_kartstacking_bubble_speedboost = CVAR_INIT ("vanillaboost_bubble_speedboost", "0.3", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_bubble_accelboost = CVAR_INIT ("vanillaboost_bubble_accelboost", "4.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_bubble_stackable = CVAR_INIT ("vanillaboost_bubble_stackable", "Off", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); -consvar_t cv_kartstacking_flame_speedval = CVAR_INIT ("vanillaboost_flame_speedval", "0.25", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_flame_accelboost = CVAR_INIT ("vanillaboost_flame_accelboost", "6.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_flame_stackable = CVAR_INIT ("vanillaboost_flame_stackable", "Off", CV_NETVAR, CV_OnOff, NULL); +consvar_t cv_kartstacking_flame_speedval = CVAR_INIT ("vanillaboost_flame_speedval", "0.25", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_flame_accelboost = CVAR_INIT ("vanillaboost_flame_accelboost", "6.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_flame_stackable = CVAR_INIT ("vanillaboost_flame_stackable", "Off", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); -consvar_t cv_kartstacking_start_speedboost = CVAR_INIT ("vanillaboost_start_speedboost", "0.25", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_start_accelboost = CVAR_INIT ("vanillaboost_start_accelboost", "6.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_start_stackable = CVAR_INIT ("vanillaboost_start_stackable", "On", CV_NETVAR, CV_OnOff, NULL); +consvar_t cv_kartstacking_start_speedboost = CVAR_INIT ("vanillaboost_start_speedboost", "0.25", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_start_accelboost = CVAR_INIT ("vanillaboost_start_accelboost", "6.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_start_stackable = CVAR_INIT ("vanillaboost_start_stackable", "On", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); -consvar_t cv_kartstacking_walltransfer_speedboost = CVAR_INIT ("vanillaboost_walltransfer_speedboost", "0.10", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_walltransfer_accelboost = CVAR_INIT ("vanillaboost_walltransfer_accelboost", "5.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_walltransfer_stackable = CVAR_INIT ("vanillaboost_walltransfer_stackable", "On", CV_NETVAR, CV_OnOff, NULL); +consvar_t cv_kartstacking_walltransfer_speedboost = CVAR_INIT ("vanillaboost_walltransfer_speedboost", "0.10", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_walltransfer_accelboost = CVAR_INIT ("vanillaboost_walltransfer_accelboost", "5.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_walltransfer_stackable = CVAR_INIT ("vanillaboost_walltransfer_stackable", "On", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); -consvar_t cv_kartstacking_drift_speedboost = CVAR_INIT ("vanillaboost_drift_speedboost", "0.25", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_drift_accelboost = CVAR_INIT ("vanillaboost_drift_accelboost", "4.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_drift_stackable = CVAR_INIT ("vanillaboost_drift_stackable", "On", CV_NETVAR, CV_OnOff, NULL); +consvar_t cv_kartstacking_drift_speedboost = CVAR_INIT ("vanillaboost_drift_speedboost", "0.25", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_drift_accelboost = CVAR_INIT ("vanillaboost_drift_accelboost", "4.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_drift_stackable = CVAR_INIT ("vanillaboost_drift_stackable", "On", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); -consvar_t cv_kartstacking_ring_speedboost = CVAR_INIT ("vanillaboost_ring_speedboost", "0.2", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_ring_accelboost = CVAR_INIT ("vanillaboost_ring_accelboost", "4.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_ring_stackable = CVAR_INIT ("vanillaboost_ring_stackable", "On", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL); +consvar_t cv_kartstacking_ring_speedboost = CVAR_INIT ("vanillaboost_ring_speedboost", "0.2", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_ring_accelboost = CVAR_INIT ("vanillaboost_ring_accelboost", "4.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_ring_stackable = CVAR_INIT ("vanillaboost_ring_stackable", "On", CV_NETVAR|CV_CHEAT|CV_GUARD, CV_OnOff, NULL); -consvar_t cv_kartstacking_slope_decay = CVAR_INIT ("vanillaboost_slope_decay", "0.004", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_slope_brakemod = CVAR_INIT ("vanillaboost_slope_brakemod", "0.01", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_slope_speedboost_max = CVAR_INIT ("vanillaboost_slope_speedboost_max", "3.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_slope_speedboost_cap = CVAR_INIT ("vanillaboost_slope_speedboost_cap", "1.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_slope_accelboost = CVAR_INIT ("vanillaboost_slope_accelboost", "3.0", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); -consvar_t cv_kartstacking_slope_stackable = CVAR_INIT ("vanillaboost_slope_stackable", "On", CV_NETVAR, CV_OnOff, NULL); +consvar_t cv_kartstacking_slope_decay = CVAR_INIT ("vanillaboost_slope_decay", "0.004", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_slope_brakemod = CVAR_INIT ("vanillaboost_slope_brakemod", "0.01", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_slope_speedboost_max = CVAR_INIT ("vanillaboost_slope_speedboost_max", "3.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_slope_speedboost_cap = CVAR_INIT ("vanillaboost_slope_speedboost_cap", "1.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_slope_accelboost = CVAR_INIT ("vanillaboost_slope_accelboost", "3.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_slope_stackable = CVAR_INIT ("vanillaboost_slope_stackable", "On", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); // Max speed for high speeds -consvar_t cv_kartstacking_drafting_minspeed = CVAR_INIT ("vanillaboost_draft_minspeed", "0.16", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_drafting_minspeed = CVAR_INIT ("vanillaboost_draft_minspeed", "0.16", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); // Max speed for low speeds -consvar_t cv_kartstacking_drafting_maxspeed = CVAR_INIT ("vanillaboost_draft_maxspeed", "0.26", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_drafting_maxspeed = CVAR_INIT ("vanillaboost_draft_maxspeed", "0.26", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); -consvar_t cv_kartchaining = CVAR_INIT ("kartchaining", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartChaining_OnChange); +consvar_t cv_kartchaining = CVAR_INIT ("kartchaining", "No", CV_NETVAR|CV_CALL|CV_NOINIT|CV_GUARD, CV_YesNo, KartChaining_OnChange); consvar_t cv_kartchainingoffroad = CVAR_INIT ("kartchaining_chainoffroad", "No", CV_NETVAR, CV_YesNo, NULL); consvar_t cv_kartitembreaker = CVAR_INIT ("kartitembreaker", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartItemBreaker_OnChange); @@ -542,7 +542,7 @@ consvar_t cv_kartitembreaker = CVAR_INIT ("kartitembreaker", "No", CV_NETVAR|CV_ consvar_t cv_kartusepwrlv = CVAR_INIT ("kartusepwrlv", "Yes", CV_NETVAR, CV_YesNo, NULL); -consvar_t cv_kartpurpledrift = CVAR_INIT ("kartpurpledrift", "No", CV_NETVAR, CV_YesNo, KartPurpleDrift_OnChange); +consvar_t cv_kartpurpledrift = CVAR_INIT ("kartpurpledrift", "No", CV_NETVAR|CV_CALL|CV_NOINIT|CV_GUARD, CV_YesNo, KartPurpleDrift_OnChange); static CV_PossibleValue_t bumpspark_cons_t[] = {{BUMPSPARK_NONE, "Off"}, {BUMPSPARK_NOCHARGE, "Remove Charge Only"}, @@ -552,33 +552,33 @@ static CV_PossibleValue_t bumpspark_cons_t[] = {{BUMPSPARK_NONE, "Off"}, consvar_t cv_kartbumpspark = CVAR_INIT("kartbumpspark", "Remove Charge Only", - CV_NETVAR | CV_CALL, + CV_NETVAR | CV_CALL | CV_NOINIT | CV_GUARD, bumpspark_cons_t, KartBumpSpark_OnChange); consvar_t cv_kartbumpspring = CVAR_INIT ("kartbumpspring", "Yes", CV_NETVAR, CV_YesNo, NULL); -consvar_t cv_kartslipdash = CVAR_INIT ("kartslipdash", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartSlipdash_OnChange); +consvar_t cv_kartslipdash = CVAR_INIT ("kartslipdash", "No", CV_NETVAR|CV_CALL|CV_NOINIT|CV_GUARD, CV_YesNo, KartSlipdash_OnChange); consvar_t cv_kartslopeboost = CVAR_INIT ("kartslopeboost", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartSlopeBoost_OnChange); -consvar_t cv_kartdrafting = CVAR_INIT ("kartdrafting", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartDrafting_OnChange); +consvar_t cv_kartdrafting = CVAR_INIT ("kartdrafting", "No", CV_NETVAR|CV_CALL|CV_NOINIT|CV_GUARD, CV_YesNo, KartDrafting_OnChange); consvar_t cv_kartdrafting_closedraft = CVAR_INIT ("kartdrafting_closedraft", "Off", CV_NETVAR, CV_OnOff, NULL); consvar_t cv_kartdrafting_closedeadzone = CVAR_INIT ("kartdrafting_closedeadzone", "640", CV_NETVAR|CV_CHEAT, CV_Unsigned, NULL); 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_kartairdrop = CVAR_INIT ("kartairdrop", "No", CV_NETVAR|CV_CALL|CV_NOINIT|CV_GUARD, CV_YesNo, KartAirDrop_OnChange); consvar_t cv_kartitemlitter = CVAR_INIT ("kartitemlitter", "On", CV_NETVAR|CV_CALL|CV_NOINIT, CV_OnOff, KartItemLitter_OnChange); // Odds distancing #define MAXODDSDIST ((INT32_MAX / FRACUNIT) / 2) static CV_PossibleValue_t distvar_cons_t[] = {{1, "MIN"}, {MAXODDSDIST, "MAX"}, {0, NULL}}; -consvar_t cv_kartoddsdist = CVAR_INIT ("kartoddsdist", "1024", CV_NETVAR|CV_CHEAT, distvar_cons_t, NULL); -consvar_t cv_kartlegacyoddsdist = CVAR_INIT ("kartlegacyoddsdist", "1472", CV_NETVAR|CV_CHEAT, distvar_cons_t, NULL); +consvar_t cv_kartoddsdist = CVAR_INIT ("kartoddsdist", "1024", CV_NETVAR|CV_CHEAT|CV_GUARD, distvar_cons_t, NULL); +consvar_t cv_kartlegacyoddsdist = CVAR_INIT ("kartlegacyoddsdist", "1472", CV_NETVAR|CV_CHEAT|CV_GUARD, distvar_cons_t, NULL); // SPB distance; no legacy modifiers currently (lazy) static CV_PossibleValue_t spbdist_cons_t[] = {{1, "MIN"}, {32000, "MAX"}, {0, NULL}}; -consvar_t cv_kartspbdist = CVAR_INIT ("kartspbdist", "6144", CV_NETVAR|CV_CHEAT, spbdist_cons_t, NULL); +consvar_t cv_kartspbdist = CVAR_INIT ("kartspbdist", "6144", CV_NETVAR|CV_CHEAT|CV_GUARD, spbdist_cons_t, NULL); #undef MAXODDSDIST // Invincibility modifiers diff --git a/src/g_demo.c b/src/g_demo.c index c0a44cf1a..e9c2e70fa 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -54,7 +54,7 @@ #include "k_color.h" #include "k_follower.h" #include "k_grandprix.h" -#include "g_party.h" +#include "strbuf.h" static CV_PossibleValue_t recordmultiplayerdemos_cons_t[] = {{0, "Disabled"}, {1, "Manual Save"}, {2, "Auto Save"}, {0, NULL}}; consvar_t cv_recordmultiplayerdemos = CVAR_INIT ("netdemo_record", "Manual Save", CV_SAVE, recordmultiplayerdemos_cons_t, NULL); @@ -3697,7 +3697,11 @@ void G_DoPlayDemo(char *defdemoname) { strbuf_t *pv = G_GetRecordPresetVersionForDemo(&header); if (pv) - G_SetPresetCvars(pv); + { + const char *faulted = G_CheckPresetCvars(pv); + if (faulted) + M_StartMessage(va("Demo cvar %s doesn't match the preset! This may be a mistake, or the demo is cheated!\n", faulted), NULL, MM_NOTHING); + } else CONS_Alert(CONS_WARNING, "Couldn't find record preset '%s' version %d\n", header.rapreset, header.rapresetversion); } diff --git a/src/g_game.c b/src/g_game.c index 3e9056bc1..244d29db3 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -550,17 +550,43 @@ strbuf_t *G_GetRecordPresetVersion(const char *name, UINT8 version) return NULL; } +const char *G_CheckPresetCvars(strbuf_t *pv) +{ + for (consvar_t *cvar = consvar_vars; cvar; cvar = cvar->next) + { + if (!(cvar->flags & CV_GUARD)) + continue; + + // if the cvar is listed in the preset, its value must match + const char *s = pv->buf + 1; + while (s - pv->buf < strbuf_len(pv)) + { + const char *name = s; + s += strlen(s)+1; + const char *value = s; + s += strlen(s)+1; + + if (!strcmp(name, cvar->name)) + { + if (!strcmp(value, cvar->string)) + goto next; + else + return cvar->name; + } + } + + // otherwise, the cvar must be set to its default value + if (strcmp(cvar->string, cvar->defaultvalue)) + return cvar->name; + next:; + } + + return NULL; +} + void G_SetPresetCvars(strbuf_t *pv) { - // TODO: CV_RAGUARD flag - CV_SetValue(&cv_kartrings, 0); - CV_SetValue(&cv_kartstacking, 0); - CV_SetValue(&cv_kartchaining, 0); - CV_SetValue(&cv_kartslipdash, 0); - CV_SetValue(&cv_kartpurpledrift, 0); - CV_SetValue(&cv_kartslopeboost, 0); - CV_SetValue(&cv_kartairdrop, 0); - CV_SetValue(&cv_kartbumpspark, 0); + CV_ResetGuardVars(); // maximum memory efficiency, am i right? const char *s = pv->buf + 1; diff --git a/src/g_game.h b/src/g_game.h index d14085597..2385828e8 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -288,6 +288,7 @@ recordpreset_t *G_AddRecordPreset(const char *name, const char *realname); const char *G_GetRecordPresetName(const char *name); strbuf_t *G_AddRecordPresetVersion(recordpreset_t *preset, UINT8 version); strbuf_t *G_GetRecordPresetVersion(const char *name, UINT8 version); +const char *G_CheckPresetCvars(strbuf_t *pv); void G_SetPresetCvars(strbuf_t *pv); boolean G_CompareRecordPresetVersions(strbuf_t *pre1, strbuf_t *pre2); diff --git a/src/k_kart.c b/src/k_kart.c index 655194358..3ebcffea9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2083,37 +2083,6 @@ boolean K_PlayerCanPunt(const player_t *player) (player->flamestore > 0 && K_GetShieldFromPlayer(player) == KSHIELD_FLAME); } -// Safe guard cvars to prevent cheating in RA. -INT32 K_RAGuard(consvar_t cvar) -{ - if (modeattacking != ATTACKING_NONE) - { - if (cvar.flags & CV_FLOAT) - { - // This is a float, atof the value and run it through FloatToFixed - return FloatToFixed(atof(cvar.defaultvalue)); - } - else - { - // Handle string bools first. - if (!strcmp(cvar.defaultvalue, "On") || !strcmp(cvar.defaultvalue, "Yes")) - { - return true; - } - - if (!strcmp(cvar.defaultvalue, "Off") || !strcmp(cvar.defaultvalue, "No")) - { - return false; - } - - // This is a int, just use atoi the value normally. - return atoi(cvar.defaultvalue); - } - } - - return cvar.value; -} - boolean K_ItemMobjAllowedtoWaterRun(mobj_t *item) { switch (item->type) diff --git a/src/k_kart.h b/src/k_kart.h index 47830ee78..0cbf6c7c3 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -82,71 +82,71 @@ extern vector3_t clusterpoint, clusterdtf; #define BUBBLEITMDAMAGE (MAXBUBBLEHEALTH) // Invincibility-related constants -#define INVINDIST K_RAGuard(cv_kartinvindist) -#define INVINDISTMUL K_RAGuard(cv_kartinvindistmul) -#define INVINMIDTIME K_RAGuard(cv_kartinvin_midtime) -#define INVINMAXTIME K_RAGuard(cv_kartinvin_maxtime) +#define INVINDIST CV_Get(&cv_kartinvindist) +#define INVINDISTMUL CV_Get(&cv_kartinvindistmul) +#define INVINMIDTIME CV_Get(&cv_kartinvin_midtime) +#define INVINMAXTIME CV_Get(&cv_kartinvin_maxtime) // Precalculated constants for stacked boost diminishing // *Somewhat* matches old calc but doesn't use arrays, which makes it faster and more memory efficent -#define DIMINISHPARAM K_RAGuard(cv_kartstacking_diminishparam) -#define MAXVANILLABOOST K_RAGuard(cv_kartstacking_maxvanillaboost) -#define SPEEDBOOSTDROPOFF K_RAGuard(cv_kartstacking_speedboostdropoff) -#define SPEEDBOOSTDROPOFF_BRAKE K_RAGuard(cv_kartstacking_speedboostdropoff_brake) -#define ACCELSTACK K_RAGuard(cv_kartstacking_accelstack) +#define DIMINISHPARAM CV_Get(&cv_kartstacking_diminishparam) +#define MAXVANILLABOOST CV_Get(&cv_kartstacking_maxvanillaboost) +#define SPEEDBOOSTDROPOFF CV_Get(&cv_kartstacking_speedboostdropoff) +#define SPEEDBOOSTDROPOFF_BRAKE CV_Get(&cv_kartstacking_speedboostdropoff_brake) +#define ACCELSTACK CV_Get(&cv_kartstacking_accelstack) // Vanilla Boosts -#define EASYSNEAKERSPEEDBOOST K_RAGuard(cv_kartstacking_sneaker_easyspeedboost) -#define NORMALSNEAKERSPEEDBOOST K_RAGuard(cv_kartstacking_sneaker_normalspeedboost) -#define HARDSNEAKERSPEEDBOOST K_RAGuard(cv_kartstacking_sneaker_hardspeedboost) -#define EXPERTSNEAKERSPEEDBOOST K_RAGuard(cv_kartstacking_sneaker_expertspeedboost) -#define SNEAKERACCELBOOST K_RAGuard(cv_kartstacking_sneaker_accelboost) -#define MAXSNEAKERSTACK K_RAGuard(cv_kartstacking_sneaker_maxgrade) -#define SNEAKERSTACKABLE K_RAGuard(cv_kartstacking_sneaker_stackable) +#define EASYSNEAKERSPEEDBOOST CV_Get(&cv_kartstacking_sneaker_easyspeedboost) +#define NORMALSNEAKERSPEEDBOOST CV_Get(&cv_kartstacking_sneaker_normalspeedboost) +#define HARDSNEAKERSPEEDBOOST CV_Get(&cv_kartstacking_sneaker_hardspeedboost) +#define EXPERTSNEAKERSPEEDBOOST CV_Get(&cv_kartstacking_sneaker_expertspeedboost) +#define SNEAKERACCELBOOST CV_Get(&cv_kartstacking_sneaker_accelboost) +#define MAXSNEAKERSTACK CV_Get(&cv_kartstacking_sneaker_maxgrade) +#define SNEAKERSTACKABLE CV_Get(&cv_kartstacking_sneaker_stackable) -#define INVINSPEEDBOOSTLGC K_RAGuard(cv_kartstacking_invincibility_legacyspeedboost) -#define INVINACCELBOOSTLGC K_RAGuard(cv_kartstacking_invincibility_legacyaccelboost) -#define INVINSPEEDBOOSTALT K_RAGuard(cv_kartstacking_invincibility_alternatespeedboost) -#define INVINACCELBOOSTALT K_RAGuard(cv_kartstacking_invincibility_alternateaccelboost) -#define INVINSTACKABLE K_RAGuard(cv_kartstacking_invincibility_stackable) +#define INVINSPEEDBOOSTLGC CV_Get(&cv_kartstacking_invincibility_legacyspeedboost) +#define INVINACCELBOOSTLGC CV_Get(&cv_kartstacking_invincibility_legacyaccelboost) +#define INVINSPEEDBOOSTALT CV_Get(&cv_kartstacking_invincibility_alternatespeedboost) +#define INVINACCELBOOSTALT CV_Get(&cv_kartstacking_invincibility_alternateaccelboost) +#define INVINSTACKABLE CV_Get(&cv_kartstacking_invincibility_stackable) -#define GROWSPEEDBOOST K_RAGuard(cv_kartstacking_grow_speedboost) -#define GROWACCELBOOST K_RAGuard(cv_kartstacking_grow_accelboost) -#define GROWSTACKABLE K_RAGuard(cv_kartstacking_grow_stackable) +#define GROWSPEEDBOOST CV_Get(&cv_kartstacking_grow_speedboost) +#define GROWACCELBOOST CV_Get(&cv_kartstacking_grow_accelboost) +#define GROWSTACKABLE CV_Get(&cv_kartstacking_grow_stackable) -#define BUBBLESPEEDBOOST K_RAGuard(cv_kartstacking_bubble_speedboost) -#define BUBBLEACCELBOOST K_RAGuard(cv_kartstacking_bubble_accelboost) -#define BUBBLESTACKABLE K_RAGuard(cv_kartstacking_bubble_stackable) +#define BUBBLESPEEDBOOST CV_Get(&cv_kartstacking_bubble_speedboost) +#define BUBBLEACCELBOOST CV_Get(&cv_kartstacking_bubble_accelboost) +#define BUBBLESTACKABLE CV_Get(&cv_kartstacking_bubble_stackable) -#define FLAMESPEEDVAL K_RAGuard(cv_kartstacking_flame_speedval) -#define FLAMEACCELBOOST K_RAGuard(cv_kartstacking_flame_accelboost) -#define FLAMESTACKABLE K_RAGuard(cv_kartstacking_flame_stackable) +#define FLAMESPEEDVAL CV_Get(&cv_kartstacking_flame_speedval) +#define FLAMEACCELBOOST CV_Get(&cv_kartstacking_flame_accelboost) +#define FLAMESTACKABLE CV_Get(&cv_kartstacking_flame_stackable) -#define STARTSPEEDBOOST K_RAGuard(cv_kartstacking_start_speedboost) -#define STARTACCELBOOST K_RAGuard(cv_kartstacking_start_accelboost) -#define STARTSTACKABLE K_RAGuard(cv_kartstacking_start_stackable) +#define STARTSPEEDBOOST CV_Get(&cv_kartstacking_start_speedboost) +#define STARTACCELBOOST CV_Get(&cv_kartstacking_start_accelboost) +#define STARTSTACKABLE CV_Get(&cv_kartstacking_start_stackable) -#define WALLTRANSFERSPEEDBOOST K_RAGuard(cv_kartstacking_walltransfer_speedboost) -#define WALLTRANSFERACCELBOOST K_RAGuard(cv_kartstacking_walltransfer_accelboost) -#define WALLTRANSFERSTACKABLE K_RAGuard(cv_kartstacking_walltransfer_stackable) +#define WALLTRANSFERSPEEDBOOST CV_Get(&cv_kartstacking_walltransfer_speedboost) +#define WALLTRANSFERACCELBOOST CV_Get(&cv_kartstacking_walltransfer_accelboost) +#define WALLTRANSFERSTACKABLE CV_Get(&cv_kartstacking_walltransfer_stackable) -#define DRIFTSPEEDBOOST K_RAGuard(cv_kartstacking_drift_speedboost) -#define DRIFTACCELBOOST K_RAGuard(cv_kartstacking_drift_accelboost) -#define DRIFTSTACKABLE K_RAGuard(cv_kartstacking_drift_stackable) +#define DRIFTSPEEDBOOST CV_Get(&cv_kartstacking_drift_speedboost) +#define DRIFTACCELBOOST CV_Get(&cv_kartstacking_drift_accelboost) +#define DRIFTSTACKABLE CV_Get(&cv_kartstacking_drift_stackable) -#define RINGSPEEDBOOST K_RAGuard(cv_kartstacking_ring_speedboost) -#define RINGACCELBOOST K_RAGuard(cv_kartstacking_ring_accelboost) -#define RINGSTACKABLE K_RAGuard(cv_kartstacking_ring_stackable) +#define RINGSPEEDBOOST CV_Get(&cv_kartstacking_ring_speedboost) +#define RINGACCELBOOST CV_Get(&cv_kartstacking_ring_accelboost) +#define RINGSTACKABLE CV_Get(&cv_kartstacking_ring_stackable) -#define SLOPEDECAY K_RAGuard(cv_kartstacking_slope_decay) -#define SLOPEBRAKEMOD K_RAGuard(cv_kartstacking_slope_brakemod) -#define SLOPESPEEDBOOSTMAX K_RAGuard(cv_kartstacking_slope_speedboost_max) -#define SLOPESPEEDBOOSTCAP K_RAGuard(cv_kartstacking_slope_speedboost_cap) -#define SLOPEACCELBOOST K_RAGuard(cv_kartstacking_slope_accelboost) -#define SLOPESTACKABLE K_RAGuard(cv_kartstacking_slope_stackable) +#define SLOPEDECAY CV_Get(&cv_kartstacking_slope_decay) +#define SLOPEBRAKEMOD CV_Get(&cv_kartstacking_slope_brakemod) +#define SLOPESPEEDBOOSTMAX CV_Get(&cv_kartstacking_slope_speedboost_max) +#define SLOPESPEEDBOOSTCAP CV_Get(&cv_kartstacking_slope_speedboost_cap) +#define SLOPEACCELBOOST CV_Get(&cv_kartstacking_slope_accelboost) +#define SLOPESTACKABLE CV_Get(&cv_kartstacking_slope_stackable) -#define DRAFTMINSPEED K_RAGuard(cv_kartstacking_drafting_minspeed) -#define DRAFTMAXSPEED K_RAGuard(cv_kartstacking_drafting_maxspeed) +#define DRAFTMINSPEED CV_Get(&cv_kartstacking_drafting_minspeed) +#define DRAFTMAXSPEED CV_Get(&cv_kartstacking_drafting_maxspeed) #define CANTCHAINOFFROAD (cv_kartchaining.value && !cv_kartchainingoffroad.value) @@ -183,8 +183,6 @@ typedef enum #define RINGVOLUMEREGEN 1 #define RINGTRANSPARENCYREGEN 3 -INT32 K_RAGuard(consvar_t cvar); - angle_t K_ReflectAngle(angle_t angle, angle_t against, fixed_t maxspeed, fixed_t yourspeed); void K_RegisterKartStuff(void); diff --git a/src/k_odds.h b/src/k_odds.h index c5ad73f59..81ff8351d 100644 --- a/src/k_odds.h +++ b/src/k_odds.h @@ -20,7 +20,6 @@ #include "d_player.h" // Need for player_t #include "d_ticcmd.h" #include "m_fixed.h" -#include "k_kart.h" // K_RAGuard #ifdef __cplusplus extern "C" { @@ -30,9 +29,9 @@ extern "C" { #define MAXODDS 16 // Distance variables -#define DISTVAR K_RAGuard(cv_kartoddsdist) -#define DISTVAR_LEGACY K_RAGuard(cv_kartlegacyoddsdist) -#define SPBDISTVAR K_RAGuard(cv_kartspbdist) +#define DISTVAR CV_Get(&cv_kartoddsdist) +#define DISTVAR_LEGACY CV_Get(&cv_kartlegacyoddsdist) +#define SPBDISTVAR CV_Get(&cv_kartspbdist) extern consvar_t *KartItemCVars[NUMKARTRESULTS-1];