X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fcompat%2Fquake3.qc;h=11b9f7188c8164661655a79b4e658295fe9bd621;hp=4d469b455dc1919c1061c238e10d8be061afc8fc;hb=0b9df86c9a55dd9ed9031b21e430fc3094fac709;hpb=ebec51e2a451b28980fcd246eb002b6d0c6bae8a diff --git a/qcsrc/server/compat/quake3.qc b/qcsrc/server/compat/quake3.qc index 4d469b455..11b9f7188 100644 --- a/qcsrc/server/compat/quake3.qc +++ b/qcsrc/server/compat/quake3.qc @@ -2,35 +2,66 @@ #include #include -#include +#include +#include #include -#include +#include +#include #include #include #include #include #include -//*********************** -//QUAKE 3 ENTITIES - So people can play quake3 maps with the xonotic weapons -//*********************** - -// NOTE: for best experience, you need to swap MGs with SGs in the map or it won't have a MG - -// SG -> SG -SPAWNFUNC_ITEM(ammo_shells, ITEM_Shells) - -// MG -> MG -SPAWNFUNC_ITEM(ammo_bullets, ITEM_Bullets) +/*********************** + * 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 + 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 & BIT(0)), ITEM_Bullets, ITEM_Shells) +SPAWNFUNC_WEAPON_COND(weapon_shotgun, (q3compat & BIT(0)), WEP_MACHINEGUN, WEP_SHOTGUN) + +// MG -> SG || MG +SPAWNFUNC_ITEM_COND(ammo_bullets, (q3compat & BIT(0)), ITEM_Shells, ITEM_Bullets) // GL -> Mortar SPAWNFUNC_ITEM(ammo_grenades, ITEM_Rockets) -// Mines -> Rockets +// Team Arena Proximity Launcher -> Mine Layer SPAWNFUNC_WEAPON(weapon_prox_launcher, WEP_MINE_LAYER) SPAWNFUNC_ITEM(ammo_mines, ITEM_Rockets) -// LG -> Lightning +// Team Arena Chaingun -> HLAC +SPAWNFUNC_WEAPON(weapon_chaingun, WEP_HLAC) +SPAWNFUNC_ITEM(ammo_belt, ITEM_Cells) + +// 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) + +// LG -> Electro SPAWNFUNC_WEAPON(weapon_lightning, WEP_ELECTRO) SPAWNFUNC_ITEM(ammo_lightning, ITEM_Cells) @@ -42,9 +73,9 @@ SPAWNFUNC_ITEM(ammo_cells, ITEM_Rockets) SPAWNFUNC_WEAPON(weapon_railgun, WEP_VORTEX) SPAWNFUNC_ITEM(ammo_slugs, ITEM_Cells) -// BFG -> Crylink -SPAWNFUNC_WEAPON(weapon_bfg, WEP_CRYLINK) -SPAWNFUNC_ITEM(ammo_bfg, ITEM_Cells) +// 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) // grappling hook -> hook SPAWNFUNC_WEAPON(weapon_grapplinghook, WEP_HOOK) @@ -56,6 +87,9 @@ SPAWNFUNC_ITEM(ammo_rockets, ITEM_Rockets) SPAWNFUNC_ITEM(item_armor_body, ITEM_ArmorMega) SPAWNFUNC_ITEM(item_armor_combat, ITEM_ArmorBig) SPAWNFUNC_ITEM(item_armor_shard, ITEM_ArmorSmall) +SPAWNFUNC_ITEM(item_armor_green, ITEM_ArmorMedium) // CCTF + +// Battle Suit SPAWNFUNC_ITEM(item_enviro, ITEM_Shield) // medkit -> armor (we have no holdables) @@ -243,35 +277,31 @@ spawnfunc(target_fragsFilter) this.use = fragsfilter_use; } -//spawnfunc(item_flight) /* handled by buffs mutator */ -//spawnfunc(item_doubler) /* handled by buffs mutator */ -//spawnfunc(item_haste) /* handled by buffs mutator */ -//spawnfunc(item_health) /* handled in t_quake.qc */ -//spawnfunc(item_health_large) /* handled in t_items.qc */ -//spawnfunc(item_health_small) /* handled in t_items.qc */ -//spawnfunc(item_health_mega) /* handled in t_items.qc */ -//spawnfunc(item_invis) /* handled by buffs mutator */ -//spawnfunc(item_regen) /* handled by buffs mutator */ - -// CTF spawnfuncs handled in mutators/gamemode_ctf.qc now - -.float notteam; -.float notsingle; -.float notfree; -.float notq3a; -.float notta; +.bool notteam; +.bool notsingle; +.bool notfree; +.bool notta; +.bool notvq3; +.bool notcpm; .string gametype; bool DoesQ3ARemoveThisEntity(entity this) { // Q3 style filters (DO NOT USE, THIS IS COMPAT ONLY) - if(this.notq3a) - if(!teamplay || g_tdm || g_ctf) + // DeFRaG mappers use "notcpm" or "notvq3" to disable an entity in CPM or VQ3 physics + // Xonotic is usually played with a CPM-based physics so we default to CPM mode + if(cvar_string("g_mod_physics") == "Q3") + { + if(this.notvq3) return true; + } + else if(this.notcpm) + return true; + // Q3 mappers use "notq3a" or "notta" to disable an entity in Q3A or Q3TA + // Xonotic has ~equivalent features to Team Arena if(this.notta) - if (!(!teamplay || g_tdm || g_ctf)) - return true; + return true; if(this.notsingle) if(maxclients == 1) @@ -288,17 +318,19 @@ bool DoesQ3ARemoveThisEntity(entity this) if(this.gametype) { string gametypename; - // static char *gametypeNames[] = {"ffa", "tournament", "single", "team", "ctf", "oneflag", "obelisk", "harvester", "teamtournament"} + // From ioq3 g_spawn.c: static char *gametypeNames[] = {"ffa", "tournament", "single", "team", "ctf", "oneflag", "obelisk", "harvester"}; gametypename = "ffa"; if(teamplay) gametypename = "team"; if(g_ctf) gametypename = "ctf"; + if(g_ctf && ctf_oneflag) + gametypename = "oneflag"; if(g_duel) gametypename = "tournament"; if(maxclients == 1) gametypename = "single"; - // we do not have the other types (oneflag, obelisk, harvester, teamtournament) + // we do not have the other types (obelisk, harvester) if(strstrofs(this.gametype, gametypename, 0) < 0) return true; }