1 void Item_ClearRespawnEffect (void) {
\r
5 void Item_Respawn (void)
\r
7 self.model = self.mdl; // restore original model
\r
8 self.solid = SOLID_TRIGGER; // allow it to be touched again
\r
9 sound (self, CHAN_VOICE, "misc/itemrespawn.wav", 1, ATTN_NORM); // play respawn sound
\r
10 setorigin (self, self.origin);
\r
12 // Savage: Add simple Respawn effect and make sure it gets removed
\r
13 if(self.effects == 0) {
\r
14 self.effects = EF_STARDUST;
\r
15 self.think = Item_ClearRespawnEffect;
\r
16 self.nextthink = time + 0.1;
\r
20 void Item_Touch (void)
\r
23 local entity oldself;
\r
24 local float _switchweapon;
\r
26 if (other.classname != "player")
\r
30 if (self.solid != SOLID_TRIGGER)
\r
33 if(self.buttonuse && !other.buttonuse)
\r
34 return; // player must press "use" button to pick this up
\r
36 if (self.classname == "droppedweapon")
\r
38 // don't allow my owner to accidentally pick me up again just after dropping me
\r
39 if(self.enemy == other && self.delay > time)
\r
43 // Savage: Remove the respawn effect if still present
\r
44 if(self.effects == EF_STARDUST)
\r
48 sound (self, CHAN_BODY, self.noise, 1, ATTN_NORM);
\r
50 SpyCloakFlicker(other);
\r
52 // if the player is using their best weapon before items are given, they
\r
53 // probably want to switch to an even better weapon after items are given
\r
54 _switchweapon = other.switchweapon == w_getbestweapon(other);
\r
56 if (self.ammo_shells)
\r
57 other.ammo_shells = min (other.ammo_shells + self.ammo_shells, 999);
\r
58 if (self.ammo_nails)
\r
59 other.ammo_nails = min (other.ammo_nails + self.ammo_nails, 999);
\r
60 if (self.ammo_rockets)
\r
61 other.ammo_rockets = min (other.ammo_rockets + self.ammo_rockets, 999);
\r
62 if (self.ammo_cells)
\r
63 other.ammo_cells = min (other.ammo_cells + self.ammo_cells, 999);
\r
65 if (self.weapon == WEP_UZI) W_GiveWeapon (other, WEP_UZI, "Machine gun", self.mass);
\r
66 if (self.weapon == WEP_SHOTGUN) W_GiveWeapon (other, WEP_SHOTGUN, "Shotgun", self.mass);
\r
67 if (self.weapon == WEP_GRENADE_LAUNCHER) W_GiveWeapon (other, WEP_GRENADE_LAUNCHER, "Mortar", self.mass);
\r
68 if (self.weapon == WEP_ELECTRO) W_GiveWeapon (other, WEP_ELECTRO, "Electro", self.mass);
\r
69 if (self.weapon == WEP_NEX) W_GiveWeapon (other, WEP_NEX, "Nex", self.mass);
\r
70 if (self.weapon == WEP_HAGAR) W_GiveWeapon (other, WEP_HAGAR, "Hagar", self.mass);
\r
71 if (self.weapon == WEP_ROCKET_LAUNCHER) W_GiveWeapon (other, WEP_ROCKET_LAUNCHER, "Rocket Launcher", self.mass);
\r
72 if (self.weapon == WEP_CRYLINK) W_GiveWeapon (other, WEP_CRYLINK, "Crylink", self.mass);
\r
74 if (self.strength_finished)
\r
75 other.strength_finished = max(other.strength_finished, time) + cvar("g_balance_powerup_strength_time");
\r
76 if (self.invincible_finished)
\r
77 other.invincible_finished = max(other.invincible_finished, time) + cvar("g_balance_powerup_invincible_time");
\r
78 //if (self.speed_finished)
\r
79 // other.speed_finished = max(other.speed_finished, time) + cvar("g_balance_powerup_speed_time");
\r
80 //if (self.slowmo_finished)
\r
81 // other.slowmo_finished = max(other.slowmo_finished, time) + (cvar("g_balance_powerup_slowmo_time") * cvar("g_balance_powerup_slowmo_speed"));
\r
83 if (self.max_health)
\r
85 other.health = other.health + self.max_health;
\r
86 DelayHealthRot(other);
\r
88 if (self.armorvalue)
\r
90 other.armorvalue = other.armorvalue + self.armorvalue;
\r
91 DelayArmorRot(other);
\r
98 self.switchweapon = w_getbestweapon(self);
\r
100 //W_UpdateWeapon ();
\r
102 weapon_action(self.weapon, WR_UPDATECOUNTS);
\r
106 if (self.classname == "droppedweapon")
\r
110 self.solid = SOLID_NOT;
\r
111 self.model = string_null;
\r
112 self.nextthink = time + self.respawntime;
\r
113 self.think = Item_Respawn;
\r
114 setorigin (self, self.origin);
\r
118 // Savage: used for item garbage-collection
\r
119 // TODO: perhaps nice special effect?
\r
120 void RemoveItem(void) = {
\r
125 void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, string itemname, float itemid, float itemflags)
\r
127 if ((cvar("g_instagib") == 1) | (cvar("g_rocketarena") == 1))
\r
132 self.mdl = itemmodel;
\r
133 self.noise = pickupsound;
\r
134 // let mappers override respawntime
\r
135 if (!self.respawntime)
\r
136 self.respawntime = defaultrespawntime;
\r
137 self.netname = itemname;
\r
138 if(itemflags & FL_WEAPON)
\r
139 self.weapon = itemid;
\r
141 self.items = itemid;
\r
142 self.flags = FL_ITEM | itemflags;
\r
143 setmodel (self, self.mdl);
\r
144 if (itemflags & FL_WEAPON)
\r
146 setorigin (self, self.origin + '0 0 22');
\r
147 setsize (self, '-12 -12 -12', '12 12 12');
\r
151 setorigin (self, self.origin + '0 0 15');
\r
152 // setsize (self, '-8 -8 -5', '8 8 8');
\r
154 self.movetype = MOVETYPE_TOSS;
\r
155 self.solid = SOLID_TRIGGER;
\r
156 self.touch = Item_Touch;
\r
158 if (itemflags & FL_POWERUP)
\r
159 self.effects = self.effects | EF_ADDITIVE;
\r
161 // Savage: remove thrown items after a certain period of time ("garbage collection")
\r
162 if (self.classname == "droppedweapon")
\r
164 self.think = RemoveItem;
\r
165 self.nextthink = time + 60;
\r
168 if (cvar("g_fullbrightitems"))
\r
169 self.effects = self.effects | EF_FULLBRIGHT;
\r
173 void weapon_uzi (void) {self.buttonuse=1;self.mass=0.25;self.ammo_nails = 120;StartItem ("models/weapons/g_uzi.md3", "weapons/weaponpickup.wav", 15, "Uzi", WEP_UZI, FL_WEAPON);}
\r
174 void weapon_shotgun (void) {self.buttonuse=1;self.mass=0.15;self.ammo_shells = 15;StartItem ("models/weapons/g_shotgun.md3", "weapons/weaponpickup.wav", 15, "Shotgun", WEP_SHOTGUN, FL_WEAPON);}
\r
175 void weapon_grenadelauncher (void) {self.buttonuse=1;self.mass=2;self.ammo_rockets = 15;StartItem ("models/weapons/g_gl.md3", "weapons/weaponpickup.wav", 15, "Grenade Launcher", WEP_GRENADE_LAUNCHER, FL_WEAPON);}
\r
176 void weapon_electro (void) {self.buttonuse=1;self.mass=1.8;self.ammo_cells = 25;StartItem ("models/weapons/g_electro.md3", "weapons/weaponpickup.wav", 15, "Electro", WEP_ELECTRO, FL_WEAPON);}
\r
177 void weapon_crylink (void) {self.buttonuse=1;self.mass=0.6;self.ammo_cells = 25;StartItem ("models/weapons/g_crylink.md3", "weapons/weaponpickup.wav", 15, "Crylink", WEP_CRYLINK, FL_WEAPON);}
\r
178 void weapon_nex (void) {self.buttonuse=1;self.mass=1.5;self.ammo_cells = 25;StartItem ("models/weapons/g_nex.md3", "weapons/weaponpickup.wav", 15, "Nex Gun", WEP_NEX, FL_WEAPON);}
\r
179 void weapon_hagar (void) {self.buttonuse=1;self.mass=1;self.ammo_rockets = 15;StartItem ("models/weapons/g_hagar.md3", "weapons/weaponpickup.wav", 15, "Hagar", WEP_HAGAR, FL_WEAPON);}
\r
180 void weapon_rocketlauncher (void) {self.buttonuse=1;self.mass=2.5;self.ammo_rockets = 15;StartItem ("models/weapons/g_rl.md3", "weapons/weaponpickup.wav", 15, "Rocket Launcher", WEP_ROCKET_LAUNCHER, FL_WEAPON);}
\r
182 void(entity pl, float typ) PrintGrenadeType =
\r
185 if (typ == TF_FLARE_OFF)
\r
248 void() GetGrenadePossibility =
\r
250 if (random() < 0.5)
\r
252 return TF_FLARE_LIT;
\r
254 if (random() < 0.5)
\r
256 if (other.tp_grenades_1 != TF_FLARE_LIT && other.no_grenades_1 < 4)
\r
258 other.no_grenades_1 = other.no_grenades_1 + TF_FLARE_OFF;
\r
259 sprint(other, "You found a ");
\r
260 PrintGrenadeType(other, other.tp_grenades_1);
\r
261 sprint(other, " grenade\n");
\r
262 return TF_FLARE_OFF;
\r
267 if (other.tp_grenades_2 != TF_FLARE_LIT && other.no_grenades_2 < 4)
\r
269 other.no_grenades_2 = other.no_grenades_2 + TF_FLARE_OFF;
\r
270 sprint(other, 2, "You found a ");
\r
271 PrintGrenadeType(other, other.tp_grenades_2);
\r
272 sprint(other, 2, " grenade\n");
\r
273 return TF_FLARE_OFF;
\r
276 sprint(other, "WOOOO\n");
\r
277 return TF_FLARE_LIT;
\r
280 void item_rockets (void) {GetGrenadePossibility();self.ammo_rockets = 15;StartItem ("models/items/a_rockets.md3", "misc/itempickup.wav", 15, "rockets", IT_ROCKETS, 0);}
\r
281 void item_bullets (void) {self.ammo_nails = 120;StartItem ("models/items/a_bullets.mdl", "misc/itempickup.wav", 15, "bullets", IT_NAILS, 0);}
\r
282 void item_cells (void) {self.ammo_cells = 25;StartItem ("models/items/a_cells.md3", "misc/itempickup.wav", 15, "cells", IT_CELLS, 0);}
\r
283 void item_shells (void) {self.ammo_shells = 25;StartItem ("models/items/a_shells.md3", "misc/itempickup.wav", 15, "shells", IT_SHELLS, 0);}
\r
285 void item_armor1 (void) {self.armorvalue = 5;StartItem ("models/items/g_a1.md3", "misc/armor1.wav", 15, "Armor Shard", 0, 0);}
\r
286 void item_armor25 (void) {self.armorvalue = 100;StartItem ("models/items/g_a25.md3", "misc/armor25.wav", 30, "Armor", 0, 0);}
\r
287 void item_health1 (void) {self.max_health = 5;StartItem ("models/items/g_h1.md3", "misc/minihealth.wav", 15, "5 Health", 0, 0);}
\r
288 void item_health25 (void) {self.max_health = 25;StartItem ("models/items/g_h25.md3", "misc/mediumhealth.wav", 15, "25 Health", 0, 0);}
\r
289 void item_health100 (void) {self.max_health = 100;StartItem ("models/items/g_h100.md3", "misc/megahealth.wav", 30, "100 Health", 0, 0);}
\r
291 void item_strength (void) {self.strength_finished = 30;StartItem ("models/items/g_strength.md3", "misc/powerup.wav", 120, "Strength Powerup", IT_STRENGTH, FL_POWERUP);}
\r
292 void item_invincible (void) {self.invincible_finished = 30;StartItem ("models/items/g_invincible.md3", "misc/powerup.wav", 120, "Invulnerability", IT_INVINCIBLE, FL_POWERUP);}
\r
293 //void item_speed (void) {self.speed_finished = 30;StartItem ("models/items/g_speed.md3", "misc/powerup.wav", 120, "Speed Powerup", IT_SPEED, FL_POWERUP);}
\r
294 //void item_slowmo (void) {self.slowmo_finished = 30;StartItem ("models/items/g_slowmo.md3", "misc/powerup.wav", 120, "Slow Motion", IT_SLOWMO, FL_POWERUP);}
\r
296 void misc_models (void)
\r
298 precache_model (self.model);
\r
299 setmodel (self, self.model);
\r
300 setsize (self, self.mins, self.maxs);
\r
304 void SpawnThrownWeapon (vector org, float w)
\r
306 return; // Not in tf, eh? We need to add backpacks! :P
\r
308 local entity oldself;
\r
315 // this will cause it to be removed later
\r
316 self.classname = "droppedweapon";
\r
318 setorigin(self, org);
\r
319 if(oldself.health <= 2)
\r
320 self.velocity = randomvec() * 100 + '0 0 200';
\r
323 makevectors(oldself.angles); // not v_angle; we don't care for up/down motion
\r
324 self.velocity = v_forward*150 + '0 0 100';
\r
327 SUB_SetFade(self, time + 10, 1);
\r
329 // delay re-pickup by owner, i.e. don't let my owner pick me up by accident
\r
330 self.enemy = oldself;
\r
331 self.delay = time + 2;
\r
335 else if (w == WEP_SHOTGUN)
\r
337 else if (w == WEP_GRENADE_LAUNCHER)
\r
338 weapon_grenadelauncher ();
\r
339 else if (w == WEP_ELECTRO)
\r
341 else if (w == WEP_CRYLINK)
\r
343 else if (w == WEP_NEX)
\r
345 else if (w == WEP_HAGAR)
\r
347 else if (w == WEP_ROCKET_LAUNCHER)
\r
348 weapon_rocketlauncher ();
\r