From fd18ff893b4bcbc3974171ae72ce9d0691c5d778 Mon Sep 17 00:00:00 2001 From: terencehill Date: Fri, 1 Apr 2022 01:06:20 +0200 Subject: [PATCH] Fix gameplay tips appearing even if the relative mutators aren't enabled by implementing a system to detect active mutators in client and menu code --- qcsrc/common/mutators/mutator/hook/cl_hook.qc | 9 ++- qcsrc/common/mutators/mutator/nades/nades.qc | 14 +++- .../offhand_blaster/cl_offhand_blaster.qc | 9 ++- qcsrc/common/util.qc | 67 ++++++++++++------- qcsrc/common/util.qh | 31 +++++++++ 5 files changed, 98 insertions(+), 32 deletions(-) diff --git a/qcsrc/common/mutators/mutator/hook/cl_hook.qc b/qcsrc/common/mutators/mutator/hook/cl_hook.qc index 4c8b2621a..be88853bb 100644 --- a/qcsrc/common/mutators/mutator/hook/cl_hook.qc +++ b/qcsrc/common/mutators/mutator/hook/cl_hook.qc @@ -5,9 +5,12 @@ REGISTER_MUTATOR(cl_hook, true); MUTATOR_HOOKFUNCTION(cl_hook, BuildGameplayTipsString) { - string key = getcommandkey(_("off-hand hook"), "+hook"); - M_ARGV(0, string) = strcat(M_ARGV(0, string), - "\n\n", sprintf(_("^3grappling hook^8 is enabled, press ^3%s^8 to use it"), key), "\n"); + if (mut_is_active(MUT_GRAPPLING_HOOK)) + { + string key = getcommandkey(_("off-hand hook"), "+hook"); + M_ARGV(0, string) = strcat(M_ARGV(0, string), + "\n\n", sprintf(_("^3grappling hook^8 is enabled, press ^3%s^8 to use it"), key), "\n"); + } } #endif diff --git a/qcsrc/common/mutators/mutator/nades/nades.qc b/qcsrc/common/mutators/mutator/nades/nades.qc index 36531e87f..5ea4cb49c 100644 --- a/qcsrc/common/mutators/mutator/nades/nades.qc +++ b/qcsrc/common/mutators/mutator/nades/nades.qc @@ -120,9 +120,12 @@ MUTATOR_HOOKFUNCTION(cl_nades, EditProjectile) MUTATOR_HOOKFUNCTION(cl_nades, BuildGameplayTipsString) { - string key = getcommandkey(_("drop weapon / throw nade"), "dropweapon"); - M_ARGV(0, string) = strcat(M_ARGV(0, string), - "\n\n", sprintf(_("^3nades^8 are enabled, press ^3%s^8 to use them"), key), "\n"); + if (mut_is_active(MUT_NADES)) + { + string key = getcommandkey(_("drop weapon / throw nade"), "dropweapon"); + M_ARGV(0, string) = strcat(M_ARGV(0, string), + "\n\n", sprintf(_("^3nades^8 are enabled, press ^3%s^8 to use them"), key), "\n"); + } } bool Projectile_isnade(int p) @@ -1572,6 +1575,11 @@ MUTATOR_HOOKFUNCTION(nades, SpectateCopy) STAT(VEIL_ORB_ALPHA, client) = STAT(VEIL_ORB_ALPHA, spectatee); } +MUTATOR_HOOKFUNCTION(nades, BuildMutatorsPrettyString) +{ + M_ARGV(0, string) = strcat(M_ARGV(0, string), ", Nades"); +} + MUTATOR_HOOKFUNCTION(nades, BuildMutatorsString) { M_ARGV(0, string) = strcat(M_ARGV(0, string), ":Nades"); diff --git a/qcsrc/common/mutators/mutator/offhand_blaster/cl_offhand_blaster.qc b/qcsrc/common/mutators/mutator/offhand_blaster/cl_offhand_blaster.qc index ebf44d000..f6b15aeda 100644 --- a/qcsrc/common/mutators/mutator/offhand_blaster/cl_offhand_blaster.qc +++ b/qcsrc/common/mutators/mutator/offhand_blaster/cl_offhand_blaster.qc @@ -4,7 +4,10 @@ REGISTER_MUTATOR(cl_offhand_blaster, true); MUTATOR_HOOKFUNCTION(cl_offhand_blaster, BuildGameplayTipsString) { - string key = getcommandkey(_("off-hand hook"), "+hook"); - M_ARGV(0, string) = strcat(M_ARGV(0, string), - "\n\n", sprintf(_("^3offhand blaster^8 is enabled, press ^3%s^8 to use it"), key), "\n"); + if (mut_is_active(MUT_OFFHAND_BLASTER)) + { + string key = getcommandkey(_("off-hand hook"), "+hook"); + M_ARGV(0, string) = strcat(M_ARGV(0, string), + "\n\n", sprintf(_("^3offhand blaster^8 is enabled, press ^3%s^8 to use it"), key), "\n"); + } } diff --git a/qcsrc/common/util.qc b/qcsrc/common/util.qc index cea6c03ff..f1c5f96cb 100644 --- a/qcsrc/common/util.qc +++ b/qcsrc/common/util.qc @@ -211,6 +211,22 @@ string draw_UseSkinFor(string pic) return strcat(draw_currentSkin, "/", pic); } +void mut_set_active(int mut) +{ + if (mut >= 24) + active_mutators[1] |= BIT(mut - 24); + else + active_mutators[0] |= BIT(mut); +} + +bool mut_is_active(int mut) +{ + if (mut >= 24) + return (active_mutators[1] & (BIT(mut - 24))); + else + return (active_mutators[0] & BIT(mut)); +} + // if s == "" (MENUQC) builds the mutator list for the Mutators dialog based on local cvar values // otherwise (CSQC) translates the mutator list (s) that client has received from server // NOTE: this function merges MENUQC and CSQC code in order to avoid duplicating and separating strings @@ -226,29 +242,34 @@ string build_mutator_list(string s) for (string arg = ""; i < n; i++) { if (i >= 0) arg = argv(i); - if(arg == "Dodging" || (!n && cvar("g_dodging"))) s2 = cons_mid(s2, ", ", _("Dodging")); - if(arg == "InstaGib" || (!n && cvar("g_instagib"))) s2 = cons_mid(s2, ", ", _("InstaGib")); - if(arg == "New Toys" || (!n && cvar("g_new_toys"))) s2 = cons_mid(s2, ", ", _("New Toys")); - if(arg == "NIX" || (!n && cvar("g_nix"))) s2 = cons_mid(s2, ", ", _("NIX")); - if(arg == "Rocket Flying" || (!n && cvar("g_rocket_flying"))) s2 = cons_mid(s2, ", ", _("Rocket Flying")); - if(arg == "Invincible Projectiles" || (!n && cvar("g_invincible_projectiles"))) s2 = cons_mid(s2, ", ", _("Invincible Projectiles")); - if(arg == "Low gravity" || (!n && cvar("sv_gravity") < stof(cvar_defstring("sv_gravity")))) s2 = cons_mid(s2, ", ", _("Low gravity")); - if(arg == "Cloaked" || (!n && cvar("g_cloaked"))) s2 = cons_mid(s2, ", ", _("Cloaked")); - if(arg == "Hook" || (!n && cvar("g_grappling_hook"))) s2 = cons_mid(s2, ", ", _("Hook")); - if(arg == "Midair" || (!n && cvar("g_midair"))) s2 = cons_mid(s2, ", ", _("Midair")); - if(arg == "Melee only" || (!n && cvar("g_melee_only"))) s2 = cons_mid(s2, ", ", _("Melee only")); - if(arg == "Vampire" || (!n && cvar("g_vampire"))) s2 = cons_mid(s2, ", ", _("Vampire")); - if(arg == "Piñata" || (!n && cvar("g_pinata"))) s2 = cons_mid(s2, ", ", _("Piñata")); - if(arg == "Weapons stay" || (!n && cvar("g_weapon_stay"))) s2 = cons_mid(s2, ", ", _("Weapons stay")); - if(arg == "Blood loss" || (!n && cvar("g_bloodloss") > 0)) s2 = cons_mid(s2, ", ", _("Blood loss")); - if(arg == "Jetpack" || (!n && cvar("g_jetpack"))) s2 = cons_mid(s2, ", ", _("Jetpack")); - if(arg == "Buffs" || (!n && cvar("g_buffs") > 0)) s2 = cons_mid(s2, ", ", _("Buffs")); - if(arg == "Overkill" || (!n && cvar("g_overkill"))) s2 = cons_mid(s2, ", ", _("Overkill")); - if(arg == "No powerups" || (!n && cvar("g_powerups") == 0)) s2 = cons_mid(s2, ", ", _("No powerups")); - if(arg == "Powerups" || (!n && cvar("g_powerups") > 0)) s2 = cons_mid(s2, ", ", _("Powerups")); - if(arg == "Touch explode" || (!n && cvar("g_touchexplode") > 0)) s2 = cons_mid(s2, ", ", _("Touch explode")); - if(arg == "Wall jumping" || (!n && cvar("g_walljump"))) s2 = cons_mid(s2, ", ", _("Wall jumping")); - if(arg == "No start weapons" || (!n && cvar_string("g_weaponarena") == "0" && cvar("g_balance_blaster_weaponstartoverride") == 0)) s2 = cons_mid(s2, ", ", _("No start weapons")); + #define X(name, translated_name, mut, cond) \ + if(arg == name || (!n && (cond))) { s2 = cons_mid(s2, ", ", translated_name); mut_set_active(mut); } + X("Dodging" , _("Dodging") , MUT_DODGING , cvar("g_dodging")) + X("InstaGib" , _("InstaGib") , MUT_INSTAGIB , cvar("g_instagib")) + X("New Toys" , _("New Toys") , MUT_NEW_TOYS , cvar("g_new_toys")) + X("NIX" , _("NIX") , MUT_NIX , cvar("g_nix")) + X("Rocket Flying" , _("Rocket Flying") , MUT_ROCKET_FLYING , cvar("g_rocket_flying")) + X("Invincible Projectiles" , _("Invincible Projectiles") , MUT_INVINCIBLE_PROJECTILES , cvar("g_invincible_projectiles")) + X("Low gravity" , _("Low gravity") , MUT_GRAVITY , cvar("sv_gravity") < stof(cvar_defstring("sv_gravity"))) + X("Cloaked" , _("Cloaked") , MUT_CLOAKED , cvar("g_cloaked")) + X("Hook" , _("Hook") , MUT_GRAPPLING_HOOK , cvar("g_grappling_hook")) + X("Midair" , _("Midair") , MUT_MIDAIR , cvar("g_midair")) + X("Melee only" , _("Melee only") , MUT_MELEE_ONLY , cvar("g_melee_only")) + X("Vampire" , _("Vampire") , MUT_VAMPIRE , cvar("g_vampire")) + X("Piñata" , _("Piñata") , MUT_PINATA , cvar("g_pinata")) + X("Weapons stay" , _("Weapons stay") , MUT_WEAPON_STAY , cvar("g_weapon_stay")) + X("Blood loss" , _("Blood loss") , MUT_BLOODLOSS , cvar("g_bloodloss") > 0) + X("Jetpack" , _("Jetpack") , MUT_JETPACK , cvar("g_jetpack")) + X("Buffs" , _("Buffs") , MUT_BUFFS , cvar("g_buffs") > 0) + X("Overkill" , _("Overkill") , MUT_OVERKILL , cvar("g_overkill")) + X("No powerups" , _("No powerups") , MUT_NO_POWERUPS , cvar("g_powerups") == 0) + X("Powerups" , _("Powerups") , MUT_POWERUPS , cvar("g_powerups") > 0) + X("Touch explode" , _("Touch explode") , MUT_TOUCHEXPLODE , cvar("g_touchexplode") > 0) + X("Wall jumping" , _("Wall jumping") , MUT_WALLJUMP , cvar("g_walljump")) + X("No start weapons" , _("No start weapons") , MUT_WEAPONARENA , cvar_string("g_weaponarena") == "0" && cvar("g_balance_blaster_weaponstartoverride") == 0) + X("Nades" , _("Nades") , MUT_NADES , cvar("g_nades")) + X("Offhand blaster" , _("Offhand blaster") , MUT_OFFHAND_BLASTER , cvar("g_offhand_blaster")) + #undef X } return s2; } diff --git a/qcsrc/common/util.qh b/qcsrc/common/util.qh index 8a6da62a6..4b53b8d7e 100644 --- a/qcsrc/common/util.qh +++ b/qcsrc/common/util.qh @@ -45,6 +45,37 @@ void wordwrap_cb(string s, float l, void(string) callback); string draw_currentSkin; string draw_UseSkinFor(string pic); +// some of these aren't proper mutators, e.g. jetpack +const int MUT_DODGING = 0; +const int MUT_INSTAGIB = 1; +const int MUT_NEW_TOYS = 2; +const int MUT_NIX = 3; +const int MUT_ROCKET_FLYING = 4; +const int MUT_INVINCIBLE_PROJECTILES = 5; +const int MUT_GRAVITY = 6; +const int MUT_CLOAKED = 7; +const int MUT_GRAPPLING_HOOK = 8; +const int MUT_MIDAIR = 9; +const int MUT_MELEE_ONLY = 10; +const int MUT_VAMPIRE = 11; +const int MUT_PINATA = 12; +const int MUT_WEAPON_STAY = 13; +const int MUT_BLOODLOSS = 14; +const int MUT_JETPACK = 15; +const int MUT_BUFFS = 16; +const int MUT_OVERKILL = 17; +const int MUT_NO_POWERUPS = 18; +const int MUT_POWERUPS = 19; +const int MUT_TOUCHEXPLODE = 20; +const int MUT_WALLJUMP = 21; +const int MUT_WEAPONARENA = 22; +const int MUT_NADES = 23; +const int MUT_OFFHAND_BLASTER = 24; + +const int MUT_MAX = 47; + +int active_mutators[2]; +bool mut_is_active(int mut); string build_mutator_list(string s); #endif -- 2.39.2