|
|
1.1 root 1: #include "g_local.h"
2:
3:
4: qboolean Pickup_Weapon (edict_t *ent, edict_t *other);
5: void Use_Weapon (edict_t *ent, gitem_t *inv);
6: void Drop_Weapon (edict_t *ent, gitem_t *inv);
7:
8: void Weapon_Blaster (edict_t *ent);
9: void Weapon_Shotgun (edict_t *ent);
10: void Weapon_SuperShotgun (edict_t *ent);
11: void Weapon_Machinegun (edict_t *ent);
12: void Weapon_Chaingun (edict_t *ent);
13: void Weapon_HyperBlaster (edict_t *ent);
14: void Weapon_RocketLauncher (edict_t *ent);
15: void Weapon_Grenade (edict_t *ent);
16: void Weapon_GrenadeLauncher (edict_t *ent);
17: void Weapon_Railgun (edict_t *ent);
18: void Weapon_BFG (edict_t *ent);
19:
20: //=========
21: //Rogue Weapons
22: void Weapon_ChainFist (edict_t *ent);
23: void Weapon_Disintegrator (edict_t *ent);
24: void Weapon_ETF_Rifle (edict_t *ent);
25: void Weapon_Heatbeam (edict_t *ent);
26: void Weapon_Prox (edict_t *ent);
27: void Weapon_Tesla (edict_t *ent);
28: void Weapon_ProxLauncher (edict_t *ent);
29: //void Weapon_Nuke (edict_t *ent);
30: //Rogue Weapons
31: //=========
32:
33: gitem_armor_t jacketarmor_info = { 25, 50, .30, .00, ARMOR_JACKET};
34: gitem_armor_t combatarmor_info = { 50, 100, .60, .30, ARMOR_COMBAT};
35: gitem_armor_t bodyarmor_info = {100, 200, .80, .60, ARMOR_BODY};
36:
37: static int jacket_armor_index;
38: static int combat_armor_index;
39: static int body_armor_index;
40: static int power_screen_index;
41: static int power_shield_index;
42:
43: #define HEALTH_IGNORE_MAX 1
44: #define HEALTH_TIMED 2
45:
46: void Use_Quad (edict_t *ent, gitem_t *item);
47: static int quad_drop_timeout_hack;
48:
49: //======================================================================
50:
51: /*
52: ===============
53: GetItemByIndex
54: ===============
55: */
56: gitem_t *GetItemByIndex (int index)
57: {
58: if (index == 0 || index >= game.num_items)
59: return NULL;
60:
61: return &itemlist[index];
62: }
63:
64:
65: /*
66: ===============
67: FindItemByClassname
68:
69: ===============
70: */
71: gitem_t *FindItemByClassname (char *classname)
72: {
73: int i;
74: gitem_t *it;
75:
76: it = itemlist;
77: for (i=0 ; i<game.num_items ; i++, it++)
78: {
79: if (!it->classname)
80: continue;
81: if (!Q_stricmp(it->classname, classname))
82: return it;
83: }
84:
85: return NULL;
86: }
87:
88: /*
89: ===============
90: FindItem
91:
92: ===============
93: */
94: gitem_t *FindItem (char *pickup_name)
95: {
96: int i;
97: gitem_t *it;
98:
99: it = itemlist;
100: for (i=0 ; i<game.num_items ; i++, it++)
101: {
102: if (!it->pickup_name)
103: continue;
104: if (!Q_stricmp(it->pickup_name, pickup_name))
105: return it;
106: }
107:
108: return NULL;
109: }
110:
111: //======================================================================
112:
113: void DoRespawn (edict_t *ent)
114: {
115: if (ent->team)
116: {
117: edict_t *master;
118: int count;
119: int choice;
120:
121: master = ent->teammaster;
122:
123: for (count = 0, ent = master; ent; ent = ent->chain, count++)
124: ;
125:
126: choice = rand() % count;
127:
128: for (count = 0, ent = master; count < choice; ent = ent->chain, count++)
129: ;
130: }
131:
132: //=====
133: //ROGUE
134: if(randomrespawn && randomrespawn->value)
135: {
136: edict_t *newEnt;
137:
138: newEnt = DoRandomRespawn (ent);
139:
140: // if we've changed entities, then do some sleight of hand.
141: // otherwise, the old entity will respawn
142: if(newEnt)
143: {
144: G_FreeEdict (ent);
145: ent = newEnt;
146: }
147: }
148: //ROGUE
149: //=====
150:
151: ent->svflags &= ~SVF_NOCLIENT;
152: ent->solid = SOLID_TRIGGER;
153: gi.linkentity (ent);
154:
155: // send an effect
156: ent->s.event = EV_ITEM_RESPAWN;
157: }
158:
159: void SetRespawn (edict_t *ent, float delay)
160: {
161: ent->flags |= FL_RESPAWN;
162: ent->svflags |= SVF_NOCLIENT;
163: ent->solid = SOLID_NOT;
164: ent->nextthink = level.time + delay;
165: ent->think = DoRespawn;
166: gi.linkentity (ent);
167: }
168:
169:
170: //======================================================================
171:
172: qboolean Pickup_Powerup (edict_t *ent, edict_t *other)
173: {
174: int quantity;
175:
176: quantity = other->client->pers.inventory[ITEM_INDEX(ent->item)];
177: if ((skill->value == 1 && quantity >= 2) || (skill->value >= 2 && quantity >= 1))
178: return false;
179:
180: if ((coop->value) && (ent->item->flags & IT_STAY_COOP) && (quantity > 0))
181: return false;
182:
183: other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
184:
185: if (deathmatch->value)
186: {
187: if (!(ent->spawnflags & DROPPED_ITEM) )
188: SetRespawn (ent, ent->item->quantity);
189: if (((int)dmflags->value & DF_INSTANT_ITEMS) || ((ent->item->use == Use_Quad) && (ent->spawnflags & DROPPED_PLAYER_ITEM)))
190: {
191: if ((ent->item->use == Use_Quad) && (ent->spawnflags & DROPPED_PLAYER_ITEM))
192: quad_drop_timeout_hack = (ent->nextthink - level.time) / FRAMETIME;
193: //PGM
194: if(ent->item->use)
195: ent->item->use (other, ent->item);
196: else
197: gi.dprintf("Powerup has no use function!\n");
198: //PGM
199: }
200: }
201:
202: return true;
203: }
204:
205: void Drop_General (edict_t *ent, gitem_t *item)
206: {
207: Drop_Item (ent, item);
208: ent->client->pers.inventory[ITEM_INDEX(item)]--;
209: ValidateSelectedItem (ent);
210: }
211:
212:
213: //======================================================================
214:
215: qboolean Pickup_Adrenaline (edict_t *ent, edict_t *other)
216: {
217: if (!deathmatch->value)
218: other->max_health += 1;
219:
220: if (other->health < other->max_health)
221: other->health = other->max_health;
222:
223: if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
224: SetRespawn (ent, ent->item->quantity);
225:
226: return true;
227: }
228:
229: qboolean Pickup_AncientHead (edict_t *ent, edict_t *other)
230: {
231: other->max_health += 2;
232:
233: if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
234: SetRespawn (ent, ent->item->quantity);
235:
236: return true;
237: }
238:
239: qboolean Pickup_Bandolier (edict_t *ent, edict_t *other)
240: {
241: gitem_t *item;
242: int index;
243:
244: if (other->client->pers.max_bullets < 250)
245: other->client->pers.max_bullets = 250;
246: if (other->client->pers.max_shells < 150)
247: other->client->pers.max_shells = 150;
248: if (other->client->pers.max_cells < 250)
249: other->client->pers.max_cells = 250;
250: if (other->client->pers.max_slugs < 75)
251: other->client->pers.max_slugs = 75;
252: //PMM
253: if (other->client->pers.max_flechettes < 250)
254: other->client->pers.max_flechettes = 250;
255: #ifndef KILL_DISRUPTOR
256: if (other->client->pers.max_rounds < 150)
257: other->client->pers.max_rounds = 150;
258: #endif
259: //pmm
260:
261: item = FindItem("Bullets");
262: if (item)
263: {
264: index = ITEM_INDEX(item);
265: other->client->pers.inventory[index] += item->quantity;
266: if (other->client->pers.inventory[index] > other->client->pers.max_bullets)
267: other->client->pers.inventory[index] = other->client->pers.max_bullets;
268: }
269:
270: item = FindItem("Shells");
271: if (item)
272: {
273: index = ITEM_INDEX(item);
274: other->client->pers.inventory[index] += item->quantity;
275: if (other->client->pers.inventory[index] > other->client->pers.max_shells)
276: other->client->pers.inventory[index] = other->client->pers.max_shells;
277: }
278:
279: if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
280: SetRespawn (ent, ent->item->quantity);
281:
282: return true;
283: }
284:
285: qboolean Pickup_Pack (edict_t *ent, edict_t *other)
286: {
287: gitem_t *item;
288: int index;
289:
290: if (other->client->pers.max_bullets < 300)
291: other->client->pers.max_bullets = 300;
292: if (other->client->pers.max_shells < 200)
293: other->client->pers.max_shells = 200;
294: if (other->client->pers.max_rockets < 100)
295: other->client->pers.max_rockets = 100;
296: if (other->client->pers.max_grenades < 100)
297: other->client->pers.max_grenades = 100;
298: if (other->client->pers.max_cells < 300)
299: other->client->pers.max_cells = 300;
300: if (other->client->pers.max_slugs < 100)
301: other->client->pers.max_slugs = 100;
302: //PMM
303: if (other->client->pers.max_flechettes < 200)
304: other->client->pers.max_flechettes = 200;
305: #ifndef KILL_DISRUPTOR
306: if (other->client->pers.max_rounds < 200)
307: other->client->pers.max_rounds = 200;
308: #endif
309: //pmm
310:
311: item = FindItem("Bullets");
312: if (item)
313: {
314: index = ITEM_INDEX(item);
315: other->client->pers.inventory[index] += item->quantity;
316: if (other->client->pers.inventory[index] > other->client->pers.max_bullets)
317: other->client->pers.inventory[index] = other->client->pers.max_bullets;
318: }
319:
320: item = FindItem("Shells");
321: if (item)
322: {
323: index = ITEM_INDEX(item);
324: other->client->pers.inventory[index] += item->quantity;
325: if (other->client->pers.inventory[index] > other->client->pers.max_shells)
326: other->client->pers.inventory[index] = other->client->pers.max_shells;
327: }
328:
329: item = FindItem("Cells");
330: if (item)
331: {
332: index = ITEM_INDEX(item);
333: other->client->pers.inventory[index] += item->quantity;
334: if (other->client->pers.inventory[index] > other->client->pers.max_cells)
335: other->client->pers.inventory[index] = other->client->pers.max_cells;
336: }
337:
338: item = FindItem("Grenades");
339: if (item)
340: {
341: index = ITEM_INDEX(item);
342: other->client->pers.inventory[index] += item->quantity;
343: if (other->client->pers.inventory[index] > other->client->pers.max_grenades)
344: other->client->pers.inventory[index] = other->client->pers.max_grenades;
345: }
346:
347: item = FindItem("Rockets");
348: if (item)
349: {
350: index = ITEM_INDEX(item);
351: other->client->pers.inventory[index] += item->quantity;
352: if (other->client->pers.inventory[index] > other->client->pers.max_rockets)
353: other->client->pers.inventory[index] = other->client->pers.max_rockets;
354: }
355:
356: item = FindItem("Slugs");
357: if (item)
358: {
359: index = ITEM_INDEX(item);
360: other->client->pers.inventory[index] += item->quantity;
361: if (other->client->pers.inventory[index] > other->client->pers.max_slugs)
362: other->client->pers.inventory[index] = other->client->pers.max_slugs;
363: }
364: //PMM
365: item = FindItem("Flechettes");
366: if (item)
367: {
368: index = ITEM_INDEX(item);
369: other->client->pers.inventory[index] += item->quantity;
370: if (other->client->pers.inventory[index] > other->client->pers.max_flechettes)
371: other->client->pers.inventory[index] = other->client->pers.max_flechettes;
372: }
373: #ifndef KILL_DISRUPTOR
374: item = FindItem("Rounds");
375: if (item)
376: {
377: index = ITEM_INDEX(item);
378: other->client->pers.inventory[index] += item->quantity;
379: if (other->client->pers.inventory[index] > other->client->pers.max_rounds)
380: other->client->pers.inventory[index] = other->client->pers.max_rounds;
381: }
382: #endif
383: //pmm
384: if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
385: SetRespawn (ent, ent->item->quantity);
386:
387: return true;
388: }
389: // ================
390: // PMM
391: qboolean Pickup_Nuke (edict_t *ent, edict_t *other)
392: {
393: int quantity;
394:
395: // if (!deathmatch->value)
396: // return;
397: quantity = other->client->pers.inventory[ITEM_INDEX(ent->item)];
398: // if ((skill->value == 1 && quantity >= 2) || (skill->value >= 2 && quantity >= 1))
399: // return false;
400:
401: if (quantity >= 1)
402: return false;
403:
404: if ((coop->value) && (ent->item->flags & IT_STAY_COOP) && (quantity > 0))
405: return false;
406:
407: other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
408:
409: if (deathmatch->value)
410: {
411: if (!(ent->spawnflags & DROPPED_ITEM) )
412: SetRespawn (ent, ent->item->quantity);
413: }
414:
415: return true;
416: }
417:
418: // ================
419: // PGM
420: void Use_IR (edict_t *ent, gitem_t *item)
421: {
422: ent->client->pers.inventory[ITEM_INDEX(item)]--;
423: ValidateSelectedItem (ent);
424:
425: if (ent->client->ir_framenum > level.framenum)
426: ent->client->ir_framenum += 600;
427: else
428: ent->client->ir_framenum = level.framenum + 600;
429:
430: // FIXME - SOUND!
431: // gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
432: }
433:
434: void Use_Double (edict_t *ent, gitem_t *item)
435: {
436: ent->client->pers.inventory[ITEM_INDEX(item)]--;
437: ValidateSelectedItem (ent);
438:
439: if (ent->client->double_framenum > level.framenum)
440: ent->client->double_framenum += 300;
441: else
442: ent->client->double_framenum = level.framenum + 300;
443:
444: gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
445: }
446:
447: void Use_Torch (edict_t *ent, gitem_t *item)
448: {
449: ent->client->torch_framenum = level.framenum + 600;
450: }
451:
452: void Use_Compass (edict_t *ent, gitem_t *item)
453: {
454: int ang;
455:
456: ang = (int)(ent->client->v_angle[1]);
457: if(ang<0)
458: ang += 360;
459:
460: gi.cprintf(ent, PRINT_HIGH, "Origin: %0.0f,%0.0f,%0.0f Dir: %d\n", ent->s.origin[0], ent->s.origin[1],
461: ent->s.origin[2], ang);
462: }
463:
464: void Use_Nuke (edict_t *ent, gitem_t *item)
465: {
466: vec3_t forward, right, start;
467: float speed;
468:
469: ent->client->pers.inventory[ITEM_INDEX(item)]--;
470: ValidateSelectedItem (ent);
471:
472: AngleVectors (ent->client->v_angle, forward, right, NULL);
473:
474: VectorCopy (ent->s.origin, start);
475: speed = 100;
476: fire_nuke (ent, start, forward, speed);
477: }
478:
479: void Use_Doppleganger (edict_t *ent, gitem_t *item)
480: {
481: vec3_t forward, right;
482: vec3_t createPt, spawnPt;
483: vec3_t ang;
484:
485: VectorClear(ang);
486: ang[YAW] = ent->client->v_angle[YAW];
487: AngleVectors (ang, forward, right, NULL);
488:
489: VectorMA(ent->s.origin, 48, forward, createPt);
490:
491: if(!FindSpawnPoint(createPt, ent->mins, ent->maxs, spawnPt, 32))
492: return;
493:
494: if(!CheckGroundSpawnPoint(spawnPt, ent->mins, ent->maxs, 64, -1))
495: return;
496:
497: ent->client->pers.inventory[ITEM_INDEX(item)]--;
498: ValidateSelectedItem (ent);
499:
500: SpawnGrow_Spawn (spawnPt, 0);
501: fire_doppleganger (ent, spawnPt, forward);
502: }
503:
504: qboolean Pickup_Doppleganger (edict_t *ent, edict_t *other)
505: {
506: int quantity;
507:
508: if(!(deathmatch->value)) // item is DM only
509: return false;
510:
511: quantity = other->client->pers.inventory[ITEM_INDEX(ent->item)];
512: if (quantity >= 1) // FIXME - apply max to dopplegangers
513: return false;
514:
515: other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
516:
517: if (!(ent->spawnflags & DROPPED_ITEM) )
518: SetRespawn (ent, ent->item->quantity);
519:
520: return true;
521: }
522:
523:
524: qboolean Pickup_Sphere (edict_t *ent, edict_t *other)
525: {
526: int quantity;
527:
528: if(other->client && other->client->owned_sphere)
529: {
530: // gi.cprintf(other, PRINT_HIGH, "Only one sphere to a customer!\n");
531: return false;
532: }
533:
534: quantity = other->client->pers.inventory[ITEM_INDEX(ent->item)];
535: if ((skill->value == 1 && quantity >= 2) || (skill->value >= 2 && quantity >= 1))
536: return false;
537:
538: if ((coop->value) && (ent->item->flags & IT_STAY_COOP) && (quantity > 0))
539: return false;
540:
541: other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
542:
543: if (deathmatch->value)
544: {
545: if (!(ent->spawnflags & DROPPED_ITEM) )
546: SetRespawn (ent, ent->item->quantity);
547: if (((int)dmflags->value & DF_INSTANT_ITEMS))
548: {
549: //PGM
550: if(ent->item->use)
551: ent->item->use (other, ent->item);
552: else
553: gi.dprintf("Powerup has no use function!\n");
554: //PGM
555: }
556: }
557:
558: return true;
559: }
560:
561: void Use_Defender (edict_t *ent, gitem_t *item)
562: {
563: if(ent->client && ent->client->owned_sphere)
564: {
565: gi.cprintf(ent, PRINT_HIGH, "Only one sphere at a time!\n");
566: return;
567: }
568:
569: ent->client->pers.inventory[ITEM_INDEX(item)]--;
570: ValidateSelectedItem (ent);
571:
572: Defender_Launch (ent);
573: }
574:
575: void Use_Hunter (edict_t *ent, gitem_t *item)
576: {
577: if(ent->client && ent->client->owned_sphere)
578: {
579: gi.cprintf(ent, PRINT_HIGH, "Only one sphere at a time!\n");
580: return;
581: }
582:
583: ent->client->pers.inventory[ITEM_INDEX(item)]--;
584: ValidateSelectedItem (ent);
585:
586: Hunter_Launch (ent);
587: }
588:
589: void Use_Vengeance (edict_t *ent, gitem_t *item)
590: {
591: if(ent->client && ent->client->owned_sphere)
592: {
593: gi.cprintf(ent, PRINT_HIGH, "Only one sphere at a time!\n");
594: return;
595: }
596:
597: ent->client->pers.inventory[ITEM_INDEX(item)]--;
598: ValidateSelectedItem (ent);
599:
600: Vengeance_Launch (ent);
601: }
602:
603: // PGM
604: // ================
605:
606:
607: //======================================================================
608:
609: void Use_Quad (edict_t *ent, gitem_t *item)
610: {
611: int timeout;
612:
613: ent->client->pers.inventory[ITEM_INDEX(item)]--;
614: ValidateSelectedItem (ent);
615:
616: if (quad_drop_timeout_hack)
617: {
618: timeout = quad_drop_timeout_hack;
619: quad_drop_timeout_hack = 0;
620: }
621: else
622: {
623: timeout = 300;
624: }
625:
626: if (ent->client->quad_framenum > level.framenum)
627: ent->client->quad_framenum += timeout;
628: else
629: ent->client->quad_framenum = level.framenum + timeout;
630:
631: gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
632: }
633:
634: //======================================================================
635:
636: void Use_Breather (edict_t *ent, gitem_t *item)
637: {
638: ent->client->pers.inventory[ITEM_INDEX(item)]--;
639: ValidateSelectedItem (ent);
640:
641: if (ent->client->breather_framenum > level.framenum)
642: ent->client->breather_framenum += 300;
643: else
644: ent->client->breather_framenum = level.framenum + 300;
645:
646: // gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
647: }
648:
649: //======================================================================
650:
651: void Use_Envirosuit (edict_t *ent, gitem_t *item)
652: {
653: ent->client->pers.inventory[ITEM_INDEX(item)]--;
654: ValidateSelectedItem (ent);
655:
656: if (ent->client->enviro_framenum > level.framenum)
657: ent->client->enviro_framenum += 300;
658: else
659: ent->client->enviro_framenum = level.framenum + 300;
660:
661: // gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
662: }
663:
664: //======================================================================
665:
666: void Use_Invulnerability (edict_t *ent, gitem_t *item)
667: {
668: ent->client->pers.inventory[ITEM_INDEX(item)]--;
669: ValidateSelectedItem (ent);
670:
671: if (ent->client->invincible_framenum > level.framenum)
672: ent->client->invincible_framenum += 300;
673: else
674: ent->client->invincible_framenum = level.framenum + 300;
675:
676: gi.sound(ent, CHAN_ITEM, gi.soundindex("items/protect.wav"), 1, ATTN_NORM, 0);
677: }
678:
679: //======================================================================
680:
681: void Use_Silencer (edict_t *ent, gitem_t *item)
682: {
683: ent->client->pers.inventory[ITEM_INDEX(item)]--;
684: ValidateSelectedItem (ent);
685: ent->client->silencer_shots += 30;
686:
687: // gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
688: }
689:
690: //======================================================================
691:
692: qboolean Pickup_Key (edict_t *ent, edict_t *other)
693: {
694: if (coop->value)
695: {
696: if (strcmp(ent->classname, "key_power_cube") == 0)
697: {
698: if (other->client->pers.power_cubes & ((ent->spawnflags & 0x0000ff00)>> 8))
699: return false;
700: other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
701: other->client->pers.power_cubes |= ((ent->spawnflags & 0x0000ff00) >> 8);
702: }
703: else
704: {
705: if (other->client->pers.inventory[ITEM_INDEX(ent->item)])
706: return false;
707: other->client->pers.inventory[ITEM_INDEX(ent->item)] = 1;
708: }
709: return true;
710: }
711: other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
712: return true;
713: }
714:
715: //======================================================================
716:
717: qboolean Add_Ammo (edict_t *ent, gitem_t *item, int count)
718: {
719: int index;
720: int max;
721:
722: if (!ent->client)
723: return false;
724:
725: if (item->tag == AMMO_BULLETS)
726: max = ent->client->pers.max_bullets;
727: else if (item->tag == AMMO_SHELLS)
728: max = ent->client->pers.max_shells;
729: else if (item->tag == AMMO_ROCKETS)
730: max = ent->client->pers.max_rockets;
731: else if (item->tag == AMMO_GRENADES)
732: max = ent->client->pers.max_grenades;
733: else if (item->tag == AMMO_CELLS)
734: max = ent->client->pers.max_cells;
735: else if (item->tag == AMMO_SLUGS)
736: max = ent->client->pers.max_slugs;
737: // ROGUE
738: // else if (item->tag == AMMO_MINES)
739: // max = ent->client->pers.max_mines;
740: else if (item->tag == AMMO_FLECHETTES)
741: max = ent->client->pers.max_flechettes;
742: else if (item->tag == AMMO_PROX)
743: max = ent->client->pers.max_prox;
744: else if (item->tag == AMMO_TESLA)
745: max = ent->client->pers.max_tesla;
746: #ifndef KILL_DISRUPTOR
747: else if (item->tag == AMMO_DISRUPTOR)
748: max = ent->client->pers.max_rounds;
749: #endif
750: // ROGUE
751: else
752: {
753: gi.dprintf("undefined ammo type\n");
754: return false;
755: }
756:
757: index = ITEM_INDEX(item);
758:
759: if (ent->client->pers.inventory[index] == max)
760: return false;
761:
762: ent->client->pers.inventory[index] += count;
763:
764: if (ent->client->pers.inventory[index] > max)
765: ent->client->pers.inventory[index] = max;
766:
767: return true;
768: }
769:
770: qboolean Pickup_Ammo (edict_t *ent, edict_t *other)
771: {
772: int oldcount;
773: int count;
774: qboolean weapon;
775:
776: weapon = (ent->item->flags & IT_WEAPON);
777: if ( (weapon) && ( (int)dmflags->value & DF_INFINITE_AMMO ) )
778: count = 1000;
779: else if (ent->count)
780: count = ent->count;
781: else
782: count = ent->item->quantity;
783:
784: oldcount = other->client->pers.inventory[ITEM_INDEX(ent->item)];
785:
786: if (!Add_Ammo (other, ent->item, count))
787: return false;
788:
789: if (weapon && !oldcount)
790: {
791: if (other->client->pers.weapon != ent->item && ( !deathmatch->value || other->client->pers.weapon == FindItem("blaster") ) )
792: other->client->newweapon = ent->item;
793: }
794:
795: if (!(ent->spawnflags & (DROPPED_ITEM | DROPPED_PLAYER_ITEM)) && (deathmatch->value))
796: SetRespawn (ent, 30);
797: return true;
798: }
799:
800: void Drop_Ammo (edict_t *ent, gitem_t *item)
801: {
802: edict_t *dropped;
803: int index;
804:
805: index = ITEM_INDEX(item);
806: dropped = Drop_Item (ent, item);
807: if (ent->client->pers.inventory[index] >= item->quantity)
808: dropped->count = item->quantity;
809: else
810: dropped->count = ent->client->pers.inventory[index];
811:
812: if (ent->client->pers.weapon &&
813: ent->client->pers.weapon->tag == AMMO_GRENADES &&
814: item->tag == AMMO_GRENADES &&
815: ent->client->pers.inventory[index] - dropped->count <= 0) {
816: gi.cprintf (ent, PRINT_HIGH, "Can't drop current weapon\n");
817: G_FreeEdict(dropped);
818: return;
819: }
820:
821: ent->client->pers.inventory[index] -= dropped->count;
822: ValidateSelectedItem (ent);
823: }
824:
825:
826: //======================================================================
827:
828: void MegaHealth_think (edict_t *self)
829: {
830: if (self->owner->health > self->owner->max_health)
831: {
832: self->nextthink = level.time + 1;
833: self->owner->health -= 1;
834: return;
835: }
836:
837: if (!(self->spawnflags & DROPPED_ITEM) && (deathmatch->value))
838: SetRespawn (self, 20);
839: else
840: G_FreeEdict (self);
841: }
842:
843: qboolean Pickup_Health (edict_t *ent, edict_t *other)
844: {
845: if (!(ent->style & HEALTH_IGNORE_MAX))
846: if (other->health >= other->max_health)
847: return false;
848:
849: other->health += ent->count;
850:
851: if (!(ent->style & HEALTH_IGNORE_MAX))
852: {
853: if (other->health > other->max_health)
854: other->health = other->max_health;
855: }
856:
857: if (ent->style & HEALTH_TIMED)
858: {
859: ent->think = MegaHealth_think;
860: ent->nextthink = level.time + 5;
861: ent->owner = other;
862: ent->flags |= FL_RESPAWN;
863: ent->svflags |= SVF_NOCLIENT;
864: ent->solid = SOLID_NOT;
865: }
866: else
867: {
868: if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
869: SetRespawn (ent, 30);
870: }
871:
872: return true;
873: }
874:
875: //======================================================================
876:
877: int ArmorIndex (edict_t *ent)
878: {
879: if (!ent->client)
880: return 0;
881:
882: if (ent->client->pers.inventory[jacket_armor_index] > 0)
883: return jacket_armor_index;
884:
885: if (ent->client->pers.inventory[combat_armor_index] > 0)
886: return combat_armor_index;
887:
888: if (ent->client->pers.inventory[body_armor_index] > 0)
889: return body_armor_index;
890:
891: return 0;
892: }
893:
894: qboolean Pickup_Armor (edict_t *ent, edict_t *other)
895: {
896: int old_armor_index;
897: gitem_armor_t *oldinfo;
898: gitem_armor_t *newinfo;
899: int newcount;
900: float salvage;
901: int salvagecount;
902:
903: // get info on new armor
904: newinfo = (gitem_armor_t *)ent->item->info;
905:
906: old_armor_index = ArmorIndex (other);
907:
908: // handle armor shards specially
909: if (ent->item->tag == ARMOR_SHARD)
910: {
911: if (!old_armor_index)
912: other->client->pers.inventory[jacket_armor_index] = 2;
913: else
914: other->client->pers.inventory[old_armor_index] += 2;
915: }
916:
917: // if player has no armor, just use it
918: else if (!old_armor_index)
919: {
920: other->client->pers.inventory[ITEM_INDEX(ent->item)] = newinfo->base_count;
921: }
922:
923: // use the better armor
924: else
925: {
926: // get info on old armor
927: if (old_armor_index == jacket_armor_index)
928: oldinfo = &jacketarmor_info;
929: else if (old_armor_index == combat_armor_index)
930: oldinfo = &combatarmor_info;
931: else // (old_armor_index == body_armor_index)
932: oldinfo = &bodyarmor_info;
933:
934: if (newinfo->normal_protection > oldinfo->normal_protection)
935: {
936: // calc new armor values
937: salvage = oldinfo->normal_protection / newinfo->normal_protection;
938: salvagecount = salvage * other->client->pers.inventory[old_armor_index];
939: newcount = newinfo->base_count + salvagecount;
940: if (newcount > newinfo->max_count)
941: newcount = newinfo->max_count;
942:
943: // zero count of old armor so it goes away
944: other->client->pers.inventory[old_armor_index] = 0;
945:
946: // change armor to new item with computed value
947: other->client->pers.inventory[ITEM_INDEX(ent->item)] = newcount;
948: }
949: else
950: {
951: // calc new armor values
952: salvage = newinfo->normal_protection / oldinfo->normal_protection;
953: salvagecount = salvage * newinfo->base_count;
954: newcount = other->client->pers.inventory[old_armor_index] + salvagecount;
955: if (newcount > oldinfo->max_count)
956: newcount = oldinfo->max_count;
957:
958: // if we're already maxed out then we don't need the new armor
959: if (other->client->pers.inventory[old_armor_index] >= newcount)
960: return false;
961:
962: // update current armor value
963: other->client->pers.inventory[old_armor_index] = newcount;
964: }
965: }
966:
967: if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
968: SetRespawn (ent, 20);
969:
970: return true;
971: }
972:
973: //======================================================================
974:
975: int PowerArmorType (edict_t *ent)
976: {
977: if (!ent->client)
978: return POWER_ARMOR_NONE;
979:
980: if (!(ent->flags & FL_POWER_ARMOR))
981: return POWER_ARMOR_NONE;
982:
983: if (ent->client->pers.inventory[power_shield_index] > 0)
984: return POWER_ARMOR_SHIELD;
985:
986: if (ent->client->pers.inventory[power_screen_index] > 0)
987: return POWER_ARMOR_SCREEN;
988:
989: return POWER_ARMOR_NONE;
990: }
991:
992: void Use_PowerArmor (edict_t *ent, gitem_t *item)
993: {
994: int index;
995:
996: if (ent->flags & FL_POWER_ARMOR)
997: {
998: ent->flags &= ~FL_POWER_ARMOR;
999: gi.sound(ent, CHAN_AUTO, gi.soundindex("misc/power2.wav"), 1, ATTN_NORM, 0);
1000: }
1001: else
1002: {
1003: index = ITEM_INDEX(FindItem("cells"));
1004: if (!ent->client->pers.inventory[index])
1005: {
1006: gi.cprintf (ent, PRINT_HIGH, "No cells for power armor.\n");
1007: return;
1008: }
1009: ent->flags |= FL_POWER_ARMOR;
1010: gi.sound(ent, CHAN_AUTO, gi.soundindex("misc/power1.wav"), 1, ATTN_NORM, 0);
1011: }
1012: }
1013:
1014: qboolean Pickup_PowerArmor (edict_t *ent, edict_t *other)
1015: {
1016: int quantity;
1017:
1018: quantity = other->client->pers.inventory[ITEM_INDEX(ent->item)];
1019:
1020: other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
1021:
1022: if (deathmatch->value)
1023: {
1024: if (!(ent->spawnflags & DROPPED_ITEM) )
1025: SetRespawn (ent, ent->item->quantity);
1026: // auto-use for DM only if we didn't already have one
1027: if (!quantity)
1028: ent->item->use (other, ent->item);
1029: }
1030:
1031: return true;
1032: }
1033:
1034: void Drop_PowerArmor (edict_t *ent, gitem_t *item)
1035: {
1036: if ((ent->flags & FL_POWER_ARMOR) && (ent->client->pers.inventory[ITEM_INDEX(item)] == 1))
1037: Use_PowerArmor (ent, item);
1038: Drop_General (ent, item);
1039: }
1040:
1041: //======================================================================
1042:
1043: /*
1044: ===============
1045: Touch_Item
1046: ===============
1047: */
1048: void Touch_Item (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf)
1049: {
1050: qboolean taken;
1051:
1052: if (!other->client)
1053: return;
1054: if (other->health < 1)
1055: return; // dead people can't pickup
1056: if (!ent->item->pickup)
1057: return; // not a grabbable item?
1058:
1059: taken = ent->item->pickup(ent, other);
1060:
1061: if (taken)
1062: {
1063: // flash the screen
1064: other->client->bonus_alpha = 0.25;
1065:
1066: // show icon and name on status bar
1067: other->client->ps.stats[STAT_PICKUP_ICON] = gi.imageindex(ent->item->icon);
1068: other->client->ps.stats[STAT_PICKUP_STRING] = CS_ITEMS+ITEM_INDEX(ent->item);
1069: other->client->pickup_msg_time = level.time + 3.0;
1070:
1071: // change selected item
1072: if (ent->item->use)
1073: other->client->pers.selected_item = other->client->ps.stats[STAT_SELECTED_ITEM] = ITEM_INDEX(ent->item);
1074:
1075: if (ent->item->pickup == Pickup_Health)
1076: {
1077: if (ent->count == 2)
1078: gi.sound(other, CHAN_ITEM, gi.soundindex("items/s_health.wav"), 1, ATTN_NORM, 0);
1079: else if (ent->count == 10)
1080: gi.sound(other, CHAN_ITEM, gi.soundindex("items/n_health.wav"), 1, ATTN_NORM, 0);
1081: else if (ent->count == 25)
1082: gi.sound(other, CHAN_ITEM, gi.soundindex("items/l_health.wav"), 1, ATTN_NORM, 0);
1083: else // (ent->count == 100)
1084: gi.sound(other, CHAN_ITEM, gi.soundindex("items/m_health.wav"), 1, ATTN_NORM, 0);
1085: }
1086: else if (ent->item->pickup_sound)
1087: {
1088: gi.sound(other, CHAN_ITEM, gi.soundindex(ent->item->pickup_sound), 1, ATTN_NORM, 0);
1089: }
1090: }
1091:
1092: if (!(ent->spawnflags & ITEM_TARGETS_USED))
1093: {
1094: G_UseTargets (ent, other);
1095: ent->spawnflags |= ITEM_TARGETS_USED;
1096: }
1097:
1098: if (!taken)
1099: return;
1100:
1101: if (!((coop->value) && (ent->item->flags & IT_STAY_COOP)) || (ent->spawnflags & (DROPPED_ITEM | DROPPED_PLAYER_ITEM)))
1102: {
1103: if (ent->flags & FL_RESPAWN)
1104: ent->flags &= ~FL_RESPAWN;
1105: else
1106: G_FreeEdict (ent);
1107: }
1108: }
1109:
1110: //======================================================================
1111:
1112: static void drop_temp_touch (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf)
1113: {
1114: if (other == ent->owner)
1115: return;
1116:
1117: Touch_Item (ent, other, plane, surf);
1118: }
1119:
1120: static void drop_make_touchable (edict_t *ent)
1121: {
1122: ent->touch = Touch_Item;
1123: if (deathmatch->value)
1124: {
1125: ent->nextthink = level.time + 29;
1126: ent->think = G_FreeEdict;
1127: }
1128: }
1129:
1130: edict_t *Drop_Item (edict_t *ent, gitem_t *item)
1131: {
1132: edict_t *dropped;
1133: vec3_t forward, right;
1134: vec3_t offset;
1135:
1136: dropped = G_Spawn();
1137:
1138: dropped->classname = item->classname;
1139: dropped->item = item;
1140: dropped->spawnflags = DROPPED_ITEM;
1141: dropped->s.effects = item->world_model_flags;
1142: dropped->s.renderfx = RF_GLOW | RF_IR_VISIBLE; // PGM
1143: VectorSet (dropped->mins, -15, -15, -15);
1144: VectorSet (dropped->maxs, 15, 15, 15);
1145: gi.setmodel (dropped, dropped->item->world_model);
1146: dropped->solid = SOLID_TRIGGER;
1147: dropped->movetype = MOVETYPE_TOSS;
1148: dropped->touch = drop_temp_touch;
1149: dropped->owner = ent;
1150:
1151: if (ent->client)
1152: {
1153: trace_t trace;
1154:
1155: AngleVectors (ent->client->v_angle, forward, right, NULL);
1156: VectorSet(offset, 24, 0, -16);
1157: G_ProjectSource (ent->s.origin, offset, forward, right, dropped->s.origin);
1158: trace = gi.trace (ent->s.origin, dropped->mins, dropped->maxs,
1159: dropped->s.origin, ent, CONTENTS_SOLID);
1160: VectorCopy (trace.endpos, dropped->s.origin);
1161: }
1162: else
1163: {
1164: AngleVectors (ent->s.angles, forward, right, NULL);
1165: VectorCopy (ent->s.origin, dropped->s.origin);
1166: }
1167:
1168: VectorScale (forward, 100, dropped->velocity);
1169: dropped->velocity[2] = 300;
1170:
1171: dropped->think = drop_make_touchable;
1172: dropped->nextthink = level.time + 1;
1173:
1174: gi.linkentity (dropped);
1175:
1176: return dropped;
1177: }
1178:
1179: void Use_Item (edict_t *ent, edict_t *other, edict_t *activator)
1180: {
1181: ent->svflags &= ~SVF_NOCLIENT;
1182: ent->use = NULL;
1183:
1184: if (ent->spawnflags & ITEM_NO_TOUCH)
1185: {
1186: ent->solid = SOLID_BBOX;
1187: ent->touch = NULL;
1188: }
1189: else
1190: {
1191: ent->solid = SOLID_TRIGGER;
1192: ent->touch = Touch_Item;
1193: }
1194:
1195: gi.linkentity (ent);
1196: }
1197:
1198: //======================================================================
1199:
1200: /*
1201: ================
1202: droptofloor
1203: ================
1204: */
1205: void droptofloor (edict_t *ent)
1206: {
1207: trace_t tr;
1208: vec3_t dest;
1209: float *v;
1210:
1211: v = tv(-15,-15,-15);
1212: VectorCopy (v, ent->mins);
1213: v = tv(15,15,15);
1214: VectorCopy (v, ent->maxs);
1215:
1216: if (ent->model)
1217: gi.setmodel (ent, ent->model);
1218: else if (ent->item->world_model) // PGM we shouldn't need this check, but paranoia...
1219: gi.setmodel (ent, ent->item->world_model);
1220: ent->solid = SOLID_TRIGGER;
1221: ent->movetype = MOVETYPE_TOSS;
1222: ent->touch = Touch_Item;
1223:
1224: v = tv(0,0,-128);
1225: VectorAdd (ent->s.origin, v, dest);
1226:
1227: tr = gi.trace (ent->s.origin, ent->mins, ent->maxs, dest, ent, MASK_SOLID);
1228: if (tr.startsolid)
1229: {
1230: gi.dprintf ("droptofloor: %s startsolid at %s\n", ent->classname, vtos(ent->s.origin));
1231: G_FreeEdict (ent);
1232: return;
1233: }
1234:
1235: VectorCopy (tr.endpos, ent->s.origin);
1236:
1237: if (ent->team)
1238: {
1239: ent->flags &= ~FL_TEAMSLAVE;
1240: ent->chain = ent->teamchain;
1241: ent->teamchain = NULL;
1242:
1243: ent->svflags |= SVF_NOCLIENT;
1244: ent->solid = SOLID_NOT;
1245: if (ent == ent->teammaster)
1246: {
1247: ent->nextthink = level.time + FRAMETIME;
1248: ent->think = DoRespawn;
1249: }
1250: }
1251:
1252: if (ent->spawnflags & ITEM_NO_TOUCH)
1253: {
1254: ent->solid = SOLID_BBOX;
1255: ent->touch = NULL;
1256: ent->s.effects &= ~EF_ROTATE;
1257: ent->s.renderfx &= ~RF_GLOW;
1258: }
1259:
1260: if (ent->spawnflags & ITEM_TRIGGER_SPAWN)
1261: {
1262: ent->svflags |= SVF_NOCLIENT;
1263: ent->solid = SOLID_NOT;
1264: ent->use = Use_Item;
1265: }
1266:
1267: gi.linkentity (ent);
1268: }
1269:
1270:
1271: /*
1272: ===============
1273: PrecacheItem
1274:
1275: Precaches all data needed for a given item.
1276: This will be called for each item spawned in a level,
1277: and for each item in each client's inventory.
1278: ===============
1279: */
1280: void PrecacheItem (gitem_t *it)
1281: {
1282: char *s, *start;
1283: char data[MAX_QPATH];
1284: int len;
1285: gitem_t *ammo;
1286:
1287: if (!it)
1288: return;
1289:
1290: if (it->pickup_sound)
1291: gi.soundindex (it->pickup_sound);
1292: if (it->world_model)
1293: gi.modelindex (it->world_model);
1294: if (it->view_model)
1295: gi.modelindex (it->view_model);
1296: if (it->icon)
1297: gi.imageindex (it->icon);
1298:
1299: // parse everything for its ammo
1300: if (it->ammo && it->ammo[0])
1301: {
1302: ammo = FindItem (it->ammo);
1303: if (ammo != it)
1304: PrecacheItem (ammo);
1305: }
1306:
1307: // parse the space seperated precache string for other items
1308: s = it->precaches;
1309: if (!s || !s[0])
1310: return;
1311:
1312: while (*s)
1313: {
1314: start = s;
1315: while (*s && *s != ' ')
1316: s++;
1317:
1318: len = s-start;
1319: if (len >= MAX_QPATH || len < 5)
1320: gi.error ("PrecacheItem: %s has bad precache string", it->classname);
1321: memcpy (data, start, len);
1322: data[len] = 0;
1323: if (*s)
1324: s++;
1325:
1326: // determine type based on extension
1327: if (!strcmp(data+len-3, "md2"))
1328: gi.modelindex (data);
1329: else if (!strcmp(data+len-3, "sp2"))
1330: gi.modelindex (data);
1331: else if (!strcmp(data+len-3, "wav"))
1332: gi.soundindex (data);
1333: if (!strcmp(data+len-3, "pcx"))
1334: gi.imageindex (data);
1335: }
1336: }
1337:
1338:
1339: //=================
1340: // Item_TriggeredSpawn - create the item marked for spawn creation
1341: //=================
1342: void Item_TriggeredSpawn (edict_t *self, edict_t *other, edict_t *activator)
1343: {
1344: // self->nextthink = level.time + 2 * FRAMETIME; // items start after other solids
1345: // self->think = droptofloor;
1346: self->svflags &= ~SVF_NOCLIENT;
1347: self->use = NULL;
1348: if(strcmp(self->classname, "key_power_cube")) // leave them be on key_power_cube..
1349: self->spawnflags = 0;
1350: droptofloor (self);
1351: }
1352:
1353: //=================
1354: // SetTriggeredSpawn - set up an item to spawn in later.
1355: //=================
1356: void SetTriggeredSpawn (edict_t *ent)
1357: {
1358: // don't do anything on key_power_cubes.
1359: if(!strcmp(ent->classname, "key_power_cube"))
1360: return;
1361:
1362: ent->think = NULL;
1363: ent->nextthink = 0;
1364: ent->use = Item_TriggeredSpawn;
1365: ent->svflags |= SVF_NOCLIENT;
1366: ent->solid = SOLID_NOT;
1367: }
1368:
1369: /*
1370: ============
1371: SpawnItem
1372:
1373: Sets the clipping size and plants the object on the floor.
1374:
1375: Items can't be immediately dropped to floor, because they might
1376: be on an entity that hasn't spawned yet.
1377: ============
1378: */
1379: void SpawnItem (edict_t *ent, gitem_t *item)
1380: {
1381: #if KILL_DISRUPTOR
1382: if ((!strcmp(ent->classname, "ammo_disruptor")) || (!strcmp(ent->classname, "weapon_disintegrator")))
1383: {
1384: G_FreeEdict (ent);
1385: return;
1386: }
1387: #endif
1388:
1389: // PGM - since the item may be freed by the following rules, go ahead
1390: // and move the precache until AFTER the following rules have been checked.
1391: // keep an eye on this.
1392: // PrecacheItem (item);
1393:
1394: if (ent->spawnflags > 1) // PGM
1395: {
1396: if (strcmp(ent->classname, "key_power_cube") != 0)
1397: {
1398: ent->spawnflags = 0;
1399: gi.dprintf("%s at %s has invalid spawnflags set\n", ent->classname, vtos(ent->s.origin));
1400: }
1401: }
1402:
1403: // some items will be prevented in deathmatch
1404: if (deathmatch->value)
1405: {
1406: if ( (int)dmflags->value & DF_NO_ARMOR )
1407: {
1408: if (item->pickup == Pickup_Armor || item->pickup == Pickup_PowerArmor)
1409: {
1410: G_FreeEdict (ent);
1411: return;
1412: }
1413: }
1414: if ( (int)dmflags->value & DF_NO_ITEMS )
1415: {
1416: if (item->pickup == Pickup_Powerup)
1417: {
1418: G_FreeEdict (ent);
1419: return;
1420: }
1421: }
1422: if ( (int)dmflags->value & DF_NO_HEALTH )
1423: {
1424: if (item->pickup == Pickup_Health || item->pickup == Pickup_Adrenaline || item->pickup == Pickup_AncientHead)
1425: {
1426: G_FreeEdict (ent);
1427: return;
1428: }
1429: }
1430: if ( (int)dmflags->value & DF_INFINITE_AMMO )
1431: {
1432: if ( (item->flags == IT_AMMO) || (strcmp(ent->classname, "weapon_bfg") == 0) )
1433: {
1434: G_FreeEdict (ent);
1435: return;
1436: }
1437: }
1438:
1439: //==========
1440: //ROGUE
1441: if ( (int)dmflags->value & DF_NO_MINES )
1442: {
1443: if ( !strcmp(ent->classname, "ammo_prox") ||
1444: !strcmp(ent->classname, "ammo_tesla") )
1445: {
1446: G_FreeEdict (ent);
1447: return;
1448: }
1449: }
1450: if ( (int)dmflags->value & DF_NO_NUKES )
1451: {
1452: if ( !strcmp(ent->classname, "ammo_nuke") )
1453: {
1454: G_FreeEdict (ent);
1455: return;
1456: }
1457: }
1458: //ROGUE
1459: //==========
1460:
1461: }
1462: //==========
1463: //ROGUE
1464: // DM only items
1465: if (!deathmatch->value)
1466: {
1467: if (item->pickup == Pickup_Doppleganger || item->pickup == Pickup_Nuke)
1468: {
1469: G_FreeEdict (ent);
1470: return;
1471: }
1472: if ((item->use == Use_Vengeance) || (item->use == Use_Hunter))
1473: {
1474: G_FreeEdict (ent);
1475: return;
1476: }
1477: }
1478: //ROGUE
1479: //==========
1480:
1481: //PGM
1482: PrecacheItem (item);
1483: //PGM
1484:
1485: if (coop->value && (strcmp(ent->classname, "key_power_cube") == 0))
1486: {
1487: ent->spawnflags |= (1 << (8 + level.power_cubes));
1488: level.power_cubes++;
1489: }
1490:
1491: // don't let them drop items that stay in a coop game
1492: if ((coop->value) && (item->flags & IT_STAY_COOP))
1493: {
1494: item->drop = NULL;
1495: }
1496:
1497: ent->item = item;
1498: ent->nextthink = level.time + 2 * FRAMETIME; // items start after other solids
1499: ent->think = droptofloor;
1500: ent->s.effects = item->world_model_flags;
1501: ent->s.renderfx = RF_GLOW;
1502: if (ent->model)
1503: gi.modelindex (ent->model);
1504:
1505: if (ent->spawnflags & 1)
1506: SetTriggeredSpawn (ent);
1507: }
1508:
1509: //======================================================================
1510:
1511: gitem_t itemlist[] =
1512: {
1513: {
1514: NULL
1515: }, // leave index 0 alone
1516:
1517: //
1518: // ARMOR
1519: //
1520:
1521: /*QUAKED item_armor_body (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1522: */
1523: {
1524: "item_armor_body",
1525: Pickup_Armor,
1526: NULL,
1527: NULL,
1528: NULL,
1529: "misc/ar1_pkup.wav",
1530: "models/items/armor/body/tris.md2", EF_ROTATE,
1531: NULL,
1532: /* icon */ "i_bodyarmor",
1533: /* pickup */ "Body Armor",
1534: /* width */ 3,
1535: 0,
1536: NULL,
1537: IT_ARMOR,
1538: 0,
1539: &bodyarmor_info,
1540: ARMOR_BODY,
1541: /* precache */ ""
1542: },
1543:
1544: /*QUAKED item_armor_combat (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1545: */
1546: {
1547: "item_armor_combat",
1548: Pickup_Armor,
1549: NULL,
1550: NULL,
1551: NULL,
1552: "misc/ar1_pkup.wav",
1553: "models/items/armor/combat/tris.md2", EF_ROTATE,
1554: NULL,
1555: /* icon */ "i_combatarmor",
1556: /* pickup */ "Combat Armor",
1557: /* width */ 3,
1558: 0,
1559: NULL,
1560: IT_ARMOR,
1561: 0,
1562: &combatarmor_info,
1563: ARMOR_COMBAT,
1564: /* precache */ ""
1565: },
1566:
1567: /*QUAKED item_armor_jacket (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1568: */
1569: {
1570: "item_armor_jacket",
1571: Pickup_Armor,
1572: NULL,
1573: NULL,
1574: NULL,
1575: "misc/ar1_pkup.wav",
1576: "models/items/armor/jacket/tris.md2", EF_ROTATE,
1577: NULL,
1578: /* icon */ "i_jacketarmor",
1579: /* pickup */ "Jacket Armor",
1580: /* width */ 3,
1581: 0,
1582: NULL,
1583: IT_ARMOR,
1584: 0,
1585: &jacketarmor_info,
1586: ARMOR_JACKET,
1587: /* precache */ ""
1588: },
1589:
1590: /*QUAKED item_armor_shard (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1591: */
1592: {
1593: "item_armor_shard",
1594: Pickup_Armor,
1595: NULL,
1596: NULL,
1597: NULL,
1598: "misc/ar2_pkup.wav",
1599: "models/items/armor/shard/tris.md2", EF_ROTATE,
1600: NULL,
1601: /* icon */ "i_jacketarmor",
1602: /* pickup */ "Armor Shard",
1603: /* width */ 3,
1604: 0,
1605: NULL,
1606: IT_ARMOR,
1607: 0,
1608: NULL,
1609: ARMOR_SHARD,
1610: /* precache */ ""
1611: },
1612:
1613:
1614: /*QUAKED item_power_screen (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1615: */
1616: {
1617: "item_power_screen",
1618: Pickup_PowerArmor,
1619: Use_PowerArmor,
1620: Drop_PowerArmor,
1621: NULL,
1622: "misc/ar3_pkup.wav",
1623: "models/items/armor/screen/tris.md2", EF_ROTATE,
1624: NULL,
1625: /* icon */ "i_powerscreen",
1626: /* pickup */ "Power Screen",
1627: /* width */ 0,
1628: 60,
1629: NULL,
1630: IT_ARMOR,
1631: 0,
1632: NULL,
1633: 0,
1634: /* precache */ ""
1635: },
1636:
1637: /*QUAKED item_power_shield (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1638: */
1639: {
1640: "item_power_shield",
1641: Pickup_PowerArmor,
1642: Use_PowerArmor,
1643: Drop_PowerArmor,
1644: NULL,
1645: "misc/ar3_pkup.wav",
1646: "models/items/armor/shield/tris.md2", EF_ROTATE,
1647: NULL,
1648: /* icon */ "i_powershield",
1649: /* pickup */ "Power Shield",
1650: /* width */ 0,
1651: 60,
1652: NULL,
1653: IT_ARMOR,
1654: 0,
1655: NULL,
1656: 0,
1657: /* precache */ "misc/power2.wav misc/power1.wav"
1658: },
1659:
1660:
1661: //
1662: // WEAPONS
1663: //
1664:
1665: /* weapon_blaster (.3 .3 1) (-16 -16 -16) (16 16 16)
1666: always owned, never in the world
1667: */
1668: {
1669: "weapon_blaster",
1670: NULL,
1671: Use_Weapon,
1672: NULL,
1673: Weapon_Blaster,
1674: "misc/w_pkup.wav",
1675: NULL, 0,
1676: "models/weapons/v_blast/tris.md2",
1677: /* icon */ "w_blaster",
1678: /* pickup */ "Blaster",
1679: 0,
1680: 0,
1681: NULL,
1682: IT_WEAPON|IT_STAY_COOP,
1683: WEAP_BLASTER,
1684: NULL,
1685: 0,
1686: /* precache */ "weapons/blastf1a.wav misc/lasfly.wav"
1687: },
1688:
1689: /*QUAKED weapon_shotgun (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1690: */
1691: {
1692: "weapon_shotgun",
1693: Pickup_Weapon,
1694: Use_Weapon,
1695: Drop_Weapon,
1696: Weapon_Shotgun,
1697: "misc/w_pkup.wav",
1698: "models/weapons/g_shotg/tris.md2", EF_ROTATE,
1699: "models/weapons/v_shotg/tris.md2",
1700: /* icon */ "w_shotgun",
1701: /* pickup */ "Shotgun",
1702: 0,
1703: 1,
1704: "Shells",
1705: IT_WEAPON|IT_STAY_COOP,
1706: WEAP_SHOTGUN,
1707: NULL,
1708: 0,
1709: /* precache */ "weapons/shotgf1b.wav weapons/shotgr1b.wav"
1710: },
1711:
1712: /*QUAKED weapon_supershotgun (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1713: */
1714: {
1715: "weapon_supershotgun",
1716: Pickup_Weapon,
1717: Use_Weapon,
1718: Drop_Weapon,
1719: Weapon_SuperShotgun,
1720: "misc/w_pkup.wav",
1721: "models/weapons/g_shotg2/tris.md2", EF_ROTATE,
1722: "models/weapons/v_shotg2/tris.md2",
1723: /* icon */ "w_sshotgun",
1724: /* pickup */ "Super Shotgun",
1725: 0,
1726: 2,
1727: "Shells",
1728: IT_WEAPON|IT_STAY_COOP,
1729: WEAP_SUPERSHOTGUN,
1730: NULL,
1731: 0,
1732: /* precache */ "weapons/sshotf1b.wav"
1733: },
1734:
1735: /*QUAKED weapon_machinegun (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1736: */
1737: {
1738: "weapon_machinegun",
1739: Pickup_Weapon,
1740: Use_Weapon,
1741: Drop_Weapon,
1742: Weapon_Machinegun,
1743: "misc/w_pkup.wav",
1744: "models/weapons/g_machn/tris.md2", EF_ROTATE,
1745: "models/weapons/v_machn/tris.md2",
1746: /* icon */ "w_machinegun",
1747: /* pickup */ "Machinegun",
1748: 0,
1749: 1,
1750: "Bullets",
1751: IT_WEAPON|IT_STAY_COOP,
1752: WEAP_MACHINEGUN,
1753: NULL,
1754: 0,
1755: /* precache */ "weapons/machgf1b.wav weapons/machgf2b.wav weapons/machgf3b.wav weapons/machgf4b.wav weapons/machgf5b.wav"
1756: },
1757:
1758: /*QUAKED weapon_chaingun (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1759: */
1760: {
1761: "weapon_chaingun",
1762: Pickup_Weapon,
1763: Use_Weapon,
1764: Drop_Weapon,
1765: Weapon_Chaingun,
1766: "misc/w_pkup.wav",
1767: "models/weapons/g_chain/tris.md2", EF_ROTATE,
1768: "models/weapons/v_chain/tris.md2",
1769: /* icon */ "w_chaingun",
1770: /* pickup */ "Chaingun",
1771: 0,
1772: 1,
1773: "Bullets",
1774: IT_WEAPON|IT_STAY_COOP,
1775: WEAP_CHAINGUN,
1776: NULL,
1777: 0,
1778: /* precache */ "weapons/chngnu1a.wav weapons/chngnl1a.wav weapons/machgf3b.wav` weapons/chngnd1a.wav"
1779: },
1780:
1781: // ROGUE
1782: /*QUAKED weapon_nailgun (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1783: */
1784: /*QUAKED weapon_etf_rifle (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1785: */
1786: {
1787: "weapon_etf_rifle", // classname
1788: Pickup_Weapon, // pickup function
1789: Use_Weapon, // use function
1790: Drop_Weapon, // drop function
1791: Weapon_ETF_Rifle, // weapon think function
1792: "misc/w_pkup.wav", // pick up sound
1793: "models/weapons/g_etf_rifle/tris.md2", EF_ROTATE, // world model, world model flags
1794: "models/weapons/v_etf_rifle/tris.md2", // view model
1795: "w_etf_rifle", // icon
1796: "ETF Rifle", // name printed when picked up
1797: 0, // number of digits for statusbar
1798: 1, // amount used / contained
1799: "Flechettes", // ammo type used
1800: IT_WEAPON, // inventory flags
1801: WEAP_ETFRIFLE, // visible weapon
1802: NULL, // info (void *)
1803: 0, // tag
1804: "weapons/nail1.wav models/proj/flechette/tris.md2", // precaches
1805: },
1806:
1807: // rogue
1808: /*QUAKED ammo_grenades (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1809: */
1810: {
1811: "ammo_grenades",
1812: Pickup_Ammo,
1813: Use_Weapon,
1814: Drop_Ammo,
1815: Weapon_Grenade,
1816: "misc/am_pkup.wav",
1817: "models/items/ammo/grenades/medium/tris.md2", 0,
1818: "models/weapons/v_handgr/tris.md2",
1819: /* icon */ "a_grenades",
1820: /* pickup */ "Grenades",
1821: /* width */ 3,
1822: 5,
1823: "grenades",
1824: IT_AMMO|IT_WEAPON,
1825: WEAP_GRENADES,
1826: NULL,
1827: AMMO_GRENADES,
1828: /* precache */ "weapons/hgrent1a.wav weapons/hgrena1b.wav weapons/hgrenc1b.wav weapons/hgrenb1a.wav weapons/hgrenb2a.wav "
1829: },
1830:
1831: /*QUAKED weapon_grenadelauncher (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1832: */
1833: {
1834: "weapon_grenadelauncher",
1835: Pickup_Weapon,
1836: Use_Weapon,
1837: Drop_Weapon,
1838: Weapon_GrenadeLauncher,
1839: "misc/w_pkup.wav",
1840: "models/weapons/g_launch/tris.md2", EF_ROTATE,
1841: "models/weapons/v_launch/tris.md2",
1842: /* icon */ "w_glauncher",
1843: /* pickup */ "Grenade Launcher",
1844: 0,
1845: 1,
1846: "Grenades",
1847: IT_WEAPON|IT_STAY_COOP,
1848: WEAP_GRENADELAUNCHER,
1849: NULL,
1850: 0,
1851: /* precache */ "models/objects/grenade/tris.md2 weapons/grenlf1a.wav weapons/grenlr1b.wav weapons/grenlb1b.wav"
1852: },
1853:
1854: // ROGUE
1855: /*QUAKED weapon_proxlauncher (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1856: */
1857: {
1858: "weapon_proxlauncher", // classname
1859: Pickup_Weapon, // pickup
1860: Use_Weapon, // use
1861: Drop_Weapon, // drop
1862: Weapon_ProxLauncher, // weapon think
1863: "misc/w_pkup.wav", // pick up sound
1864: "models/weapons/g_plaunch/tris.md2", EF_ROTATE, // world model, world model flags
1865: "models/weapons/v_plaunch/tris.md2", // view model
1866: "w_proxlaunch", // icon
1867: "Prox Launcher", // name printed when picked up
1868: 0, // number of digits for statusbar
1869: 1, // amount used
1870: "prox", // ammo type used
1871: IT_WEAPON, // inventory flags
1872: WEAP_PROXLAUNCH, // visible weapon
1873: NULL, // info (void *)
1874: AMMO_PROX, // tag
1875: "weapons/grenlf1a.wav weapons/grenlr1b.wav weapons/grenlb1b.wav weapons/proxwarn.wav",
1876: },
1877: // rogue
1878:
1879: /*QUAKED weapon_rocketlauncher (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1880: */
1881: {
1882: "weapon_rocketlauncher",
1883: Pickup_Weapon,
1884: Use_Weapon,
1885: Drop_Weapon,
1886: Weapon_RocketLauncher,
1887: "misc/w_pkup.wav",
1888: "models/weapons/g_rocket/tris.md2", EF_ROTATE,
1889: "models/weapons/v_rocket/tris.md2",
1890: /* icon */ "w_rlauncher",
1891: /* pickup */ "Rocket Launcher",
1892: 0,
1893: 1,
1894: "Rockets",
1895: IT_WEAPON|IT_STAY_COOP,
1896: WEAP_ROCKETLAUNCHER,
1897: NULL,
1898: 0,
1899: /* precache */ "models/objects/rocket/tris.md2 weapons/rockfly.wav weapons/rocklf1a.wav weapons/rocklr1b.wav models/objects/debris2/tris.md2"
1900: },
1901:
1902: /*QUAKED weapon_hyperblaster (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1903: */
1904: {
1905: "weapon_hyperblaster",
1906: Pickup_Weapon,
1907: Use_Weapon,
1908: Drop_Weapon,
1909: Weapon_HyperBlaster,
1910: "misc/w_pkup.wav",
1911: "models/weapons/g_hyperb/tris.md2", EF_ROTATE,
1912: "models/weapons/v_hyperb/tris.md2",
1913: /* icon */ "w_hyperblaster",
1914: /* pickup */ "HyperBlaster",
1915: 0,
1916: 1,
1917: "Cells",
1918: IT_WEAPON|IT_STAY_COOP,
1919: WEAP_HYPERBLASTER,
1920: NULL,
1921: 0,
1922: /* precache */ "weapons/hyprbu1a.wav weapons/hyprbl1a.wav weapons/hyprbf1a.wav weapons/hyprbd1a.wav misc/lasfly.wav"
1923: },
1924:
1925: // ROGUE
1926: /*QUAKED weapon_heatbeam (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1927: */
1928: /*QUAKED weapon_plasmabeam (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1929: */
1930: {
1931: "weapon_plasmabeam", // classname
1932: Pickup_Weapon, // pickup function
1933: Use_Weapon, // use function
1934: Drop_Weapon, // drop function
1935: Weapon_Heatbeam, // weapon think function
1936: "misc/w_pkup.wav", // pick up sound
1937: "models/weapons/g_beamer/tris.md2", EF_ROTATE, // world model, world model flags
1938: "models/weapons/v_beamer/tris.md2", // view model
1939: "w_heatbeam", // icon
1940: "Plasma Beam", // name printed when picked up
1941: 0, // number of digits for statusbar
1942: // FIXME - if this changes, change it in NoAmmoWeaponChange as well
1943: 2, // amount used / contained
1944: "Cells", // ammo type used
1945: IT_WEAPON, // inventory flags
1946: WEAP_PLASMA, // visible weapon
1947: NULL, // info (void *)
1948: 0, // tag
1949: "models/weapons/v_beamer2/tris.md2 weapons/bfg__l1a.wav", // precaches
1950: },
1951: //rogue
1952: /*QUAKED weapon_railgun (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1953: */
1954: {
1955: "weapon_railgun",
1956: Pickup_Weapon,
1957: Use_Weapon,
1958: Drop_Weapon,
1959: Weapon_Railgun,
1960: "misc/w_pkup.wav",
1961: "models/weapons/g_rail/tris.md2", EF_ROTATE,
1962: "models/weapons/v_rail/tris.md2",
1963: /* icon */ "w_railgun",
1964: /* pickup */ "Railgun",
1965: 0,
1966: 1,
1967: "Slugs",
1968: IT_WEAPON|IT_STAY_COOP,
1969: WEAP_RAILGUN,
1970: NULL,
1971: 0,
1972: /* precache */ "weapons/rg_hum.wav"
1973: },
1974:
1975: /*QUAKED weapon_bfg (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
1976: */
1977: {
1978: "weapon_bfg",
1979: Pickup_Weapon,
1980: Use_Weapon,
1981: Drop_Weapon,
1982: Weapon_BFG,
1983: "misc/w_pkup.wav",
1984: "models/weapons/g_bfg/tris.md2", EF_ROTATE,
1985: "models/weapons/v_bfg/tris.md2",
1986: /* icon */ "w_bfg",
1987: /* pickup */ "BFG10K",
1988: 0,
1989: 50,
1990: "Cells",
1991: IT_WEAPON|IT_STAY_COOP,
1992: WEAP_BFG,
1993: NULL,
1994: 0,
1995: /* precache */ "sprites/s_bfg1.sp2 sprites/s_bfg2.sp2 sprites/s_bfg3.sp2 weapons/bfg__f1y.wav weapons/bfg__l1a.wav weapons/bfg__x1b.wav weapons/bfg_hum.wav"
1996: },
1997:
1998: // =========================
1999: // ROGUE WEAPONS
2000: /*QUAKED weapon_chainfist (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2001: */
2002: {
2003: "weapon_chainfist", // classname
2004: Pickup_Weapon, // pickup function
2005: Use_Weapon, // use function
2006: Drop_Weapon, // drop function
2007: Weapon_ChainFist, // weapon think function
2008: "misc/w_pkup.wav", // pick up sound
2009: "models/weapons/g_chainf/tris.md2", EF_ROTATE, // world model, world model flags
2010: "models/weapons/v_chainf/tris.md2", // view model
2011: "w_chainfist", // icon
2012: "Chainfist", // name printed when picked up
2013: 0, // number of digits for statusbar
2014: 0, // amount used / contained
2015: NULL, // ammo type used
2016: IT_WEAPON | IT_MELEE, // inventory flags
2017: WEAP_CHAINFIST, // visible weapon
2018: NULL, // info (void *)
2019: 1, // tag
2020: "weapons/sawidle.wav weapons/sawhit.wav", // precaches
2021: },
2022:
2023: /*QUAKED weapon_disintegrator (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2024: */
2025: {
2026: "weapon_disintegrator", // classname
2027: Pickup_Weapon, // pickup function
2028: Use_Weapon, // use function
2029: Drop_Weapon, // drop function
2030: Weapon_Disintegrator, // weapon think function
2031: "misc/w_pkup.wav", // pick up sound
2032: "models/weapons/g_dist/tris.md2", EF_ROTATE, // world model, world model flags
2033: "models/weapons/v_dist/tris.md2", // view model
2034: "w_disintegrator", // icon
2035: "Disruptor", // name printed when picked up
2036: 0, // number of digits for statusbar
2037: 1, // amount used / contained
2038: "Rounds", // ammo type used
2039: #ifdef KILL_DISRUPTOR
2040: IT_NOT_GIVEABLE,
2041: #else
2042: IT_WEAPON, // inventory flags
2043: #endif
2044: WEAP_DISRUPTOR, // visible weapon
2045: NULL, // info (void *)
2046: 1, // tag
2047: "models/items/spawngro/tris.md2 models/proj/disintegrator/tris.md2 weapons/disrupt.wav weapons/disint2.wav weapons/disrupthit.wav", // precaches
2048: },
2049:
2050: // ROGUE WEAPONS
2051: // =========================
2052:
2053:
2054: //
2055: // AMMO ITEMS
2056: //
2057:
2058: /*QUAKED ammo_shells (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2059: */
2060: {
2061: "ammo_shells",
2062: Pickup_Ammo,
2063: NULL,
2064: Drop_Ammo,
2065: NULL,
2066: "misc/am_pkup.wav",
2067: "models/items/ammo/shells/medium/tris.md2", 0,
2068: NULL,
2069: /* icon */ "a_shells",
2070: /* pickup */ "Shells",
2071: /* width */ 3,
2072: 10,
2073: NULL,
2074: IT_AMMO,
2075: 0,
2076: NULL,
2077: AMMO_SHELLS,
2078: /* precache */ ""
2079: },
2080:
2081: /*QUAKED ammo_bullets (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2082: */
2083: {
2084: "ammo_bullets",
2085: Pickup_Ammo,
2086: NULL,
2087: Drop_Ammo,
2088: NULL,
2089: "misc/am_pkup.wav",
2090: "models/items/ammo/bullets/medium/tris.md2", 0,
2091: NULL,
2092: /* icon */ "a_bullets",
2093: /* pickup */ "Bullets",
2094: /* width */ 3,
2095: 50,
2096: NULL,
2097: IT_AMMO,
2098: 0,
2099: NULL,
2100: AMMO_BULLETS,
2101: /* precache */ ""
2102: },
2103:
2104: /*QUAKED ammo_cells (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2105: */
2106: {
2107: "ammo_cells",
2108: Pickup_Ammo,
2109: NULL,
2110: Drop_Ammo,
2111: NULL,
2112: "misc/am_pkup.wav",
2113: "models/items/ammo/cells/medium/tris.md2", 0,
2114: NULL,
2115: /* icon */ "a_cells",
2116: /* pickup */ "Cells",
2117: /* width */ 3,
2118: 50,
2119: NULL,
2120: IT_AMMO,
2121: 0,
2122: NULL,
2123: AMMO_CELLS,
2124: /* precache */ ""
2125: },
2126:
2127: /*QUAKED ammo_rockets (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2128: */
2129: {
2130: "ammo_rockets",
2131: Pickup_Ammo,
2132: NULL,
2133: Drop_Ammo,
2134: NULL,
2135: "misc/am_pkup.wav",
2136: "models/items/ammo/rockets/medium/tris.md2", 0,
2137: NULL,
2138: /* icon */ "a_rockets",
2139: /* pickup */ "Rockets",
2140: /* width */ 3,
2141: 5,
2142: NULL,
2143: IT_AMMO,
2144: 0,
2145: NULL,
2146: AMMO_ROCKETS,
2147: /* precache */ ""
2148: },
2149:
2150: /*QUAKED ammo_slugs (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2151: */
2152: {
2153: "ammo_slugs",
2154: Pickup_Ammo,
2155: NULL,
2156: Drop_Ammo,
2157: NULL,
2158: "misc/am_pkup.wav",
2159: "models/items/ammo/slugs/medium/tris.md2", 0,
2160: NULL,
2161: /* icon */ "a_slugs",
2162: /* pickup */ "Slugs",
2163: /* width */ 3,
2164: 10,
2165: NULL,
2166: IT_AMMO,
2167: 0,
2168: NULL,
2169: AMMO_SLUGS,
2170: /* precache */ ""
2171: },
2172:
2173: // =======================================
2174: // ROGUE AMMO
2175:
2176: /*QUAKED ammo_nails (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2177: */
2178: /*QUAKED ammo_flechettes (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2179: */
2180: {
2181: "ammo_flechettes",
2182: Pickup_Ammo,
2183: NULL,
2184: Drop_Ammo,
2185: NULL,
2186: "misc/am_pkup.wav",
2187: "models/ammo/am_flechette/tris.md2", 0,
2188: NULL,
2189: "a_flechettes", //FIXME
2190: "Flechettes",
2191: 3,
2192: 50,
2193: NULL,
2194: IT_AMMO,
2195: 0,
2196: NULL,
2197: AMMO_FLECHETTES
2198: },
2199: /*QUAKED ammo_prox (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2200: */
2201: {
2202: "ammo_prox",
2203: Pickup_Ammo,
2204: NULL, // Use_Weapon,
2205: Drop_Ammo,
2206: NULL, // Weapon_Prox,
2207: "misc/am_pkup.wav",
2208: "models/ammo/am_prox/tris.md2", 0,
2209: NULL, // "models/weapons/v_prox/tris.md2",
2210: "a_prox",
2211: "prox", // FIXME
2212: 3,
2213: 5,
2214: "prox",
2215: IT_AMMO, // IT_AMMO | IT_WEAPON,
2216: 0,
2217: NULL,
2218: AMMO_PROX,
2219: "models/weapons/g_prox/tris.md2 weapons/proxwarn.wav"
2220: },
2221:
2222: /*QUAKED ammo_tesla (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2223: */
2224: {
2225: "ammo_tesla",
2226: Pickup_Ammo,
2227: Use_Weapon, // PGM
2228: Drop_Ammo,
2229: Weapon_Tesla, // PGM
2230: "misc/am_pkup.wav",
2231: // "models/weapons/g_tesla/tris.md2", 0,
2232: "models/ammo/am_tesl/tris.md2", 0,
2233: "models/weapons/v_tesla/tris.md2",
2234: "a_tesla",
2235: "Tesla",
2236: 3,
2237: 5,
2238: "Tesla", // PGM
2239: IT_AMMO | IT_WEAPON, // inventory flags
2240: 0,
2241: NULL, // info (void *)
2242: AMMO_TESLA, // tag
2243: "models/weapons/v_tesla2/tris.md2 weapons/hgrenb1a.wav weapons/hgrenb2a.wav models/weapons/g_tesla/tris.md2" // precache
2244: },
2245:
2246: /*QUAKED ammo_nuke (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2247: */
2248: {
2249: "ammo_nuke",
2250: Pickup_Nuke,
2251: Use_Nuke, // PMM
2252: Drop_Ammo,
2253: NULL, // PMM
2254: "misc/am_pkup.wav",
2255: "models/weapons/g_nuke/tris.md2", EF_ROTATE,
2256: NULL,
2257: /* icon */ "p_nuke",
2258: /* pickup */ "Nuke",
2259: /* width */ 3,
2260: 300, /* quantity (used for respawn time) */
2261: "Nuke",
2262: IT_POWERUP,
2263: 0,
2264: NULL,
2265: 0,
2266: "weapons/nukewarn2.wav world/rumble.wav"
2267: },
2268:
2269: /*QUAKED ammo_disruptor (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2270: */
2271: {
2272: "ammo_disruptor",
2273: Pickup_Ammo,
2274: NULL,
2275: Drop_Ammo,
2276: NULL,
2277: "misc/am_pkup.wav",
2278: "models/ammo/am_disr/tris.md2", 0,
2279: NULL,
2280: "a_disruptor",
2281: "Rounds", // FIXME
2282: 3,
2283: 15,
2284: NULL,
2285: #ifdef KILL_DISRUPTOR
2286: IT_NOT_GIVEABLE,
2287: #else
2288: IT_AMMO, // inventory flags
2289: #endif
2290: 0,
2291: NULL,
2292: #ifdef KILL_DISRUPTOR
2293: 0,
2294: #else
2295: AMMO_DISRUPTOR,
2296: #endif
2297: },
2298: // ROGUE AMMO
2299: // =======================================
2300:
2301: //
2302: // POWERUP ITEMS
2303: //
2304: /*QUAKED item_quad (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2305: */
2306: {
2307: "item_quad",
2308: Pickup_Powerup,
2309: Use_Quad,
2310: Drop_General,
2311: NULL,
2312: "items/pkup.wav",
2313: "models/items/quaddama/tris.md2", EF_ROTATE,
2314: NULL,
2315: /* icon */ "p_quad",
2316: /* pickup */ "Quad Damage",
2317: /* width */ 2,
2318: 60,
2319: NULL,
2320: IT_POWERUP,
2321: 0,
2322: NULL,
2323: 0,
2324: /* precache */ "items/damage.wav items/damage2.wav items/damage3.wav"
2325: },
2326:
2327: /*QUAKED item_invulnerability (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2328: */
2329: {
2330: "item_invulnerability",
2331: Pickup_Powerup,
2332: Use_Invulnerability,
2333: Drop_General,
2334: NULL,
2335: "items/pkup.wav",
2336: "models/items/invulner/tris.md2", EF_ROTATE,
2337: NULL,
2338: /* icon */ "p_invulnerability",
2339: /* pickup */ "Invulnerability",
2340: /* width */ 2,
2341: 300,
2342: NULL,
2343: IT_POWERUP,
2344: 0,
2345: NULL,
2346: 0,
2347: /* precache */ "items/protect.wav items/protect2.wav items/protect4.wav"
2348: },
2349:
2350: /*QUAKED item_silencer (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2351: */
2352: {
2353: "item_silencer",
2354: Pickup_Powerup,
2355: Use_Silencer,
2356: Drop_General,
2357: NULL,
2358: "items/pkup.wav",
2359: "models/items/silencer/tris.md2", EF_ROTATE,
2360: NULL,
2361: /* icon */ "p_silencer",
2362: /* pickup */ "Silencer",
2363: /* width */ 2,
2364: 60,
2365: NULL,
2366: IT_POWERUP,
2367: 0,
2368: NULL,
2369: 0,
2370: /* precache */ ""
2371: },
2372:
2373: /*QUAKED item_breather (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2374: */
2375: {
2376: "item_breather",
2377: Pickup_Powerup,
2378: Use_Breather,
2379: Drop_General,
2380: NULL,
2381: "items/pkup.wav",
2382: "models/items/breather/tris.md2", EF_ROTATE,
2383: NULL,
2384: /* icon */ "p_rebreather",
2385: /* pickup */ "Rebreather",
2386: /* width */ 2,
2387: 60,
2388: NULL,
2389: IT_STAY_COOP|IT_POWERUP,
2390: 0,
2391: NULL,
2392: 0,
2393: /* precache */ "items/airout.wav"
2394: },
2395:
2396: /*QUAKED item_enviro (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2397: */
2398: {
2399: "item_enviro",
2400: Pickup_Powerup,
2401: Use_Envirosuit,
2402: Drop_General,
2403: NULL,
2404: "items/pkup.wav",
2405: "models/items/enviro/tris.md2", EF_ROTATE,
2406: NULL,
2407: /* icon */ "p_envirosuit",
2408: /* pickup */ "Environment Suit",
2409: /* width */ 2,
2410: 60,
2411: NULL,
2412: IT_STAY_COOP|IT_POWERUP,
2413: 0,
2414: NULL,
2415: 0,
2416: /* precache */ "items/airout.wav"
2417: },
2418:
2419: /*QUAKED item_ancient_head (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2420: Special item that gives +2 to maximum health
2421: */
2422: {
2423: "item_ancient_head",
2424: Pickup_AncientHead,
2425: NULL,
2426: NULL,
2427: NULL,
2428: "items/pkup.wav",
2429: "models/items/c_head/tris.md2", EF_ROTATE,
2430: NULL,
2431: /* icon */ "i_fixme",
2432: /* pickup */ "Ancient Head",
2433: /* width */ 2,
2434: 60,
2435: NULL,
2436: 0,
2437: 0,
2438: NULL,
2439: 0,
2440: /* precache */ ""
2441: },
2442:
2443: /*QUAKED item_adrenaline (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2444: gives +1 to maximum health
2445: */
2446: {
2447: "item_adrenaline",
2448: Pickup_Adrenaline,
2449: NULL,
2450: NULL,
2451: NULL,
2452: "items/pkup.wav",
2453: "models/items/adrenal/tris.md2", EF_ROTATE,
2454: NULL,
2455: /* icon */ "p_adrenaline",
2456: /* pickup */ "Adrenaline",
2457: /* width */ 2,
2458: 60,
2459: NULL,
2460: 0,
2461: 0,
2462: NULL,
2463: 0,
2464: /* precache */ ""
2465: },
2466:
2467: /*QUAKED item_bandolier (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2468: */
2469: {
2470: "item_bandolier",
2471: Pickup_Bandolier,
2472: NULL,
2473: NULL,
2474: NULL,
2475: "items/pkup.wav",
2476: "models/items/band/tris.md2", EF_ROTATE,
2477: NULL,
2478: /* icon */ "p_bandolier",
2479: /* pickup */ "Bandolier",
2480: /* width */ 2,
2481: 60,
2482: NULL,
2483: 0,
2484: 0,
2485: NULL,
2486: 0,
2487: /* precache */ ""
2488: },
2489:
2490: /*QUAKED item_pack (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2491: */
2492: {
2493: "item_pack",
2494: Pickup_Pack,
2495: NULL,
2496: NULL,
2497: NULL,
2498: "items/pkup.wav",
2499: "models/items/pack/tris.md2", EF_ROTATE,
2500: NULL,
2501: /* icon */ "i_pack",
2502: /* pickup */ "Ammo Pack",
2503: /* width */ 2,
2504: 180,
2505: NULL,
2506: 0,
2507: 0,
2508: NULL,
2509: 0,
2510: /* precache */ ""
2511: },
2512:
2513: // ======================================
2514: // PGM
2515:
2516: /*QUAKED item_ir_goggles (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2517: gives +1 to maximum health
2518: */
2519: {
2520: "item_ir_goggles",
2521: Pickup_Powerup,
2522: Use_IR,
2523: Drop_General,
2524: NULL,
2525: "items/pkup.wav",
2526: "models/items/goggles/tris.md2", EF_ROTATE,
2527: NULL,
2528: /* icon */ "p_ir",
2529: /* pickup */ "IR Goggles",
2530: /* width */ 2,
2531: 60,
2532: NULL,
2533: IT_POWERUP,
2534: 0,
2535: NULL,
2536: 0,
2537: /* precache */ ""
2538: },
2539:
2540: /*QUAKED item_double (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2541: */
2542: {
2543: "item_double",
2544: Pickup_Powerup,
2545: Use_Double,
2546: Drop_General,
2547: NULL,
2548: "items/pkup.wav",
2549: "models/items/ddamage/tris.md2", EF_ROTATE,
2550: NULL,
2551: /* icon */ "p_double",
2552: /* pickup */ "Double Damage",
2553: /* width */ 2,
2554: 60,
2555: NULL,
2556: IT_POWERUP,
2557: 0,
2558: NULL,
2559: 0,
2560: /* precache */ "items/damage.wav items/damage2.wav items/damage3.wav"
2561: },
2562:
2563: /*QUAKED item_torch (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2564: */
2565: {
2566: "item_torch",
2567: Pickup_Powerup,
2568: Use_Torch,
2569: Drop_General,
2570: NULL,
2571: "items/pkup.wav",
2572: "models/objects/fire/tris.md2", EF_ROTATE,
2573: NULL,
2574: /* icon */ "p_torch",
2575: /* pickup */ "torch",
2576: /* width */ 2,
2577: 60,
2578: NULL,
2579: IT_POWERUP,
2580: 0,
2581: NULL,
2582: 0,
2583: },
2584:
2585: /*QUAKED item_compass (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2586: */
2587: {
2588: "item_compass",
2589: Pickup_Powerup,
2590: Use_Compass,
2591: NULL,
2592: NULL,
2593: "items/pkup.wav",
2594: "models/objects/fire/tris.md2", EF_ROTATE,
2595: NULL,
2596: /* icon */ "p_compass",
2597: /* pickup */ "compass",
2598: /* width */ 2,
2599: 60,
2600: NULL,
2601: IT_POWERUP,
2602: 0,
2603: NULL,
2604: 0,
2605: },
2606:
2607: /*QUAKED item_sphere_vengeance (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2608: */
2609: {
2610: "item_sphere_vengeance",
2611: Pickup_Sphere,
2612: Use_Vengeance,
2613: NULL,
2614: NULL,
2615: "items/pkup.wav",
2616: "models/items/vengnce/tris.md2", EF_ROTATE,
2617: NULL,
2618: /* icon */ "p_vengeance",
2619: /* pickup */ "vengeance sphere",
2620: /* width */ 2,
2621: 60,
2622: NULL,
2623: IT_POWERUP,
2624: 0,
2625: NULL,
2626: 0,
2627: "powerup/vsphere.wav" //precache
2628: },
2629:
2630: /*QUAKED item_sphere_hunter (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2631: */
2632: {
2633: "item_sphere_hunter",
2634: Pickup_Sphere,
2635: Use_Hunter,
2636: NULL,
2637: NULL,
2638: "items/pkup.wav",
2639: "models/items/hunter/tris.md2", EF_ROTATE,
2640: NULL,
2641: /* icon */ "p_hunter",
2642: /* pickup */ "hunter sphere",
2643: /* width */ 2,
2644: 60,
2645: NULL,
2646: IT_POWERUP,
2647: 0,
2648: NULL,
2649: 0,
2650: "powerup/hsphere.wav" //precache
2651: },
2652:
2653: /*QUAKED item_sphere_defender (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2654: */
2655: {
2656: "item_sphere_defender",
2657: Pickup_Sphere,
2658: Use_Defender,
2659: NULL,
2660: NULL,
2661: "items/pkup.wav",
2662: "models/items/defender/tris.md2", EF_ROTATE,
2663: NULL,
2664: /* icon */ "p_defender",
2665: /* pickup */ "defender sphere",
2666: /* width */ 2,
2667: 60, // respawn time
2668: NULL, // ammo type used
2669: IT_POWERUP, // inventory flags
2670: 0,
2671: NULL, // info (void *)
2672: 0, // tag
2673: "models/proj/laser2/tris.md2 models/items/shell/tris.md2 powerup/dsphere.wav" // precache
2674: },
2675:
2676: /*QUAKED item_doppleganger (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2677: */
2678: {
2679: "item_doppleganger", // classname
2680: Pickup_Doppleganger, // pickup function
2681: Use_Doppleganger, // use function
2682: Drop_General, // drop function
2683: NULL, // weapon think function
2684: "items/pkup.wav", // pick up sound
2685: "models/items/dopple/tris.md2", // world model
2686: EF_ROTATE, // world model flags
2687: NULL, // view model
2688: "p_doppleganger", // icon
2689: "Doppleganger", // name printed when picked up
2690: 0, // number of digits for statusbar
2691: 90, // respawn time
2692: NULL, // ammo type used
2693: IT_POWERUP, // inventory flags
2694: 0,
2695: NULL, // info (void *)
2696: 0, // tag
2697: "models/objects/dopplebase/tris.md2 models/items/spawngro2/tris.md2 models/items/hunter/tris.md2 models/items/vengnce/tris.md2", // precaches
2698: },
2699:
2700: {
2701: // "dm_tag_token", // classname
2702: NULL, // classname
2703: Tag_PickupToken, // pickup function
2704: NULL, // use function
2705: NULL, // drop function
2706: NULL, // weapon think function
2707: "items/pkup.wav", // pick up sound
2708: "models/items/tagtoken/tris.md2", // world model
2709: EF_ROTATE | EF_TAGTRAIL, // world model flags
2710: NULL, // view model
2711: "i_fixme", // icon
2712: "Tag Token", // name printed when picked up
2713: 0, // number of digits for statusbar
2714: 0, // amount used / contained
2715: NULL, // ammo type used
2716: IT_POWERUP | IT_NOT_GIVEABLE, // inventory flags
2717: 0,
2718: NULL, // info (void *)
2719: 1, // tag
2720: NULL, // precaches
2721: },
2722:
2723: // PGM
2724: // ======================================
2725:
2726:
2727: //
2728: // KEYS
2729: //
2730: /*QUAKED key_data_cd (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2731: key for computer centers
2732: */
2733: {
2734: "key_data_cd",
2735: Pickup_Key,
2736: NULL,
2737: Drop_General,
2738: NULL,
2739: "items/pkup.wav",
2740: "models/items/keys/data_cd/tris.md2", EF_ROTATE,
2741: NULL,
2742: "k_datacd",
2743: "Data CD",
2744: 2,
2745: 0,
2746: NULL,
2747: IT_STAY_COOP|IT_KEY,
2748: 0,
2749: NULL,
2750: 0,
2751: /* precache */ ""
2752: },
2753:
2754: /*QUAKED key_power_cube (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN NO_TOUCH
2755: warehouse circuits
2756: */
2757: {
2758: "key_power_cube",
2759: Pickup_Key,
2760: NULL,
2761: Drop_General,
2762: NULL,
2763: "items/pkup.wav",
2764: "models/items/keys/power/tris.md2", EF_ROTATE,
2765: NULL,
2766: "k_powercube",
2767: "Power Cube",
2768: 2,
2769: 0,
2770: NULL,
2771: IT_STAY_COOP|IT_KEY,
2772: 0,
2773: NULL,
2774: 0,
2775: /* precache */ ""
2776: },
2777:
2778: /*QUAKED key_pyramid (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2779: key for the entrance of jail3
2780: */
2781: {
2782: "key_pyramid",
2783: Pickup_Key,
2784: NULL,
2785: Drop_General,
2786: NULL,
2787: "items/pkup.wav",
2788: "models/items/keys/pyramid/tris.md2", EF_ROTATE,
2789: NULL,
2790: "k_pyramid",
2791: "Pyramid Key",
2792: 2,
2793: 0,
2794: NULL,
2795: IT_STAY_COOP|IT_KEY,
2796: 0,
2797: NULL,
2798: 0,
2799: /* precache */ ""
2800: },
2801:
2802: /*QUAKED key_data_spinner (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2803: key for the city computer
2804: */
2805: {
2806: "key_data_spinner",
2807: Pickup_Key,
2808: NULL,
2809: Drop_General,
2810: NULL,
2811: "items/pkup.wav",
2812: "models/items/keys/spinner/tris.md2", EF_ROTATE,
2813: NULL,
2814: "k_dataspin",
2815: "Data Spinner",
2816: 2,
2817: 0,
2818: NULL,
2819: IT_STAY_COOP|IT_KEY,
2820: 0,
2821: NULL,
2822: 0,
2823: /* precache */ ""
2824: },
2825:
2826: /*QUAKED key_pass (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2827: security pass for the security level
2828: */
2829: {
2830: "key_pass",
2831: Pickup_Key,
2832: NULL,
2833: Drop_General,
2834: NULL,
2835: "items/pkup.wav",
2836: "models/items/keys/pass/tris.md2", EF_ROTATE,
2837: NULL,
2838: "k_security",
2839: "Security Pass",
2840: 2,
2841: 0,
2842: NULL,
2843: IT_STAY_COOP|IT_KEY,
2844: 0,
2845: NULL,
2846: 0,
2847: /* precache */ ""
2848: },
2849:
2850: /*QUAKED key_blue_key (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2851: normal door key - blue
2852: */
2853: {
2854: "key_blue_key",
2855: Pickup_Key,
2856: NULL,
2857: Drop_General,
2858: NULL,
2859: "items/pkup.wav",
2860: "models/items/keys/key/tris.md2", EF_ROTATE,
2861: NULL,
2862: "k_bluekey",
2863: "Blue Key",
2864: 2,
2865: 0,
2866: NULL,
2867: IT_STAY_COOP|IT_KEY,
2868: 0,
2869: NULL,
2870: 0,
2871: /* precache */ ""
2872: },
2873:
2874: /*QUAKED key_red_key (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2875: normal door key - red
2876: */
2877: {
2878: "key_red_key",
2879: Pickup_Key,
2880: NULL,
2881: Drop_General,
2882: NULL,
2883: "items/pkup.wav",
2884: "models/items/keys/red_key/tris.md2", EF_ROTATE,
2885: NULL,
2886: "k_redkey",
2887: "Red Key",
2888: 2,
2889: 0,
2890: NULL,
2891: IT_STAY_COOP|IT_KEY,
2892: 0,
2893: NULL,
2894: 0,
2895: /* precache */ ""
2896: },
2897:
2898: /*QUAKED key_commander_head (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2899: tank commander's head
2900: */
2901: {
2902: "key_commander_head",
2903: Pickup_Key,
2904: NULL,
2905: Drop_General,
2906: NULL,
2907: "items/pkup.wav",
2908: "models/monsters/commandr/head/tris.md2", EF_GIB,
2909: NULL,
2910: /* icon */ "k_comhead",
2911: /* pickup */ "Commander's Head",
2912: /* width */ 2,
2913: 0,
2914: NULL,
2915: IT_STAY_COOP|IT_KEY,
2916: 0,
2917: NULL,
2918: 0,
2919: /* precache */ ""
2920: },
2921:
2922: /*QUAKED key_airstrike_target (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2923: tank commander's head
2924: */
2925: {
2926: "key_airstrike_target",
2927: Pickup_Key,
2928: NULL,
2929: Drop_General,
2930: NULL,
2931: "items/pkup.wav",
2932: "models/items/keys/target/tris.md2", EF_ROTATE,
2933: NULL,
2934: /* icon */ "i_airstrike",
2935: /* pickup */ "Airstrike Marker",
2936: /* width */ 2,
2937: 0,
2938: NULL,
2939: IT_STAY_COOP|IT_KEY,
2940: 0,
2941: NULL,
2942: 0,
2943: /* precache */ ""
2944: },
2945:
2946: // ======================================
2947: // PGM
2948:
2949: /*QUAKED key_nuke_container (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2950: */
2951: {
2952: "key_nuke_container", // classname
2953: Pickup_Key, // pickup function
2954: NULL, // use function
2955: Drop_General, // drop function
2956: NULL, // weapon think function
2957: "items/pkup.wav", // pick up sound
2958: "models/weapons/g_nuke/tris.md2", // world model
2959: EF_ROTATE, // world model flags
2960: NULL, // view model
2961: "i_fixme", // icon
2962: "Antimatter Container", // name printed when picked up
2963: 2, // number of digits for statusbar
2964: 0, // respawn time
2965: NULL, // ammo type used
2966: IT_STAY_COOP|IT_KEY, // inventory flags
2967: 0,
2968: NULL, // info (void *)
2969: 0, // tag
2970: NULL, // precaches
2971: },
2972:
2973: /*QUAKED key_nuke (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
2974: */
2975: {
2976: "key_nuke", // classname
2977: Pickup_Key, // pickup function
2978: NULL, // use function
2979: Drop_General, // drop function
2980: NULL, // weapon think function
2981: "items/pkup.wav", // pick up sound
2982: "models/weapons/g_nuke/tris.md2", // world model
2983: EF_ROTATE, // world model flags
2984: NULL, // view model
2985: "i_fixme", // icon
2986: "Antimatter Bomb", // name printed when picked up
2987: 2, // number of digits for statusbar
2988: 0, // respawn time
2989: NULL, // ammo type used
2990: IT_STAY_COOP|IT_KEY, // inventory flags
2991: 0,
2992: NULL, // info (void *)
2993: 0, // tag
2994: NULL, // precaches
2995: },
2996:
2997: // PGM
2998: // ======================================
2999:
3000: {
3001: NULL,
3002: Pickup_Health,
3003: NULL,
3004: NULL,
3005: NULL,
3006: "items/pkup.wav",
3007: NULL, 0,
3008: NULL,
3009: /* icon */ "i_health",
3010: /* pickup */ "Health",
3011: /* width */ 3,
3012: 0,
3013: NULL,
3014: 0,
3015: 0,
3016: NULL,
3017: 0,
3018: /* precache */ "items/s_health.wav items/n_health.wav items/l_health.wav items/m_health.wav"
3019: },
3020:
3021: // end of list marker
3022: {NULL}
3023: };
3024:
3025:
3026: /*QUAKED item_health (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
3027: */
3028: void SP_item_health (edict_t *self)
3029: {
3030: if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
3031: {
3032: G_FreeEdict (self);
3033: return;
3034: }
3035:
3036: self->model = "models/items/healing/medium/tris.md2";
3037: self->count = 10;
3038: SpawnItem (self, FindItem ("Health"));
3039: gi.soundindex ("items/n_health.wav");
3040: }
3041:
3042: /*QUAKED item_health_small (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
3043: */
3044: void SP_item_health_small (edict_t *self)
3045: {
3046: if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
3047: {
3048: G_FreeEdict (self);
3049: return;
3050: }
3051:
3052: self->model = "models/items/healing/stimpack/tris.md2";
3053: self->count = 2;
3054: SpawnItem (self, FindItem ("Health"));
3055: self->style = HEALTH_IGNORE_MAX;
3056: gi.soundindex ("items/s_health.wav");
3057: }
3058:
3059: /*QUAKED item_health_large (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
3060: */
3061: void SP_item_health_large (edict_t *self)
3062: {
3063: if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
3064: {
3065: G_FreeEdict (self);
3066: return;
3067: }
3068:
3069: self->model = "models/items/healing/large/tris.md2";
3070: self->count = 25;
3071: SpawnItem (self, FindItem ("Health"));
3072: gi.soundindex ("items/l_health.wav");
3073: }
3074:
3075: /*QUAKED item_health_mega (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
3076: */
3077: void SP_item_health_mega (edict_t *self)
3078: {
3079: if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
3080: {
3081: G_FreeEdict (self);
3082: return;
3083: }
3084:
3085: self->model = "models/items/mega_h/tris.md2";
3086: self->count = 100;
3087: SpawnItem (self, FindItem ("Health"));
3088: gi.soundindex ("items/m_health.wav");
3089: self->style = HEALTH_IGNORE_MAX|HEALTH_TIMED;
3090: }
3091:
3092:
3093: void InitItems (void)
3094: {
3095: game.num_items = sizeof(itemlist)/sizeof(itemlist[0]) - 1;
3096: }
3097:
3098:
3099:
3100: /*
3101: ===============
3102: SetItemNames
3103:
3104: Called by worldspawn
3105: ===============
3106: */
3107: void SetItemNames (void)
3108: {
3109: int i;
3110: gitem_t *it;
3111:
3112: for (i=0 ; i<game.num_items ; i++)
3113: {
3114: it = &itemlist[i];
3115: gi.configstring (CS_ITEMS+i, it->pickup_name);
3116: }
3117:
3118: jacket_armor_index = ITEM_INDEX(FindItem("Jacket Armor"));
3119: combat_armor_index = ITEM_INDEX(FindItem("Combat Armor"));
3120: body_armor_index = ITEM_INDEX(FindItem("Body Armor"));
3121: power_screen_index = ITEM_INDEX(FindItem("Power Screen"));
3122: power_shield_index = ITEM_INDEX(FindItem("Power Shield"));
3123: }
3124:
3125:
3126: //===============
3127: //ROGUE
3128: void SP_xatrix_item (edict_t *self)
3129: {
3130: gitem_t *item;
3131: int i;
3132: char *spawnClass;
3133:
3134: if(!self->classname)
3135: return;
3136:
3137: if(!strcmp(self->classname, "ammo_magslug"))
3138: spawnClass = "ammo_flechettes";
3139: else if(!strcmp(self->classname, "ammo_trap"))
3140: spawnClass = "weapon_proxlauncher";
3141: else if(!strcmp(self->classname, "item_quadfire"))
3142: {
3143: float chance;
3144:
3145: chance = random();
3146: if(chance < 0.2)
3147: spawnClass = "item_sphere_hunter";
3148: else if (chance < 0.6)
3149: spawnClass = "item_sphere_vengeance";
3150: else
3151: spawnClass = "item_sphere_defender";
3152: }
3153: else if(!strcmp(self->classname, "weapon_boomer"))
3154: spawnClass = "weapon_etf_rifle";
3155: else if(!strcmp(self->classname, "weapon_phalanx"))
3156: spawnClass = "weapon_heatbeam";
3157:
3158:
3159: // check item spawn functions
3160: for (i=0,item=itemlist ; i<game.num_items ; i++,item++)
3161: {
3162: if (!item->classname)
3163: continue;
3164: if (!strcmp(item->classname, spawnClass))
3165: { // found it
3166: SpawnItem (self, item);
3167: return;
3168: }
3169: }
3170: }
3171: //ROGUE
3172: //===============
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.