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