/*========== backpack_touch ==========*/ void() backpack_touch = { if (other.classname != "player") return; if (other.health <= 0) return; other.ammo_shells = other.ammo_shells + self.ammo_shells; other.ammo_nails = other.ammo_nails + self.ammo_nails; other.ammo_rockets = other.ammo_rockets + self.ammo_rockets; other.ammo_cells = other.ammo_cells + self.ammo_cells; W_BoundAmmo(other); W_SetCurrentAmmo(other); sound (other, CHAN_ITEM, "weapons/lock4.wav", 1, ATTN_NORM); stuffcmd (other, "bf\n"); // tell the player what's inside float comma = FALSE; sprint (other, "You get "); if (self.items) { if (self.items & IT_AXE) { sprint(other, "the Axe"); comma = TRUE; } if (self.items & IT_SHOTGUN) { if (comma) sprint(other, ", "); sprint(other, "the Shotgun"); comma = TRUE; } if (self.items & IT_SUPER_SHOTGUN) { if (comma) sprint(other, ", "); sprint(other, "the Double-barrelled Shotgun"); comma = TRUE; } if (self.items & IT_NAILGUN) { if (comma) sprint(other, ", "); sprint(other, "the Nailgun"); comma = TRUE; } if (self.items & IT_SUPER_NAILGUN) { if (comma) sprint(other, ", "); sprint(other, "the Perforator"); comma = TRUE; } if (self.items & IT_GRENADE_LAUNCHER) { if (comma) sprint(other, ", "); sprint(other, "the Grenade Launcher"); comma = TRUE; } if (self.items & IT_ROCKET_LAUNCHER) { if (comma) sprint(other, ", "); sprint(other, "the Rocket Launcher"); comma = TRUE; } if (self.items & IT_LIGHTNING) { if (comma) sprint(other, ", "); sprint(other, "the Thunderbolt"); comma = TRUE; } } if (self.ammo_shells) { if (comma) sprint(other, ", "); comma = TRUE; sprint (other, ftos(self.ammo_shells)); sprint (other, " shells"); } if (self.ammo_nails) { if (comma) sprint(other, ", "); comma = TRUE; sprint (other, ftos(self.ammo_nails)); sprint (other, " nails"); } if (self.ammo_rockets) { if (comma) sprint(other, ", "); comma = TRUE; sprint (other, ftos(self.ammo_rockets)); sprint (other, " rockets"); } if (self.ammo_cells) { if (comma) sprint(other, ", "); comma = TRUE; sprint (other, ftos(self.ammo_cells)); sprint (other, " cells"); } sprint (other, "\n"); if (self.items) { if (other.items & self.items == 0) { other.items = other.items | self.items; if (!other.weaponframe) { other.weapon = self.items; W_UpdateWeapon(other); } } } self.solid = SOLID_NOT; self.model = string_null; // set up for respawn if (self.classname == "item_backpack" && deathmatch) // map item, not dropped backpack { self.think = ItemRespawn; self.nextthink = time + self.teleport_time; } else { self.think = SUB_Remove; self.nextthink = time + 0.01; } // fire all targets activator = other; UseTargets(); }; /*========== DropBackpack called by players and monsters upon death drops a backpack containing current weapon and ammo ==========*/ void() DropBackpack = { // nothing to drop if (!(self.ammo_shells + self.ammo_nails + self.ammo_rockets + self.ammo_cells)) return; entity backpack = spawn(); backpack.classname = "backpack"; backpack.items = self.weapon; backpack.ammo_shells = self.ammo_shells; backpack.ammo_nails = self.ammo_nails; backpack.ammo_rockets = self.ammo_rockets; backpack.ammo_cells = self.ammo_cells; backpack.flags = FL_ITEM; backpack.solid = SOLID_TRIGGER; backpack.movetype = MOVETYPE_TOSS; setmodel (backpack, "progs/backpack.mdl"); setsize (backpack, '-16 -16 0', '16 16 56'); setorigin (backpack, self.origin - '0 0 24'); backpack.touch = backpack_touch; backpack.velocity = [crandom() * 100, crandom() * 100, 300]; backpack.nextthink = time + 120; backpack.think = SUB_Remove; }; /*QUAKED item_backpack (0 0 1) (-16 -16 0) (16 16 56) X X X X DONT_DROP RESPAWN X X NOT_IN_EASY NOT_IN_NORMAL NOT_IN_HARD NOT_IN_DM { model("progs/backpack.mdl"); } Backpack pickup. Contains 40 shells, 50 nails, 10 rockets and 12 cells. Keys: items - set to one of a combination of the IT_SHOTGUN etc values to make the backpack contain weapons ammo_shells, ammo_nails, ammo_rockets, ammo_cells - set to override ammo defaults. set to -1 to not give ANY ammo of that type. teleport_time - time in seconds to respawn (default 120) Spawnflags: DONT_DROP - don't drop to floor on map load RESPAWN - respawn automatically */ void() item_backpack = { precache_model ("progs/backpack.mdl"); precache_sound ("weapons/lock4.wav"); setmodel (self, "progs/backpack.mdl"); setsize (self, '-16 -16 0', '16 16 56'); self.touch = backpack_touch; SetPositiveDefault(teleport_time, 120); // remove anything that isn't a weapon self.items = self.items & (IT_AXE | IT_SHOTGUN | IT_SUPER_SHOTGUN | IT_NAILGUN | IT_SUPER_NAILGUN | IT_GRENADE_LAUNCHER | IT_ROCKET_LAUNCHER | IT_LIGHTNING); if (!self.ammo_shells) self.ammo_shells = 40; if (self.ammo_shells < 0) self.ammo_shells = 0; if (!self.ammo_nails) self.ammo_nails = 50; if (self.ammo_nails < 0) self.ammo_nails = 0; if (!self.ammo_rockets) self.ammo_rockets = 10; if (self.ammo_rockets < 0) self.ammo_rockets = 0; if (!self.ammo_cells) self.ammo_cells = 12; if (self.ammo_cells < 0) self.ammo_cells = 0; StartItem(); };