]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Support count field of Q3 ammo pickups, also tuba support
authorbones_was_here <bones_was_here@xa.org.au>
Thu, 27 Aug 2020 23:50:47 +0000 (09:50 +1000)
committerbones_was_here <bones_was_here@xa.org.au>
Thu, 27 Aug 2020 23:50:47 +0000 (09:50 +1000)
qcsrc/common/weapons/all.qc
qcsrc/common/weapons/weapon.qh
qcsrc/server/compat/quake3.qc
qcsrc/server/compat/quake3.qh

index 6b675468c91c4c6a7f870dcc82663785250ca4ba..631aaf11b51c2a910229cac79426cb986c98f6c1 100644 (file)
@@ -237,6 +237,23 @@ string GetAmmoName(int ammotype)
        }
 }
 
+entity GetAmmoItem(int ammotype)
+{
+       switch (ammotype)
+       {
+               case RES_SHELLS:  return ITEM_Shells;
+               case RES_BULLETS: return ITEM_Bullets;
+               case RES_ROCKETS: return ITEM_Rockets;
+               case RES_CELLS:   return ITEM_Cells;
+               case RES_PLASMA:  return ITEM_Plasma;
+               case RES_FUEL:    return ITEM_JetpackFuel;
+       }
+       LOG_WARNF("Invalid ammo type %d ", ammotype);
+       return NULL;
+       // WEAPONTODO: use this generic func to reduce duplication ?
+       // GetAmmoPicture  GetAmmoName  notif_arg_item_wepammo  ammo_pickupevalfunc ?
+}
+
 #ifdef SVQC
 int GetAmmoConsumptionPrimary(string netname)
 // Returns ammo consumed per shot by the primary/default fire mode
index d072dd915ec99242d199c809bcc5b4827069aedf..916acdf9ed97c0cc316685a6bab8eadeb8c3cbf5 100644 (file)
@@ -231,6 +231,8 @@ string GetAmmoPicture(int ammotype);
 
 string GetAmmoName(int ammotype);
 
+entity GetAmmoItem(int ammotype);
+
 #ifdef SVQC
 int GetAmmoConsumptionPrimary(string netname);
 #endif
index 392d96f71be7d85271041fcee7ecc0705c8b6af0..71a11b6305acf60308cec6235aad6cdca5109ed2 100644 (file)
@@ -13,7 +13,6 @@
 #include <common/mapobjects/trigger/counter.qh>
 #include <common/mutators/mutator/buffs/buffs.qh>
 #include <common/notifications/all.qh>
-#include <common/weapons/_all.qh>
 
 /***********************
  * QUAKE 3 ENTITIES - So people can play quake3 maps with the xonotic weapons
  * Map entities NOT handled in this file:
  holdable_invulnerability      Q3TA    currently unsupported
  holdable_kamikaze             Q3TA    currently unsupported
- item_ammoregen                        Q3TA    handled by buffs mutator
- item_doubler                  Q3TA    handled by buffs mutator
- item_guard                    Q3TA    handled by buffs mutator
- item_scout                    Q3TA    handled by buffs mutator
- item_armor_jacket             CPMA    handled in quake2.qc
- item_flight                   Q3A     handled by buffs mutator
- item_haste                    Q3A     handled by buffs mutator
- item_health                   Q3A     handled in quake.qc
- item_health_large             Q3A     handled in items.qc
- item_health_small             Q3A     handled in health.qh
- item_health_mega              Q3A     handled in health.qh
- item_invis                    Q3A     handled by buffs mutator
- item_quad                     Q3A     handled in items.qc
- item_regen                    Q3A     handled by buffs mutator
+ item_ammoregen                        Q3TA    buffs mutator
+ item_doubler                  Q3TA    buffs mutator
+ item_guard                    Q3TA    buffs mutator
+ item_scout                    Q3TA    buffs mutator
+ item_armor_jacket             CPMA    quake2.qc
+ item_flight                   Q3A     buffs mutator
+ item_haste                    Q3A     buffs mutator
+ item_health                   Q3A     quake.qc
+ item_health_large             Q3A     items.qc
+ item_health_small             Q3A     health.qh
+ item_health_mega              Q3A     health.qh
+ item_invis                    Q3A     buffs mutator
+ item_quad                     Q3A     items.qc
+ item_regen                    Q3A     buffs mutator
+ weapon_machinegun             Q3A     machinegun.qh
+ weapon_grenadelauncher                Q3A     mortar.qh
+ weapon_rocketlauncher         Q3A     devastator.qh
  CTF spawnfuncs handled in sv_ctf.qc
 
  NOTE: for best experience, you need to swap MGs with SGs in the map or it won't have a MG
 */
 
 // SG -> MG || SG
-SPAWNFUNC_ITEM_COND(ammo_shells, (q3compat & Q3COMPAT_ARENA), ITEM_Bullets, ITEM_Shells)
-SPAWNFUNC_WEAPON_COND(weapon_shotgun, (q3compat & Q3COMPAT_ARENA), WEP_MACHINEGUN, WEP_SHOTGUN)
+SPAWNFUNC_Q3_COND(weapon_shotgun, ammo_shells, (q3compat & Q3COMPAT_ARENA), WEP_MACHINEGUN, WEP_SHOTGUN)
 
 // MG -> SG || MG
-SPAWNFUNC_ITEM_COND(ammo_bullets, (q3compat & Q3COMPAT_ARENA), ITEM_Shells, ITEM_Bullets)
+// Technically we should replace weapon_machinegun with WEP_SHOTGUN if Q3COMPAT_ARENA, but it almost never occurs on Q3 maps
+SPAWNFUNC_Q3AMMO_COND(ammo_bullets, (q3compat & Q3COMPAT_ARENA), WEP_SHOTGUN, WEP_MACHINEGUN)
 
 // GL -> Mortar
-SPAWNFUNC_ITEM(ammo_grenades, ITEM_Rockets)
+SPAWNFUNC_Q3AMMO(ammo_grenades, WEP_MORTAR)
 
 // Team Arena Proximity Launcher -> Mortar
 // It's more accurate to spawn Mine Layer but players prefer Mortar, and weapon_grenadelauncher is usually disabled by "notta" and weapon_prox_launcher placed at the same origin
-SPAWNFUNC_WEAPON(weapon_prox_launcher, WEP_MORTAR)
-SPAWNFUNC_ITEM(ammo_mines, ITEM_Rockets)
+SPAWNFUNC_Q3(weapon_prox_launcher, ammo_mines, WEP_MORTAR)
 
 // Team Arena Chaingun -> HLAC
-SPAWNFUNC_WEAPON(weapon_chaingun, WEP_HLAC)
-SPAWNFUNC_ITEM(ammo_belt, ITEM_Cells)
+SPAWNFUNC_Q3(weapon_chaingun, ammo_belt, WEP_HLAC)
 
 // Quake Live Heavy Machine Gun -> HLAC
-SPAWNFUNC_WEAPON(weapon_hmg, WEP_HLAC)
-SPAWNFUNC_ITEM(ammo_hmg, ITEM_Cells)
+SPAWNFUNC_Q3(weapon_hmg, ammo_hmg, WEP_HLAC)
 
 // Team Arena Nailgun -> Crylink || Quake Nailgun -> Electro
-SPAWNFUNC_WEAPON_COND(weapon_nailgun, cvar("sv_mapformat_is_quake3"), WEP_CRYLINK, WEP_ELECTRO)
-SPAWNFUNC_ITEM(ammo_nails, ITEM_Cells)
+SPAWNFUNC_Q3_COND(weapon_nailgun, ammo_nails, cvar("sv_mapformat_is_quake3"), WEP_CRYLINK, WEP_ELECTRO)
 
 // LG -> Electro
-SPAWNFUNC_WEAPON(weapon_lightning, WEP_ELECTRO)
-SPAWNFUNC_ITEM(ammo_lightning, ITEM_Cells)
+SPAWNFUNC_Q3(weapon_lightning, ammo_lightning, WEP_ELECTRO)
 
 // Plasma -> Hagar
-SPAWNFUNC_WEAPON(weapon_plasmagun, WEP_HAGAR)
-SPAWNFUNC_ITEM(ammo_cells, ITEM_Rockets)
+SPAWNFUNC_Q3(weapon_plasmagun, ammo_cells, WEP_HAGAR)
 
 // Rail -> Vortex
-SPAWNFUNC_WEAPON(weapon_railgun, WEP_VORTEX)
-SPAWNFUNC_ITEM(ammo_slugs, ITEM_Cells)
+SPAWNFUNC_Q3(weapon_railgun, ammo_slugs, WEP_VORTEX)
 
 // BFG -> Crylink || Fireball
-SPAWNFUNC_WEAPON_COND(weapon_bfg, cvar_string("g_mod_balance") == "XDF", WEP_CRYLINK, WEP_FIREBALL)
-SPAWNFUNC_ITEM_COND(ammo_bfg, cvar_string("g_mod_balance") == "XDF", ITEM_Cells, ITEM_Rockets)
+SPAWNFUNC_Q3_COND(weapon_bfg, ammo_bfg, cvar_string("g_mod_balance") == "XDF", WEP_CRYLINK, WEP_FIREBALL)
 
 // grappling hook -> hook
 SPAWNFUNC_WEAPON(weapon_grapplinghook, WEP_HOOK)
 
 // RL -> RL
-SPAWNFUNC_ITEM(ammo_rockets, ITEM_Rockets)
+SPAWNFUNC_Q3AMMO(ammo_rockets, WEP_DEVASTATOR)
+
+// Gauntlet -> Tuba
+SPAWNFUNC_ITEM(weapon_gauntlet, WEP_TUBA)
 
 // Armor
 SPAWNFUNC_ITEM(item_armor_body, ITEM_ArmorMega)
index 7830446530722d25dd5e3867052daba2312bef25..d6ca4fd55f7948ba50eee7b8fa637368b1174c41 100644 (file)
@@ -7,3 +7,36 @@ int q3compat = 0;
 bool DoesQ3ARemoveThisEntity(entity this);
 
 .int fragsfilter_cnt;
+
+// The ammo spawnfunc knows which weapon will use the ammo so it can look up the type
+// and calculate the amount required for the number of shots in the count field.
+#define _SPAWNFUNC_Q3AMMO(ammo_classname, xonwep) \
+       if(this.count) \
+               SetResource(this, xonwep.ammo_type, this.count * GetAmmoConsumptionPrimary(xonwep.netname)); \
+       spawnfunc_body(GetAmmoItem(xonwep.ammo_type));
+
+// Ammo only, unconditional
+#define SPAWNFUNC_Q3AMMO(ammo_classname, xonwep) \
+       spawnfunc(ammo_classname) \
+       { \
+               _SPAWNFUNC_Q3AMMO(ammo_classname, xonwep) \
+       }
+
+// Ammo only, conditional
+#define SPAWNFUNC_Q3AMMO_COND(ammo_classname, cond, xonwep1, xonwep0) \
+       spawnfunc(ammo_classname) \
+       { \
+               entity xonwep = (cond) ? xonwep1 : xonwep0; \
+               _SPAWNFUNC_Q3AMMO(ammo_classname, xonwep) \
+       }
+
+// Weapon & ammo, unconditional
+#define SPAWNFUNC_Q3(weapon_classname, ammo_classname, xonwep) \
+       SPAWNFUNC_WEAPON(weapon_classname, xonwep) \
+       SPAWNFUNC_Q3AMMO(ammo_classname, xonwep)
+
+// Weapon & ammo, conditional
+#define SPAWNFUNC_Q3_COND(weapon_classname, ammo_classname, cond, xonwep1, xonwep0) \
+       SPAWNFUNC_WEAPON_COND(weapon_classname, cond, xonwep1, xonwep0) \
+       SPAWNFUNC_Q3AMMO_COND(ammo_classname, cond, xonwep1, xonwep0)
+