X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=qcsrc%2Fserver%2Fcompat%2Fquake3.qc;h=264daeca1a9306277cd2b6f333be4039fd12c55a;hb=dc02e4d78fb0e67b47a0c1e150b4c18c0711b8bf;hp=5a9d31d86231235fcf7180ec5bbd2f97c704f8db;hpb=15760ac4bc969993cc32074d98ee122e39ee123c;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/compat/quake3.qc b/qcsrc/server/compat/quake3.qc index 5a9d31d86..264daeca1 100644 --- a/qcsrc/server/compat/quake3.qc +++ b/qcsrc/server/compat/quake3.qc @@ -7,88 +7,88 @@ #include #include #include +#include #include #include #include #include #include #include -#include /*********************** * 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 + holdable_invulnerability Q3TA buffs mutator + holdable_kamikaze Q3TA buffs mutator + holdable_teleporter Q3A 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) + // FIXME: WEP_FIREBALL has no ammo_type field so ammo_bfg is deleted by spawnfunc_body // 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) @@ -200,54 +200,32 @@ void target_give_init(entity this) { IL_EACH(g_items, it.targetname == this.target, { - if (it.classname == "weapon_devastator") { - this.ammo_rockets = it.ammo_rockets; - this.netname = cons(this.netname, "devastator"); - } - else if (it.classname == "weapon_vortex") { - this.ammo_cells = it.ammo_cells; - this.netname = cons(this.netname, "vortex"); - } - else if (it.classname == "weapon_electro") { - this.ammo_cells = it.ammo_cells; - this.netname = cons(this.netname, "electro"); - } - else if (it.classname == "weapon_hagar") { - this.ammo_rockets = it.ammo_rockets; - this.netname = cons(this.netname, "hagar"); - } - else if (it.classname == "weapon_crylink") { - this.ammo_cells = it.ammo_cells; - this.netname = cons(this.netname, "crylink"); - } - else if (it.classname == "weapon_mortar") { - this.ammo_rockets = it.ammo_rockets; - this.netname = cons(this.netname, "mortar"); - } - else if (it.classname == "weapon_shotgun") { - this.ammo_shells = it.ammo_shells; - this.netname = cons(this.netname, "shotgun"); - } - else if (it.classname == "weapon_machinegun") { - this.ammo_nails = it.ammo_nails; - this.netname = cons(this.netname, "machinegun"); - } - else if (it.classname == "item_armor_mega") - SetResourceExplicit(this, RES_ARMOR, 100); - else if (it.classname == "item_health_mega") - SetResourceExplicit(this, RES_HEALTH, 200); - else if (it.classname == "item_buff") { + if (it.classname == "item_buff") + { entity buff = buff_FirstFromFlags(STAT(BUFFS, it)); this.netname = cons(this.netname, buff.netname); - STAT(BUFF_TIME, this) = it.count; + STAT(BUFF_TIME, this) += it.count; } - else if (it.classname == "item_shield") { - this.invincible_finished = it.count; - this.netname = cons(this.netname, "invincible"); - } - else if (it.classname == "item_strength") { - this.strength_finished = it.count; - this.netname = cons(this.netname, "strength"); + else + { + if (it.ammo_rockets) + this.ammo_rockets += it.ammo_rockets; + else if (it.ammo_cells) + this.ammo_cells += it.ammo_cells; + else if (it.ammo_shells) + this.ammo_shells += it.ammo_shells; + else if (it.ammo_nails) + this.ammo_nails += it.ammo_nails; + else if (it.invincible_finished) + this.invincible_finished += it.invincible_finished; + else if (it.strength_finished) + this.strength_finished += it.strength_finished; + else if (it.health) + this.health += it.health; + else if (it.armorvalue) + this.armorvalue += it.armorvalue; + + this.netname = cons(this.netname, it.netname); } //remove(it); // removing ents in init functions causes havoc, workaround: