Quake-2

Quake 2 GPL Source Release
Log | Files | Refs

g_items.c (50287B)


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