]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Make nade selection more reliable by not using registry IDs directly
authorMario <mario.mario@y7mail.com>
Tue, 11 Feb 2025 16:50:15 +0000 (16:50 +0000)
committerbones_was_here <bones_was_here@xonotic.au>
Tue, 11 Feb 2025 16:50:15 +0000 (16:50 +0000)
16 files changed:
qcsrc/common/mutators/mutator/nades/nade/ammo.qh
qcsrc/common/mutators/mutator/nades/nade/darkness.qh
qcsrc/common/mutators/mutator/nades/nade/entrap.qh
qcsrc/common/mutators/mutator/nades/nade/heal.qh
qcsrc/common/mutators/mutator/nades/nade/ice.qh
qcsrc/common/mutators/mutator/nades/nade/monster.qh
qcsrc/common/mutators/mutator/nades/nade/napalm.qh
qcsrc/common/mutators/mutator/nades/nade/normal.qh
qcsrc/common/mutators/mutator/nades/nade/spawn.qh
qcsrc/common/mutators/mutator/nades/nade/translocate.qh
qcsrc/common/mutators/mutator/nades/nade/veil.qh
qcsrc/common/mutators/mutator/nades/nades.qc
qcsrc/common/mutators/mutator/nades/nades.qh
qcsrc/common/mutators/mutator/nades/sv_nades.qc
qcsrc/common/mutators/mutator/nades/sv_nades.qh
qcsrc/server/client.qh

index 6797826f8bc2fb5db346dfb1af991c58a51a00fe..beca99bf6807ba79bf3afbd6249490089d819f2c 100644 (file)
@@ -21,4 +21,6 @@ CLASS(AmmoNade, Nade)
        ATTRIB(AmmoNade, m_color, vector, '0.66 0.33 0');
        ATTRIB(AmmoNade, m_name, string, _("Ammo grenade"));
        ATTRIB(AmmoNade, m_icon, string, "nade_ammo");
+       ATTRIB(AmmoNade, netname, string, "ammo");
+       ATTRIB(AmmoNade, impulse, int, 10);
 ENDCLASS(AmmoNade)
index e638aa17544025155411b7ca478ba7230a2949ab..efccc06a25beff3b034d34be4da9a66447fe19e5 100644 (file)
@@ -18,4 +18,6 @@ CLASS(DarknessNade, Nade)
        ATTRIB(DarknessNade, m_color, vector, '0.23 0 0.23');
        ATTRIB(DarknessNade, m_name, string, _("Darkness grenade"));
        ATTRIB(DarknessNade, m_icon, string, "nade_darkness");
+       ATTRIB(DarknessNade, netname, string, "darkness");
+       ATTRIB(DarknessNade, impulse, int, 11);
 ENDCLASS(DarknessNade)
index e89c64fbac9cb9d299cf5cbdd2bf7814be36962f..4a260813c653251a7bba418e54b41a24d0f2acd1 100644 (file)
@@ -21,4 +21,6 @@ CLASS(EntrapNade, Nade)
        ATTRIB(EntrapNade, m_color, vector, '0.15 0.85 0');
        ATTRIB(EntrapNade, m_name, string, _("Entrap grenade"));
        ATTRIB(EntrapNade, m_icon, string, "nade_entrap");
+       ATTRIB(EntrapNade, netname, string, "entrap");
+       ATTRIB(EntrapNade, impulse, int, 8);
 ENDCLASS(EntrapNade)
index 49b6f9edb5486381e5604e7936904ef14ccf11ee..01386aedd2b1916209086b7ea424d118c28d747e 100644 (file)
@@ -19,4 +19,6 @@ CLASS(HealNade, Nade)
        ATTRIB(HealNade, m_color, vector, '1 0 0');
        ATTRIB(HealNade, m_name, string, _("Heal grenade"));
        ATTRIB(HealNade, m_icon, string, "nade_heal");
+       ATTRIB(HealNade, netname, string, "heal");
+       ATTRIB(HealNade, impulse, int, 6);
 ENDCLASS(HealNade)
index 2ac7dd2b1ecf6e3026bae6081845f140b6085ef1..ed64a8303e36f58d16243b96362b949c939b71c4 100644 (file)
@@ -19,4 +19,6 @@ CLASS(IceNade, Nade)
        ATTRIB(IceNade, m_color, vector, '0 0.5 2');
        ATTRIB(IceNade, m_name, string, _("Ice grenade"));
        ATTRIB(IceNade, m_icon, string, "nade_ice");
+       ATTRIB(IceNade, netname, string, "ice");
+       ATTRIB(IceNade, impulse, int, 3);
 ENDCLASS(IceNade)
index 464b34b5522a0f43e7688ac13c0f7ae0f547811d..50d3e8c69f9ef7d7effa84d451a9a5c437088002 100644 (file)
@@ -18,4 +18,6 @@ CLASS(MonsterNade, Nade)
        ATTRIB(MonsterNade, m_color, vector, '0.25 0.75 0');
        ATTRIB(MonsterNade, m_name, string, _("Monster grenade"));
        ATTRIB(MonsterNade, m_icon, string, "nade_monster");
+       ATTRIB(MonsterNade, netname, string, "pokenade"); // TODO: "monster"? nade needs renaming!
+       ATTRIB(MonsterNade, impulse, int, 7);
 ENDCLASS(MonsterNade)
index 26f6cc81766078be3c43f0b763c00d5b601a8f68..e8ee871e44ec456ef085719f5d5b172804f7bd21 100644 (file)
@@ -30,4 +30,6 @@ CLASS(NapalmNade, Nade)
        ATTRIB(NapalmNade, m_color, vector, '2 0.5 0');
        ATTRIB(NapalmNade, m_name, string, _("Napalm grenade"));
        ATTRIB(NapalmNade, m_icon, string, "nade_napalm");
+       ATTRIB(NapalmNade, netname, string, "napalm");
+       ATTRIB(NapalmNade, impulse, int, 2);
 ENDCLASS(NapalmNade)
index 24716f07634ece6e6463e20f56f6a67b77a2c781..76c19eb770b1bbfcb69dbbd981b64acbec3afbea 100644 (file)
@@ -10,4 +10,6 @@ CLASS(NormalNade, Nade)
        ATTRIB(NormalNade, m_color, vector, '1 1 1');
        ATTRIB(NormalNade, m_name, string, _("Grenade"));
        ATTRIB(NormalNade, m_icon, string, "nade_normal");
+       ATTRIB(NormalNade, impulse, int, 1);
+       ATTRIB(NormalNade, netname, string, "normal");
 ENDCLASS(NormalNade)
index 0b97773e3e4659483cf2fa8ce040e1db1a4ce494..5d9f09c5fb167cd5fcb190cfc73bc3d757058295 100644 (file)
@@ -16,4 +16,6 @@ CLASS(SpawnNade, Nade)
        ATTRIB(SpawnNade, m_color, vector, '1 0.9 0');
        ATTRIB(SpawnNade, m_name, string, _("Spawn grenade"));
        ATTRIB(SpawnNade, m_icon, string, "nade_spawn");
+       ATTRIB(SpawnNade, netname, string, "spawn");
+       ATTRIB(SpawnNade, impulse, int, 5);
 ENDCLASS(SpawnNade)
index 0ad11a103a84ac47d0f55356d17d5927e7bbde6f..0c01e737479784af20cd750a3b8c022783b01839 100644 (file)
@@ -16,4 +16,6 @@ CLASS(TranslocateNade, Nade)
        ATTRIB(TranslocateNade, m_color, vector, '1 0 1');
        ATTRIB(TranslocateNade, m_name, string, _("Translocate grenade"));
        ATTRIB(TranslocateNade, m_icon, string, "nade_translocate");
+       ATTRIB(TranslocateNade, netname, string, "translocate");
+       ATTRIB(TranslocateNade, impulse, int, 4);
 ENDCLASS(TranslocateNade)
index 09169da5131f4c075228a7ad06af45536524c318..95312a4747e8a8ec138037eae9f20f03dfb4f820 100644 (file)
@@ -22,4 +22,6 @@ CLASS(VeilNade, Nade)
        ATTRIB(VeilNade, m_name, string, _("Veil grenade"));
        ATTRIB(VeilNade, m_icon, string, "nade_veil");
        ATTRIB(VeilNade, m_alpha, float, 0.45);
+       ATTRIB(VeilNade, netname, string, "veil");
+       ATTRIB(VeilNade, impulse, int, 9);
 ENDCLASS(VeilNade)
index 7a6b7f08b2b8d7a3aeaa44a9986680b663a26deb..aa570b0d3324647613a13fbedd5b0beb6b24fe69 100644 (file)
@@ -11,7 +11,7 @@ REGISTER_STAT(NADES_SMALL, INT, autocvar_g_nades_nade_small)
 
 #ifdef GAMEQC
 
-REPLICATE(cvar_cl_nade_type, int, "cl_nade_type");
+REPLICATE(cvar_cl_nade_type, string, "cl_nade_type");
 REPLICATE(cvar_cl_pokenade_type, string, "cl_pokenade_type");
 
 entity Nade_TrailEffect(int proj, int nade_team)
index 456fb608ab816f16e3de5e3deb329c6296bed035..84e5a352a5fe1d68fe6f01bed9f3b7f6d7b709ab 100644 (file)
@@ -14,6 +14,8 @@ CLASS(Nade, Object)
     ATTRIB(Nade, m_name, string, _("Grenade"));
     ATTRIB(Nade, m_icon, string, "nade_normal");
     ATTRIB(Nade, m_alpha, float, 1);
+    ATTRIB(Nade, netname, string, "random");
+    ATTRIB(Nade, impulse, int, 0); // legacy number for selection, do not add to new nade types
     ATTRIBARRAY(Nade, m_projectile, int, 2);
     ATTRIBARRAY(Nade, m_trail, entity, 2);
     METHOD(Nade, display, void(entity this, void(string name, string icon) returns)) {
@@ -52,6 +54,6 @@ Nade Nade_FromProjectile(int proj)
 .float orb_radius;
 
 #ifdef GAMEQC
-REPLICATE_INIT(int, cvar_cl_nade_type);
+REPLICATE_INIT(string, cvar_cl_nade_type);
 REPLICATE_INIT(string, cvar_cl_pokenade_type);
 #endif
index 94a7cd240c7446a6e76ef6f47446a0b12d0f1c01..a14787861ab6c58517602fff23c9bab5c20e331b 100644 (file)
@@ -169,10 +169,10 @@ void nade_boom(entity this)
        delete(this);
 }
 
-void spawn_held_nade(entity player, entity nowner, float ntime, int ntype, string pntype);
+void spawn_held_nade(entity player, entity nowner, float ntime, string ntype, string pntype);
 void nade_pickup(entity this, entity thenade)
 {
-       spawn_held_nade(this, thenade.realowner, autocvar_g_nades_pickup_time, STAT(NADE_BONUS_TYPE, thenade), thenade.pokenade_type);
+       spawn_held_nade(this, thenade.realowner, autocvar_g_nades_pickup_time, REGISTRY_GET(Nades, STAT(NADE_BONUS_TYPE, thenade)).netname, thenade.pokenade_type);
 
        // set refire so player can't even
        this.nade_refire = time + autocvar_g_nades_nade_refire;
@@ -460,17 +460,34 @@ bool nade_customize(entity this, entity client)
        return true;
 }
 
-void spawn_held_nade(entity player, entity nowner, float ntime, int ntype, string pntype)
+Nade Nades_FromString(string ntype)
+{
+       FOREACH(Nades, it != NADE_TYPE_Null && (it.netname == ntype || ftos(it.impulse) == ntype),
+       {
+               return it;
+       });
+       return NADE_TYPE_Null;
+}
+
+Nade Nades_GetType(string ntype)
+{
+       Nade def = Nades_FromString(ntype);
+       if(ntype == "random" || ntype == "0")
+       {
+               int rnade = floor(random() * (REGISTRY_COUNT(Nades) - 1)) + 1;
+               def = REGISTRY_GET(Nades, rnade);
+       }
+
+       return (def == NADE_TYPE_Null) ? NADE_TYPE_NORMAL : def;
+}
+
+void spawn_held_nade(entity player, entity nowner, float ntime, string ntype, string pntype)
 {
        entity n = new(nade), fn = new(fake_nade);
 
-       n.pokenade_type = pntype;
+       Nade def = Nades_GetType(ntype);
 
-       if(ntype == 0) // random nade
-               ntype = floor(random() * (REGISTRY_COUNT(Nades) - 1)) + 1;
-       Nade def = REGISTRY_GET(Nades, ntype);
-       if(def == NADE_TYPE_Null)
-               def = NADE_TYPE_NORMAL;
+       n.pokenade_type = pntype;
 
        STAT(NADE_BONUS_TYPE, n) = def.m_id;
 
@@ -524,24 +541,24 @@ void nade_prime(entity this)
                delete(this.fake_nade);
        this.fake_nade = NULL;
 
-       int ntype;
+       Nade ntype;
        string pntype = this.pokenade_type;
 
        if(StatusEffects_active(STATUSEFFECT_Strength, this) && autocvar_g_nades_bonus_onstrength)
-               ntype = STAT(NADE_BONUS_TYPE, this);
+               ntype = REGISTRY_GET(Nades, STAT(NADE_BONUS_TYPE, this));
        else if (STAT(NADE_BONUS, this) >= 1)
        {
-               ntype = STAT(NADE_BONUS_TYPE, this);
+               ntype = REGISTRY_GET(Nades, STAT(NADE_BONUS_TYPE, this));
                pntype = this.pokenade_type;
                STAT(NADE_BONUS, this) -= 1;
        }
        else
        {
-               ntype   = ((autocvar_g_nades_client_select) ? CS_CVAR(this).cvar_cl_nade_type : autocvar_g_nades_nade_type);
-               pntype  = ((autocvar_g_nades_client_select) ? CS_CVAR(this).cvar_cl_pokenade_type : autocvar_g_nades_pokenade_monster_type);
+               ntype = Nades_FromString(((autocvar_g_nades_client_select) ? CS_CVAR(this).cvar_cl_nade_type : autocvar_g_nades_nade_type));
+               pntype = ((autocvar_g_nades_client_select) ? CS_CVAR(this).cvar_cl_pokenade_type : autocvar_g_nades_pokenade_monster_type);
        }
 
-       spawn_held_nade(this, this, autocvar_g_nades_nade_lifetime, ntype, pntype);
+       spawn_held_nade(this, this, autocvar_g_nades_nade_lifetime, ntype.netname, pntype);
 }
 
 bool CanThrowNade(entity this)
@@ -592,15 +609,15 @@ void nades_Clear(entity player)
        STAT(NADE_TIMER, player) = 0;
 }
 
-int nades_CheckTypes(entity player, int cl_ntype)
+int nades_CheckTypes(entity player, Nade cl_ntype)
 {
        // TODO check what happens without this patch
 #define CL_NADE_TYPE_CHECK(nade_ent, nade_cvar) \
-       case nade_ent.m_id: if (nade_cvar) return cl_ntype
+       case nade_ent: if (nade_cvar) return cl_ntype.m_id
 
        switch (cl_ntype)
        {
-               case 0: return 0; // random nade
+               case NADE_TYPE_Null: return 0; // random nade
                CL_NADE_TYPE_CHECK(NADE_TYPE_NAPALM,      autocvar_g_nades_napalm);
                CL_NADE_TYPE_CHECK(NADE_TYPE_ICE,         autocvar_g_nades_ice);
                CL_NADE_TYPE_CHECK(NADE_TYPE_TRANSLOCATE, autocvar_g_nades_translocate);
@@ -723,12 +740,12 @@ MUTATOR_HOOKFUNCTION(nades, PlayerPreThink)
 
                        if(autocvar_g_nades_bonus_client_select)
                        {
-                               STAT(NADE_BONUS_TYPE, player) = nades_CheckTypes(player, CS_CVAR(player).cvar_cl_nade_type);
+                               STAT(NADE_BONUS_TYPE, player) = nades_CheckTypes(player, Nades_FromString(CS_CVAR(player).cvar_cl_nade_type));
                                player.pokenade_type = CS_CVAR(player).cvar_cl_pokenade_type;
                        }
                        else
                        {
-                               STAT(NADE_BONUS_TYPE, player) = autocvar_g_nades_bonus_type;
+                               STAT(NADE_BONUS_TYPE, player) = Nades_FromString(autocvar_g_nades_bonus_type).m_id;
                                player.pokenade_type = autocvar_g_nades_pokenade_monster_type;
                        }
 
@@ -817,7 +834,7 @@ MUTATOR_HOOKFUNCTION(nades, PlayerSpawn)
                player.nade_refire += autocvar_g_nades_nade_refire;
 
        if(autocvar_g_nades_bonus_client_select)
-               STAT(NADE_BONUS_TYPE, player) = CS_CVAR(player).cvar_cl_nade_type;
+               STAT(NADE_BONUS_TYPE, player) = Nades_FromString(CS_CVAR(player).cvar_cl_nade_type).m_id;
 
        STAT(NADE_TIMER, player) = 0;
 
index 0dd01dcbfefa0dab83b86ee4b26471b1dbe16cae..ced6e588f88259e0408c839b51ca6ebf7599598c 100644 (file)
@@ -21,11 +21,11 @@ float autocvar_g_nades_nade_edgedamage;
 float autocvar_g_nades_nade_radius;
 float autocvar_g_nades_nade_force;
 int autocvar_g_nades_nade_newton_style;
-int autocvar_g_nades_nade_type;
+string autocvar_g_nades_nade_type;
 bool autocvar_g_nades_client_select;
 
 bool autocvar_g_nades_bonus;
-int autocvar_g_nades_bonus_type;
+string autocvar_g_nades_bonus_type;
 bool autocvar_g_nades_bonus_client_select;
 bool autocvar_g_nades_bonus_onstrength;
 bool autocvar_g_nades_bonus_only;
@@ -46,7 +46,7 @@ int autocvar_g_nades_bonus_score_spree;
 .float nade_special_time;
 .string pokenade_type;
 .entity nade_damage_target;
-.int cvar_cl_nade_type;
+.string cvar_cl_nade_type;
 .string cvar_cl_pokenade_type;
 .float toss_time;
 .float nade_show_particles;
index 5aa2a42ac5fc25e745b84fa4e71636352a030649..6cbda43e5e128b9813597995c219d77834789f15 100644 (file)
@@ -205,7 +205,7 @@ CLASS(Client, Object)
     ATTRIB(Client, cvar_cl_voice_directional_taunt_attenuation, float, this.cvar_cl_voice_directional_taunt_attenuation);
     ATTRIB(Client, cvar_cl_physics, string, this.cvar_cl_physics);
     ATTRIB(Client, cvar_cl_buffs_autoreplace, bool, this.cvar_cl_buffs_autoreplace);
-    ATTRIB(Client, cvar_cl_nade_type, int, this.cvar_cl_nade_type);
+    ATTRIB(Client, cvar_cl_nade_type, string, this.cvar_cl_nade_type);
     ATTRIB(Client, cvar_cl_pokenade_type, string, this.cvar_cl_pokenade_type);
     ATTRIB(Client, cvar_cl_spawn_near_teammate, bool, this.cvar_cl_spawn_near_teammate);
     ATTRIB(Client, cvar_cl_gunalign, int, this.cvar_cl_gunalign);