From: bones_was_here Date: Thu, 27 Aug 2020 23:50:47 +0000 (+1000) Subject: Support count field of Q3 ammo pickups, also tuba support X-Git-Tag: xonotic-v0.8.5~352^2~39 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=493cb49141eae2273fc05dca1396ab7585abee30;p=xonotic%2Fxonotic-data.pk3dir.git Support count field of Q3 ammo pickups, also tuba support --- diff --git a/qcsrc/common/weapons/all.qc b/qcsrc/common/weapons/all.qc index 6b675468c..631aaf11b 100644 --- a/qcsrc/common/weapons/all.qc +++ b/qcsrc/common/weapons/all.qc @@ -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 diff --git a/qcsrc/common/weapons/weapon.qh b/qcsrc/common/weapons/weapon.qh index d072dd915..916acdf9e 100644 --- a/qcsrc/common/weapons/weapon.qh +++ b/qcsrc/common/weapons/weapon.qh @@ -231,6 +231,8 @@ string GetAmmoPicture(int ammotype); string GetAmmoName(int ammotype); +entity GetAmmoItem(int ammotype); + #ifdef SVQC int GetAmmoConsumptionPrimary(string netname); #endif diff --git a/qcsrc/server/compat/quake3.qc b/qcsrc/server/compat/quake3.qc index 392d96f71..71a11b630 100644 --- a/qcsrc/server/compat/quake3.qc +++ b/qcsrc/server/compat/quake3.qc @@ -13,7 +13,6 @@ #include #include #include -#include /*********************** * QUAKE 3 ENTITIES - So people can play quake3 maps with the xonotic weapons @@ -22,73 +21,71 @@ * 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) diff --git a/qcsrc/server/compat/quake3.qh b/qcsrc/server/compat/quake3.qh index 783044653..d6ca4fd55 100644 --- a/qcsrc/server/compat/quake3.qh +++ b/qcsrc/server/compat/quake3.qh @@ -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) +