|
|
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: gitem_armor_t jacketarmor_info = { 25, 50, .30, .00, ARMOR_JACKET};
21: gitem_armor_t combatarmor_info = { 50, 100, .60, .30, ARMOR_COMBAT};
22: gitem_armor_t bodyarmor_info = {100, 200, .80, .60, ARMOR_BODY};
23:
24: static int jacket_armor_index;
25: static int combat_armor_index;
26: static int body_armor_index;
27: static int power_screen_index;
28: static int power_shield_index;
29:
30: #define HEALTH_IGNORE_MAX 1
31: #define HEALTH_TIMED 2
32:
33: void Use_Quad (edict_t *ent, gitem_t *item);
34: static int quad_drop_timeout_hack;
35:
36: //======================================================================
37:
38: /*
39: ===============
40: GetItemByIndex
41: ===============
42: */
43: gitem_t *GetItemByIndex (int index)
44: {
45: if (index == 0 || index >= game.num_items)
46: return NULL;
47:
48: return &itemlist[index];
49: }
50:
51:
52: /*
53: ===============
54: FindItemByClassname
55:
56: ===============
57: */
58: gitem_t *FindItemByClassname (char *classname)
59: {
60: int i;
61: gitem_t *it;
62:
63: it = itemlist;
64: for (i=0 ; i<game.num_items ; i++, it++)
65: {
66: if (!it->classname)
67: continue;
68: if (!Q_stricmp(it->classname, classname))
69: return it;
70: }
71:
72: return NULL;
73: }
74:
75: /*
76: ===============
77: FindItem
78:
79: ===============
80: */
81: gitem_t *FindItem (char *pickup_name)
82: {
83: int i;
84: gitem_t *it;
85:
86: it = itemlist;
87: for (i=0 ; i<game.num_items ; i++, it++)
88: {
89: if (!it->pickup_name)
90: continue;
91: if (!Q_stricmp(it->pickup_name, pickup_name))
92: return it;
93: }
94:
95: return NULL;
96: }
97:
98: //======================================================================
99:
100: void DoRespawn (edict_t *ent)
101: {
102: if (ent->team)
103: {
104: edict_t *master;
105: int count;
106: int choice;
107:
108: master = ent->teammaster;
109:
110: //ZOID
111: //in ctf, when we are weapons stay, only the master of a team of weapons
112: //is spawned
113: if (ctf->value &&
114: ((int)dmflags->value & DF_WEAPONS_STAY) &&
115: master->item && (master->item->flags & IT_WEAPON))
116: ent = master;
117: else {
118: //ZOID
119:
120: for (count = 0, ent = master; ent; ent = ent->chain, count++)
121: ;
122:
123: choice = rand() % count;
124:
125: for (count = 0, ent = master; count < choice; ent = ent->chain, count++)
126: ;
127: }
128: }
129:
130: ent->svflags &= ~SVF_NOCLIENT;
131: ent->solid = SOLID_TRIGGER;
132: gi.linkentity (ent);
133:
134: // send an effect
135: ent->s.event = EV_ITEM_RESPAWN;
136: }
137:
138: void SetRespawn (edict_t *ent, float delay)
139: {
140: ent->flags |= FL_RESPAWN;
141: ent->svflags |= SVF_NOCLIENT;
142: ent->solid = SOLID_NOT;
143: ent->nextthink = level.time + delay;
144: ent->think = DoRespawn;
145: gi.linkentity (ent);
146: }
147:
148:
149: //======================================================================
150:
151: qboolean Pickup_Powerup (edict_t *ent, edict_t *other)
152: {
153: int quantity;
154:
155: quantity = other->client->pers.inventory[ITEM_INDEX(ent->item)];
156: if ((skill->value == 1 && quantity >= 2) || (skill->value >= 2 && quantity >= 1))
157: return false;
158:
159: if ((coop->value) && (ent->item->flags & IT_STAY_COOP) && (quantity > 0))
160: return false;
161:
162: other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
163:
164: if (deathmatch->value)
165: {
166: if (!(ent->spawnflags & DROPPED_ITEM) )
167: SetRespawn (ent, ent->item->quantity);
168: if (((int)dmflags->value & DF_INSTANT_ITEMS) || ((ent->item->use == Use_Quad) && (ent->spawnflags & DROPPED_PLAYER_ITEM)))
169: {
170: if ((ent->item->use == Use_Quad) && (ent->spawnflags & DROPPED_PLAYER_ITEM))
171: quad_drop_timeout_hack = (ent->nextthink - level.time) / FRAMETIME;
172: ent->item->use (other, ent->item);
173: }
174: }
175:
176: return true;
177: }
178:
179: void Drop_General (edict_t *ent, gitem_t *item)
180: {
181: Drop_Item (ent, item);
182: ent->client->pers.inventory[ITEM_INDEX(item)]--;
183: ValidateSelectedItem (ent);
184: }
185:
186:
187: //======================================================================
188:
189: qboolean Pickup_Adrenaline (edict_t *ent, edict_t *other)
190: {
191: if (!deathmatch->value)
192: other->max_health += 1;
193:
194: if (other->health < other->max_health)
195: other->health = other->max_health;
196:
197: if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
198: SetRespawn (ent, ent->item->quantity);
199:
200: return true;
201: }
202:
203: qboolean Pickup_AncientHead (edict_t *ent, edict_t *other)
204: {
205: other->max_health += 2;
206:
207: if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
208: SetRespawn (ent, ent->item->quantity);
209:
210: return true;
211: }
212:
213: qboolean Pickup_Bandolier (edict_t *ent, edict_t *other)
214: {
215: gitem_t *item;
216: int index;
217:
218: if (other->client->pers.max_bullets < 250)
219: other->client->pers.max_bullets = 250;
220: if (other->client->pers.max_shells < 150)
221: other->client->pers.max_shells = 150;
222: if (other->client->pers.max_cells < 250)
223: other->client->pers.max_cells = 250;
224: if (other->client->pers.max_slugs < 75)
225: other->client->pers.max_slugs = 75;
226:
227: item = FindItem("Bullets");
228: if (item)
229: {
230: index = ITEM_INDEX(item);
231: other->client->pers.inventory[index] += item->quantity;
232: if (other->client->pers.inventory[index] > other->client->pers.max_bullets)
233: other->client->pers.inventory[index] = other->client->pers.max_bullets;
234: }
235:
236: item = FindItem("Shells");
237: if (item)
238: {
239: index = ITEM_INDEX(item);
240: other->client->pers.inventory[index] += item->quantity;
241: if (other->client->pers.inventory[index] > other->client->pers.max_shells)
242: other->client->pers.inventory[index] = other->client->pers.max_shells;
243: }
244:
245: if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
246: SetRespawn (ent, ent->item->quantity);
247:
248: return true;
249: }
250:
251: qboolean Pickup_Pack (edict_t *ent, edict_t *other)
252: {
253: gitem_t *item;
254: int index;
255:
256: if (other->client->pers.max_bullets < 300)
257: other->client->pers.max_bullets = 300;
258: if (other->client->pers.max_shells < 200)
259: other->client->pers.max_shells = 200;
260: if (other->client->pers.max_rockets < 100)
261: other->client->pers.max_rockets = 100;
262: if (other->client->pers.max_grenades < 100)
263: other->client->pers.max_grenades = 100;
264: if (other->client->pers.max_cells < 300)
265: other->client->pers.max_cells = 300;
266: if (other->client->pers.max_slugs < 100)
267: other->client->pers.max_slugs = 100;
268:
269: item = FindItem("Bullets");
270: if (item)
271: {
272: index = ITEM_INDEX(item);
273: other->client->pers.inventory[index] += item->quantity;
274: if (other->client->pers.inventory[index] > other->client->pers.max_bullets)
275: other->client->pers.inventory[index] = other->client->pers.max_bullets;
276: }
277:
278: item = FindItem("Shells");
279: if (item)
280: {
281: index = ITEM_INDEX(item);
282: other->client->pers.inventory[index] += item->quantity;
283: if (other->client->pers.inventory[index] > other->client->pers.max_shells)
284: other->client->pers.inventory[index] = other->client->pers.max_shells;
285: }
286:
287: item = FindItem("Cells");
288: if (item)
289: {
290: index = ITEM_INDEX(item);
291: other->client->pers.inventory[index] += item->quantity;
292: if (other->client->pers.inventory[index] > other->client->pers.max_cells)
293: other->client->pers.inventory[index] = other->client->pers.max_cells;
294: }
295:
296: item = FindItem("Grenades");
297: if (item)
298: {
299: index = ITEM_INDEX(item);
300: other->client->pers.inventory[index] += item->quantity;
301: if (other->client->pers.inventory[index] > other->client->pers.max_grenades)
302: other->client->pers.inventory[index] = other->client->pers.max_grenades;
303: }
304:
305: item = FindItem("Rockets");
306: if (item)
307: {
308: index = ITEM_INDEX(item);
309: other->client->pers.inventory[index] += item->quantity;
310: if (other->client->pers.inventory[index] > other->client->pers.max_rockets)
311: other->client->pers.inventory[index] = other->client->pers.max_rockets;
312: }
313:
314: item = FindItem("Slugs");
315: if (item)
316: {
317: index = ITEM_INDEX(item);
318: other->client->pers.inventory[index] += item->quantity;
319: if (other->client->pers.inventory[index] > other->client->pers.max_slugs)
320: other->client->pers.inventory[index] = other->client->pers.max_slugs;
321: }
322:
323: if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
324: SetRespawn (ent, ent->item->quantity);
325:
326: return true;
327: }
328:
329: //======================================================================
330:
331: void Use_Quad (edict_t *ent, gitem_t *item)
332: {
333: int timeout;
334:
335: ent->client->pers.inventory[ITEM_INDEX(item)]--;
336: ValidateSelectedItem (ent);
337:
338: if (quad_drop_timeout_hack)
339: {
340: timeout = quad_drop_timeout_hack;
341: quad_drop_timeout_hack = 0;
342: }
343: else
344: {
345: timeout = 300;
346: }
347:
348: if (ent->client->quad_framenum > level.framenum)
349: ent->client->quad_framenum += timeout;
350: else
351: ent->client->quad_framenum = level.framenum + timeout;
352:
353: gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
354: }
355:
356: //======================================================================
357:
358: void Use_Breather (edict_t *ent, gitem_t *item)
359: {
360: ent->client->pers.inventory[ITEM_INDEX(item)]--;
361: ValidateSelectedItem (ent);
362:
363: if (ent->client->breather_framenum > level.framenum)
364: ent->client->breather_framenum += 300;
365: else
366: ent->client->breather_framenum = level.framenum + 300;
367:
368: // gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
369: }
370:
371: //======================================================================
372:
373: void Use_Envirosuit (edict_t *ent, gitem_t *item)
374: {
375: ent->client->pers.inventory[ITEM_INDEX(item)]--;
376: ValidateSelectedItem (ent);
377:
378: if (ent->client->enviro_framenum > level.framenum)
379: ent->client->enviro_framenum += 300;
380: else
381: ent->client->enviro_framenum = level.framenum + 300;
382:
383: // gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
384: }
385:
386: //======================================================================
387:
388: void Use_Invulnerability (edict_t *ent, gitem_t *item)
389: {
390: ent->client->pers.inventory[ITEM_INDEX(item)]--;
391: ValidateSelectedItem (ent);
392:
393: if (ent->client->invincible_framenum > level.framenum)
394: ent->client->invincible_framenum += 300;
395: else
396: ent->client->invincible_framenum = level.framenum + 300;
397:
398: gi.sound(ent, CHAN_ITEM, gi.soundindex("items/protect.wav"), 1, ATTN_NORM, 0);
399: }
400:
401: //======================================================================
402:
403: void Use_Silencer (edict_t *ent, gitem_t *item)
404: {
405: ent->client->pers.inventory[ITEM_INDEX(item)]--;
406: ValidateSelectedItem (ent);
407: ent->client->silencer_shots += 30;
408:
409: // gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
410: }
411:
412: //======================================================================
413:
414: qboolean Pickup_Key (edict_t *ent, edict_t *other)
415: {
416: if (coop->value)
417: {
418: if (strcmp(ent->classname, "key_power_cube") == 0)
419: {
420: if (other->client->pers.power_cubes & ((ent->spawnflags & 0x0000ff00)>> 8))
421: return false;
422: other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
423: other->client->pers.power_cubes |= ((ent->spawnflags & 0x0000ff00) >> 8);
424: }
425: else
426: {
427: if (other->client->pers.inventory[ITEM_INDEX(ent->item)])
428: return false;
429: other->client->pers.inventory[ITEM_INDEX(ent->item)] = 1;
430: }
431: return true;
432: }
433: other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
434: return true;
435: }
436:
437: //======================================================================
438:
439: qboolean Add_Ammo (edict_t *ent, gitem_t *item, int count)
440: {
441: int index;
442: int max;
443:
444: if (!ent->client)
445: return false;
446:
447: if (item->tag == AMMO_BULLETS)
448: max = ent->client->pers.max_bullets;
449: else if (item->tag == AMMO_SHELLS)
450: max = ent->client->pers.max_shells;
451: else if (item->tag == AMMO_ROCKETS)
452: max = ent->client->pers.max_rockets;
453: else if (item->tag == AMMO_GRENADES)
454: max = ent->client->pers.max_grenades;
455: else if (item->tag == AMMO_CELLS)
456: max = ent->client->pers.max_cells;
457: else if (item->tag == AMMO_SLUGS)
458: max = ent->client->pers.max_slugs;
459: else
460: return false;
461:
462: index = ITEM_INDEX(item);
463:
464: if (ent->client->pers.inventory[index] == max)
465: return false;
466:
467: ent->client->pers.inventory[index] += count;
468:
469: if (ent->client->pers.inventory[index] > max)
470: ent->client->pers.inventory[index] = max;
471:
472: return true;
473: }
474:
475: qboolean Pickup_Ammo (edict_t *ent, edict_t *other)
476: {
477: int oldcount;
478: int count;
479: qboolean weapon;
480:
481: weapon = (ent->item->flags & IT_WEAPON);
482: if ( (weapon) && ( (int)dmflags->value & DF_INFINITE_AMMO ) )
483: count = 1000;
484: else if (ent->count)
485: count = ent->count;
486: else
487: count = ent->item->quantity;
488:
489: oldcount = other->client->pers.inventory[ITEM_INDEX(ent->item)];
490:
491: if (!Add_Ammo (other, ent->item, count))
492: return false;
493:
494: if (weapon && !oldcount)
495: {
496: if (other->client->pers.weapon != ent->item && ( !deathmatch->value || other->client->pers.weapon == FindItem("blaster") ) )
497: other->client->newweapon = ent->item;
498: }
499:
500: if (!(ent->spawnflags & (DROPPED_ITEM | DROPPED_PLAYER_ITEM)) && (deathmatch->value))
501: SetRespawn (ent, 30);
502: return true;
503: }
504:
505: void Drop_Ammo (edict_t *ent, gitem_t *item)
506: {
507: edict_t *dropped;
508: int index;
509:
510: index = ITEM_INDEX(item);
511: dropped = Drop_Item (ent, item);
512: if (ent->client->pers.inventory[index] >= item->quantity)
513: dropped->count = item->quantity;
514: else
515: dropped->count = ent->client->pers.inventory[index];
516: ent->client->pers.inventory[index] -= dropped->count;
517: ValidateSelectedItem (ent);
518: }
519:
520:
521: //======================================================================
522:
523: void MegaHealth_think (edict_t *self)
524: {
525: if (self->owner->health > self->owner->max_health
526: //ZOID
527: && !CTFHasRegeneration(self->owner)
528: //ZOID
529: )
530: {
531: self->nextthink = level.time + 1;
532: self->owner->health -= 1;
533: return;
534: }
535:
536: if (!(self->spawnflags & DROPPED_ITEM) && (deathmatch->value))
537: SetRespawn (self, 20);
538: else
539: G_FreeEdict (self);
540: }
541:
542: qboolean Pickup_Health (edict_t *ent, edict_t *other)
543: {
544: if (!(ent->style & HEALTH_IGNORE_MAX))
545: if (other->health >= other->max_health)
546: return false;
547:
548: //ZOID
549: if (other->health >= 250 && ent->count > 25)
550: return false;
551: //ZOID
552:
553: other->health += ent->count;
554:
555: //ZOID
556: if (other->health > 250 && ent->count > 25)
557: other->health = 250;
558: //ZOID
559:
560: if (!(ent->style & HEALTH_IGNORE_MAX))
561: {
562: if (other->health > other->max_health)
563: other->health = other->max_health;
564: }
565:
566: //ZOID
567: if ((ent->style & HEALTH_TIMED)
568: && !CTFHasRegeneration(other)
569: //ZOID
570: )
571: {
572: ent->think = MegaHealth_think;
573: ent->nextthink = level.time + 5;
574: ent->owner = other;
575: ent->flags |= FL_RESPAWN;
576: ent->svflags |= SVF_NOCLIENT;
577: ent->solid = SOLID_NOT;
578: }
579: else
580: {
581: if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
582: SetRespawn (ent, 30);
583: }
584:
585: return true;
586: }
587:
588: //======================================================================
589:
590: int ArmorIndex (edict_t *ent)
591: {
592: if (!ent->client)
593: return 0;
594:
595: if (ent->client->pers.inventory[jacket_armor_index] > 0)
596: return jacket_armor_index;
597:
598: if (ent->client->pers.inventory[combat_armor_index] > 0)
599: return combat_armor_index;
600:
601: if (ent->client->pers.inventory[body_armor_index] > 0)
602: return body_armor_index;
603:
604: return 0;
605: }
606:
607: qboolean Pickup_Armor (edict_t *ent, edict_t *other)
608: {
609: int old_armor_index;
610: gitem_armor_t *oldinfo;
611: gitem_armor_t *newinfo;
612: int newcount;
613: float salvage;
614: int salvagecount;
615:
616: // get info on new armor
617: newinfo = (gitem_armor_t *)ent->item->info;
618:
619: old_armor_index = ArmorIndex (other);
620:
621: // handle armor shards specially
622: if (ent->item->tag == ARMOR_SHARD)
623: {
624: if (!old_armor_index)
625: other->client->pers.inventory[jacket_armor_index] = 2;
626: else
627: other->client->pers.inventory[old_armor_index] += 2;
628: }
629:
630: // if player has no armor, just use it
631: else if (!old_armor_index)
632: {
633: other->client->pers.inventory[ITEM_INDEX(ent->item)] = newinfo->base_count;
634: }
635:
636: // use the better armor
637: else
638: {
639: // get info on old armor
640: if (old_armor_index == jacket_armor_index)
641: oldinfo = &jacketarmor_info;
642: else if (old_armor_index == combat_armor_index)
643: oldinfo = &combatarmor_info;
644: else // (old_armor_index == body_armor_index)
645: oldinfo = &bodyarmor_info;
646:
647: if (newinfo->normal_protection > oldinfo->normal_protection)
648: {
649: // calc new armor values
650: salvage = oldinfo->normal_protection / newinfo->normal_protection;
651: salvagecount = salvage * other->client->pers.inventory[old_armor_index];
652: newcount = newinfo->base_count + salvagecount;
653: if (newcount > newinfo->max_count)
654: newcount = newinfo->max_count;
655:
656: // zero count of old armor so it goes away
657: other->client->pers.inventory[old_armor_index] = 0;
658:
659: // change armor to new item with computed value
660: other->client->pers.inventory[ITEM_INDEX(ent->item)] = newcount;
661: }
662: else
663: {
664: // calc new armor values
665: salvage = newinfo->normal_protection / oldinfo->normal_protection;
666: salvagecount = salvage * newinfo->base_count;
667: newcount = other->client->pers.inventory[old_armor_index] + salvagecount;
668: if (newcount > oldinfo->max_count)
669: newcount = oldinfo->max_count;
670:
671: // if we're already maxed out then we don't need the new armor
672: if (other->client->pers.inventory[old_armor_index] >= newcount)
673: return false;
674:
675: // update current armor value
676: other->client->pers.inventory[old_armor_index] = newcount;
677: }
678: }
679:
680: if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
681: SetRespawn (ent, 20);
682:
683: return true;
684: }
685:
686: //======================================================================
687:
688: int PowerArmorType (edict_t *ent)
689: {
690: if (!ent->client)
691: return POWER_ARMOR_NONE;
692:
693: if (!(ent->flags & FL_POWER_ARMOR))
694: return POWER_ARMOR_NONE;
695:
696: if (ent->client->pers.inventory[power_shield_index] > 0)
697: return POWER_ARMOR_SHIELD;
698:
699: if (ent->client->pers.inventory[power_screen_index] > 0)
700: return POWER_ARMOR_SCREEN;
701:
702: return POWER_ARMOR_NONE;
703: }
704:
705: void Use_PowerArmor (edict_t *ent, gitem_t *item)
706: {
707: int index;
708:
709: if (ent->flags & FL_POWER_ARMOR)
710: {
711: ent->flags &= ~FL_POWER_ARMOR;
712: gi.sound(ent, CHAN_AUTO, gi.soundindex("misc/power2.wav"), 1, ATTN_NORM, 0);
713: }
714: else
715: {
716: index = ITEM_INDEX(FindItem("cells"));
717: if (!ent->client->pers.inventory[index])
718: {
719: gi.cprintf (ent, PRINT_HIGH, "No cells for power armor.\n");
720: return;
721: }
722: ent->flags |= FL_POWER_ARMOR;
723: gi.sound(ent, CHAN_AUTO, gi.soundindex("misc/power1.wav"), 1, ATTN_NORM, 0);
724: }
725: }
726:
727: qboolean Pickup_PowerArmor (edict_t *ent, edict_t *other)
728: {
729: int quantity;
730:
731: quantity = other->client->pers.inventory[ITEM_INDEX(ent->item)];
732:
733: other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
734:
735: if (deathmatch->value)
736: {
737: if (!(ent->spawnflags & DROPPED_ITEM) )
738: SetRespawn (ent, ent->item->quantity);
739: // auto-use for DM only if we didn't already have one
740: if (!quantity)
741: ent->item->use (other, ent->item);
742: }
743:
744: return true;
745: }
746:
747: void Drop_PowerArmor (edict_t *ent, gitem_t *item)
748: {
749: if ((ent->flags & FL_POWER_ARMOR) && (ent->client->pers.inventory[ITEM_INDEX(item)] == 1))
750: Use_PowerArmor (ent, item);
751: Drop_General (ent, item);
752: }
753:
754: //======================================================================
755:
756: /*
757: ===============
758: Touch_Item
759: ===============
760: */
761: void Touch_Item (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf)
762: {
763: qboolean taken;
764:
765: if (!other->client)
766: return;
767: if (other->health < 1)
768: return; // dead people can't pickup
769: if (!ent->item->pickup)
770: return; // not a grabbable item?
771:
772: if (CTFMatchSetup())
773: return; // can't pick stuff up right now
774:
775: taken = ent->item->pickup(ent, other);
776:
777: if (taken)
778: {
779: // flash the screen
780: other->client->bonus_alpha = 0.25;
781:
782: // show icon and name on status bar
783: other->client->ps.stats[STAT_PICKUP_ICON] = gi.imageindex(ent->item->icon);
784: other->client->ps.stats[STAT_PICKUP_STRING] = CS_ITEMS+ITEM_INDEX(ent->item);
785: other->client->pickup_msg_time = level.time + 3.0;
786:
787: // change selected item
788: if (ent->item->use)
789: other->client->pers.selected_item = other->client->ps.stats[STAT_SELECTED_ITEM] = ITEM_INDEX(ent->item);
790:
791: if (ent->item->pickup == Pickup_Health)
792: {
793: if (ent->count == 2)
794: gi.sound(other, CHAN_ITEM, gi.soundindex("items/s_health.wav"), 1, ATTN_NORM, 0);
795: else if (ent->count == 10)
796: gi.sound(other, CHAN_ITEM, gi.soundindex("items/n_health.wav"), 1, ATTN_NORM, 0);
797: else if (ent->count == 25)
798: gi.sound(other, CHAN_ITEM, gi.soundindex("items/l_health.wav"), 1, ATTN_NORM, 0);
799: else // (ent->count == 100)
800: gi.sound(other, CHAN_ITEM, gi.soundindex("items/m_health.wav"), 1, ATTN_NORM, 0);
801: }
802: else if (ent->item->pickup_sound)
803: {
804: gi.sound(other, CHAN_ITEM, gi.soundindex(ent->item->pickup_sound), 1, ATTN_NORM, 0);
805: }
806: }
807:
808: if (!(ent->spawnflags & ITEM_TARGETS_USED))
809: {
810: G_UseTargets (ent, other);
811: ent->spawnflags |= ITEM_TARGETS_USED;
812: }
813:
814: if (!taken)
815: return;
816:
817: if (!((coop->value) && (ent->item->flags & IT_STAY_COOP)) || (ent->spawnflags & (DROPPED_ITEM | DROPPED_PLAYER_ITEM)))
818: {
819: if (ent->flags & FL_RESPAWN)
820: ent->flags &= ~FL_RESPAWN;
821: else
822: G_FreeEdict (ent);
823: }
824: }
825:
826: //======================================================================
827:
828: static void drop_temp_touch (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf)
829: {
830: if (other == ent->owner)
831: return;
832:
833: Touch_Item (ent, other, plane, surf);
834: }
835:
836: static void drop_make_touchable (edict_t *ent)
837: {
838: ent->touch = Touch_Item;
839: if (deathmatch->value)
840: {
841: ent->nextthink = level.time + 29;
842: ent->think = G_FreeEdict;
843: }
844: }
845:
846: edict_t *Drop_Item (edict_t *ent, gitem_t *item)
847: {
848: edict_t *dropped;
849: vec3_t forward, right;
850: vec3_t offset;
851:
852: dropped = G_Spawn();
853:
854: dropped->classname = item->classname;
855: dropped->item = item;
856: dropped->spawnflags = DROPPED_ITEM;
857: dropped->s.effects = item->world_model_flags;
858: dropped->s.renderfx = RF_GLOW;
859: VectorSet (dropped->mins, -15, -15, -15);
860: VectorSet (dropped->maxs, 15, 15, 15);
861: gi.setmodel (dropped, dropped->item->world_model);
862: dropped->solid = SOLID_TRIGGER;
863: dropped->movetype = MOVETYPE_TOSS;
864: dropped->touch = drop_temp_touch;
865: dropped->owner = ent;
866:
867: if (ent->client)
868: {
869: trace_t trace;
870:
871: AngleVectors (ent->client->v_angle, forward, right, NULL);
872: VectorSet(offset, 24, 0, -16);
873: G_ProjectSource (ent->s.origin, offset, forward, right, dropped->s.origin);
874: trace = gi.trace (ent->s.origin, dropped->mins, dropped->maxs,
875: dropped->s.origin, ent, CONTENTS_SOLID);
876: VectorCopy (trace.endpos, dropped->s.origin);
877: }
878: else
879: {
880: AngleVectors (ent->s.angles, forward, right, NULL);
881: VectorCopy (ent->s.origin, dropped->s.origin);
882: }
883:
884: VectorScale (forward, 100, dropped->velocity);
885: dropped->velocity[2] = 300;
886:
887: dropped->think = drop_make_touchable;
888: dropped->nextthink = level.time + 1;
889:
890: gi.linkentity (dropped);
891:
892: return dropped;
893: }
894:
895: void Use_Item (edict_t *ent, edict_t *other, edict_t *activator)
896: {
897: ent->svflags &= ~SVF_NOCLIENT;
898: ent->use = NULL;
899:
900: if (ent->spawnflags & ITEM_NO_TOUCH)
901: {
902: ent->solid = SOLID_BBOX;
903: ent->touch = NULL;
904: }
905: else
906: {
907: ent->solid = SOLID_TRIGGER;
908: ent->touch = Touch_Item;
909: }
910:
911: gi.linkentity (ent);
912: }
913:
914: //======================================================================
915:
916: /*
917: ================
918: droptofloor
919: ================
920: */
921: void droptofloor (edict_t *ent)
922: {
923: trace_t tr;
924: vec3_t dest;
925: float *v;
926:
927: v = tv(-15,-15,-15);
928: VectorCopy (v, ent->mins);
929: v = tv(15,15,15);
930: VectorCopy (v, ent->maxs);
931:
932: if (ent->model)
933: gi.setmodel (ent, ent->model);
934: else
935: gi.setmodel (ent, ent->item->world_model);
936: ent->solid = SOLID_TRIGGER;
937: ent->movetype = MOVETYPE_TOSS;
938: ent->touch = Touch_Item;
939:
940: v = tv(0,0,-128);
941: VectorAdd (ent->s.origin, v, dest);
942:
943: tr = gi.trace (ent->s.origin, ent->mins, ent->maxs, dest, ent, MASK_SOLID);
944: if (tr.startsolid)
945: {
946: gi.dprintf ("droptofloor: %s startsolid at %s\n", ent->classname, vtos(ent->s.origin));
947: G_FreeEdict (ent);
948: return;
949: }
950:
951: VectorCopy (tr.endpos, ent->s.origin);
952:
953: if (ent->team)
954: {
955: ent->flags &= ~FL_TEAMSLAVE;
956: ent->chain = ent->teamchain;
957: ent->teamchain = NULL;
958:
959: ent->svflags |= SVF_NOCLIENT;
960: ent->solid = SOLID_NOT;
961: if (ent == ent->teammaster)
962: {
963: ent->nextthink = level.time + FRAMETIME;
964: ent->think = DoRespawn;
965: }
966: }
967:
968: if (ent->spawnflags & ITEM_NO_TOUCH)
969: {
970: ent->solid = SOLID_BBOX;
971: ent->touch = NULL;
972: ent->s.effects &= ~EF_ROTATE;
973: ent->s.renderfx &= ~RF_GLOW;
974: }
975:
976: if (ent->spawnflags & ITEM_TRIGGER_SPAWN)
977: {
978: ent->svflags |= SVF_NOCLIENT;
979: ent->solid = SOLID_NOT;
980: ent->use = Use_Item;
981: }
982:
983: gi.linkentity (ent);
984: }
985:
986:
987: /*
988: ===============
989: PrecacheItem
990:
991: Precaches all data needed for a given item.
992: This will be called for each item spawned in a level,
993: and for each item in each client's inventory.
994: ===============
995: */
996: void PrecacheItem (gitem_t *it)
997: {
998: char *s, *start;
999: char data[MAX_QPATH];
1000: int len;
1001: gitem_t *ammo;
1002:
1003: if (!it)
1004: return;
1005:
1006: if (it->pickup_sound)
1007: gi.soundindex (it->pickup_sound);
1008: if (it->world_model)
1009: gi.modelindex (it->world_model);
1010: if (it->view_model)
1011: gi.modelindex (it->view_model);
1012: if (it->icon)
1013: gi.imageindex (it->icon);
1014:
1015: // parse everything for its ammo
1016: if (it->ammo && it->ammo[0])
1017: {
1018: ammo = FindItem (it->ammo);
1019: if (ammo != it)
1020: PrecacheItem (ammo);
1021: }
1022:
1023: // parse the space seperated precache string for other items
1024: s = it->precaches;
1025: if (!s || !s[0])
1026: return;
1027:
1028: while (*s)
1029: {
1030: start = s;
1031: while (*s && *s != ' ')
1032: s++;
1033:
1034: len = s-start;
1035: if (len >= MAX_QPATH || len < 5)
1036: gi.error ("PrecacheItem: %s has bad precache string", it->classname);
1037: memcpy (data, start, len);
1038: data[len] = 0;
1039: if (*s)
1040: s++;
1041:
1042: // determine type based on extension
1043: if (!strcmp(data+len-3, "md2"))
1044: gi.modelindex (data);
1045: else if (!strcmp(data+len-3, "sp2"))
1046: gi.modelindex (data);
1047: else if (!strcmp(data+len-3, "wav"))
1048: gi.soundindex (data);
1049: if (!strcmp(data+len-3, "pcx"))
1050: gi.imageindex (data);
1051: }
1052: }
1053:
1054: /*
1055: ============
1056: SpawnItem
1057:
1058: Sets the clipping size and plants the object on the floor.
1059:
1060: Items can't be immediately dropped to floor, because they might
1061: be on an entity that hasn't spawned yet.
1062: ============
1063: */
1064: void SpawnItem (edict_t *ent, gitem_t *item)
1065: {
1066: PrecacheItem (item);
1067:
1068: if (ent->spawnflags)
1069: {
1070: if (strcmp(ent->classname, "key_power_cube") != 0)
1071: {
1072: ent->spawnflags = 0;
1073: gi.dprintf("%s at %s has invalid spawnflags set\n", ent->classname, vtos(ent->s.origin));
1074: }
1075: }
1076:
1077: // some items will be prevented in deathmatch
1078: if (deathmatch->value)
1079: {
1080: if ( (int)dmflags->value & DF_NO_ARMOR )
1081: {
1082: if (item->pickup == Pickup_Armor || item->pickup == Pickup_PowerArmor)
1083: {
1084: G_FreeEdict (ent);
1085: return;
1086: }
1087: }
1088: if ( (int)dmflags->value & DF_NO_ITEMS )
1089: {
1090: if (item->pickup == Pickup_Powerup)
1091: {
1092: G_FreeEdict (ent);
1093: return;
1094: }
1095: }
1096: if ( (int)dmflags->value & DF_NO_HEALTH )
1097: {
1098: if (item->pickup == Pickup_Health || item->pickup == Pickup_Adrenaline || item->pickup == Pickup_AncientHead)
1099: {
1100: G_FreeEdict (ent);
1101: return;
1102: }
1103: }
1104: if ( (int)dmflags->value & DF_INFINITE_AMMO )
1105: {
1106: if ( (item->flags == IT_AMMO) || (strcmp(ent->classname, "weapon_bfg") == 0) )
1107: {
1108: G_FreeEdict (ent);
1109: return;
1110: }
1111: }
1112: }
1113:
1114: if (coop->value && (strcmp(ent->classname, "key_power_cube") == 0))
1115: {
1116: ent->spawnflags |= (1 << (8 + level.power_cubes));
1117: level.power_cubes++;
1118: }
1119:
1120: // don't let them drop items that stay in a coop game
1121: if ((coop->value) && (item->flags & IT_STAY_COOP))
1122: {
1123: item->drop = NULL;
1124: }
1125:
1126: //ZOID
1127: //Don't spawn the flags unless enabled
1128: if (!ctf->value &&
1129: (strcmp(ent->classname, "item_flag_team1") == 0 ||
1130: strcmp(ent->classname, "item_flag_team2") == 0)) {
1131: G_FreeEdict(ent);
1132: return;
1133: }
1134: //ZOID
1135:
1136: ent->item = item;
1137: ent->nextthink = level.time + 2 * FRAMETIME; // items start after other solids
1138: ent->think = droptofloor;
1139: ent->s.effects = item->world_model_flags;
1140: ent->s.renderfx = RF_GLOW;
1141: if (ent->model)
1142: gi.modelindex (ent->model);
1143:
1144: //ZOID
1145: //flags are server animated and have special handling
1146: if (strcmp(ent->classname, "item_flag_team1") == 0 ||
1147: strcmp(ent->classname, "item_flag_team2") == 0) {
1148: ent->think = CTFFlagSetup;
1149: }
1150: //ZOID
1151:
1152: }
1153:
1154: //======================================================================
1155:
1156: gitem_t itemlist[] =
1157: {
1158: {
1159: NULL
1160: }, // leave index 0 alone
1161:
1162: //
1163: // ARMOR
1164: //
1165:
1166: /*QUAKED item_armor_body (.3 .3 1) (-16 -16 -16) (16 16 16)
1167: */
1168: {
1169: "item_armor_body",
1170: Pickup_Armor,
1171: NULL,
1172: NULL,
1173: NULL,
1174: "misc/ar1_pkup.wav",
1175: "models/items/armor/body/tris.md2", EF_ROTATE,
1176: NULL,
1177: /* icon */ "i_bodyarmor",
1178: /* pickup */ "Body Armor",
1179: /* width */ 3,
1180: 0,
1181: NULL,
1182: IT_ARMOR,
1183: 0,
1184: &bodyarmor_info,
1185: ARMOR_BODY,
1186: /* precache */ ""
1187: },
1188:
1189: /*QUAKED item_armor_combat (.3 .3 1) (-16 -16 -16) (16 16 16)
1190: */
1191: {
1192: "item_armor_combat",
1193: Pickup_Armor,
1194: NULL,
1195: NULL,
1196: NULL,
1197: "misc/ar1_pkup.wav",
1198: "models/items/armor/combat/tris.md2", EF_ROTATE,
1199: NULL,
1200: /* icon */ "i_combatarmor",
1201: /* pickup */ "Combat Armor",
1202: /* width */ 3,
1203: 0,
1204: NULL,
1205: IT_ARMOR,
1206: 0,
1207: &combatarmor_info,
1208: ARMOR_COMBAT,
1209: /* precache */ ""
1210: },
1211:
1212: /*QUAKED item_armor_jacket (.3 .3 1) (-16 -16 -16) (16 16 16)
1213: */
1214: {
1215: "item_armor_jacket",
1216: Pickup_Armor,
1217: NULL,
1218: NULL,
1219: NULL,
1220: "misc/ar1_pkup.wav",
1221: "models/items/armor/jacket/tris.md2", EF_ROTATE,
1222: NULL,
1223: /* icon */ "i_jacketarmor",
1224: /* pickup */ "Jacket Armor",
1225: /* width */ 3,
1226: 0,
1227: NULL,
1228: IT_ARMOR,
1229: 0,
1230: &jacketarmor_info,
1231: ARMOR_JACKET,
1232: /* precache */ ""
1233: },
1234:
1235: /*QUAKED item_armor_shard (.3 .3 1) (-16 -16 -16) (16 16 16)
1236: */
1237: {
1238: "item_armor_shard",
1239: Pickup_Armor,
1240: NULL,
1241: NULL,
1242: NULL,
1243: "misc/ar2_pkup.wav",
1244: "models/items/armor/shard/tris.md2", EF_ROTATE,
1245: NULL,
1246: /* icon */ "i_jacketarmor",
1247: /* pickup */ "Armor Shard",
1248: /* width */ 3,
1249: 0,
1250: NULL,
1251: IT_ARMOR,
1252: 0,
1253: NULL,
1254: ARMOR_SHARD,
1255: /* precache */ ""
1256: },
1257:
1258:
1259: /*QUAKED item_power_screen (.3 .3 1) (-16 -16 -16) (16 16 16)
1260: */
1261: {
1262: "item_power_screen",
1263: Pickup_PowerArmor,
1264: Use_PowerArmor,
1265: Drop_PowerArmor,
1266: NULL,
1267: "misc/ar3_pkup.wav",
1268: "models/items/armor/screen/tris.md2", EF_ROTATE,
1269: NULL,
1270: /* icon */ "i_powerscreen",
1271: /* pickup */ "Power Screen",
1272: /* width */ 0,
1273: 60,
1274: NULL,
1275: IT_ARMOR,
1276: 0,
1277: NULL,
1278: 0,
1279: /* precache */ ""
1280: },
1281:
1282: /*QUAKED item_power_shield (.3 .3 1) (-16 -16 -16) (16 16 16)
1283: */
1284: {
1285: "item_power_shield",
1286: Pickup_PowerArmor,
1287: Use_PowerArmor,
1288: Drop_PowerArmor,
1289: NULL,
1290: "misc/ar3_pkup.wav",
1291: "models/items/armor/shield/tris.md2", EF_ROTATE,
1292: NULL,
1293: /* icon */ "i_powershield",
1294: /* pickup */ "Power Shield",
1295: /* width */ 0,
1296: 60,
1297: NULL,
1298: IT_ARMOR,
1299: 0,
1300: NULL,
1301: 0,
1302: /* precache */ "misc/power2.wav misc/power1.wav"
1303: },
1304:
1305:
1306: //
1307: // WEAPONS
1308: //
1309:
1310: /* weapon_grapple (.3 .3 1) (-16 -16 -16) (16 16 16)
1311: always owned, never in the world
1312: */
1313: {
1314: "weapon_grapple",
1315: NULL,
1316: Use_Weapon,
1317: NULL,
1318: CTFWeapon_Grapple,
1319: "misc/w_pkup.wav",
1320: NULL, 0,
1321: "models/weapons/grapple/tris.md2",
1322: /* icon */ "w_grapple",
1323: /* pickup */ "Grapple",
1324: 0,
1325: 0,
1326: NULL,
1327: IT_WEAPON,
1328: WEAP_GRAPPLE,
1329: NULL,
1330: 0,
1331: /* precache */ "weapons/grapple/grfire.wav weapons/grapple/grpull.wav weapons/grapple/grhang.wav weapons/grapple/grreset.wav weapons/grapple/grhit.wav"
1332: },
1333:
1334: /* weapon_blaster (.3 .3 1) (-16 -16 -16) (16 16 16)
1335: always owned, never in the world
1336: */
1337: {
1338: "weapon_blaster",
1339: NULL,
1340: Use_Weapon,
1341: NULL,
1342: Weapon_Blaster,
1343: "misc/w_pkup.wav",
1344: NULL, 0,
1345: "models/weapons/v_blast/tris.md2",
1346: /* icon */ "w_blaster",
1347: /* pickup */ "Blaster",
1348: 0,
1349: 0,
1350: NULL,
1351: IT_WEAPON|IT_STAY_COOP,
1352: WEAP_BLASTER,
1353: NULL,
1354: 0,
1355: /* precache */ "weapons/blastf1a.wav misc/lasfly.wav"
1356: },
1357:
1358:
1359: /*QUAKED weapon_shotgun (.3 .3 1) (-16 -16 -16) (16 16 16)
1360: */
1361: {
1362: "weapon_shotgun",
1363: Pickup_Weapon,
1364: Use_Weapon,
1365: Drop_Weapon,
1366: Weapon_Shotgun,
1367: "misc/w_pkup.wav",
1368: "models/weapons/g_shotg/tris.md2", EF_ROTATE,
1369: "models/weapons/v_shotg/tris.md2",
1370: /* icon */ "w_shotgun",
1371: /* pickup */ "Shotgun",
1372: 0,
1373: 1,
1374: "Shells",
1375: IT_WEAPON|IT_STAY_COOP,
1376: WEAP_SHOTGUN,
1377: NULL,
1378: 0,
1379: /* precache */ "weapons/shotgf1b.wav weapons/shotgr1b.wav"
1380: },
1381:
1382: /*QUAKED weapon_supershotgun (.3 .3 1) (-16 -16 -16) (16 16 16)
1383: */
1384: {
1385: "weapon_supershotgun",
1386: Pickup_Weapon,
1387: Use_Weapon,
1388: Drop_Weapon,
1389: Weapon_SuperShotgun,
1390: "misc/w_pkup.wav",
1391: "models/weapons/g_shotg2/tris.md2", EF_ROTATE,
1392: "models/weapons/v_shotg2/tris.md2",
1393: /* icon */ "w_sshotgun",
1394: /* pickup */ "Super Shotgun",
1395: 0,
1396: 2,
1397: "Shells",
1398: IT_WEAPON|IT_STAY_COOP,
1399: WEAP_SUPERSHOTGUN,
1400: NULL,
1401: 0,
1402: /* precache */ "weapons/sshotf1b.wav"
1403: },
1404:
1405: /*QUAKED weapon_machinegun (.3 .3 1) (-16 -16 -16) (16 16 16)
1406: */
1407: {
1408: "weapon_machinegun",
1409: Pickup_Weapon,
1410: Use_Weapon,
1411: Drop_Weapon,
1412: Weapon_Machinegun,
1413: "misc/w_pkup.wav",
1414: "models/weapons/g_machn/tris.md2", EF_ROTATE,
1415: "models/weapons/v_machn/tris.md2",
1416: /* icon */ "w_machinegun",
1417: /* pickup */ "Machinegun",
1418: 0,
1419: 1,
1420: "Bullets",
1421: IT_WEAPON|IT_STAY_COOP,
1422: WEAP_MACHINEGUN,
1423: NULL,
1424: 0,
1425: /* precache */ "weapons/machgf1b.wav weapons/machgf2b.wav weapons/machgf3b.wav weapons/machgf4b.wav weapons/machgf5b.wav"
1426: },
1427:
1428: /*QUAKED weapon_chaingun (.3 .3 1) (-16 -16 -16) (16 16 16)
1429: */
1430: {
1431: "weapon_chaingun",
1432: Pickup_Weapon,
1433: Use_Weapon,
1434: Drop_Weapon,
1435: Weapon_Chaingun,
1436: "misc/w_pkup.wav",
1437: "models/weapons/g_chain/tris.md2", EF_ROTATE,
1438: "models/weapons/v_chain/tris.md2",
1439: /* icon */ "w_chaingun",
1440: /* pickup */ "Chaingun",
1441: 0,
1442: 1,
1443: "Bullets",
1444: IT_WEAPON|IT_STAY_COOP,
1445: WEAP_CHAINGUN,
1446: NULL,
1447: 0,
1448: /* precache */ "weapons/chngnu1a.wav weapons/chngnl1a.wav weapons/machgf3b.wav` weapons/chngnd1a.wav"
1449: },
1450:
1451: /*QUAKED ammo_grenades (.3 .3 1) (-16 -16 -16) (16 16 16)
1452: */
1453: {
1454: "ammo_grenades",
1455: Pickup_Ammo,
1456: Use_Weapon,
1457: Drop_Ammo,
1458: Weapon_Grenade,
1459: "misc/am_pkup.wav",
1460: "models/items/ammo/grenades/medium/tris.md2", 0,
1461: "models/weapons/v_handgr/tris.md2",
1462: /* icon */ "a_grenades",
1463: /* pickup */ "Grenades",
1464: /* width */ 3,
1465: 5,
1466: "grenades",
1467: IT_AMMO|IT_WEAPON,
1468: WEAP_GRENADES,
1469: NULL,
1470: AMMO_GRENADES,
1471: /* precache */ "weapons/hgrent1a.wav weapons/hgrena1b.wav weapons/hgrenc1b.wav weapons/hgrenb1a.wav weapons/hgrenb2a.wav "
1472: },
1473:
1474: /*QUAKED weapon_grenadelauncher (.3 .3 1) (-16 -16 -16) (16 16 16)
1475: */
1476: {
1477: "weapon_grenadelauncher",
1478: Pickup_Weapon,
1479: Use_Weapon,
1480: Drop_Weapon,
1481: Weapon_GrenadeLauncher,
1482: "misc/w_pkup.wav",
1483: "models/weapons/g_launch/tris.md2", EF_ROTATE,
1484: "models/weapons/v_launch/tris.md2",
1485: /* icon */ "w_glauncher",
1486: /* pickup */ "Grenade Launcher",
1487: 0,
1488: 1,
1489: "Grenades",
1490: IT_WEAPON|IT_STAY_COOP,
1491: WEAP_GRENADELAUNCHER,
1492: NULL,
1493: 0,
1494: /* precache */ "models/objects/grenade/tris.md2 weapons/grenlf1a.wav weapons/grenlr1b.wav weapons/grenlb1b.wav"
1495: },
1496:
1497: /*QUAKED weapon_rocketlauncher (.3 .3 1) (-16 -16 -16) (16 16 16)
1498: */
1499: {
1500: "weapon_rocketlauncher",
1501: Pickup_Weapon,
1502: Use_Weapon,
1503: Drop_Weapon,
1504: Weapon_RocketLauncher,
1505: "misc/w_pkup.wav",
1506: "models/weapons/g_rocket/tris.md2", EF_ROTATE,
1507: "models/weapons/v_rocket/tris.md2",
1508: /* icon */ "w_rlauncher",
1509: /* pickup */ "Rocket Launcher",
1510: 0,
1511: 1,
1512: "Rockets",
1513: IT_WEAPON|IT_STAY_COOP,
1514: WEAP_ROCKETLAUNCHER,
1515: NULL,
1516: 0,
1517: /* precache */ "models/objects/rocket/tris.md2 weapons/rockfly.wav weapons/rocklf1a.wav weapons/rocklr1b.wav models/objects/debris2/tris.md2"
1518: },
1519:
1520: /*QUAKED weapon_hyperblaster (.3 .3 1) (-16 -16 -16) (16 16 16)
1521: */
1522: {
1523: "weapon_hyperblaster",
1524: Pickup_Weapon,
1525: Use_Weapon,
1526: Drop_Weapon,
1527: Weapon_HyperBlaster,
1528: "misc/w_pkup.wav",
1529: "models/weapons/g_hyperb/tris.md2", EF_ROTATE,
1530: "models/weapons/v_hyperb/tris.md2",
1531: /* icon */ "w_hyperblaster",
1532: /* pickup */ "HyperBlaster",
1533: 0,
1534: 1,
1535: "Cells",
1536: IT_WEAPON|IT_STAY_COOP,
1537: WEAP_HYPERBLASTER,
1538: NULL,
1539: 0,
1540: /* precache */ "weapons/hyprbu1a.wav weapons/hyprbl1a.wav weapons/hyprbf1a.wav weapons/hyprbd1a.wav misc/lasfly.wav"
1541: },
1542:
1543: /*QUAKED weapon_railgun (.3 .3 1) (-16 -16 -16) (16 16 16)
1544: */
1545: {
1546: "weapon_railgun",
1547: Pickup_Weapon,
1548: Use_Weapon,
1549: Drop_Weapon,
1550: Weapon_Railgun,
1551: "misc/w_pkup.wav",
1552: "models/weapons/g_rail/tris.md2", EF_ROTATE,
1553: "models/weapons/v_rail/tris.md2",
1554: /* icon */ "w_railgun",
1555: /* pickup */ "Railgun",
1556: 0,
1557: 1,
1558: "Slugs",
1559: IT_WEAPON|IT_STAY_COOP,
1560: WEAP_RAILGUN,
1561: NULL,
1562: 0,
1563: /* precache */ "weapons/rg_hum.wav"
1564: },
1565:
1566: /*QUAKED weapon_bfg (.3 .3 1) (-16 -16 -16) (16 16 16)
1567: */
1568: {
1569: "weapon_bfg",
1570: Pickup_Weapon,
1571: Use_Weapon,
1572: Drop_Weapon,
1573: Weapon_BFG,
1574: "misc/w_pkup.wav",
1575: "models/weapons/g_bfg/tris.md2", EF_ROTATE,
1576: "models/weapons/v_bfg/tris.md2",
1577: /* icon */ "w_bfg",
1578: /* pickup */ "BFG10K",
1579: 0,
1580: 50,
1581: "Cells",
1582: IT_WEAPON|IT_STAY_COOP,
1583: WEAP_BFG,
1584: NULL,
1585: 0,
1586: /* 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"
1587: },
1588:
1589: #if 0
1590: //ZOID
1591: /*QUAKED weapon_laser (.3 .3 1) (-16 -16 -16) (16 16 16)
1592: */
1593: {
1594: "weapon_laser",
1595: Pickup_Weapon,
1596: Use_Weapon,
1597: Drop_Weapon,
1598: Weapon_Laser,
1599: "misc/w_pkup.wav",
1600: "models/weapons/g_laser/tris.md2", EF_ROTATE,
1601: "models/weapons/v_laser/tris.md2",
1602: /* icon */ "w_bfg",
1603: /* pickup */ "Flashlight Laser",
1604: 0,
1605: 1,
1606: "Cells",
1607: IT_WEAPON,
1608: 0,
1609: NULL,
1610: 0,
1611: /* precache */ ""
1612: },
1613: #endif
1614:
1615: //
1616: // AMMO ITEMS
1617: //
1618:
1619: /*QUAKED ammo_shells (.3 .3 1) (-16 -16 -16) (16 16 16)
1620: */
1621: {
1622: "ammo_shells",
1623: Pickup_Ammo,
1624: NULL,
1625: Drop_Ammo,
1626: NULL,
1627: "misc/am_pkup.wav",
1628: "models/items/ammo/shells/medium/tris.md2", 0,
1629: NULL,
1630: /* icon */ "a_shells",
1631: /* pickup */ "Shells",
1632: /* width */ 3,
1633: 10,
1634: NULL,
1635: IT_AMMO,
1636: 0,
1637: NULL,
1638: AMMO_SHELLS,
1639: /* precache */ ""
1640: },
1641:
1642: /*QUAKED ammo_bullets (.3 .3 1) (-16 -16 -16) (16 16 16)
1643: */
1644: {
1645: "ammo_bullets",
1646: Pickup_Ammo,
1647: NULL,
1648: Drop_Ammo,
1649: NULL,
1650: "misc/am_pkup.wav",
1651: "models/items/ammo/bullets/medium/tris.md2", 0,
1652: NULL,
1653: /* icon */ "a_bullets",
1654: /* pickup */ "Bullets",
1655: /* width */ 3,
1656: 50,
1657: NULL,
1658: IT_AMMO,
1659: 0,
1660: NULL,
1661: AMMO_BULLETS,
1662: /* precache */ ""
1663: },
1664:
1665: /*QUAKED ammo_cells (.3 .3 1) (-16 -16 -16) (16 16 16)
1666: */
1667: {
1668: "ammo_cells",
1669: Pickup_Ammo,
1670: NULL,
1671: Drop_Ammo,
1672: NULL,
1673: "misc/am_pkup.wav",
1674: "models/items/ammo/cells/medium/tris.md2", 0,
1675: NULL,
1676: /* icon */ "a_cells",
1677: /* pickup */ "Cells",
1678: /* width */ 3,
1679: 50,
1680: NULL,
1681: IT_AMMO,
1682: 0,
1683: NULL,
1684: AMMO_CELLS,
1685: /* precache */ ""
1686: },
1687:
1688: /*QUAKED ammo_rockets (.3 .3 1) (-16 -16 -16) (16 16 16)
1689: */
1690: {
1691: "ammo_rockets",
1692: Pickup_Ammo,
1693: NULL,
1694: Drop_Ammo,
1695: NULL,
1696: "misc/am_pkup.wav",
1697: "models/items/ammo/rockets/medium/tris.md2", 0,
1698: NULL,
1699: /* icon */ "a_rockets",
1700: /* pickup */ "Rockets",
1701: /* width */ 3,
1702: 5,
1703: NULL,
1704: IT_AMMO,
1705: 0,
1706: NULL,
1707: AMMO_ROCKETS,
1708: /* precache */ ""
1709: },
1710:
1711: /*QUAKED ammo_slugs (.3 .3 1) (-16 -16 -16) (16 16 16)
1712: */
1713: {
1714: "ammo_slugs",
1715: Pickup_Ammo,
1716: NULL,
1717: Drop_Ammo,
1718: NULL,
1719: "misc/am_pkup.wav",
1720: "models/items/ammo/slugs/medium/tris.md2", 0,
1721: NULL,
1722: /* icon */ "a_slugs",
1723: /* pickup */ "Slugs",
1724: /* width */ 3,
1725: 10,
1726: NULL,
1727: IT_AMMO,
1728: 0,
1729: NULL,
1730: AMMO_SLUGS,
1731: /* precache */ ""
1732: },
1733:
1734:
1735: //
1736: // POWERUP ITEMS
1737: //
1738: /*QUAKED item_quad (.3 .3 1) (-16 -16 -16) (16 16 16)
1739: */
1740: {
1741: "item_quad",
1742: Pickup_Powerup,
1743: Use_Quad,
1744: Drop_General,
1745: NULL,
1746: "items/pkup.wav",
1747: "models/items/quaddama/tris.md2", EF_ROTATE,
1748: NULL,
1749: /* icon */ "p_quad",
1750: /* pickup */ "Quad Damage",
1751: /* width */ 2,
1752: 60,
1753: NULL,
1754: IT_POWERUP,
1755: 0,
1756: NULL,
1757: 0,
1758: /* precache */ "items/damage.wav items/damage2.wav items/damage3.wav"
1759: },
1760:
1761: /*QUAKED item_invulnerability (.3 .3 1) (-16 -16 -16) (16 16 16)
1762: */
1763: {
1764: "item_invulnerability",
1765: Pickup_Powerup,
1766: Use_Invulnerability,
1767: Drop_General,
1768: NULL,
1769: "items/pkup.wav",
1770: "models/items/invulner/tris.md2", EF_ROTATE,
1771: NULL,
1772: /* icon */ "p_invulnerability",
1773: /* pickup */ "Invulnerability",
1774: /* width */ 2,
1775: 300,
1776: NULL,
1777: IT_POWERUP,
1778: 0,
1779: NULL,
1780: 0,
1781: /* precache */ "items/protect.wav items/protect2.wav items/protect4.wav"
1782: },
1783:
1784: /*QUAKED item_silencer (.3 .3 1) (-16 -16 -16) (16 16 16)
1785: */
1786: {
1787: "item_silencer",
1788: Pickup_Powerup,
1789: Use_Silencer,
1790: Drop_General,
1791: NULL,
1792: "items/pkup.wav",
1793: "models/items/silencer/tris.md2", EF_ROTATE,
1794: NULL,
1795: /* icon */ "p_silencer",
1796: /* pickup */ "Silencer",
1797: /* width */ 2,
1798: 60,
1799: NULL,
1800: IT_POWERUP,
1801: 0,
1802: NULL,
1803: 0,
1804: /* precache */ ""
1805: },
1806:
1807: /*QUAKED item_breather (.3 .3 1) (-16 -16 -16) (16 16 16)
1808: */
1809: {
1810: "item_breather",
1811: Pickup_Powerup,
1812: Use_Breather,
1813: Drop_General,
1814: NULL,
1815: "items/pkup.wav",
1816: "models/items/breather/tris.md2", EF_ROTATE,
1817: NULL,
1818: /* icon */ "p_rebreather",
1819: /* pickup */ "Rebreather",
1820: /* width */ 2,
1821: 60,
1822: NULL,
1823: IT_STAY_COOP|IT_POWERUP,
1824: 0,
1825: NULL,
1826: 0,
1827: /* precache */ "items/airout.wav"
1828: },
1829:
1830: /*QUAKED item_enviro (.3 .3 1) (-16 -16 -16) (16 16 16)
1831: */
1832: {
1833: "item_enviro",
1834: Pickup_Powerup,
1835: Use_Envirosuit,
1836: Drop_General,
1837: NULL,
1838: "items/pkup.wav",
1839: "models/items/enviro/tris.md2", EF_ROTATE,
1840: NULL,
1841: /* icon */ "p_envirosuit",
1842: /* pickup */ "Environment Suit",
1843: /* width */ 2,
1844: 60,
1845: NULL,
1846: IT_STAY_COOP|IT_POWERUP,
1847: 0,
1848: NULL,
1849: 0,
1850: /* precache */ "items/airout.wav"
1851: },
1852:
1853: /*QUAKED item_ancient_head (.3 .3 1) (-16 -16 -16) (16 16 16)
1854: Special item that gives +2 to maximum health
1855: */
1856: {
1857: "item_ancient_head",
1858: Pickup_AncientHead,
1859: NULL,
1860: NULL,
1861: NULL,
1862: "items/pkup.wav",
1863: "models/items/c_head/tris.md2", EF_ROTATE,
1864: NULL,
1865: /* icon */ "i_fixme",
1866: /* pickup */ "Ancient Head",
1867: /* width */ 2,
1868: 60,
1869: NULL,
1870: 0,
1871: 0,
1872: NULL,
1873: 0,
1874: /* precache */ ""
1875: },
1876:
1877: /*QUAKED item_adrenaline (.3 .3 1) (-16 -16 -16) (16 16 16)
1878: gives +1 to maximum health
1879: */
1880: {
1881: "item_adrenaline",
1882: Pickup_Adrenaline,
1883: NULL,
1884: NULL,
1885: NULL,
1886: "items/pkup.wav",
1887: "models/items/adrenal/tris.md2", EF_ROTATE,
1888: NULL,
1889: /* icon */ "p_adrenaline",
1890: /* pickup */ "Adrenaline",
1891: /* width */ 2,
1892: 60,
1893: NULL,
1894: 0,
1895: 0,
1896: NULL,
1897: 0,
1898: /* precache */ ""
1899: },
1900:
1901: /*QUAKED item_bandolier (.3 .3 1) (-16 -16 -16) (16 16 16)
1902: */
1903: {
1904: "item_bandolier",
1905: Pickup_Bandolier,
1906: NULL,
1907: NULL,
1908: NULL,
1909: "items/pkup.wav",
1910: "models/items/band/tris.md2", EF_ROTATE,
1911: NULL,
1912: /* icon */ "p_bandolier",
1913: /* pickup */ "Bandolier",
1914: /* width */ 2,
1915: 60,
1916: NULL,
1917: 0,
1918: 0,
1919: NULL,
1920: 0,
1921: /* precache */ ""
1922: },
1923:
1924: /*QUAKED item_pack (.3 .3 1) (-16 -16 -16) (16 16 16)
1925: */
1926: {
1927: "item_pack",
1928: Pickup_Pack,
1929: NULL,
1930: NULL,
1931: NULL,
1932: "items/pkup.wav",
1933: "models/items/pack/tris.md2", EF_ROTATE,
1934: NULL,
1935: /* icon */ "i_pack",
1936: /* pickup */ "Ammo Pack",
1937: /* width */ 2,
1938: 180,
1939: NULL,
1940: 0,
1941: 0,
1942: NULL,
1943: 0,
1944: /* precache */ ""
1945: },
1946:
1947: //
1948: // KEYS
1949: //
1950: /*QUAKED key_data_cd (0 .5 .8) (-16 -16 -16) (16 16 16)
1951: key for computer centers
1952: */
1953: {
1954: "key_data_cd",
1955: Pickup_Key,
1956: NULL,
1957: Drop_General,
1958: NULL,
1959: "items/pkup.wav",
1960: "models/items/keys/data_cd/tris.md2", EF_ROTATE,
1961: NULL,
1962: "k_datacd",
1963: "Data CD",
1964: 2,
1965: 0,
1966: NULL,
1967: IT_STAY_COOP|IT_KEY,
1968: 0,
1969: NULL,
1970: 0,
1971: /* precache */ ""
1972: },
1973:
1974: /*QUAKED key_power_cube (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN NO_TOUCH
1975: warehouse circuits
1976: */
1977: {
1978: "key_power_cube",
1979: Pickup_Key,
1980: NULL,
1981: Drop_General,
1982: NULL,
1983: "items/pkup.wav",
1984: "models/items/keys/power/tris.md2", EF_ROTATE,
1985: NULL,
1986: "k_powercube",
1987: "Power Cube",
1988: 2,
1989: 0,
1990: NULL,
1991: IT_STAY_COOP|IT_KEY,
1992: 0,
1993: NULL,
1994: 0,
1995: /* precache */ ""
1996: },
1997:
1998: /*QUAKED key_pyramid (0 .5 .8) (-16 -16 -16) (16 16 16)
1999: key for the entrance of jail3
2000: */
2001: {
2002: "key_pyramid",
2003: Pickup_Key,
2004: NULL,
2005: Drop_General,
2006: NULL,
2007: "items/pkup.wav",
2008: "models/items/keys/pyramid/tris.md2", EF_ROTATE,
2009: NULL,
2010: "k_pyramid",
2011: "Pyramid Key",
2012: 2,
2013: 0,
2014: NULL,
2015: IT_STAY_COOP|IT_KEY,
2016: 0,
2017: NULL,
2018: 0,
2019: /* precache */ ""
2020: },
2021:
2022: /*QUAKED key_data_spinner (0 .5 .8) (-16 -16 -16) (16 16 16)
2023: key for the city computer
2024: */
2025: {
2026: "key_data_spinner",
2027: Pickup_Key,
2028: NULL,
2029: Drop_General,
2030: NULL,
2031: "items/pkup.wav",
2032: "models/items/keys/spinner/tris.md2", EF_ROTATE,
2033: NULL,
2034: "k_dataspin",
2035: "Data Spinner",
2036: 2,
2037: 0,
2038: NULL,
2039: IT_STAY_COOP|IT_KEY,
2040: 0,
2041: NULL,
2042: 0,
2043: /* precache */ ""
2044: },
2045:
2046: /*QUAKED key_pass (0 .5 .8) (-16 -16 -16) (16 16 16)
2047: security pass for the security level
2048: */
2049: {
2050: "key_pass",
2051: Pickup_Key,
2052: NULL,
2053: Drop_General,
2054: NULL,
2055: "items/pkup.wav",
2056: "models/items/keys/pass/tris.md2", EF_ROTATE,
2057: NULL,
2058: "k_security",
2059: "Security Pass",
2060: 2,
2061: 0,
2062: NULL,
2063: IT_STAY_COOP|IT_KEY,
2064: 0,
2065: NULL,
2066: 0,
2067: /* precache */ ""
2068: },
2069:
2070: /*QUAKED key_blue_key (0 .5 .8) (-16 -16 -16) (16 16 16)
2071: normal door key - blue
2072: */
2073: {
2074: "key_blue_key",
2075: Pickup_Key,
2076: NULL,
2077: Drop_General,
2078: NULL,
2079: "items/pkup.wav",
2080: "models/items/keys/key/tris.md2", EF_ROTATE,
2081: NULL,
2082: "k_bluekey",
2083: "Blue Key",
2084: 2,
2085: 0,
2086: NULL,
2087: IT_STAY_COOP|IT_KEY,
2088: 0,
2089: NULL,
2090: 0,
2091: /* precache */ ""
2092: },
2093:
2094: /*QUAKED key_red_key (0 .5 .8) (-16 -16 -16) (16 16 16)
2095: normal door key - red
2096: */
2097: {
2098: "key_red_key",
2099: Pickup_Key,
2100: NULL,
2101: Drop_General,
2102: NULL,
2103: "items/pkup.wav",
2104: "models/items/keys/red_key/tris.md2", EF_ROTATE,
2105: NULL,
2106: "k_redkey",
2107: "Red Key",
2108: 2,
2109: 0,
2110: NULL,
2111: IT_STAY_COOP|IT_KEY,
2112: 0,
2113: NULL,
2114: 0,
2115: /* precache */ ""
2116: },
2117:
2118: /*QUAKED key_commander_head (0 .5 .8) (-16 -16 -16) (16 16 16)
2119: tank commander's head
2120: */
2121: {
2122: "key_commander_head",
2123: Pickup_Key,
2124: NULL,
2125: Drop_General,
2126: NULL,
2127: "items/pkup.wav",
2128: "models/monsters/commandr/head/tris.md2", EF_GIB,
2129: NULL,
2130: /* icon */ "k_comhead",
2131: /* pickup */ "Commander's Head",
2132: /* width */ 2,
2133: 0,
2134: NULL,
2135: IT_STAY_COOP|IT_KEY,
2136: 0,
2137: NULL,
2138: 0,
2139: /* precache */ ""
2140: },
2141:
2142: /*QUAKED key_airstrike_target (0 .5 .8) (-16 -16 -16) (16 16 16)
2143: tank commander's head
2144: */
2145: {
2146: "key_airstrike_target",
2147: Pickup_Key,
2148: NULL,
2149: Drop_General,
2150: NULL,
2151: "items/pkup.wav",
2152: "models/items/keys/target/tris.md2", EF_ROTATE,
2153: NULL,
2154: /* icon */ "i_airstrike",
2155: /* pickup */ "Airstrike Marker",
2156: /* width */ 2,
2157: 0,
2158: NULL,
2159: IT_STAY_COOP|IT_KEY,
2160: 0,
2161: NULL,
2162: 0,
2163: /* precache */ ""
2164: },
2165:
2166: {
2167: NULL,
2168: Pickup_Health,
2169: NULL,
2170: NULL,
2171: NULL,
2172: "items/pkup.wav",
2173: NULL, 0,
2174: NULL,
2175: /* icon */ "i_health",
2176: /* pickup */ "Health",
2177: /* width */ 3,
2178: 0,
2179: NULL,
2180: 0,
2181: 0,
2182: NULL,
2183: 0,
2184: /* precache */ "items/s_health.wav items/n_health.wav items/l_health.wav items/m_health.wav"
2185: },
2186:
2187:
2188: //ZOID
2189: /*QUAKED item_flag_team1 (1 0.2 0) (-16 -16 -24) (16 16 32)
2190: */
2191: {
2192: "item_flag_team1",
2193: CTFPickup_Flag,
2194: NULL,
2195: CTFDrop_Flag, //Should this be null if we don't want players to drop it manually?
2196: NULL,
2197: "ctf/flagtk.wav",
2198: "players/male/flag1.md2", EF_FLAG1,
2199: NULL,
2200: /* icon */ "i_ctf1",
2201: /* pickup */ "Red Flag",
2202: /* width */ 2,
2203: 0,
2204: NULL,
2205: 0,
2206: 0,
2207: NULL,
2208: 0,
2209: /* precache */ "ctf/flagcap.wav"
2210: },
2211:
2212: /*QUAKED item_flag_team2 (1 0.2 0) (-16 -16 -24) (16 16 32)
2213: */
2214: {
2215: "item_flag_team2",
2216: CTFPickup_Flag,
2217: NULL,
2218: CTFDrop_Flag, //Should this be null if we don't want players to drop it manually?
2219: NULL,
2220: "ctf/flagtk.wav",
2221: "players/male/flag2.md2", EF_FLAG2,
2222: NULL,
2223: /* icon */ "i_ctf2",
2224: /* pickup */ "Blue Flag",
2225: /* width */ 2,
2226: 0,
2227: NULL,
2228: 0,
2229: 0,
2230: NULL,
2231: 0,
2232: /* precache */ "ctf/flagcap.wav"
2233: },
2234:
2235: /* Resistance Tech */
2236: {
2237: "item_tech1",
2238: CTFPickup_Tech,
2239: NULL,
2240: CTFDrop_Tech, //Should this be null if we don't want players to drop it manually?
2241: NULL,
2242: "items/pkup.wav",
2243: "models/ctf/resistance/tris.md2", EF_ROTATE,
2244: NULL,
2245: /* icon */ "tech1",
2246: /* pickup */ "Disruptor Shield",
2247: /* width */ 2,
2248: 0,
2249: NULL,
2250: IT_TECH,
2251: 0,
2252: NULL,
2253: 0,
2254: /* precache */ "ctf/tech1.wav"
2255: },
2256:
2257: /* Strength Tech */
2258: {
2259: "item_tech2",
2260: CTFPickup_Tech,
2261: NULL,
2262: CTFDrop_Tech, //Should this be null if we don't want players to drop it manually?
2263: NULL,
2264: "items/pkup.wav",
2265: "models/ctf/strength/tris.md2", EF_ROTATE,
2266: NULL,
2267: /* icon */ "tech2",
2268: /* pickup */ "Power Amplifier",
2269: /* width */ 2,
2270: 0,
2271: NULL,
2272: IT_TECH,
2273: 0,
2274: NULL,
2275: 0,
2276: /* precache */ "ctf/tech2.wav ctf/tech2x.wav"
2277: },
2278:
2279: /* Haste Tech */
2280: {
2281: "item_tech3",
2282: CTFPickup_Tech,
2283: NULL,
2284: CTFDrop_Tech, //Should this be null if we don't want players to drop it manually?
2285: NULL,
2286: "items/pkup.wav",
2287: "models/ctf/haste/tris.md2", EF_ROTATE,
2288: NULL,
2289: /* icon */ "tech3",
2290: /* pickup */ "Time Accel",
2291: /* width */ 2,
2292: 0,
2293: NULL,
2294: IT_TECH,
2295: 0,
2296: NULL,
2297: 0,
2298: /* precache */ "ctf/tech3.wav"
2299: },
2300:
2301: /* Regeneration Tech */
2302: {
2303: "item_tech4",
2304: CTFPickup_Tech,
2305: NULL,
2306: CTFDrop_Tech, //Should this be null if we don't want players to drop it manually?
2307: NULL,
2308: "items/pkup.wav",
2309: "models/ctf/regeneration/tris.md2", EF_ROTATE,
2310: NULL,
2311: /* icon */ "tech4",
2312: /* pickup */ "AutoDoc",
2313: /* width */ 2,
2314: 0,
2315: NULL,
2316: IT_TECH,
2317: 0,
2318: NULL,
2319: 0,
2320: /* precache */ "ctf/tech4.wav"
2321: },
2322:
2323: //ZOID
2324:
2325: // end of list marker
2326: {NULL}
2327: };
2328:
2329:
2330: /*QUAKED item_health (.3 .3 1) (-16 -16 -16) (16 16 16)
2331: */
2332: void SP_item_health (edict_t *self)
2333: {
2334: if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
2335: {
2336: G_FreeEdict (self);
2337: return;
2338: }
2339:
2340: self->model = "models/items/healing/medium/tris.md2";
2341: self->count = 10;
2342: SpawnItem (self, FindItem ("Health"));
2343: gi.soundindex ("items/n_health.wav");
2344: }
2345:
2346: /*QUAKED item_health_small (.3 .3 1) (-16 -16 -16) (16 16 16)
2347: */
2348: void SP_item_health_small (edict_t *self)
2349: {
2350: if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
2351: {
2352: G_FreeEdict (self);
2353: return;
2354: }
2355:
2356: self->model = "models/items/healing/stimpack/tris.md2";
2357: self->count = 2;
2358: SpawnItem (self, FindItem ("Health"));
2359: self->style = HEALTH_IGNORE_MAX;
2360: gi.soundindex ("items/s_health.wav");
2361: }
2362:
2363: /*QUAKED item_health_large (.3 .3 1) (-16 -16 -16) (16 16 16)
2364: */
2365: void SP_item_health_large (edict_t *self)
2366: {
2367: if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
2368: {
2369: G_FreeEdict (self);
2370: return;
2371: }
2372:
2373: self->model = "models/items/healing/large/tris.md2";
2374: self->count = 25;
2375: SpawnItem (self, FindItem ("Health"));
2376: gi.soundindex ("items/l_health.wav");
2377: }
2378:
2379: /*QUAKED item_health_mega (.3 .3 1) (-16 -16 -16) (16 16 16)
2380: */
2381: void SP_item_health_mega (edict_t *self)
2382: {
2383: if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
2384: {
2385: G_FreeEdict (self);
2386: return;
2387: }
2388:
2389: self->model = "models/items/mega_h/tris.md2";
2390: self->count = 100;
2391: SpawnItem (self, FindItem ("Health"));
2392: gi.soundindex ("items/m_health.wav");
2393: self->style = HEALTH_IGNORE_MAX|HEALTH_TIMED;
2394: }
2395:
2396:
2397: void InitItems (void)
2398: {
2399: game.num_items = sizeof(itemlist)/sizeof(itemlist[0]) - 1;
2400: }
2401:
2402:
2403:
2404: /*
2405: ===============
2406: SetItemNames
2407:
2408: Called by worldspawn
2409: ===============
2410: */
2411: void SetItemNames (void)
2412: {
2413: int i;
2414: gitem_t *it;
2415:
2416: for (i=0 ; i<game.num_items ; i++)
2417: {
2418: it = &itemlist[i];
2419: gi.configstring (CS_ITEMS+i, it->pickup_name);
2420: }
2421:
2422: jacket_armor_index = ITEM_INDEX(FindItem("Jacket Armor"));
2423: combat_armor_index = ITEM_INDEX(FindItem("Combat Armor"));
2424: body_armor_index = ITEM_INDEX(FindItem("Body Armor"));
2425: power_screen_index = ITEM_INDEX(FindItem("Power Screen"));
2426: power_shield_index = ITEM_INDEX(FindItem("Power Shield"));
2427: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.