From ae449a62e9e9265e3185358101bf7b096691ba81 Mon Sep 17 00:00:00 2001 From: div0 Date: Fri, 5 Sep 2008 06:52:32 +0000 Subject: [PATCH] trigger_items git-svn-id: svn://svn.icculus.org/nexuiz/trunk@4346 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/common/constants.qh | 2 + data/qcsrc/server/cl_client.qc | 2 +- data/qcsrc/server/cl_weapons.qc | 18 ++-- data/qcsrc/server/miscfunctions.qc | 4 + data/qcsrc/server/race.qc | 20 ++++ data/qcsrc/server/t_items.qc | 139 +++++++++++++++++++++++++ data/qcsrc/server/w_crylink.qc | 6 +- data/qcsrc/server/w_electro.qc | 4 +- data/qcsrc/server/w_grenadelauncher.qc | 4 +- data/qcsrc/server/w_hagar.qc | 4 +- data/qcsrc/server/w_minstanex.qc | 2 +- data/qcsrc/server/w_nex.qc | 2 +- data/qcsrc/server/w_porto.qc | 2 +- data/qcsrc/server/w_rocketlauncher.qc | 2 +- data/qcsrc/server/w_shotgun.qc | 4 +- data/qcsrc/server/w_uzi.qc | 2 +- data/scripts/entities.def | 18 ++++ 17 files changed, 209 insertions(+), 26 deletions(-) diff --git a/data/qcsrc/common/constants.qh b/data/qcsrc/common/constants.qh index a58604f4d..1f3d220d1 100644 --- a/data/qcsrc/common/constants.qh +++ b/data/qcsrc/common/constants.qh @@ -293,6 +293,8 @@ float WEP_MINSTANEX = 11; float WEPBIT_MINSTANEX = 1024; float WEP_LAST = 11; float WEPBIT_ALL = 2047; float WEP_COUNT = 12; +float IT_UNLIMITED_AMMO = 1; +// when this bit is set, using a weapon does not reduce ammo. Checkpoints can give this powerup. float IT_SHELLS = 256; float IT_NAILS = 512; float IT_ROCKETS = 1024; diff --git a/data/qcsrc/server/cl_client.qc b/data/qcsrc/server/cl_client.qc index 33f6fe617..970c21aca 100644 --- a/data/qcsrc/server/cl_client.qc +++ b/data/qcsrc/server/cl_client.qc @@ -633,7 +633,7 @@ void PutClientInServer (void) self.ammo_cells = start_ammo_cells; self.health = start_health; self.armorvalue = start_armorvalue; - self.items = 0; + self.items = start_items; self.weapons = start_weapons; self.switchweapon = start_switchweapon; self.cnt = start_switchweapon; diff --git a/data/qcsrc/server/cl_weapons.qc b/data/qcsrc/server/cl_weapons.qc index 9a4ba37cb..5f61b963f 100644 --- a/data/qcsrc/server/cl_weapons.qc +++ b/data/qcsrc/server/cl_weapons.qc @@ -399,20 +399,20 @@ void Nixnex_GiveCurrentWeapon() if(nixnex_nextchange != self.nixnex_lastchange_id) // this shall only be called once per round! { self.nixnex_lastchange_id = nixnex_nextchange; - if (cvar("g_use_ammunition")) - { - self.ammo_shells = cvar("g_balance_nixnex_ammo_shells"); - self.ammo_nails = cvar("g_balance_nixnex_ammo_nails"); - self.ammo_rockets = cvar("g_balance_nixnex_ammo_rockets"); - self.ammo_cells = cvar("g_balance_nixnex_ammo_cells"); - } - else + if (self.items & IT_UNLIMITED_AMMO) { self.ammo_shells = cvar("g_pickup_shells_max"); self.ammo_nails = cvar("g_pickup_nails_max"); self.ammo_rockets = cvar("g_pickup_rockets_max"); self.ammo_cells = cvar("g_pickup_cells_max"); } + else + { + self.ammo_shells = cvar("g_balance_nixnex_ammo_shells"); + self.ammo_nails = cvar("g_balance_nixnex_ammo_nails"); + self.ammo_rockets = cvar("g_balance_nixnex_ammo_rockets"); + self.ammo_cells = cvar("g_balance_nixnex_ammo_cells"); + } self.nixnex_nextincr = time + cvar("g_balance_nixnex_incrtime"); if(dt >= 1 && dt <= 5) self.nixnex_lastinfotime = -42; @@ -426,7 +426,7 @@ void Nixnex_GiveCurrentWeapon() centerprint(self, strcat("^3", ftos(dt), "^2 seconds until weapon change...\n\nNext weapon: ^3", W_Name(nixnex_nextweapon), "\n")); } - if(cvar("g_use_ammunition") && time > self.nixnex_nextincr) + if(!(self.items & IT_UNLIMITED_AMMO) && time > self.nixnex_nextincr) { self.ammo_shells = self.ammo_shells + cvar("g_balance_nixnex_ammoincr_shells"); self.ammo_nails = self.ammo_nails + cvar("g_balance_nixnex_ammoincr_nails"); diff --git a/data/qcsrc/server/miscfunctions.qc b/data/qcsrc/server/miscfunctions.qc index 2a381c8c4..75efdd0dd 100644 --- a/data/qcsrc/server/miscfunctions.qc +++ b/data/qcsrc/server/miscfunctions.qc @@ -701,6 +701,7 @@ float g_pickup_healthmega; float g_pickup_healthmega_max; float start_weapons; +float start_items; float start_switchweapon; float start_ammo_shells; float start_ammo_nails; @@ -770,6 +771,7 @@ void readlevelcvars(void) // initialize starting values for players start_weapons = 0; + start_items = 0; start_switchweapon = 0; start_ammo_shells = 0; start_ammo_nails = 0; @@ -784,6 +786,7 @@ void readlevelcvars(void) start_switchweapon = WEP_ROCKET_LAUNCHER; weapon_action(start_switchweapon, WR_PRECACHE); start_ammo_rockets = 999; + start_items |= IT_UNLIMITED_AMMO; } else if(g_nixnex) { @@ -829,6 +832,7 @@ void readlevelcvars(void) start_ammo_nails = cvar("g_pickup_nails_max"); start_ammo_rockets = cvar("g_pickup_rockets_max"); start_ammo_cells = cvar("g_pickup_cells_max"); + start_items |= IT_UNLIMITED_AMMO; } for(i = WEP_FIRST; i <= WEP_LAST; ++i) diff --git a/data/qcsrc/server/race.qc b/data/qcsrc/server/race.qc index 1fc65fda7..e4f665631 100644 --- a/data/qcsrc/server/race.qc +++ b/data/qcsrc/server/race.qc @@ -301,9 +301,29 @@ void dumpsurface(entity e) void checkpoint_touch() { + if(other.classname == "porto") + { + // do not allow portalling through checkpoints + trace_plane_normal = normalize(-1 * other.velocity); + self = other; + W_Porto_Fail(); + return; + } + if(other.classname != "player") return; + /* + * Remove unauthorized equipment + */ + Portal_ClearAll(other); + + /* + * Trigger targets + */ + activator = other; + SUB_UseTargets(); + EXACTTRIGGER_TOUCH; if(other.race_checkpoint == -1 || other.race_checkpoint == self.race_checkpoint) diff --git a/data/qcsrc/server/t_items.qc b/data/qcsrc/server/t_items.qc index 86091dd7a..d474542ac 100644 --- a/data/qcsrc/server/t_items.qc +++ b/data/qcsrc/server/t_items.qc @@ -24,6 +24,7 @@ string Item_CounterFieldName(float it) case IT_NAILS: return "nails"; case IT_ROCKETS: return "rockets"; case IT_CELLS: return "cells"; + // add more things here (health, armor) default: error("requested item has no counter field name"); } @@ -881,3 +882,141 @@ void spawnfunc_func_wall (void) self.use = func_wall_use; } +void trigger_items_use (void) +{ + if(activator.classname != "player") + return; + if(activator.deadflag != DEAD_NO) + return; + EXACTTRIGGER_TOUCH; + + float _switchweapon; + _switchweapon = FALSE; + if (activator.autoswitch) + if (activator.switchweapon == w_getbestweapon(activator)) + _switchweapon = TRUE; + + if(self.spawnflags == 0) // SET + { + activator.ammo_shells = self.ammo_shells; + activator.ammo_nails = self.ammo_nails; + activator.ammo_rockets = self.ammo_rockets; + activator.ammo_cells = self.ammo_cells; + activator.health = self.health; + activator.armorvalue = self.armorvalue; + activator.weapons = self.weapons; + activator.items = self.items; + + if(self.weapons) + sound (activator, CHAN_AUTO, "weapons/weaponpickup.wav", VOL_BASE, ATTN_NORM); + if(self.items) + sound (activator, CHAN_AUTO, "misc/itempickup.wav", VOL_BASE, ATTN_NORM); + if(self.health) + sound (activator, CHAN_AUTO, "misc/megahealth.wav", VOL_BASE, ATTN_NORM); + if(self.armorvalue) + sound (activator, CHAN_AUTO, "misc/armor25.wav", VOL_BASE, ATTN_NORM); + if(self.items & IT_STRENGTH) + { + sound (activator, CHAN_AUTO, "misc/powerup.wav", VOL_BASE, ATTN_NORM); + activator.strength_finished = max(activator.strength_finished, time + self.strength_finished); + } + if(self.items & IT_INVINCIBLE) + { + sound (activator, CHAN_AUTO, "misc/powerup_shield.wav", VOL_BASE, ATTN_NORM); + activator.invincible_finished = max(activator.invincible_finished, time + self.invincible_finished); + } + } + else if(self.spawnflags == 1) // AND/MIN + { + activator.ammo_shells = min(activator.ammo_shells, self.ammo_shells); + activator.ammo_nails = min(activator.ammo_nails, self.ammo_nails); + activator.ammo_rockets = min(activator.ammo_rockets, self.ammo_rockets); + activator.ammo_cells = min(activator.ammo_cells, self.ammo_cells); + activator.health = min(activator.health, self.health); + activator.armorvalue = min(activator.armorvalue, self.armorvalue); + activator.weapons = activator.weapons & self.weapons; + activator.items = activator.items & self.items; + + if not(self.items & IT_STRENGTH) + activator.strength_finished = 0; + if not(self.items & IT_INVINCIBLE) + activator.invincible_finished = 0; + } + else if(self.spawnflags == 2) // OR/MAX + { + activator.ammo_shells = max(activator.ammo_shells, self.ammo_shells); + activator.ammo_nails = max(activator.ammo_nails, self.ammo_nails); + activator.ammo_rockets = max(activator.ammo_rockets, self.ammo_rockets); + activator.ammo_cells = max(activator.ammo_cells, self.ammo_cells); + activator.health = max(activator.health, self.health); + activator.armorvalue = max(activator.armorvalue, self.armorvalue); + activator.weapons |= self.weapons; + activator.items |= self.items; + + if(self.weapons) + sound (activator, CHAN_AUTO, "weapons/weaponpickup.wav", VOL_BASE, ATTN_NORM); + if(self.items) + sound (activator, CHAN_AUTO, "misc/itempickup.wav", VOL_BASE, ATTN_NORM); + if(self.health) + sound (activator, CHAN_AUTO, "misc/megahealth.wav", VOL_BASE, ATTN_NORM); + if(self.armorvalue) + sound (activator, CHAN_AUTO, "misc/armor25.wav", VOL_BASE, ATTN_NORM); + if(self.items & IT_STRENGTH) + { + sound (activator, CHAN_AUTO, "misc/powerup.wav", VOL_BASE, ATTN_NORM); + activator.strength_finished = max(activator.strength_finished, time + self.strength_finished); + } + if(self.items & IT_INVINCIBLE) + { + sound (activator, CHAN_AUTO, "misc/powerup_shield.wav", VOL_BASE, ATTN_NORM); + activator.invincible_finished = max(activator.invincible_finished, time + self.invincible_finished); + } + } + else if(self.spawnflags == 4) // ANDNOT/MIN + { + activator.ammo_shells = min(activator.ammo_shells, self.ammo_shells); + activator.ammo_nails = min(activator.ammo_nails, self.ammo_nails); + activator.ammo_rockets = min(activator.ammo_rockets, self.ammo_rockets); + activator.ammo_cells = min(activator.ammo_cells, self.ammo_cells); + activator.health = min(activator.health, self.health); + activator.armorvalue = min(activator.armorvalue, self.armorvalue); + activator.weapons -= activator.weapons & self.weapons; + activator.items -= activator.items & self.items; + + if(self.items & IT_STRENGTH) + activator.strength_finished = 0; + if(self.items & IT_INVINCIBLE) + activator.invincible_finished = 0; + } + + if not(activator.weapons & W_WeaponBit(activator.switchweapon)) + _switchweapon = TRUE; + if(_switchweapon) + W_SwitchWeapon_Force(activator, w_getbestweapon(activator)); +} + +void spawnfunc_trigger_items (void) +{ + float n, i, j; + entity e; + EXACTTRIGGER_INIT; + self.use = trigger_items_use; + if(!self.strength_finished) + self.strength_finished = cvar("g_balance_powerup_strength_time"); + if(!self.invincible_finished) + self.invincible_finished = cvar("g_balance_powerup_invincible_time"); + + n = tokenize(self.message); + for(i = 0; i < n; ++i) + { + if(argv(i) == "unlimited_ammo") self.items |= IT_UNLIMITED_AMMO; + if(argv(i) == "strength") self.items |= IT_STRENGTH; + if(argv(i) == "shield") self.items |= IT_INVINCIBLE; + for(j = WEP_FIRST; j <= WEP_LAST; ++j) + { + e = get_weaponinfo(j); + if(argv(i) == e.netname) + self.weapons |= e.weapons; + } + } +} diff --git a/data/qcsrc/server/w_crylink.qc b/data/qcsrc/server/w_crylink.qc index 977f7b359..03854fd1a 100644 --- a/data/qcsrc/server/w_crylink.qc +++ b/data/qcsrc/server/w_crylink.qc @@ -67,7 +67,7 @@ void W_Crylink_Attack (void) local entity proj; local vector s; - if (cvar("g_use_ammunition")) + if not(self.items & IT_UNLIMITED_AMMO) self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_primary_ammo"); W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire.wav"); @@ -131,7 +131,7 @@ void W_Crylink_Attack2 (void) local float counter, shots; local entity proj; - if (cvar("g_use_ammunition")) + if not(self.items & IT_UNLIMITED_AMMO) self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_secondary_ammo"); W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/crylink_fire.wav"); @@ -180,7 +180,7 @@ void W_Crylink_Attack2 (void) // experimental lightning gun void W_Crylink_Attack3 (void) { - if (cvar("g_use_ammunition")) + if not(self.items & IT_UNLIMITED_AMMO) self.ammo_cells = self.ammo_cells - cvar("g_balance_crylink_primary_ammo"); W_SetupShot (self, '25 8 -8', TRUE, 0, "weapons/crylink_fire.wav"); diff --git a/data/qcsrc/server/w_electro.qc b/data/qcsrc/server/w_electro.qc index 3746ec887..5be097cec 100644 --- a/data/qcsrc/server/w_electro.qc +++ b/data/qcsrc/server/w_electro.qc @@ -109,7 +109,7 @@ void W_Electro_Attack() proj.solid = SOLID_BBOX; setorigin(proj, w_shotorg); - if (cvar("g_use_ammunition")) + if not(self.items & IT_UNLIMITED_AMMO) self.ammo_cells = self.ammo_cells - cvar("g_balance_electro_primary_ammo"); proj.effects = EF_BRIGHTFIELD | EF_LOWPRECISION; proj.movetype = MOVETYPE_FLY; @@ -143,7 +143,7 @@ void W_Electro_Attack2() proj.solid = SOLID_BBOX; setorigin(proj, w_shotorg); - if (cvar("g_use_ammunition")) + if not(self.items & IT_UNLIMITED_AMMO) self.ammo_cells = self.ammo_cells - cvar("g_balance_electro_secondary_ammo"); proj.effects = EF_LOWPRECISION; //proj.glow_size = 50; diff --git a/data/qcsrc/server/w_grenadelauncher.qc b/data/qcsrc/server/w_grenadelauncher.qc index 5d5cfd523..7cdbed38e 100644 --- a/data/qcsrc/server/w_grenadelauncher.qc +++ b/data/qcsrc/server/w_grenadelauncher.qc @@ -76,7 +76,7 @@ void W_Grenade_Attack (void) { local entity gren; - if (cvar("g_use_ammunition")) + if not(self.items & IT_UNLIMITED_AMMO) self.ammo_rockets = self.ammo_rockets - cvar("g_balance_grenadelauncher_primary_ammo"); W_SetupShot (self, '25 6 -8', FALSE, 4, "weapons/grenade_fire.wav"); //W_SetupShot (self, '25 8 -8', FALSE, 4, "weapons/grenade_fire.wav"); // TODO: move model to the right a little @@ -111,7 +111,7 @@ void W_Grenade_Attack2 (void) { local entity gren; - if (cvar("g_use_ammunition")) + if not(self.items & IT_UNLIMITED_AMMO) self.ammo_rockets = self.ammo_rockets - cvar("g_balance_grenadelauncher_secondary_ammo"); W_SetupShot (self, '25 6 -8', FALSE, 4, "weapons/grenade_fire.wav"); //W_SetupShot (self, '25 8 -8', FALSE, 4, "weapons/grenade_fire.wav"); // TODO: move model to the right a little diff --git a/data/qcsrc/server/w_hagar.qc b/data/qcsrc/server/w_hagar.qc index 1d544de2d..e05055e14 100644 --- a/data/qcsrc/server/w_hagar.qc +++ b/data/qcsrc/server/w_hagar.qc @@ -80,7 +80,7 @@ void W_Hagar_Attack (void) { local entity missile; - if (cvar("g_use_ammunition")) + if not(self.items & IT_UNLIMITED_AMMO) self.ammo_rockets = self.ammo_rockets - cvar("g_balance_hagar_primary_ammo"); W_SetupShot (self, '25 5 -8', FALSE, 2, "weapons/hagar_fire.wav"); //W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/hagar_fire.wav"); // TODO: move model a little to the right @@ -119,7 +119,7 @@ void W_Hagar_Attack2 (void) { local entity missile; - if (cvar("g_use_ammunition")) + if not(self.items & IT_UNLIMITED_AMMO) self.ammo_rockets = self.ammo_rockets - cvar("g_balance_hagar_secondary_ammo"); W_SetupShot (self, '25 5 -8', FALSE, 2, "weapons/hagar_fire.wav"); //W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/hagar_fire.wav"); // TODO: move model a little to the right diff --git a/data/qcsrc/server/w_minstanex.qc b/data/qcsrc/server/w_minstanex.qc index da40a966e..626a4be97 100644 --- a/data/qcsrc/server/w_minstanex.qc +++ b/data/qcsrc/server/w_minstanex.qc @@ -23,7 +23,7 @@ void W_MinstaNex_Attack (void) // play a sound soundat (self, trace_endpos, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM); - if (cvar("g_use_ammunition")) + if not(self.items & IT_UNLIMITED_AMMO) { if (g_minstagib) self.ammo_cells = self.ammo_cells - 1; diff --git a/data/qcsrc/server/w_nex.qc b/data/qcsrc/server/w_nex.qc index 20975a0d6..4a3021589 100644 --- a/data/qcsrc/server/w_nex.qc +++ b/data/qcsrc/server/w_nex.qc @@ -22,7 +22,7 @@ void W_Nex_Attack (void) // play a sound soundat (self, trace_endpos, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM); - if (cvar("g_use_ammunition")) + if not(self.items & IT_UNLIMITED_AMMO) { self.ammo_cells = self.ammo_cells - cvar("g_balance_nex_ammo"); } diff --git a/data/qcsrc/server/w_porto.qc b/data/qcsrc/server/w_porto.qc index c2c2ba30a..87b9fe450 100644 --- a/data/qcsrc/server/w_porto.qc +++ b/data/qcsrc/server/w_porto.qc @@ -98,7 +98,7 @@ void W_Porto_Attack (void) { local entity gren; - if (cvar("g_use_ammunition")) + if not(self.items & IT_UNLIMITED_AMMO) self.weapons = self.weapons - (self.weapons & WEPBIT_PORTO); W_SetupShot (self, '0 0 0', FALSE, 4, "weapons/grenade_fire.wav"); diff --git a/data/qcsrc/server/w_rocketlauncher.qc b/data/qcsrc/server/w_rocketlauncher.qc index 7692a28ba..e198bbeaa 100644 --- a/data/qcsrc/server/w_rocketlauncher.qc +++ b/data/qcsrc/server/w_rocketlauncher.qc @@ -213,7 +213,7 @@ void W_Rocket_Attack (void) local entity missile; local entity flash, flash2; - if (cvar("g_use_ammunition") && !g_rocketarena) + if not(self.items & IT_UNLIMITED_AMMO) self.ammo_rockets = self.ammo_rockets - cvar("g_balance_rocketlauncher_ammo"); W_SetupShot (self, '25 3 -4', FALSE, 5, "weapons/rocket_fire.wav"); diff --git a/data/qcsrc/server/w_shotgun.qc b/data/qcsrc/server/w_shotgun.qc index 827a96434..61ff05c66 100644 --- a/data/qcsrc/server/w_shotgun.qc +++ b/data/qcsrc/server/w_shotgun.qc @@ -16,7 +16,7 @@ void W_Shotgun_Attack (void) W_SetupShot (self, '25 8 -8', TRUE, 5, "weapons/shotgun_fire.wav"); for (sc = 0;sc < bullets;sc = sc + 1) fireBullet (w_shotorg, w_shotdir, spread, d, f, WEP_SHOTGUN, sc < 3); - if (cvar("g_use_ammunition")) + if not(self.items & IT_UNLIMITED_AMMO) self.ammo_shells = self.ammo_shells - cvar("g_balance_shotgun_primary_ammo"); pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, cvar("g_balance_shotgun_primary_ammo")); @@ -59,7 +59,7 @@ void W_Shotgun_Attack2 (void) W_SetupShot (self, '25 8 -8', TRUE, 5, "weapons/shotgun_fire.wav"); for (sc = 0;sc < bullets;sc = sc + 1) fireBullet (w_shotorg, w_shotdir, spread, d, f, WEP_SHOTGUN, sc < 3); - if (cvar("g_use_ammunition")) + if not(self.items & IT_UNLIMITED_AMMO) self.ammo_shells = self.ammo_shells - cvar("g_balance_shotgun_secondary_ammo"); pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, cvar("g_balance_shotgun_secondary_ammo")); diff --git a/data/qcsrc/server/w_uzi.qc b/data/qcsrc/server/w_uzi.qc index 5a73c6053..91a614337 100644 --- a/data/qcsrc/server/w_uzi.qc +++ b/data/qcsrc/server/w_uzi.qc @@ -15,7 +15,7 @@ void W_Uzi_Attack (void) { local entity flash, flash2; - if (cvar("g_use_ammunition")) + if not(self.items & IT_UNLIMITED_AMMO) { if (self.uzi_bulletcounter == 1) self.ammo_nails = self.ammo_nails - cvar("g_balance_uzi_first_ammo"); diff --git a/data/scripts/entities.def b/data/scripts/entities.def index 6ce65beed..7810ede15 100644 --- a/data/scripts/entities.def +++ b/data/scripts/entities.def @@ -922,6 +922,7 @@ A checkpoint, for the race game mode. Be sure to make them quite long, so they a cnt: Number of the checkpoint. 0 for finish line, and at least two other checkpoints have to exist. They MUST be touched in sequential order! message: Death message, when touching checkpoints in the wrong order. targetname: Name of the checkpoint. info_player_race can target this to assign a spawn to a checkpoint. Also used for triggering a checkpoint by an event. +target: when the checkpoint is passed, these entities are triggered. Useful for forcing items in certain areas using trigger_items -------- SPAWNFLAGS -------- NOTOUCH: the checkpoint will not become active when touched, it HAS to be targeted CRUSH: the checkpoint kills when used at the wrong time @@ -1006,6 +1007,7 @@ model="models/weapons/g_minstanex.md3" /*QUAKED weapon_porto (1 0 .5) (-30 -30 0) (30 30 32) FLOATING the Port-O-Launch. Only can be shot once. +Portals cannot be made on noimpact surfaces, and the portal missile will bounce on slick surfaces. -------- KEYS -------- respawntime: time till it respawns (default: 120) team: out of items with the same value here, only one (random one) will spawn. Useful to put multiple items on one spot. @@ -1014,3 +1016,19 @@ FLOATING: the item will float in air, instead of aligning to the floor by fallin -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY -------- model="models/weapons/g_porto.md3" */ + +/*QUAKED trigger_items (0 0 1) (-8 -8 -8) (8 8 8) AND OR ANDNOT +Sets the items of any player who triggers this. +-------- KEYS -------- +message: space separated list of items (either weapon short names (like in g_start_weapon_* cvars), or item short names "unlimited_ammo", "shield" and "strength" +ammo_shells: amount of shells +ammo_nails: amount of bullets +ammo_rockets: amount of rockets +ammo_cells: amount of cells +health: amount of health +armorvalue: amount of armor +-------- SPAWNFLAGS -------- +AND: any items not listed will get removed, and none will get added +OR: the player may keep items not listed +ANDNOT: the items listed will get removed from the player +*/ -- 2.39.2