X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fcompat%2Fquake3.qc;h=112a7f039d95cee3c5ab34820011a0a1a7dd20d4;hp=6a7f21aa674d319bad7ece6abeb908b28b764d60;hb=991de5e6922cd3c283de56c3249624f0f1bfe767;hpb=c47eca442cbc3f383fa220473159cd40fcb2e4ba diff --git a/qcsrc/server/compat/quake3.qc b/qcsrc/server/compat/quake3.qc index 6a7f21aa6..112a7f039 100644 --- a/qcsrc/server/compat/quake3.qc +++ b/qcsrc/server/compat/quake3.qc @@ -3,10 +3,12 @@ #include #include #include +#include +#include +#include +#include #include -spawnfunc(target_items); - //*********************** //QUAKE 3 ENTITIES - So people can play quake3 maps with the xonotic weapons //*********************** @@ -82,11 +84,55 @@ void target_init_verify(entity this) } } +void target_init_use(entity this, entity actor, entity trigger) +{ + if (!(this.spawnflags & 1)) + { + SetResource(actor, RES_ARMOR, start_armorvalue); + actor.pauserotarmor_finished = time + autocvar_g_balance_pause_armor_rot; + } + + if (!(this.spawnflags & 2)) + { + SetResource(actor, RES_HEALTH, start_health); + actor.pauserothealth_finished = time + autocvar_g_balance_pause_health_rot; + actor.pauseregen_finished = time + autocvar_g_balance_pause_health_regen; + } + + if (!(this.spawnflags & 4)) + { + SetResource(actor, RES_SHELLS, start_ammo_shells); + SetResource(actor, RES_BULLETS, start_ammo_nails); + SetResource(actor, RES_ROCKETS, start_ammo_rockets); + SetResource(actor, RES_CELLS, start_ammo_cells); + SetResource(actor, RES_PLASMA, start_ammo_plasma); + SetResource(actor, RES_FUEL, start_ammo_fuel); + + STAT(WEAPONS, actor) = start_weapons; + if (this.spawnflags & 32) + { + // TODO + } + } + + if (!(this.spawnflags & 8)) + { + actor.strength_finished = 0; + actor.invincible_finished = 0; + STAT(BUFFS, actor) = 0; + } + + if (!(this.spawnflags & 16)) + { + // We don't have holdables. + } + + SUB_UseTargets(this, actor, trigger); +} + spawnfunc(target_init) { - this.spawnflags = 0; // remove all weapons except the ones listed below - this.netname = "shotgun"; // keep these weapons through the remove trigger - spawnfunc_target_items(this); + this.use = target_init_use; InitializeEntity(this, target_init_verify, INITPRIO_FINDTARGET); } @@ -96,33 +142,33 @@ void target_give_init(entity this) IL_EACH(g_items, it.targetname == this.target, { if (it.classname == "weapon_devastator") { - this.ammo_rockets += it.count * WEP_CVAR(devastator, ammo); + SetResourceExplicit(this, RES_ROCKETS, GetResource(this, RES_ROCKETS) + it.count * WEP_CVAR_PRI(devastator, ammo)); // WEAPONTODO this.netname = cons(this.netname, "devastator"); } else if (it.classname == "weapon_vortex") { - this.ammo_cells += it.count * WEP_CVAR_PRI(vortex, ammo); // WEAPONTODO + SetResourceExplicit(this, RES_CELLS, GetResource(this, RES_CELLS) + it.count * WEP_CVAR_PRI(vortex, ammo)); // WEAPONTODO this.netname = cons(this.netname, "vortex"); } else if (it.classname == "weapon_electro") { - this.ammo_cells += it.count * WEP_CVAR_PRI(electro, ammo); // WEAPONTODO + SetResourceExplicit(this, RES_CELLS, GetResource(this, RES_CELLS) + it.count * WEP_CVAR_PRI(electro, ammo)); // WEAPONTODO this.netname = cons(this.netname, "electro"); } else if (it.classname == "weapon_hagar") { - this.ammo_rockets += it.count * WEP_CVAR_PRI(hagar, ammo); // WEAPONTODO + SetResourceExplicit(this, RES_ROCKETS, GetResource(this, RES_ROCKETS) + it.count * WEP_CVAR_PRI(hagar, ammo)); // WEAPONTODO this.netname = cons(this.netname, "hagar"); } else if (it.classname == "weapon_crylink") { - this.ammo_cells += it.count * WEP_CVAR_PRI(crylink, ammo); + SetResourceExplicit(this, RES_CELLS, GetResource(this, RES_CELLS) + it.count * WEP_CVAR_PRI(crylink, ammo)); // WEAPONTODO this.netname = cons(this.netname, "crylink"); } else if (it.classname == "weapon_mortar") { - this.ammo_rockets += it.count * WEP_CVAR_PRI(mortar, ammo); // WEAPONTODO + SetResourceExplicit(this, RES_ROCKETS, GetResource(this, RES_ROCKETS) + it.count * WEP_CVAR_PRI(mortar, ammo)); // WEAPONTODO this.netname = cons(this.netname, "mortar"); } else if (it.classname == "item_armor_mega") - this.armorvalue = 100; + SetResourceExplicit(this, RES_ARMOR, 100); else if (it.classname == "item_health_mega") - this.health = 200; + SetResourceExplicit(this, RES_HEALTH, 200); //remove(it); // removing ents in init functions causes havoc, workaround: setthink(it, SUB_Remove); it.nextthink = time; @@ -138,6 +184,37 @@ spawnfunc(target_give) InitializeEntity(this, target_give_init, INITPRIO_FINDTARGET); } +void score_use(entity this, entity actor, entity trigger) +{ + if(!IS_PLAYER(actor)) + return; + actor.fragsfilter_cnt += this.count; +} +spawnfunc(target_score) +{ + if(!g_cts) { delete(this); return; } + + if(!this.count) + this.count = 1; + this.use = score_use; +} + +void fragsfilter_use(entity this, entity actor, entity trigger) +{ + if(!IS_PLAYER(actor)) + return; + if(actor.fragsfilter_cnt >= this.frags) + SUB_UseTargets(this, actor, trigger); +} +spawnfunc(target_fragsFilter) +{ + if(!g_cts) { delete(this); return; } + + if(!this.frags) + this.frags = 1; + this.use = fragsfilter_use; +} + //spawnfunc(item_flight) /* handled by buffs mutator */ //spawnfunc(item_haste) /* handled by buffs mutator */ //spawnfunc(item_health) /* handled in t_quake.qc */ @@ -188,6 +265,8 @@ bool DoesQ3ARemoveThisEntity(entity this) gametypename = "team"; if(g_ctf) gametypename = "ctf"; + if(g_duel) + gametypename = "tournament"; if(maxclients == 1) gametypename = "single"; // we do not have the other types (oneflag, obelisk, harvester, teamtournament)