]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Fix gameplay tips appearing even if the relative mutators aren't enabled by implement...
authorterencehill <piuntn@gmail.com>
Thu, 31 Mar 2022 23:06:20 +0000 (01:06 +0200)
committerterencehill <piuntn@gmail.com>
Thu, 31 Mar 2022 23:06:20 +0000 (01:06 +0200)
qcsrc/common/mutators/mutator/hook/cl_hook.qc
qcsrc/common/mutators/mutator/nades/nades.qc
qcsrc/common/mutators/mutator/offhand_blaster/cl_offhand_blaster.qc
qcsrc/common/util.qc
qcsrc/common/util.qh

index 4c8b2621a44b05da3a8c502448464054e5d5547a..be88853bbf37e2e2cb312367ff86ed90becd8c45 100644 (file)
@@ -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
index 36531e87f4eae03506833482a573f0bb98354563..5ea4cb49cfb9a4d4deb6802d8bf8e82d1cad3491 100644 (file)
@@ -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");
index ebf44d000db02a4b9b3e61e24abcd6967e0af27b..f6b15aeda92f279e9e6172039205972eb9fd3e19 100644 (file)
@@ -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");
+       }
 }
index cea6c03ff9dedf5658926b982f739ca02d7565ad..f1c5f96cb5396c78a0c8d6df7a33e42e4ed107c7 100644 (file)
@@ -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;
 }
index 8a6da62a60c96670e8f46be224801cd9801f089a..4b53b8d7e12cadc396347d3a6068bf71210176d9 100644 (file)
@@ -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