]> icculus.org git repositories - divverent/nexuiz.git/blob - attic/TeamNexuiz/game/gamec/t_items.c
now menu qc respects g_campaign_name
[divverent/nexuiz.git] / attic / TeamNexuiz / game / gamec / t_items.c
1 void Item_ClearRespawnEffect (void) {\r
2         self.effects = 0;\r
3 }\r
4 \r
5 void Item_Respawn (void)\r
6 {\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
11 \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
17         }\r
18 }\r
19 \r
20 void Item_Touch (void)\r
21 {\r
22 \r
23         local entity oldself;\r
24         local float     _switchweapon;\r
25 \r
26         if (other.classname != "player")\r
27                 return;\r
28         if (other.deadflag)\r
29                 return;\r
30         if (self.solid != SOLID_TRIGGER)\r
31                 return;\r
32 \r
33         if(self.buttonuse && !other.buttonuse)\r
34                 return; // player must press "use" button to pick this up\r
35 \r
36         if (self.classname == "droppedweapon")\r
37         {\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
40                         return;\r
41         }\r
42 \r
43         // Savage: Remove the respawn effect if still present\r
44         if(self.effects == EF_STARDUST)\r
45                 self.effects = 0;\r
46 \r
47 \r
48         sound (self, CHAN_BODY, self.noise, 1, ATTN_NORM);\r
49 \r
50         SpyCloakFlicker(other);\r
51 \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
55 \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
64 \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
73 \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
82 \r
83         if (self.max_health)\r
84         {\r
85                 other.health = other.health + self.max_health;\r
86                 DelayHealthRot(other);\r
87         }\r
88         if (self.armorvalue)\r
89         {\r
90                 other.armorvalue = other.armorvalue + self.armorvalue;\r
91                 DelayArmorRot(other);\r
92         }\r
93 \r
94         oldself = self;\r
95         self = other;\r
96 \r
97         if (_switchweapon)\r
98                 self.switchweapon = w_getbestweapon(self);\r
99 \r
100         //W_UpdateWeapon ();\r
101         //W_UpdateAmmo ();\r
102         weapon_action(self.weapon, WR_UPDATECOUNTS);\r
103 \r
104         self = oldself;\r
105 \r
106         if (self.classname == "droppedweapon")\r
107                 remove (self);\r
108         else\r
109         {\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
115         }\r
116 }\r
117 \r
118 // Savage: used for item garbage-collection\r
119 // TODO: perhaps nice special effect?\r
120 void RemoveItem(void) = {\r
121         remove(self);\r
122 }\r
123 \r
124 \r
125 void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, string itemname, float itemid, float itemflags)\r
126 {\r
127         if ((cvar("g_instagib") == 1) | (cvar("g_rocketarena") == 1))\r
128         {\r
129                 remove (self);\r
130                 return;\r
131         }\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
140         else\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
145         {\r
146                 setorigin (self, self.origin + '0 0 22');\r
147                 setsize (self, '-12 -12 -12', '12 12 12');\r
148         }\r
149         else\r
150         {\r
151                 setorigin (self, self.origin + '0 0 15');\r
152         //      setsize (self, '-8 -8 -5', '8 8 8');\r
153         }\r
154         self.movetype = MOVETYPE_TOSS;\r
155         self.solid = SOLID_TRIGGER;\r
156         self.touch = Item_Touch;\r
157 \r
158         if (itemflags & FL_POWERUP)\r
159                 self.effects = self.effects | EF_ADDITIVE;\r
160 \r
161         // Savage: remove thrown items after a certain period of time ("garbage collection")\r
162         if (self.classname == "droppedweapon")\r
163         {\r
164                 self.think = RemoveItem;\r
165                 self.nextthink = time + 60;\r
166         }\r
167 \r
168         if (cvar("g_fullbrightitems"))\r
169                 self.effects = self.effects | EF_FULLBRIGHT;\r
170 \r
171 }\r
172 \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
181 \r
182 void(entity pl, float typ) PrintGrenadeType = \r
183 {\r
184         local string st;\r
185         if (typ == TF_FLARE_OFF)\r
186         {\r
187                 st = "Normal";\r
188         }/*\r
189         else\r
190         {\r
191                 if (typ == 2)\r
192                 {\r
193                         st = "Concussion";\r
194                 }\r
195                 else\r
196                 {\r
197                         if (typ == 3)\r
198                         {\r
199                                 st = "Nail";\r
200                         }\r
201                         else\r
202                         {\r
203                                 if (typ == 4)\r
204                                 {\r
205                                         st = "Mirv";\r
206                                 }\r
207                                 else\r
208                                 {\r
209                                         if (typ == 5)\r
210                                         {\r
211                                                 st = "Napalm";\r
212                                         }\r
213                                         else\r
214                                         {\r
215                                                 if (typ == 6)\r
216                                                 {\r
217                                                         st = "Flare";\r
218                                                 }\r
219                                                 else\r
220                                                 {\r
221                                                         if (typ == 7)\r
222                                                         {\r
223                                                                 st = "Gas";\r
224                                                         }\r
225                                                         else\r
226                                                         {\r
227                                                                 if (typ == 8)\r
228                                                                 {\r
229                                                                         st = "EMP";\r
230                                                                 }\r
231                                                                 else\r
232                                                                 {\r
233                                                                         if (typ == 9)\r
234                                                                         {\r
235                                                                                 st = "Flash";\r
236                                                                         }\r
237                                                                 }\r
238                                                         }\r
239                                                 }\r
240                                         }\r
241                                 }\r
242                         }\r
243                 }\r
244         }*/\r
245         sprint(pl, st);\r
246 };\r
247 \r
248 void() GetGrenadePossibility = \r
249 {\r
250         if (random() < 0.5)\r
251         {\r
252                 return TF_FLARE_LIT;\r
253         }\r
254         if (random() < 0.5)\r
255         {\r
256                 if (other.tp_grenades_1 != TF_FLARE_LIT && other.no_grenades_1 < 4)\r
257                 {\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
263                 }\r
264         }/*\r
265         else\r
266         {\r
267                 if (other.tp_grenades_2 != TF_FLARE_LIT && other.no_grenades_2 < 4)\r
268                 {\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
274                 }\r
275         }*/\r
276         sprint(other, "WOOOO\n");\r
277         return TF_FLARE_LIT;\r
278 };\r
279 \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
284 \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
290 \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
295 \r
296 void misc_models (void)\r
297 {\r
298         precache_model (self.model);\r
299         setmodel (self, self.model);\r
300         setsize (self, self.mins, self.maxs);\r
301 }\r
302 \r
303 \r
304 void SpawnThrownWeapon (vector org, float w)\r
305 {\r
306         return;                         // Not in tf, eh? We need to add backpacks! :P\r
307 \r
308         local entity oldself;\r
309 \r
310         if (w == IT_LASER)\r
311                 return;\r
312 \r
313         oldself = self;\r
314         self = spawn();\r
315         // this will cause it to be removed later\r
316         self.classname = "droppedweapon";\r
317 \r
318         setorigin(self, org);\r
319         if(oldself.health <= 2)\r
320                 self.velocity = randomvec() * 100 + '0 0 200';\r
321         else\r
322         {\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
325         }\r
326 \r
327         SUB_SetFade(self, time + 10, 1);\r
328 \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
332 \r
333         if (w == WEP_UZI)\r
334                 weapon_uzi ();\r
335         else if (w == WEP_SHOTGUN)\r
336                 weapon_shotgun ();\r
337         else if (w == WEP_GRENADE_LAUNCHER)\r
338                 weapon_grenadelauncher ();\r
339         else if (w == WEP_ELECTRO)\r
340                 weapon_electro ();\r
341         else if (w == WEP_CRYLINK)\r
342                 weapon_crylink ();\r
343         else if (w == WEP_NEX)\r
344                 weapon_nex ();\r
345         else if (w == WEP_HAGAR)\r
346                 weapon_hagar ();\r
347         else if (w == WEP_ROCKET_LAUNCHER)\r
348                 weapon_rocketlauncher ();\r
349         else\r
350         {\r
351                 remove(self);\r
352         }\r
353 \r
354         self = oldself;\r
355 }\r
356 \r