thirtyflightsofloving/missionpack/g_items.c
Knightmare66 0d4e872ce9 Added LMCTF / LM Escape plasma rifle to missionpack DLL.
Added plasma guards (monster_soldier_plasma_re and monster_soldier_plasma_sp) from LM Escape to missionpack DLL.
Added Zaero items/weapons to missionpack DLL.
Added support for Zaero doors  to missionpack DLL.
Fixed crash caused by killtargeting sentien (laser edict not freed) in missionpack DLL.
Fixed bug with broken Rogue turrets in missionpack DLL.
Fixed crash in g_combat.c->M_ReactToDamage() caused by attacker with NULL classname in missionpack DLL.
2020-08-09 02:45:19 -04:00

5121 lines
116 KiB
C

#include "g_local.h"
qboolean Pickup_Weapon (edict_t *ent, edict_t *other);
void Use_Weapon (edict_t *ent, gitem_t *inv);
void Drop_Weapon (edict_t *ent, gitem_t *inv);
void Weapon_Blaster (edict_t *ent);
void Weapon_Shotgun (edict_t *ent);
void Weapon_SuperShotgun (edict_t *ent);
void Weapon_Machinegun (edict_t *ent);
void Weapon_Chaingun (edict_t *ent);
void Weapon_HyperBlaster (edict_t *ent);
void Weapon_RocketLauncher (edict_t *ent);
void Weapon_Grenade (edict_t *ent);
void Weapon_GrenadeLauncher (edict_t *ent);
void Weapon_Railgun (edict_t *ent);
void Weapon_BFG (edict_t *ent);
// RAFAEL
void Weapon_Ionripper (edict_t *ent);
void Weapon_Phalanx (edict_t *ent);
void Weapon_Trap (edict_t *ent);
//=========
//Rogue Weapons
void Weapon_ChainFist (edict_t *ent);
void Weapon_Disintegrator (edict_t *ent);
void Weapon_ETF_Rifle (edict_t *ent);
void Weapon_Heatbeam (edict_t *ent);
void Weapon_Prox (edict_t *ent);
void Weapon_Tesla (edict_t *ent);
void Weapon_ProxLauncher (edict_t *ent);
//void Weapon_Nuke (edict_t *ent);
//Rogue Weapons
//=========
void Weapon_Shockwave (edict_t *ent);
void Weapon_Plasma_Rifle (edict_t *ent); // SKWiD MOD
void Weapon_HomingMissileLauncher (edict_t *ent);
void Weapon_Null(edict_t *ent);
// *** Zaero prototypes ***
void Weapon_FlareGun (edict_t *ent);
//void Weapon_SniperRifle(edict_t *ent);
void Weapon_LaserTripBomb(edict_t *ent);
//void Weapon_SonicCannon (edict_t *ent);
void Weapon_EMPNuke (edict_t *ent);
//void Weapon_A2k (edict_t *ent);
void Use_Visor (edict_t *ent, gitem_t *item);
//void Action_Push(edict_t *ent);
void Use_PlasmaShield (edict_t *ent, gitem_t *item);
gitem_armor_t jacketarmor_info = { 25, 100, .30, .00, ARMOR_JACKET};
gitem_armor_t combatarmor_info = { 50, 200, .60, .30, ARMOR_COMBAT};
gitem_armor_t bodyarmor_info = {100, 10000, .80, .60, ARMOR_BODY};
int noweapon_index;
int jacket_armor_index;
int combat_armor_index;
int body_armor_index;
int power_screen_index;
int power_shield_index;
int shells_index;
int bullets_index;
int grenades_index;
int rockets_index;
int cells_index;
int slugs_index;
int fuel_index;
int homing_index;
int rl_index;
int hml_index;
int pl_index;
int pr_index; // SKWiD MOD
int magslug_index;
int flechettes_index;
int prox_index;
int disruptors_index;
int tesla_index;
int trap_index;
int shocksphere_index;
int flares_index;
int tbombs_index;
int empnuke_index;
int plasmashield_index;
// added for convenience with triger_key sound hack
int key_q1_med_silver_index;
int key_q1_med_gold_index;
int key_q1_rune_silver_index;
int key_q1_rune_gold_index;
int key_q1_base_silver_index;
int key_q1_base_gold_index;
#define HEALTH_IGNORE_MAX 1
#define HEALTH_TIMED 2
#define HEALTH_FOODCUBE 4
void Use_Quad (edict_t *ent, gitem_t *item);
void Use_Double (edict_t *ent, gitem_t *item);
// RAFAEL
void Use_QuadFire (edict_t *ent, gitem_t *item);
// added stasis generator support
void Use_Stasis (edict_t *ent, gitem_t *item);
static int quad_drop_timeout_hack;
static int double_drop_timeout_hack;
// RAFAEL
static int quad_fire_drop_timeout_hack;
//======================================================================
/*
===============
GetItemByIndex
===============
*/
gitem_t *GetItemByIndex (int index)
{
if (index == 0 || index >= game.num_items)
return NULL;
return &itemlist[index];
}
/*
===============
GetMaxAmmoByIndex
===============
*/
int GetMaxAmmoByIndex (gclient_t *client, int item_index)
{
int value;
if (!client)
return 0;
if (item_index == shells_index)
value = client->pers.max_shells;
else if (item_index == bullets_index)
value = client->pers.max_bullets;
else if (item_index == grenades_index)
value = client->pers.max_grenades;
else if (item_index == rockets_index)
value = client->pers.max_rockets;
else if (item_index == cells_index)
value = client->pers.max_cells;
else if (item_index == slugs_index)
value = client->pers.max_slugs;
else if (item_index == fuel_index)
value = client->pers.max_fuel;
else if (item_index == homing_index)
value = client->pers.max_homing_rockets;
else if (item_index == magslug_index)
value = client->pers.max_magslug;
else if (item_index == flechettes_index)
value = client->pers.max_flechettes;
else if (item_index == prox_index)
value = client->pers.max_prox;
else if (item_index == disruptors_index)
value = client->pers.max_disruptors;
else if (item_index == tesla_index)
value = client->pers.max_tesla;
else if (item_index == trap_index)
value = client->pers.max_trap;
else if (item_index == shocksphere_index)
value = client->pers.max_shockspheres;
else if (item_index == flares_index)
value = client->pers.max_flares;
else if (item_index == tbombs_index)
value = client->pers.max_tbombs;
else if (item_index == empnuke_index)
value = client->pers.max_empnuke;
else if (item_index == plasmashield_index)
value = client->pers.max_plasmashield;
else
value = 0;
return value;
}
/*
===============
GetMaxArmorByIndex
===============
*/
int GetMaxArmorByIndex (int item_index)
{
int value;
if (item_index == jacket_armor_index)
value = sk_max_armor_jacket->value;
else if (item_index == combat_armor_index)
value = sk_max_armor_combat->value;
else if (item_index == body_armor_index)
value = sk_max_armor_body->value;
else
value = 0;
return value;
}
/*
===============
FindItemByClassname
===============
*/
gitem_t *FindItemByClassname (char *classname)
{
int i;
gitem_t *it;
it = itemlist;
for (i=0 ; i<game.num_items ; i++, it++)
{
if (!it->classname)
continue;
if (!Q_stricmp(it->classname, classname))
return it;
}
return NULL;
}
/*
===============
FindItem
===============
*/
gitem_t *FindItem (char *pickup_name)
{
int i;
gitem_t *it;
it = itemlist;
for (i=0 ; i<game.num_items ; i++, it++)
{
if (!it->pickup_name)
continue;
if (!Q_stricmp(it->pickup_name, pickup_name))
return it;
}
return NULL;
}
//======================================================================
void DoRespawn (edict_t *ent)
{
if (ent->team)
{
edict_t *master;
int count;
int choice;
master = ent->teammaster;
for (count = 0, ent = master; ent; ent = ent->chain, count++)
;
// choice = rand() % count;
choice = count ? rand() % count : 0;
for (count = 0, ent = master; count < choice; ent = ent->chain, count++)
;
}
//=====
//ROGUE
if(randomrespawn && randomrespawn->value)
{
edict_t *newEnt;
newEnt = DoRandomRespawn (ent);
// if we've changed entities, then do some sleight of hand.
// otherwise, the old entity will respawn
if(newEnt)
{
G_FreeEdict (ent);
ent = newEnt;
}
}
//ROGUE
//=====
ent->svflags &= ~SVF_NOCLIENT;
ent->solid = SOLID_TRIGGER;
gi.linkentity (ent);
// send an effect
ent->s.event = EV_ITEM_RESPAWN;
}
void SetRespawn (edict_t *ent, float delay)
{
ent->flags |= FL_RESPAWN;
ent->svflags |= SVF_NOCLIENT;
ent->solid = SOLID_NOT;
ent->nextthink = level.time + delay;
ent->think = DoRespawn;
gi.linkentity (ent);
}
//======================================================================
qboolean Pickup_Powerup (edict_t *ent, edict_t *other)
{
int quantity;
quantity = other->client->pers.inventory[ITEM_INDEX(ent->item)];
if ((skill->value == 1 && quantity >= sk_powerup_max->value) || (skill->value >= 2 && quantity >= (sk_powerup_max->value - 1)))
return false;
if ((coop->value) && (ent->item->flags & IT_STAY_COOP) && (quantity > 0))
return false;
//Can only pickup one flashlight
if (!strcmp(ent->classname, "item_flashlight") && quantity >= 1)
return false;
#ifdef JETPACK_MOD
if( !Q_stricmp(ent->classname,"item_jetpack") )
{
gitem_t *fuel;
if( quantity >= 1 )
return false;
fuel = FindItem("Fuel");
if(ent->count < 0)
{
other->client->jetpack_infinite = true;
Add_Ammo(other,fuel,100000);
}
else
{
other->client->jetpack_infinite = false;
Add_Ammo(other,fuel,ent->count);
}
}
#endif
other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
//Knightmare- set cell usage for flashlight
if (!strcmp(ent->classname, "item_flashlight"))
{
if (ent->count)
other->client->flashlight_cell_usage = ent->count;
else
other->client->flashlight_cell_usage = 0;
}
if (deathmatch->value)
{
if (!(ent->spawnflags & DROPPED_ITEM) )
SetRespawn (ent, ent->item->quantity);
#ifdef JETPACK_MOD
// DON'T Instant-use Jetpack
if(ent->item->use == Use_Jet) return true;
#endif
if ( ((int)dmflags->value & DF_INSTANT_ITEMS)
|| ((ent->item->use == Use_Quad || ent->item->use == Use_Double || ent->item->use == Use_QuadFire)
&& (ent->spawnflags & DROPPED_PLAYER_ITEM)) )
{
if ((ent->item->use == Use_Quad) && (ent->spawnflags & DROPPED_PLAYER_ITEM))
quad_drop_timeout_hack = (ent->nextthink - level.time) / FRAMETIME;
if ((ent->item->use == Use_Double) && (ent->spawnflags & DROPPED_PLAYER_ITEM))
double_drop_timeout_hack = (ent->nextthink - level.time) / FRAMETIME;
if ((ent->item->use == Use_QuadFire) && (ent->spawnflags & DROPPED_PLAYER_ITEM))
quad_fire_drop_timeout_hack = (ent->nextthink - level.time) / FRAMETIME;
ent->item->use (other, ent->item);
}
//PGM
/* if(ent->item->use)
ent->item->use (other, ent->item);
else
gi.dprintf("Powerup has no use function!\n");*/
//PGM
}
return true;
}
void Drop_General (edict_t *ent, gitem_t *item)
{
Drop_Item (ent, item);
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
}
#ifdef JETPACK_MOD
void Drop_Jetpack (edict_t *ent, gitem_t *item)
{
if(ent->client->jetpack)
gi.cprintf(ent,PRINT_HIGH,"Cannot drop jetpack in use\n");
else
{
edict_t *dropped;
dropped = Drop_Item (ent, item);
if(ent->client->jetpack_infinite)
{
dropped->count = -1;
ent->client->pers.inventory[fuel_index] = 0;
ent->client->jetpack_infinite = false;
}
else
{
dropped->count = ent->client->pers.inventory[fuel_index];
if(dropped->count > 500)
dropped->count = 500;
ent->client->pers.inventory[fuel_index] -= dropped->count;
}
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
}
}
#endif
//======================================================================
qboolean Pickup_Adrenaline (edict_t *ent, edict_t *other)
{
if (!deathmatch->value)
other->max_health += 1;
if (other->health < other->max_health)
other->health = other->max_health;
if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
SetRespawn (ent, ent->item->quantity);
return true;
}
qboolean Pickup_AncientHead (edict_t *ent, edict_t *other)
{
other->max_health += 2;
if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
SetRespawn (ent, ent->item->quantity);
return true;
}
qboolean Pickup_Bandolier (edict_t *ent, edict_t *other)
{
gitem_t *item;
int index;
// Knightmare- override ammo pickup values with cvars
SetAmmoPickupValues ();
if (other->client->pers.max_bullets < sk_bando_bullets->value)
other->client->pers.max_bullets = sk_bando_bullets->value;
if (other->client->pers.max_shells < sk_bando_shells->value)
other->client->pers.max_shells = sk_bando_shells->value;
if (other->client->pers.max_cells < sk_bando_cells->value)
other->client->pers.max_cells = sk_bando_cells->value;
if (other->client->pers.max_slugs < sk_bando_slugs->value)
other->client->pers.max_slugs = sk_bando_slugs->value;
// RAFAEL
if (other->client->pers.max_magslug < sk_bando_magslugs->value)
other->client->pers.max_magslug = sk_bando_magslugs->value;
// PMM
if (other->client->pers.max_flechettes < sk_bando_flechettes->value)
other->client->pers.max_flechettes = sk_bando_flechettes->value;
if (other->client->pers.max_disruptors < sk_bando_rounds->value)
other->client->pers.max_disruptors = sk_bando_rounds->value;
// pmm
if (other->client->pers.max_fuel < sk_bando_fuel->value)
other->client->pers.max_fuel = sk_bando_fuel->value;
// Zaero
if (other->client->pers.max_flares < sk_bando_flares->value)
other->client->pers.max_flares = sk_bando_flares->value;
// end Zaero
item = FindItem("Bullets");
if (item)
{
index = ITEM_INDEX(item);
other->client->pers.inventory[index] += item->quantity;
if (other->client->pers.inventory[index] > other->client->pers.max_bullets)
other->client->pers.inventory[index] = other->client->pers.max_bullets;
}
item = FindItem("Shells");
if (item)
{
index = ITEM_INDEX(item);
other->client->pers.inventory[index] += item->quantity;
if (other->client->pers.inventory[index] > other->client->pers.max_shells)
other->client->pers.inventory[index] = other->client->pers.max_shells;
}
if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
SetRespawn (ent, ent->item->quantity);
return true;
}
qboolean Pickup_Pack (edict_t *ent, edict_t *other)
{
gitem_t *item;
int index;
// Knightmare- override ammo pickup values with cvars
SetAmmoPickupValues ();
if (other->client->pers.max_bullets < sk_pack_bullets->value)
other->client->pers.max_bullets = sk_pack_bullets->value;
if (other->client->pers.max_shells < sk_pack_shells->value)
other->client->pers.max_shells = sk_pack_shells->value;
if (other->client->pers.max_rockets < sk_pack_rockets->value)
other->client->pers.max_rockets = sk_pack_rockets->value;
if (other->client->pers.max_grenades < sk_pack_grenades->value)
other->client->pers.max_grenades = sk_pack_grenades->value;
if (other->client->pers.max_cells < sk_pack_cells->value)
other->client->pers.max_cells = sk_pack_cells->value;
if (other->client->pers.max_slugs < sk_pack_slugs->value)
other->client->pers.max_slugs = sk_pack_slugs->value;
if (other->client->pers.max_magslug < sk_pack_magslugs->value)
other->client->pers.max_magslug = sk_pack_magslugs->value;
if (other->client->pers.max_trap < sk_pack_traps->value)
other->client->pers.max_trap = sk_pack_traps->value;
// PMM
if (other->client->pers.max_flechettes < sk_pack_flechettes->value)
other->client->pers.max_flechettes = sk_pack_flechettes->value;
if (other->client->pers.max_prox < sk_pack_prox->value)
other->client->pers.max_prox = sk_pack_prox->value;
if (other->client->pers.max_tesla < sk_pack_tesla->value)
other->client->pers.max_tesla = sk_pack_tesla->value;
if (other->client->pers.max_disruptors < sk_pack_rounds->value)
other->client->pers.max_disruptors = sk_pack_rounds->value;
if (other->client->pers.max_shockspheres < sk_pack_shocksphere->value)
other->client->pers.max_shockspheres = sk_pack_shocksphere->value;
if (other->client->pers.max_homing_rockets < sk_pack_rockets->value)
other->client->pers.max_homing_rockets = sk_pack_rockets->value;
// pmm
if (other->client->pers.max_fuel < sk_pack_fuel->value)
other->client->pers.max_fuel = sk_pack_fuel->value;
// Zaero
if (other->client->pers.max_flares < sk_pack_flares->value)
other->client->pers.max_flares = sk_pack_flares->value;
if (other->client->pers.max_tbombs < sk_pack_tbombs->value)
other->client->pers.max_tbombs = sk_pack_tbombs->value;
/* if (other->client->pers.max_a2k < sk_pack_a2k->value)
other->client->pers.max_a2k = sk_pack_a2k->value;*/
if (other->client->pers.max_empnuke < sk_pack_empnuke->value)
other->client->pers.max_empnuke = sk_pack_empnuke->value;
if (other->client->pers.max_plasmashield < sk_pack_plasmashield->value)
other->client->pers.max_plasmashield = sk_pack_plasmashield->value;
// end Zaero
item = FindItem("Bullets");
if (item)
{
index = ITEM_INDEX(item);
other->client->pers.inventory[index] += item->quantity;
if (other->client->pers.inventory[index] > other->client->pers.max_bullets)
other->client->pers.inventory[index] = other->client->pers.max_bullets;
}
item = FindItem("Shells");
if (item)
{
index = ITEM_INDEX(item);
other->client->pers.inventory[index] += item->quantity;
if (other->client->pers.inventory[index] > other->client->pers.max_shells)
other->client->pers.inventory[index] = other->client->pers.max_shells;
}
item = FindItem("Cells");
if (item)
{
index = ITEM_INDEX(item);
other->client->pers.inventory[index] += item->quantity;
if (other->client->pers.inventory[index] > other->client->pers.max_cells)
other->client->pers.inventory[index] = other->client->pers.max_cells;
}
item = FindItem("Grenades");
if (item)
{
index = ITEM_INDEX(item);
other->client->pers.inventory[index] += item->quantity;
if (other->client->pers.inventory[index] > other->client->pers.max_grenades)
other->client->pers.inventory[index] = other->client->pers.max_grenades;
}
item = FindItem("Rockets");
if (item)
{
index = ITEM_INDEX(item);
other->client->pers.inventory[index] += item->quantity;
if (other->client->pers.inventory[index] > other->client->pers.max_rockets)
other->client->pers.inventory[index] = other->client->pers.max_rockets;
}
item = FindItem("Slugs");
if (item)
{
index = ITEM_INDEX(item);
other->client->pers.inventory[index] += item->quantity;
if (other->client->pers.inventory[index] > other->client->pers.max_slugs)
other->client->pers.inventory[index] = other->client->pers.max_slugs;
}
item = FindItem("Magslug");
if (item && sk_pack_give_xatrix_ammo->value)
{
index = ITEM_INDEX(item);
other->client->pers.inventory[index] += item->quantity;
if (other->client->pers.inventory[index] > other->client->pers.max_magslug)
other->client->pers.inventory[index] = other->client->pers.max_magslug;
}
// PMM
item = FindItem("Flechettes");
if (item && sk_pack_give_rogue_ammo->value)
{
index = ITEM_INDEX(item);
other->client->pers.inventory[index] += item->quantity;
if (other->client->pers.inventory[index] > other->client->pers.max_flechettes)
other->client->pers.inventory[index] = other->client->pers.max_flechettes;
}
item = FindItem("Disruptors");
if (item && sk_pack_give_rogue_ammo->value)
{
index = ITEM_INDEX(item);
other->client->pers.inventory[index] += item->quantity;
if (other->client->pers.inventory[index] > other->client->pers.max_disruptors)
other->client->pers.inventory[index] = other->client->pers.max_disruptors;
}
// pmm
// Zaero
item = FindItem("Flares");
if (item && sk_pack_give_zaero_ammo->value)
{
index = ITEM_INDEX(item);
other->client->pers.inventory[index] += item->quantity;
if (other->client->pers.inventory[index] > other->client->pers.max_empnuke)
other->client->pers.inventory[index] = other->client->pers.max_empnuke;
}
item = FindItem("IRED");
if (item && sk_pack_give_zaero_ammo->value)
{
index = ITEM_INDEX(item);
other->client->pers.inventory[index] += item->quantity;
if (other->client->pers.inventory[index] > other->client->pers.max_tbombs)
other->client->pers.inventory[index] = other->client->pers.max_tbombs;
}
/*
item = FindItem("A2k");
if (item && sk_pack_give_zaero_ammo->value)
{
index = ITEM_INDEX(item);
other->client->pers.inventory[index] += item->quantity;
if (other->client->pers.inventory[index] > other->client->pers.max_a2k)
other->client->pers.inventory[index] = other->client->pers.max_a2k;
}
*/
item = FindItem("EMPNuke");
if (item && sk_pack_give_zaero_ammo->value)
{
index = ITEM_INDEX(item);
other->client->pers.inventory[index] += item->quantity;
if (other->client->pers.inventory[index] > other->client->pers.max_empnuke)
other->client->pers.inventory[index] = other->client->pers.max_empnuke;
}
item = FindItem("Plasma Shield");
if (item && sk_pack_give_zaero_ammo->value)
{
index = ITEM_INDEX(item);
other->client->pers.inventory[index] += item->quantity;
if (other->client->pers.inventory[index] > other->client->pers.max_plasmashield)
other->client->pers.inventory[index] = other->client->pers.max_plasmashield;
}
// end Zaero
if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
SetRespawn (ent, ent->item->quantity);
return true;
}
// ================
// PMM
qboolean Pickup_Nuke (edict_t *ent, edict_t *other)
{
int quantity;
// if (!deathmatch->value)
// return;
quantity = other->client->pers.inventory[ITEM_INDEX(ent->item)];
if (quantity >= sk_nuke_max->value)
return false;
/*if ((coop->value) && (ent->item->flags & IT_STAY_COOP) && (quantity > 0))
return false;*/
other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
if (deathmatch->value)
{
if (!(ent->spawnflags & DROPPED_ITEM) )
SetRespawn (ent, 300);
}
return true;
}
qboolean Pickup_Nbomb (edict_t *ent, edict_t *other)
{
int quantity;
quantity = other->client->pers.inventory[ITEM_INDEX(ent->item)];
if (quantity >= sk_nbomb_max->value)
return false;
/*if ((coop->value) && (ent->item->flags & IT_STAY_COOP) && (quantity > 0))
return false;*/
other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
if (deathmatch->value)
{
if (!(ent->spawnflags & DROPPED_ITEM) )
SetRespawn (ent, 300);
}
return true;
}
// ================
// PGM
void Use_IR (edict_t *ent, gitem_t *item)
{
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
if (ent->client->ir_framenum > level.framenum)
ent->client->ir_framenum += (sk_ir_time->value * 10);
else
ent->client->ir_framenum = level.framenum + (sk_ir_time->value * 10);
gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/ir_start.wav"), 1, ATTN_NORM, 0);
}
void Use_Double (edict_t *ent, gitem_t *item)
{
int timeout;
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
if (double_drop_timeout_hack)
{
timeout = double_drop_timeout_hack;
double_drop_timeout_hack = 0;
}
else
{
timeout = (sk_double_time->value * 10);
}
if (ent->client->double_framenum > level.framenum)
ent->client->double_framenum += (sk_double_time->value * 10);
else
ent->client->double_framenum = level.framenum + (sk_double_time->value * 10);
gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/ddamage1.wav"), 1, ATTN_NORM, 0);
}
/*
void Use_Torch (edict_t *ent, gitem_t *item)
{
ent->client->torch_framenum = level.framenum + 6000;
}
*/
// Knightmare
void Use_Flashlight (edict_t *ent, gitem_t *item)
{
if (ent->client->flashlight_active)
{
ent->client->flashlight_active = false;
ent->client->flashlight_framenum = 0;
}
else
{ //can't use flashlight if we don't have the cells
if ((ent->client->flashlight_cell_usage > 0)
&& (ent->client->pers.inventory[ITEM_INDEX(FindItem("Cells"))] < ent->client->flashlight_cell_usage))
return;
ent->client->flashlight_active = true;
//Think every 60 seconds
ent->client->flashlight_framenum = level.time + 60;
}
}
void Use_Compass (edict_t *ent, gitem_t *item)
{
int ang;
ang = (int)(ent->client->v_angle[1]);
if(ang<0)
ang += 360;
gi.cprintf(ent, PRINT_HIGH, "Origin: %0.0f,%0.0f,%0.0f Dir: %d\n", ent->s.origin[0], ent->s.origin[1],
ent->s.origin[2], ang);
}
void Use_Nuke (edict_t *ent, gitem_t *item)
{
vec3_t forward, right, start;
float speed;
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
AngleVectors (ent->client->v_angle, forward, right, NULL);
VectorCopy (ent->s.origin, start);
speed = 100;
fire_nuke (ent, start, forward, speed);
}
void Use_Nbomb (edict_t *ent, gitem_t *item)
{
vec3_t forward, right, start;
float speed;
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
AngleVectors (ent->client->v_angle, forward, right, NULL);
VectorCopy (ent->s.origin, start);
speed = 100;
fire_nbomb (ent, start, forward, speed);
}
void Use_Doppleganger (edict_t *ent, gitem_t *item)
{
vec3_t forward, right;
vec3_t createPt, spawnPt;
vec3_t ang;
VectorClear(ang);
ang[YAW] = ent->client->v_angle[YAW];
AngleVectors (ang, forward, right, NULL);
VectorMA(ent->s.origin, 48, forward, createPt);
if(!FindSpawnPoint(createPt, ent->mins, ent->maxs, spawnPt, 32))
return;
if(!CheckGroundSpawnPoint(spawnPt, ent->mins, ent->maxs, 64, -1))
return;
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
SpawnGrow_Spawn (spawnPt, 0);
fire_doppleganger (ent, spawnPt, forward);
}
qboolean Pickup_Doppleganger (edict_t *ent, edict_t *other)
{
int quantity;
//if(!(deathmatch->value)) // item is DM only
//return false;
quantity = other->client->pers.inventory[ITEM_INDEX(ent->item)];
if (quantity >= sk_doppleganger_max->value) // FIXME - apply max to dopplegangers
return false;
other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
if (!(ent->spawnflags & DROPPED_ITEM) )
SetRespawn (ent, ent->item->quantity);
return true;
}
qboolean Pickup_Sphere (edict_t *ent, edict_t *other)
{
int quantity;
if(other->client && other->client->owned_sphere)
{
// gi.cprintf(other, PRINT_HIGH, "Only one sphere to a customer!\n");
// return false;
}
quantity = other->client->pers.inventory[ITEM_INDEX(ent->item)];
if ((skill->value == 1 && quantity >= sk_powerup_max->value) || (skill->value >= 2 && quantity >= (sk_powerup_max->value - 1)))
return false;
if ((coop->value) && (ent->item->flags & IT_STAY_COOP) && (quantity > 0))
return false;
other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
if (deathmatch->value)
{
if (!(ent->spawnflags & DROPPED_ITEM) )
SetRespawn (ent, ent->item->quantity);
if (((int)dmflags->value & DF_INSTANT_ITEMS))
{
//PGM
if(ent->item->use)
ent->item->use (other, ent->item);
else
gi.dprintf("Powerup has no use function!\n");
//PGM
}
}
return true;
}
void Use_Defender (edict_t *ent, gitem_t *item)
{
if(ent->client && ent->client->owned_sphere)
{
gi.cprintf(ent, PRINT_HIGH, "Only one sphere at a time!\n");
return;
}
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
Defender_Launch (ent);
}
void Use_Hunter (edict_t *ent, gitem_t *item)
{
if(ent->client && ent->client->owned_sphere)
{
gi.cprintf(ent, PRINT_HIGH, "Only one sphere at a time!\n");
return;
}
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
Hunter_Launch (ent);
}
void Use_Vengeance (edict_t *ent, gitem_t *item)
{
if(ent->client && ent->client->owned_sphere)
{
gi.cprintf(ent, PRINT_HIGH, "Only one sphere at a time!\n");
return;
}
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
Vengeance_Launch (ent);
}
// PGM
// ================
//======================================================================
void Use_Quad (edict_t *ent, gitem_t *item)
{
int timeout;
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
if (quad_drop_timeout_hack)
{
timeout = quad_drop_timeout_hack;
quad_drop_timeout_hack = 0;
}
else
{
timeout = (sk_quad_time->value * 10);
}
if (ent->client->quad_framenum > level.framenum)
ent->client->quad_framenum += timeout;
else
ent->client->quad_framenum = level.framenum + timeout;
gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
}
//======================================================================
// RAFAEL
void Use_QuadFire (edict_t *ent, gitem_t *item)
{
int timeout;
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
if (quad_fire_drop_timeout_hack)
{
timeout = quad_fire_drop_timeout_hack;
quad_fire_drop_timeout_hack = 0;
}
else
{
timeout = (sk_quad_fire_time->value * 10);
}
if (ent->client->quadfire_framenum > level.framenum)
ent->client->quadfire_framenum += timeout;
else
ent->client->quadfire_framenum = level.framenum + timeout;
gi.sound(ent, CHAN_ITEM, gi.soundindex("items/quadfire1.wav"), 1, ATTN_NORM, 0);
}
//======================================================================
void Use_Breather (edict_t *ent, gitem_t *item)
{
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
if (ent->client->breather_framenum > level.framenum)
ent->client->breather_framenum += (sk_breather_time->value * 10);
else
ent->client->breather_framenum = level.framenum + (sk_breather_time->value * 10);
// gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
}
//======================================================================
void Use_Envirosuit (edict_t *ent, gitem_t *item)
{
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
if (ent->client->enviro_framenum > level.framenum)
ent->client->enviro_framenum += (sk_enviro_time->value * 10);
else
ent->client->enviro_framenum = level.framenum + (sk_enviro_time->value * 10);
// gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
}
//======================================================================
void Use_Invulnerability (edict_t *ent, gitem_t *item)
{
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
if (ent->client->invincible_framenum > level.framenum)
ent->client->invincible_framenum += (sk_inv_time->value * 10);
else
ent->client->invincible_framenum = level.framenum + (sk_inv_time->value * 10);
gi.sound(ent, CHAN_ITEM, gi.soundindex("items/protect.wav"), 1, ATTN_NORM, 0);
}
//======================================================================
void Use_Silencer (edict_t *ent, gitem_t *item)
{
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
ent->client->silencer_shots += sk_silencer_shots->value;
// gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
}
//======================================================================
qboolean Pickup_Key (edict_t *ent, edict_t *other)
{
if (coop->value)
{
if (strcmp(ent->classname, "key_power_cube") == 0)
{
if (other->client->pers.power_cubes & ((ent->spawnflags & 0x0000ff00)>> 8))
return false;
other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
other->client->pers.power_cubes |= ((ent->spawnflags & 0x0000ff00) >> 8);
}
else
{
if (other->client->pers.inventory[ITEM_INDEX(ent->item)])
return false;
other->client->pers.inventory[ITEM_INDEX(ent->item)] = 1;
}
return true;
}
other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
return true;
}
//======================================================================
qboolean Add_Ammo (edict_t *ent, gitem_t *item, int count)
{
int index;
int max;
if (!ent->client)
return false;
if (item->tag == AMMO_BULLETS)
max = ent->client->pers.max_bullets;
else if (item->tag == AMMO_SHELLS)
max = ent->client->pers.max_shells;
else if (item->tag == AMMO_ROCKETS)
max = ent->client->pers.max_rockets;
else if (item->tag == AMMO_GRENADES)
max = ent->client->pers.max_grenades;
else if (item->tag == AMMO_CELLS)
max = ent->client->pers.max_cells;
else if (item->tag == AMMO_SLUGS)
max = ent->client->pers.max_slugs;
else if (item->tag == AMMO_MAGSLUG)
max = ent->client->pers.max_magslug;
else if (item->tag == AMMO_TRAP)
max = ent->client->pers.max_trap;
else if (item->tag == AMMO_FLECHETTES)
max = ent->client->pers.max_flechettes;
else if (item->tag == AMMO_PROX)
max = ent->client->pers.max_prox;
else if (item->tag == AMMO_TESLA)
max = ent->client->pers.max_tesla;
else if (item->tag == AMMO_DISRUPTOR)
max = ent->client->pers.max_disruptors;
else if (item->tag == AMMO_SHOCKSPHERE)
max = ent->client->pers.max_shockspheres;
else if (item->tag == AMMO_FUEL)
max = ent->client->pers.max_fuel;
else if (item->tag == AMMO_HOMING_ROCKETS)
max = ent->client->pers.max_homing_rockets;
else if (item->tag == AMMO_LASERTRIPBOMB)
max = ent->client->pers.max_tbombs;
else if (item->tag == AMMO_FLARES)
max = ent->client->pers.max_flares;
else if (item->tag == AMMO_EMPNUKE)
max = ent->client->pers.max_empnuke;
else if (item->tag == AMMO_PLASMASHIELD)
max = ent->client->pers.max_plasmashield;
// ROGUE
else
{
gi.dprintf("undefined ammo type\n");
return false;
}
index = ITEM_INDEX(item);
if (ent->client->pers.inventory[index] >= max)
return false;
ent->client->pers.inventory[index] += count;
if (ent->client->pers.inventory[index] > max)
ent->client->pers.inventory[index] = max;
return true;
}
// Knightmare- this function overrides ammo pickup values with cvars
void SetAmmoPickupValues (void)
{
gitem_t *item;
item = FindItem("Shells");
if (item)
item->quantity = sk_box_shells->value;
item = FindItem("Bullets");
if (item)
item->quantity = sk_box_bullets->value;
item = FindItem("Grenades");
if (item)
item->quantity = sk_box_grenades->value;
item = FindItem("Rockets");
if (item)
item->quantity = sk_box_rockets->value;
item = FindItem("Homing Rockets");
if (item)
item->quantity = sk_box_rockets->value;
item = FindItem("Cells");
if (item)
item->quantity = sk_box_cells->value;
item = FindItem("Slugs");
if (item)
item->quantity = sk_box_slugs->value;
item = FindItem("Magslug");
if (item)
item->quantity = sk_box_magslugs->value;
item = FindItem("Trap");
if (item)
item->quantity = sk_box_trap->value;
item = FindItem("Flechettes");
if (item)
item->quantity = sk_box_flechettes->value;
item = FindItem("Prox");
if (item)
item->quantity = sk_box_prox->value;
item = FindItem("Tesla");
if (item)
item->quantity = sk_box_tesla->value;
item = FindItem("Disruptors");
if (item)
item->quantity = sk_box_disruptors->value;
item = FindItem("Shocksphere");
if (item)
item->quantity = sk_box_shocksphere->value;
item = FindItem("Fuel");
if (item)
item->quantity = sk_box_fuel->value;
item = FindItem("Flares");
if (item)
item->quantity = sk_box_flares->value;
item = FindItem("IRED");
if (item)
item->quantity = sk_box_tbombs->value;
item = FindItem("EMPNuke");
if (item)
item->quantity = sk_box_empnuke->value;
item = FindItem("Plasma Shield");
if (item)
item->quantity = sk_box_plasmashield->value;
}
qboolean Pickup_Ammo (edict_t *ent, edict_t *other)
{
int oldcount;
int count;
qboolean weapon;
//Knightmare- override ammo pickup values with cvars
SetAmmoPickupValues ();
weapon = (ent->item->flags & IT_WEAPON);
if ( (weapon) && ( (int)dmflags->value & DF_INFINITE_AMMO ) )
count = 1000;
else if (ent->count)
count = ent->count;
else
count = ent->item->quantity;
oldcount = other->client->pers.inventory[ITEM_INDEX(ent->item)];
if (!Add_Ammo (other, ent->item, count))
return false;
if (weapon && !oldcount)
{
// don't switch to tesla
if (other->client->pers.weapon != ent->item
&& ( !deathmatch->value || other->client->pers.weapon == FindItem("blaster"))
&& (strcmp(ent->classname, "ammo_tesla")) )
other->client->newweapon = ent->item;
}
if (!(ent->spawnflags & (DROPPED_ITEM | DROPPED_PLAYER_ITEM)) && (deathmatch->value))
SetRespawn (ent, 30);
return true;
}
void Drop_Ammo (edict_t *ent, gitem_t *item)
{
edict_t *dropped;
int index;
index = ITEM_INDEX(item);
dropped = Drop_Item (ent, item);
if (ent->client->pers.inventory[index] >= item->quantity)
dropped->count = item->quantity;
else
dropped->count = ent->client->pers.inventory[index];
if (ent->client->pers.weapon &&
ent->client->pers.weapon->tag == AMMO_GRENADES &&
item->tag == AMMO_GRENADES &&
ent->client->pers.inventory[index] - dropped->count <= 0) {
gi.cprintf (ent, PRINT_HIGH, "Can't drop current weapon\n");
G_FreeEdict(dropped);
return;
}
ent->client->pers.inventory[index] -= dropped->count;
ValidateSelectedItem (ent);
}
//======================================================================
void MegaHealth_think (edict_t *self)
{
if (self->owner->health > self->owner->max_health) //&& self->owner->health > self->owner->base_health)
{
self->nextthink = level.time + 1;
self->owner->health -= 1;
return;
}
if (!(self->spawnflags & DROPPED_ITEM) && (deathmatch->value))
SetRespawn (self, 20);
else
G_FreeEdict (self);
}
qboolean Pickup_Health (edict_t *ent, edict_t *other)
{
if (!(ent->style & HEALTH_IGNORE_MAX))
if (other->health >= other->max_health)
return false;
// Knightmare- cap foodcube
if ((ent->style & HEALTH_FOODCUBE) && other->health >= other->client->pers.max_fc_health)
return false;
//backup current health upon getting megahealth
/* if (ent->style & HEALTH_TIMED)
{
if (other->base_health && other->health > other->base_health)
{
gi.dprintf("Player already has megahealth active, not saving current health\n");
}
else if (other->health >= other->max_health)
{
other->base_health = other->health;
gi.dprintf("Current health saved as base_health\n");
}
else
{
other->base_health = other->max_health;
gi.dprintf("Current max_health saved as base_health\n");
}
}*/
other->health += ent->count;
//stimpacks shouldn't rot away
/* if (ent->style & HEALTH_IGNORE_MAX
&& other->base_health >= other->max_health && other->health >= other->base_health)
other->base_health += ent->count;
*/
// PMM - health sound fix
/*
if (ent->count == 2)
ent->item->pickup_sound = "items/s_health.wav";
else if (ent->count == 10)
ent->item->pickup_sound = "items/n_health.wav";
else if (ent->count == 25)
ent->item->pickup_sound = "items/l_health.wav";
else // (ent->count == 100)
ent->item->pickup_sound = "items/m_health.wav";
*/
// Knightmare- cap foodcube
if (ent->style & HEALTH_FOODCUBE)
{
if (other->health > other->client->pers.max_fc_health)
other->health = other->client->pers.max_fc_health;
}
else if (!(ent->style & HEALTH_IGNORE_MAX))
{
if (other->health > other->max_health)
other->health = other->max_health;
}
if (ent->style & HEALTH_TIMED)
{
ent->think = MegaHealth_think;
ent->nextthink = level.time + 5;
ent->owner = other;
ent->flags |= FL_RESPAWN;
ent->svflags |= SVF_NOCLIENT;
ent->solid = SOLID_NOT;
}
else
{
if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
SetRespawn (ent, 30);
}
return true;
}
//======================================================================
int ArmorIndex (edict_t *ent)
{
if (!ent->client)
return 0;
if (ent->client->pers.inventory[jacket_armor_index] > 0)
return jacket_armor_index;
if (ent->client->pers.inventory[combat_armor_index] > 0)
return combat_armor_index;
if (ent->client->pers.inventory[body_armor_index] > 0)
return body_armor_index;
return 0;
}
qboolean Pickup_Armor (edict_t *ent, edict_t *other)
{
int old_armor_index;
gitem_armor_t *oldinfo;
gitem_armor_t *newinfo;
int newcount;
float salvage;
int salvagecount;
int armor_maximum;
// set armor cap
if (ent->item->tag == ARMOR_JACKET)
armor_maximum = sk_max_armor_jacket->value;
else if (ent->item->tag == ARMOR_COMBAT)
armor_maximum = sk_max_armor_combat->value;
else // ARMOR_BODY
armor_maximum = sk_max_armor_body->value;
// get info on new armor
newinfo = (gitem_armor_t *)ent->item->info;
old_armor_index = ArmorIndex (other);
// handle armor shards specially
if (ent->item->tag == ARMOR_SHARD)
{
if (!old_armor_index)
other->client->pers.inventory[jacket_armor_index] = sk_armor_bonus_value->value;
else
other->client->pers.inventory[old_armor_index] += sk_armor_bonus_value->value;
}
// if player has no armor, just use it
else if (!old_armor_index)
{
other->client->pers.inventory[ITEM_INDEX(ent->item)] = newinfo->base_count;
}
// use the better armor
else
{
// get info on old armor
if (old_armor_index == jacket_armor_index)
oldinfo = &jacketarmor_info;
else if (old_armor_index == combat_armor_index)
oldinfo = &combatarmor_info;
else // (old_armor_index == body_armor_index)
oldinfo = &bodyarmor_info;
//if stroner than current armor (always pick up)
if (newinfo->normal_protection > oldinfo->normal_protection)
{
// calc new armor values
salvage = oldinfo->normal_protection / newinfo->normal_protection;
salvagecount = salvage * other->client->pers.inventory[old_armor_index];
newcount = newinfo->base_count + salvagecount;
if (newcount > armor_maximum)
newcount = armor_maximum;
// zero count of old armor so it goes away
other->client->pers.inventory[old_armor_index] = 0;
// change armor to new item with computed value
other->client->pers.inventory[ITEM_INDEX(ent->item)] = newcount;
}
else
{
// calc new armor values
salvage = newinfo->normal_protection / oldinfo->normal_protection;
salvagecount = salvage * newinfo->base_count;
newcount = other->client->pers.inventory[old_armor_index] + salvagecount;
if (newcount > armor_maximum)
newcount = armor_maximum;
// if we're already maxed out then we don't need the new armor
if (other->client->pers.inventory[old_armor_index] >= newcount)
return false;
// update current armor value
other->client->pers.inventory[old_armor_index] = newcount;
}
}
if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
SetRespawn (ent, 20);
return true;
}
//======================================================================
// Knightmare- rewrote this so it's handled properly
int PowerArmorType (edict_t *ent)
{
if (!ent->client)
return POWER_ARMOR_NONE;
// if (!(ent->flags & FL_POWER_SHIELD) && !(ent->flags & FL_POWER_SCREEN))
// return POWER_ARMOR_NONE;
// if (ent->client->pers.inventory[power_shield_index] > 0)
if (ent->flags & FL_POWER_SHIELD)
return POWER_ARMOR_SHIELD;
// if (ent->client->pers.inventory[power_screen_index] > 0)
if (ent->flags & FL_POWER_SCREEN)
return POWER_ARMOR_SCREEN;
return POWER_ARMOR_NONE;
}
// Knightmare- rewrote this to differentiate between power shield and power screen
void Use_PowerArmor (edict_t *ent, gitem_t *item)
{
int index;
if (item == FindItemByClassname("item_power_screen"))
{ //if player has an active power shield, deacivate that and activate power screen
if (ent->flags & FL_POWER_SHIELD)
{
index = ITEM_INDEX(FindItem("cells"));
if (!ent->client->pers.inventory[index])
{
gi.cprintf (ent, PRINT_HIGH, "No cells for power screen.\n");
return;
}
ent->flags &= ~FL_POWER_SHIELD;
ent->flags |= FL_POWER_SCREEN;
gi.sound(ent, CHAN_AUTO, gi.soundindex("misc/power2.wav"), 1, ATTN_NORM, 0);
gi.sound(ent, CHAN_AUTO, gi.soundindex("misc/power1.wav"), 1, ATTN_NORM, 0);
}
//if they have an active power screen, deactivate that
else if (ent->flags & FL_POWER_SCREEN)
{
ent->flags &= ~FL_POWER_SCREEN;
gi.sound(ent, CHAN_AUTO, gi.soundindex("misc/power2.wav"), 1, ATTN_NORM, 0);
}
else //activate power screen
{
index = ITEM_INDEX(FindItem("cells"));
if (!ent->client->pers.inventory[index])
{
gi.cprintf (ent, PRINT_HIGH, "No cells for power screen.\n");
return;
}
ent->flags |= FL_POWER_SCREEN;
gi.sound(ent, CHAN_AUTO, gi.soundindex("misc/power1.wav"), 1, ATTN_NORM, 0);
}
}
else if (item == FindItemByClassname("item_power_shield"))
{ //if player has an active power screen, deacivate that and activate power shield
if (ent->flags & FL_POWER_SCREEN)
{
index = ITEM_INDEX(FindItem("cells"));
if (!ent->client->pers.inventory[index])
{
gi.cprintf (ent, PRINT_HIGH, "No cells for power shield.\n");
return;
}
ent->flags &= ~FL_POWER_SCREEN;
ent->flags |= FL_POWER_SHIELD;
gi.sound(ent, CHAN_AUTO, gi.soundindex("misc/power2.wav"), 1, ATTN_NORM, 0);
gi.sound(ent, CHAN_AUTO, gi.soundindex("misc/power1.wav"), 1, ATTN_NORM, 0);
}
//if they have an active power shield, deactivate it
else if (ent->flags & FL_POWER_SHIELD)
{
ent->flags &= ~FL_POWER_SHIELD;
gi.sound(ent, CHAN_AUTO, gi.soundindex("misc/power2.wav"), 1, ATTN_NORM, 0);
}
else //activate power shield
{
index = ITEM_INDEX(FindItem("cells"));
if (!ent->client->pers.inventory[index])
{
gi.cprintf (ent, PRINT_HIGH, "No cells for power shield.\n");
return;
}
ent->flags |= FL_POWER_SHIELD;
gi.sound(ent, CHAN_AUTO, gi.soundindex("misc/power1.wav"), 1, ATTN_NORM, 0);
}
}
}
qboolean Pickup_PowerArmor (edict_t *ent, edict_t *other)
{
int quantity;
quantity = other->client->pers.inventory[ITEM_INDEX(ent->item)];
other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
if (deathmatch->value)
{
if (!(ent->spawnflags & DROPPED_ITEM) )
SetRespawn (ent, ent->item->quantity);
// auto-use for DM only if we didn't already have one
if ( !quantity
//Knightmare- don't switch to power screen if we already have a power shield active
&& !(ent->item == FindItemByClassname("item_power_screen") && (other->flags & FL_POWER_SHIELD)))
ent->item->use (other, ent->item);
}
return true;
}
// Knightmare- rewrote this so it's handled properly
void Drop_PowerArmor (edict_t *ent, gitem_t *item)
{
if (item == FindItemByClassname("item_power_shield"))
{
if ((ent->flags & FL_POWER_SHIELD) && (ent->client->pers.inventory[ITEM_INDEX(item)] == 1))
Use_PowerArmor (ent, item);
}
else
if ((ent->flags & FL_POWER_SCREEN) && (ent->client->pers.inventory[ITEM_INDEX(item)] == 1))
Use_PowerArmor (ent, item);
Drop_General (ent, item);
}
//======================================================================
// Zaero
qboolean Pickup_PlasmaShield(edict_t *ent, edict_t *other)
{
if (other->client->pers.inventory[ITEM_INDEX(ent->item)] > ent->client->pers.max_plasmashield)
{
return false;
}
other->client->pers.inventory[ITEM_INDEX(ent->item)]++;// = 1;
if (deathmatch->value)
{
if (!(ent->spawnflags & DROPPED_ITEM) )
SetRespawn (ent, ent->item->quantity);
}
return true;
}
qboolean Pickup_Visor (edict_t *ent, edict_t *other)
{
int frames_per_visor = (max(sk_visor_time->value, 2) * 10); // was 300
// do we already have a visor?
if (other->client->pers.inventory[ITEM_INDEX(ent->item)] >= sk_powerup_max->value)
// && other->client->pers.visorFrames == frames_per_visor)
{
return false;
}
other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
if (ent->spawnflags & DROPPED_ITEM)
other->client->pers.visorFrames = (int)(other->client->pers.visorFrames + ent->visorFrames)
% frames_per_visor;
else
other->client->pers.visorFrames = (int)(other->client->pers.visorFrames + frames_per_visor)
% frames_per_visor;
if (deathmatch->value)
{
if (!(ent->spawnflags & DROPPED_ITEM) )
SetRespawn (ent, 30);
}
return true;
}
void Drop_Visor (edict_t *ent, gitem_t *item)
{
int frames_per_visor = (max(sk_visor_time->value, 2) * 10);
edict_t *visor = Drop_Item (ent, item);
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
visor->visorFrames = (ent->client->pers.visorFrames > 0) ? ent->client->pers.visorFrames : frames_per_visor;
ent->client->pers.visorFrames = 0;
// if (ent->client->pers.inventory[ITEM_INDEX(item)] == 0)
// ent->client->pers.visorFrames = 0;
}
// end Zaero
//======================================================================
/*
===============
Touch_Item
===============
*/
void Touch_Item (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf)
{
qboolean taken;
if (!other->client)
return;
if (other->health < 1)
return; // dead people can't pickup
if (!ent->item->pickup)
return; // not a grabbable item?
taken = ent->item->pickup(ent, other);
if (taken)
{
// flash the screen
other->client->bonus_alpha = 0.25;
// show icon and name on status bar
other->client->ps.stats[STAT_PICKUP_ICON] = gi.imageindex(ent->item->icon);
other->client->ps.stats[STAT_PICKUP_STRING] = CS_ITEMS+ITEM_INDEX(ent->item);
other->client->pickup_msg_time = level.time + 3.0;
// change selected item
if (ent->item->use)
other->client->pers.selected_item = other->client->ps.stats[STAT_SELECTED_ITEM] = ITEM_INDEX(ent->item);
// PMM - health sound fix
if (ent->item->pickup == Pickup_Health)
{
if (ent->style & HEALTH_FOODCUBE)
gi.sound(other, CHAN_ITEM, gi.soundindex("items/m_health.wav"), 1, ATTN_NORM, 0);
//if (ent->count == sk_health_bonus_value->value) // Knightmare
else if (ent->count < 10) // Knightmare
gi.sound(other, CHAN_ITEM, gi.soundindex("items/s_health.wav"), 1, ATTN_NORM, 0);
else if (ent->count == 10)
gi.sound(other, CHAN_ITEM, gi.soundindex("items/n_health.wav"), 1, ATTN_NORM, 0);
else if (ent->count == 25)
gi.sound(other, CHAN_ITEM, gi.soundindex("items/l_health.wav"), 1, ATTN_NORM, 0);
else // (ent->count == 100)
gi.sound(other, CHAN_ITEM, gi.soundindex("items/m_health.wav"), 1, ATTN_NORM, 0);
}
else if (ent->item->pickup_sound) // PGM - paranoia
{
gi.sound(other, CHAN_ITEM, gi.soundindex(ent->item->pickup_sound), 1, ATTN_NORM, 0);
}
}
if (!(ent->spawnflags & ITEM_TARGETS_USED))
{
G_UseTargets (ent, other);
ent->spawnflags |= ITEM_TARGETS_USED;
}
if (!taken)
return;
// Lazarus reflections
DeleteReflection (ent, -1);
if (!((coop->value) && (ent->item->flags & IT_STAY_COOP)) || (ent->spawnflags & (DROPPED_ITEM | DROPPED_PLAYER_ITEM)))
{
if (ent->flags & FL_RESPAWN)
ent->flags &= ~FL_RESPAWN;
else
G_FreeEdict (ent);
}
}
//======================================================================
/*static*/ void drop_temp_touch (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf)
{
if (other == ent->owner)
return;
Touch_Item (ent, other, plane, surf);
}
/*static*/ void drop_make_touchable (edict_t *ent)
{
ent->touch = Touch_Item;
if (deathmatch->value)
{
ent->nextthink = level.time + 29;
ent->think = G_FreeEdict;
}
}
void Item_Die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
{
// BecomeExplosion1 (self);
gi.WriteByte (svc_temp_entity);
gi.WriteByte (TE_EXPLOSION1);
gi.WritePosition (self->s.origin);
gi.multicast (self->s.origin, MULTICAST_PVS);
// Lazarus reflections
if (level.num_reflectors)
ReflectExplosion (TE_EXPLOSION1, self->s.origin);
if (!(self->spawnflags & DROPPED_ITEM) && (deathmatch->value))
SetRespawn (self, 30);
else
G_FreeEdict (self);
}
edict_t *Drop_Item (edict_t *ent, gitem_t *item)
{
edict_t *dropped;
vec3_t forward, right;
vec3_t offset;
dropped = G_Spawn();
dropped->classname = item->classname;
dropped->item = item;
dropped->spawnflags = DROPPED_ITEM;
dropped->s.skinnum = item->world_model_skinnum; // Knightmare- skinnum specified in item table
dropped->s.effects = item->world_model_flags;
dropped->s.renderfx = RF_GLOW | RF_IR_VISIBLE; // PGM
dropped->s.angles[1] = ent->s.angles[1]; // Knightmare- preserve yaw from dropping entity
// mxd- Actually randomize it a bit (and not in 0 .. 32767 range like rand() does)
/*if (rand() > 0.5) // randomize it a bit
dropped->s.angles[1] += rand()*45;
else
dropped->s.angles[1] -= rand()*45;*/
dropped->s.angles[1] += crandom() * 45;
VectorSet (dropped->mins, -16, -16, -16);
VectorSet (dropped->maxs, 16, 16, 16);
gi.setmodel (dropped, dropped->item->world_model);
dropped->solid = SOLID_TRIGGER;
dropped->movetype = MOVETYPE_TOSS;
dropped->touch = drop_temp_touch;
dropped->owner = ent;
if (ent->client)
{
trace_t trace;
AngleVectors (ent->client->v_angle, forward, right, NULL);
VectorSet(offset, 24, 0, -16);
G_ProjectSource (ent->s.origin, offset, forward, right, dropped->s.origin);
trace = gi.trace (ent->s.origin, dropped->mins, dropped->maxs,
dropped->s.origin, ent, CONTENTS_SOLID);
VectorCopy (trace.endpos, dropped->s.origin);
}
else
{
AngleVectors (ent->s.angles, forward, right, NULL);
VectorCopy (ent->s.origin, dropped->s.origin);
}
/* if (ent->solid == SOLID_BSP) //Knightmare- hack for items dropped by shootable boxes
{
VectorCopy (ent->velocity, dropped->velocity); //if it's moving on a conveyor
}
else*/
if (ent->solid != SOLID_BSP) //Knightmare- hack for items dropped by shootable boxes
VectorScale (forward, 100, dropped->velocity);
if (!strcmp(ent->classname, "func_pushable")) //Make items dropped by movable crates destroyable
{
dropped->spawnflags |= ITEM_SHOOTABLE;
dropped->solid = SOLID_BBOX;
dropped->health = 20;
dropped->takedamage = DAMAGE_YES;
//dropped->die = BecomeExplosion1;
//Knightmare- this compiles cleaner
dropped->die = Item_Die;
}
dropped->velocity[2] += 300;
dropped->think = drop_make_touchable;
dropped->nextthink = level.time + 1;
gi.linkentity (dropped);
return dropped;
}
void Use_Item (edict_t *ent, edict_t *other, edict_t *activator)
{
ent->svflags &= ~SVF_NOCLIENT;
ent->use = NULL;
if (ent->spawnflags & ITEM_NO_TOUCH)
{
ent->solid = SOLID_BBOX;
ent->touch = NULL;
}
else
{
ent->solid = SOLID_TRIGGER;
ent->touch = Touch_Item;
}
gi.linkentity (ent);
}
//======================================================================
/*
================
droptofloor
================
*/
void droptofloor (edict_t *ent)
{
trace_t tr;
vec3_t dest;
float *v;
v = tv(-15,-15,-15);
VectorCopy (v, ent->mins);
v = tv(15,15,15);
VectorCopy (v, ent->maxs);
if (ent->model)
gi.setmodel (ent, ent->model);
else if (ent->item->world_model) // PGM we shouldn't need this check, but paranoia...
gi.setmodel (ent, ent->item->world_model);
ent->solid = SOLID_TRIGGER;
if (ent->spawnflags & ITEM_NO_DROPTOFLOOR)
ent->movetype = MOVETYPE_NONE;
else
ent->movetype = MOVETYPE_TOSS;
ent->touch = Touch_Item;
if (!(ent->spawnflags & ITEM_NO_DROPTOFLOOR)) // Knightmare- allow marked items to spawn in solids
{
v = tv(0,0,-128);
VectorAdd (ent->s.origin, v, dest);
tr = gi.trace (ent->s.origin, ent->mins, ent->maxs, dest, ent, MASK_SOLID);
if (tr.startsolid)
{
gi.dprintf ("droptofloor: %s startsolid at %s\n", ent->classname, vtos(ent->s.origin));
G_FreeEdict (ent);
return;
}
VectorCopy (tr.endpos, ent->s.origin);
}
if (ent->team)
{
ent->flags &= ~FL_TEAMSLAVE;
ent->chain = ent->teamchain;
ent->teamchain = NULL;
ent->svflags |= SVF_NOCLIENT;
ent->solid = SOLID_NOT;
if (ent == ent->teammaster)
{
ent->nextthink = level.time + FRAMETIME;
ent->think = DoRespawn;
}
}
if (ent->spawnflags & ITEM_NO_TOUCH)
{
ent->solid = SOLID_BBOX;
ent->touch = NULL;
ent->s.effects &= ~EF_ROTATE;
ent->s.renderfx &= ~RF_GLOW;
}
if (ent->spawnflags & ITEM_TRIGGER_SPAWN)
{
ent->svflags |= SVF_NOCLIENT;
ent->solid = SOLID_NOT;
ent->use = Use_Item;
}
if (ent->spawnflags & ITEM_NO_ROTATE)
ent->s.effects &= ~EF_ROTATE;
if (ent->spawnflags & ITEM_SHOOTABLE)
{
ent->solid = SOLID_BBOX;
if (!ent->health)
ent->health = 20;
ent->takedamage = DAMAGE_YES;
//ent->die = BecomeExplosion1;
//Knightmare- this compiles cleaner
ent->die = Item_Die;
}
gi.linkentity (ent);
}
/*
===============
PrecacheItem
Precaches all data needed for a given item.
This will be called for each item spawned in a level,
and for each item in each client's inventory.
===============
*/
void PrecacheItem (gitem_t *it)
{
char *s, *start;
char data[MAX_QPATH];
int len;
gitem_t *ammo;
if (!it)
return;
if (it->pickup_sound)
gi.soundindex (it->pickup_sound);
if (it->world_model)
gi.modelindex (it->world_model);
if (it->view_model)
gi.modelindex (it->view_model);
if (it->icon)
gi.imageindex (it->icon);
// parse everything for its ammo
if (it->ammo && it->ammo[0])
{
ammo = FindItem (it->ammo);
if (ammo != it)
PrecacheItem (ammo);
}
// parse the space seperated precache string for other items
s = it->precaches;
if (!s || !s[0])
return;
while (*s)
{
start = s;
while (*s && *s != ' ')
s++;
len = s-start;
if (len >= MAX_QPATH || len < 5)
gi.error ("PrecacheItem: %s has bad precache string", it->classname);
memcpy (data, start, len);
data[len] = 0;
if (*s)
s++;
// determine type based on extension
if (!strcmp(data+len-3, "md2"))
gi.modelindex (data);
else if (!strcmp(data+len-3, "sp2"))
gi.modelindex (data);
else if (!strcmp(data+len-3, "wav"))
gi.soundindex (data);
if (!strcmp(data+len-3, "pcx"))
gi.imageindex (data);
}
}
//=================
// Item_TriggeredSpawn - create the item marked for spawn creation
//=================
void Item_TriggeredSpawn (edict_t *self, edict_t *other, edict_t *activator)
{
// self->nextthink = level.time + 2 * FRAMETIME; // items start after other solids
// self->think = droptofloor;
self->svflags &= ~SVF_NOCLIENT;
self->use = NULL;
if (strcmp(self->classname, "key_power_cube")) // leave them be on key_power_cube..
self->spawnflags = 0;
droptofloor (self);
}
//=================
// SetTriggeredSpawn - set up an item to spawn in later.
//=================
void SetTriggeredSpawn (edict_t *ent)
{
// don't do anything on key_power_cubes.
if(!strcmp(ent->classname, "key_power_cube"))
return;
ent->think = NULL;
ent->nextthink = 0;
ent->use = Item_TriggeredSpawn;
ent->svflags |= SVF_NOCLIENT;
ent->solid = SOLID_NOT;
}
/*
============
SpawnItem
Sets the clipping size and plants the object on the floor.
Items can't be immediately dropped to floor, because they might
be on an entity that hasn't spawned yet.
============
*/
void SpawnItem (edict_t *ent, gitem_t *item)
{
// PGM - since the item may be freed by the following rules, go ahead
// and move the precache until AFTER the following rules have been checked.
// keep an eye on this.
// PrecacheItem (item);
/* if (ent->spawnflags > 1) // PGM
{
if (strcmp(ent->classname, "key_power_cube") != 0)
{
ent->spawnflags = 0;
gi.dprintf("%s at %s has invalid spawnflags set\n", ent->classname, vtos(ent->s.origin));
}
}*/
// some items will be prevented in deathmatch
if (deathmatch->value)
{
if ( (int)dmflags->value & DF_NO_ARMOR )
{
if (item->pickup == Pickup_Armor || item->pickup == Pickup_PowerArmor)
{
G_FreeEdict (ent);
return;
}
}
if ( (int)dmflags->value & DF_NO_ITEMS )
{
if (item->pickup == Pickup_Powerup)
{
G_FreeEdict (ent);
return;
}
//=====
//ROGUE
if (item->pickup == Pickup_Sphere)
{
G_FreeEdict (ent);
return;
}
if (item->pickup == Pickup_Doppleganger)
{
G_FreeEdict (ent);
return;
}
//ROGUE
//=====
}
if ( (int)dmflags->value & DF_NO_HEALTH )
{
if (item->pickup == Pickup_Health || item->pickup == Pickup_Adrenaline || item->pickup == Pickup_AncientHead)
{
G_FreeEdict (ent);
return;
}
}
if ( (int)dmflags->value & DF_INFINITE_AMMO )
{
if ( (item->flags == IT_AMMO) || (strcmp(ent->classname, "weapon_bfg") == 0) )
{
G_FreeEdict (ent);
return;
}
}
//==========
//ROGUE
if ( (int)dmflags->value & DF_NO_MINES )
{
if ( !strcmp(ent->classname, "ammo_prox") ||
!strcmp(ent->classname, "ammo_tesla") )
{
G_FreeEdict (ent);
return;
}
}
if ( (int)dmflags->value & DF_NO_NUKES )
{
if ( !strcmp(ent->classname, "ammo_nuke") )
{
G_FreeEdict (ent);
return;
}
}
if ( (int)dmflags->value & DF_NO_SPHERES )
{
if (item->pickup == Pickup_Sphere)
{
G_FreeEdict (ent);
return;
}
}
//ROGUE
//==========
}
//==========
//ROGUE
// DM only items
if (!deathmatch->value)
{
if (item->pickup == Pickup_Doppleganger || item->pickup == Pickup_Nuke)
{
G_FreeEdict (ent);
return;
}
if ((item->use == Use_Vengeance) || (item->use == Use_Hunter))
{
G_FreeEdict (ent);
return;
}
}
//ROGUE
//==========
//PGM
PrecacheItem (item);
//PGM
if (coop->value && (strcmp(ent->classname, "key_power_cube") == 0))
{
ent->spawnflags |= (1 << (8 + level.power_cubes));
level.power_cubes++;
}
// don't let them drop items that stay in a coop game
if ((coop->value) && (item->flags & IT_STAY_COOP))
{
item->drop = NULL;
}
ent->item = item;
ent->nextthink = level.time + 2 * FRAMETIME; // items start after other solids
ent->think = droptofloor;
ent->s.skinnum = item->world_model_skinnum; //Knightmare- skinnum specified in item table
ent->s.effects = item->world_model_flags;
ent->s.renderfx = RF_GLOW;
if (ent->model)
gi.modelindex (ent->model);
// Knightmare added- all items are IR visible
ent->s.renderfx |= RF_IR_VISIBLE;
if (ent->spawnflags & 1)
SetTriggeredSpawn (ent);
}
//======================================================================
gitem_t itemlist[] =
{
{NULL}, // leave index 0 alone
//
// ARMOR
//
// 1
/*QUAKED item_armor_body (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_armor_body",
Pickup_Armor,
NULL,
NULL,
NULL,
"misc/ar1_pkup.wav",
"models/items/armor/body/tris.md2", 0, EF_ROTATE,
NULL,
"i_bodyarmor", // icon
"Body Armor", // pickup
3, // width
0,
NULL,
IT_ARMOR,
0,
&bodyarmor_info,
ARMOR_BODY,
"" // precache
},
// 2
/*QUAKED item_armor_combat (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_armor_combat",
Pickup_Armor,
NULL,
NULL,
NULL,
"misc/ar1_pkup.wav",
"models/items/armor/combat/tris.md2", 0, EF_ROTATE,
NULL,
"i_combatarmor", // icon
"Combat Armor", // pickup
3, // width
0,
NULL,
IT_ARMOR,
0,
&combatarmor_info,
ARMOR_COMBAT,
"" // precache
},
// 3
/*QUAKED item_armor_jacket (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_armor_jacket",
Pickup_Armor,
NULL,
NULL,
NULL,
"misc/ar1_pkup.wav",
"models/items/armor/jacket/tris.md2", 0, EF_ROTATE,
NULL,
"i_jacketarmor", // icon
"Jacket Armor", // pickup
3, // width
0,
NULL,
IT_ARMOR,
0,
&jacketarmor_info,
ARMOR_JACKET,
"" // precache
},
// 4
/*QUAKED item_armor_shard (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_armor_shard",
Pickup_Armor,
NULL,
NULL,
NULL,
"misc/ar2_pkup.wav",
"models/items/armor/shard/tris.md2", 0, EF_ROTATE,
NULL,
#ifdef KMQUAKE2_ENGINE_MOD
"i_shard", // icon
#else
"i_jacketarmor", // icon
#endif
"Armor Shard", // pickup
3, // width
0,
NULL,
IT_ARMOR,
0,
NULL,
ARMOR_SHARD,
"" // precache
},
//Knightmare- armor shard that lies flat on the ground
// 5
/*QUAKED item_armor_shard_flat (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_armor_shard_flat",
Pickup_Armor,
NULL,
NULL,
NULL,
"misc/ar2_pkup.wav",
"models/items/armor/shard/flat/tris.md2", 0, 0,
NULL,
#ifdef KMQUAKE2_ENGINE_MOD
"i_shard", // icon
#else
"i_jacketarmor", // icon
#endif
"Armor Shard", // pickup
3, // width
0,
NULL,
IT_ARMOR,
0,
NULL,
ARMOR_SHARD,
"" // precache
},
// 6
/*QUAKED item_power_screen (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_power_screen",
Pickup_PowerArmor,
Use_PowerArmor,
Drop_PowerArmor,
NULL,
"misc/ar3_pkup.wav",
"models/items/armor/screen/tris.md2", 0, EF_ROTATE,
NULL,
"i_powerscreen", // icon
"Power Screen", // pickup
0, // width
60,
NULL,
IT_ARMOR,
0,
NULL,
0,
"misc/power2.wav misc/power1.wav" // precache
},
// 7
/*QUAKED item_power_shield (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_power_shield",
Pickup_PowerArmor,
Use_PowerArmor,
Drop_PowerArmor,
NULL,
"misc/ar3_pkup.wav",
"models/items/armor/shield/tris.md2", 0, EF_ROTATE,
NULL,
"i_powershield", // icon
"Power Shield", // pickup
0, // width
60,
NULL,
IT_ARMOR,
0,
NULL,
0,
"misc/power2.wav misc/power1.wav" // precache
},
//
// WEAPONS
//
// 8
/*QUAKED weapon_flaregun (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"weapon_flaregun",
Pickup_Weapon,
Use_Weapon,
Drop_Weapon,
Weapon_FlareGun,
"misc/w_pkup.wav",
"models/weapons/g_flare/tris.md2", 0, EF_ROTATE,
"models/weapons/v_flare/tris.md2",
"w_flare", // icon
"Flare Gun", // pickup
0,
1,
"Flares",
IT_WEAPON|IT_STAY_COOP|IT_ZAERO,
WEAP_BLASTER,
NULL,
0,
"models/objects/flare/tris.md2 weapons/flare/shoot.wav weapons/flare/flarehis.wav" // precache
},
// 9
/* weapon_blaster (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"weapon_blaster",
Pickup_Weapon, //was NULL
Use_Weapon,
Drop_Weapon, //was NULL
Weapon_Blaster,
"misc/w_pkup.wav",
"models/weapons/g_blast/tris.md2", 0, EF_ROTATE, //was NULL, 0
"models/weapons/v_blast/tris.md2",
"w_blaster", // icon
"Blaster", // pickup
0,
0,
NULL,
IT_WEAPON|IT_STAY_COOP,
WEAP_BLASTER,
NULL,
0,
#ifdef KMQUAKE2_ENGINE_MOD // Knightmare- precache alternate blaster bolts
"models/objects/laser2/tris.md2 models/objects/blaser/tris.md2 weapons/blastf1a.wav misc/lasfly.wav" // precache
#else
"weapons/blastf1a.wav misc/lasfly.wav" // precache
#endif
},
// 10
/*QUAKED weapon_shotgun (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"weapon_shotgun",
Pickup_Weapon,
Use_Weapon,
Drop_Weapon,
Weapon_Shotgun,
"misc/w_pkup.wav",
"models/weapons/g_shotg/tris.md2", 0, EF_ROTATE,
"models/weapons/v_shotg/tris.md2",
"w_shotgun", // icon
"Shotgun", // pickup
0,
1,
"Shells",
IT_WEAPON|IT_STAY_COOP,
WEAP_SHOTGUN,
NULL,
0,
"weapons/shotgf1b.wav weapons/shotgr1b.wav" // precache
},
// 11
/*QUAKED weapon_supershotgun (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"weapon_supershotgun",
Pickup_Weapon,
Use_Weapon,
Drop_Weapon,
Weapon_SuperShotgun,
"misc/w_pkup.wav",
"models/weapons/g_shotg2/tris.md2", 0, EF_ROTATE,
"models/weapons/v_shotg2/tris.md2",
"w_sshotgun", // icon
"Super Shotgun", // pickup
0,
2,
"Shells",
IT_WEAPON|IT_STAY_COOP,
WEAP_SUPERSHOTGUN,
NULL,
0,
"weapons/sshotf1b.wav" // precache
},
// 12
/*QUAKED weapon_machinegun (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"weapon_machinegun",
Pickup_Weapon,
Use_Weapon,
Drop_Weapon,
Weapon_Machinegun,
"misc/w_pkup.wav",
"models/weapons/g_machn/tris.md2", 0, EF_ROTATE,
"models/weapons/v_machn/tris.md2",
"w_machinegun", // icon
"Machinegun", // pickup
0,
1,
"Bullets",
IT_WEAPON|IT_STAY_COOP,
WEAP_MACHINEGUN,
NULL,
0,
"weapons/machgf1b.wav weapons/machgf2b.wav weapons/machgf3b.wav weapons/machgf4b.wav weapons/machgf5b.wav" // precache
},
// 13
/*QUAKED weapon_chaingun (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"weapon_chaingun",
Pickup_Weapon,
Use_Weapon,
Drop_Weapon,
Weapon_Chaingun,
"misc/w_pkup.wav",
"models/weapons/g_chain/tris.md2", 0, EF_ROTATE,
"models/weapons/v_chain/tris.md2",
"w_chaingun", // icon
"Chaingun", // pickup
0,
1,
"Bullets",
IT_WEAPON|IT_STAY_COOP,
WEAP_CHAINGUN,
NULL,
0,
"weapons/chngnu1a.wav weapons/chngnl1a.wav weapons/machgf3b.wav` weapons/chngnd1a.wav" // precache
},
// 14
// ROGUE
/*QUAKED weapon_etf_rifle (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"weapon_etf_rifle", // classname
Pickup_Weapon, // pickup function
Use_Weapon, // use function
Drop_Weapon, // drop function
Weapon_ETF_Rifle, // weapon think function
"misc/w_pkup.wav", // pick up sound
"models/weapons/g_etf_rifle/tris.md2", 0, EF_ROTATE,// world model, skinnum, world model flags
"models/weapons/v_etf_rifle/tris.md2", // view model
"w_etf_rifle", // icon
"ETF Rifle", // name printed when picked up
0, // number of digits for statusbar
1, // amount used / contained
"Flechettes", // ammo type used
IT_WEAPON|IT_STAY_COOP|IT_ROGUE, // inventory flags
WEAP_ETFRIFLE, // visible weapon
NULL, // info (void *)
0, // tag
"weapons/nail1.wav models/proj/flechette/tris.md2", // precaches
},
// rogue
// 15
/*QUAKED ammo_grenades (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"ammo_grenades",
Pickup_Ammo,
Use_Weapon,
Drop_Ammo,
Weapon_Grenade,
"misc/am_pkup.wav",
"models/items/ammo/grenades/medium/tris.md2", 0, 0,
"models/weapons/v_handgr/tris.md2",
"a_grenades", // icon
"Grenades", // pickup
3, // width
5,
"grenades",
IT_AMMO|IT_WEAPON,
WEAP_GRENADES,
NULL,
AMMO_GRENADES,
"weapons/hgrent1a.wav weapons/hgrena1b.wav weapons/hgrenc1b.wav weapons/hgrenb1a.wav weapons/hgrenb2a.wav" // precache
},
// 16
/*QUAKED ammo_ired (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"ammo_ired",
Pickup_Ammo,
Use_Weapon,
Drop_Ammo,
Weapon_LaserTripBomb,
"misc/am_pkup.wav",
"models/items/ammo/ireds/tris.md2", 0, 0,
"models/weapons/v_ired/tris.md2",
"w_ired", // icon
"IRED", // pickup
3, // width
3,
"IRED",
IT_AMMO|IT_WEAPON|IT_ZAERO,
WEAP_GRENADES,
NULL,
AMMO_LASERTRIPBOMB,
"models/weapons/v_ired/hand.md2 models/objects/ired/tris.md2 modes/objects models/objects/shrapnel/tris.md2 weapons/ired/las_set.wav weapons/ired/las_arm.wav " // precache
/*"weapons/ired/las_tink.wav "weapons/ired/las_trig.wav "*/
/*"weapons/ired/las_glow.wav"*/,
},
// 17
/*QUAKED weapon_grenadelauncher (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"weapon_grenadelauncher",
Pickup_Weapon,
Use_Weapon,
Drop_Weapon,
Weapon_GrenadeLauncher,
"misc/w_pkup.wav",
"models/weapons/g_launch/tris.md2", 0, EF_ROTATE,
"models/weapons/v_launch/tris.md2",
"w_glauncher", // icon
"Grenade Launcher", // pickup
0,
1,
"Grenades",
IT_WEAPON|IT_STAY_COOP,
WEAP_GRENADELAUNCHER,
NULL,
0,
"models/objects/grenade/tris.md2 weapons/grenlf1a.wav weapons/grenlr1b.wav weapons/grenlb1b.wav" // precache
},
// 18
// ROGUE
/*QUAKED weapon_proxlauncher (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"weapon_proxlauncher", // classname
Pickup_Weapon, // pickup
Use_Weapon, // use
Drop_Weapon, // drop
Weapon_ProxLauncher, // weapon think
"misc/w_pkup.wav", // pick up sound
"models/weapons/g_plaunch/tris.md2", 0, EF_ROTATE, // world model, skinnum, world model flags
"models/weapons/v_plaunch/tris.md2", // view model
"w_proxlaunch", // icon
"Prox Launcher", // name printed when picked up
0, // number of digits for statusbar
1, // amount used
"Prox", // ammo type used
IT_WEAPON|IT_STAY_COOP|IT_ROGUE, // inventory flags
WEAP_PROXLAUNCH, // visible weapon
NULL, // info (void *)
AMMO_PROX, // tag
"weapons/grenlf1a.wav weapons/grenlr1b.wav weapons/grenlb1b.wav weapons/proxwarn.wav weapons/proxopen.wav",
},
// rogue
// 19
/*QUAKED weapon_rocketlauncher (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"weapon_rocketlauncher",
Pickup_Weapon,
Use_Weapon,
Drop_Weapon,
Weapon_RocketLauncher,
"misc/w_pkup.wav",
"models/weapons/g_rocket/tris.md2", 0, EF_ROTATE,
"models/weapons/v_rocket/tris.md2",
"w_rlauncher", // icon
"Rocket Launcher", // pickup
0,
1,
"Rockets",
IT_WEAPON|IT_STAY_COOP,
WEAP_ROCKETLAUNCHER,
NULL,
0,
"models/objects/rocket/tris.md2 weapons/rockfly.wav weapons/rocklf1a.wav weapons/rocklr1b.wav models/objects/debris2/tris.md2" // precache
},
// 20
/*QUAKED weapon_hyperblaster (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"weapon_hyperblaster",
Pickup_Weapon,
Use_Weapon,
Drop_Weapon,
Weapon_HyperBlaster,
"misc/w_pkup.wav",
"models/weapons/g_hyperb/tris.md2", 0, EF_ROTATE,
"models/weapons/v_hyperb/tris.md2",
"w_hyperblaster", // icon
"HyperBlaster", // pickup
0,
1,
"Cells",
IT_WEAPON|IT_STAY_COOP,
WEAP_HYPERBLASTER,
NULL,
0,
#ifdef KMQUAKE2_ENGINE_MOD // Knightmare- precache alternate blaster bolts
"models/objects/laser2/tris.md2 models/objects/blaser/tris.md2 weapons/hyprbl1a.wav weapons/hyprbf1a.wav weapons/hyprbd1a.wav misc/lasfly.wav" //removed weapons/hyprbu1a.wav
#else
"weapons/hyprbl1a.wav weapons/hyprbf1a.wav weapons/hyprbd1a.wav misc/lasfly.wav" //removed weapons/hyprbu1a.wav
#endif
},
// 21
// ROGUE
/*QUAKED weapon_plasmabeam (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"weapon_plasmabeam", // classname
Pickup_Weapon, // pickup function
Use_Weapon, // use function
Drop_Weapon, // drop function
Weapon_Heatbeam, // weapon think function
"misc/w_pkup.wav", // pick up sound
"models/weapons/g_beamer/tris.md2", 0, EF_ROTATE, // world model, skinnum, world model flags
"models/weapons/v_beamer/tris.md2", // view model
"w_heatbeam", // icon
"Plasma Beam", // name printed when picked up
0, // number of digits for statusbar
2, // amount used / contained- if this changes, change it in NoAmmoWeaponChange as well
"Cells", // ammo type used
IT_WEAPON|IT_STAY_COOP|IT_ROGUE, // inventory flags
WEAP_PLASMA, // visible weapon
NULL, // info (void *)
0, // tag
"models/weapons/v_beamer2/tris.md2 weapons/bfg__l1a.wav", // precache
},
// ROGUE
// 22
/*QUAKED weapon_boomer (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"weapon_boomer",
Pickup_Weapon,
Use_Weapon,
Drop_Weapon,
Weapon_Ionripper,
"misc/w_pkup.wav",
"models/weapons/g_boom/tris.md2", 0, EF_ROTATE,
"models/weapons/v_boomer/tris.md2",
"w_ripper", // icon
"ION Ripper", /// pickup
0,
2,
"Cells",
IT_WEAPON|IT_STAY_COOP|IT_XATRIX,
WEAP_BOOMER,
NULL,
0,
#ifdef KMQUAKE2_ENGINE_MOD
"weapons/ionactive.wav weapons/ion_hum.wav weapons/ionaway.wav weapons/rippfire.wav misc/lasfly.wav weapons/ionhit1.wav weapons/ionhit2.wav weapons/ionhit3.wav weapons/ionexp.wav models/objects/boomrang/tris.md2" // precache
#else
"weapons/rippfire.wav misc/lasfly.wav models/objects/boomrang/tris.md2" // precache
#endif
},
// 23
/*QUAKED weapon_railgun (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"weapon_railgun",
Pickup_Weapon,
Use_Weapon,
Drop_Weapon,
Weapon_Railgun,
"misc/w_pkup.wav",
"models/weapons/g_rail/tris.md2", 0, EF_ROTATE,
"models/weapons/v_rail/tris.md2",
"w_railgun", // icon
"Railgun", // pickup
0,
1,
"Slugs",
IT_WEAPON|IT_STAY_COOP,
WEAP_RAILGUN,
NULL,
0,
"weapons/rg_hum.wav weapons/railgf1a.wav" // precache
},
// 24
/*QUAKED weapon_phalanx (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"weapon_phalanx",
Pickup_Weapon,
Use_Weapon,
Drop_Weapon,
Weapon_Phalanx,
"misc/w_pkup.wav",
"models/weapons/g_shotx/tris.md2", 0, EF_ROTATE,
"models/weapons/v_shotx/tris.md2",
"w_phallanx", // icon
"Phalanx", // pickup
0,
1,
"Magslug",
IT_WEAPON|IT_STAY_COOP|IT_XATRIX,
WEAP_PHALANX,
NULL,
0,
#ifdef KMQUAKE2_ENGINE_MOD
"sprites/s_photon.sp2 eapons/plasshot.wav weapons/phaloop.wav" // precache
#else
"sprites/s_photon.sp2 weapons/plasshot.wav" // precache
#endif
},
// 25
/*QUAKED weapon_bfg (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"weapon_bfg",
Pickup_Weapon,
Use_Weapon,
Drop_Weapon,
Weapon_BFG,
"misc/w_pkup.wav",
"models/weapons/g_bfg/tris.md2", 0, EF_ROTATE,
"models/weapons/v_bfg/tris.md2",
"w_bfg", // icon
"BFG10K", // pickup
0,
50,
"Cells",
IT_WEAPON|IT_STAY_COOP,
WEAP_BFG,
NULL,
0,
#ifdef KMQUAKE2_ENGINE_MOD
"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" // precache
#else
"sprites/s_bfg1.sp2 sprites/s_bfg2.sp2 sprites/s_bfg3.sp2 weapons/bfg__f1y.wav weapons/bfg__l1a.wav weapons/bfg__x1b.wav" // precache
#endif
},
// 26
/*QUAKED weapon_disintegrator (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"weapon_disintegrator", // classname
Pickup_Weapon, // pickup function
Use_Weapon, // use function
Drop_Weapon, // drop function
Weapon_Disintegrator, // weapon think function
"misc/w_pkup.wav", // pick up sound
"models/weapons/g_dist/tris.md2", 0, EF_ROTATE, // world model, skinnum, world model flags
"models/weapons/v_dist/tris.md2", // view model
"w_disintegrator", // icon
"Disintegrator", // name printed when picked up
0, // number of digits for statusbar
1, // amount used / contained
"Disruptors", // ammo type used
IT_WEAPON|IT_STAY_COOP|IT_ROGUE, // inventory flags
WEAP_DISRUPTOR, // visible weapon
NULL, // info (void *)
1, // tag
"models/items/spawngro/tris.md2 models/proj/disintegrator/tris.md2 weapons/disrupt.wav weapons/disint2.wav weapons/disrupthit.wav", // precaches
},
// 27
/*QUAKED weapon_chainfist (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"weapon_chainfist", // classname
Pickup_Weapon, // pickup function
Use_Weapon, // use function
Drop_Weapon, // drop function
Weapon_ChainFist, // weapon think function
"misc/w_pkup.wav", // pick up sound
"models/weapons/g_chainf/tris.md2", 0, EF_ROTATE, // world model, world model flags
"models/weapons/v_chainf/tris.md2", // view model
"w_chainfist", // icon
"Chainfist", // name printed when picked up
0, // number of digits for statusbar
0, // amount used / contained
NULL, // ammo type used
IT_WEAPON|IT_STAY_COOP|IT_MELEE|IT_ROGUE, // inventory flags
WEAP_CHAINFIST, // visible weapon
NULL, // info (void *)
1, // tag
"weapons/sawidle.wav weapons/sawhit.wav", // precaches
},
// 28
/*QUAKED weapon_shockwave (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"weapon_shockwave",
Pickup_Weapon,
Use_Weapon,
Drop_Weapon,
Weapon_Shockwave,
"misc/w_pkup.wav",
"models/weapons/g_chain/tris.md2", 0, EF_ROTATE,
"models/weapons/v_chain/tris.md2",
"w_chaingun", // icon
"Shockwave", // pickup
0,
1,
"Shocksphere",
IT_WEAPON|IT_STAY_COOP,
WEAP_SHOCKWAVE, // visible weapon
NULL,
0,
"weapons/shockactive.wav weapons/shock_hum.wav weapons/shockfire.wav weapons/shockaway.wav weapons/shockhit.wav weapons/shockexp.wav models/objects/shocksphere/tris.md2 models/objects/shockfield/tris.md2 sprites/s_trap.sp2"
},
// 29 SKWiD MOD
/*QUAKED weapon_plasma (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"weapon_plasma",
Pickup_Weapon,
Use_Weapon,
Drop_Weapon,
Weapon_Plasma_Rifle,
"misc/w_pkup.wav",
PLASMA_MODEL_WORLD, 0, EF_ROTATE,
PLASMA_MODEL_VIEW,
"w_plasma", // icon
PLASMA_PICKUP_NAME, // pickup
0,
PLASMA_CELLS_PER_SHOT, // bat - was 1
"Cells",
IT_WEAPON|IT_STAY_COOP|IT_LM,
WEAP_PLASMARIFLE,
NULL,
0,
"PLASMA_PRECACHE"
},
// 30
/*QUAKED weapon_hml (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"weapon_hml",
NULL,
Use_Weapon,
NULL,
Weapon_HomingMissileLauncher,
NULL,
NULL, 0, EF_ROTATE,
"models/weapons/v_homing/tris.md2",
NULL, // icon
"Homing Rocket Launcher", // pickup
0,
1,
"Homing Rockets",
IT_WEAPON|IT_STAY_COOP,
WEAP_ROCKETLAUNCHER,
NULL,
0,
"models/objects/rocket/tris.md2 weapons/rockfly.wav weapons/rocklf1a.wav weapons/rocklr1b.wav models/objects/debris2/tris.md2"
},
// 31
// Lazarus: No weapon - we HAVE to have a weapon
{
"weapon_null",
NULL,
Use_Weapon,
NULL,
Weapon_Null,
"misc/w_pkup.wav",
NULL, 0, 0,
NULL,
NULL,
"No Weapon",
0,
0,
NULL,
IT_WEAPON|IT_STAY_COOP,
WEAP_NONE,
NULL,
0,
""
},
//
// AMMO ITEMS
//
// 32
/*QUAKED ammo_shells (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"ammo_shells",
Pickup_Ammo,
NULL,
Drop_Ammo,
NULL,
"misc/am_pkup.wav",
"models/items/ammo/shells/medium/tris.md2", 0, 0,
NULL,
"a_shells", // icon
"Shells", // pickup
3, // width
10,
NULL,
IT_AMMO,
0,
NULL,
AMMO_SHELLS,
"" // precache
},
// 33
/*QUAKED ammo_bullets (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"ammo_bullets",
Pickup_Ammo,
NULL,
Drop_Ammo,
NULL,
"misc/am_pkup.wav",
"models/items/ammo/bullets/medium/tris.md2", 0, 0,
NULL,
"a_bullets", // icon
"Bullets", // pickup
3, // width
50,
NULL,
IT_AMMO,
0,
NULL,
AMMO_BULLETS,
"" // precache
},
// 34
/*QUAKED ammo_cells (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"ammo_cells",
Pickup_Ammo,
NULL,
Drop_Ammo,
NULL,
"misc/am_pkup.wav",
"models/items/ammo/cells/medium/tris.md2", 0, 0,
NULL,
"a_cells", // icon
"Cells", // pickup
3, // width
50,
NULL,
IT_AMMO,
0,
NULL,
AMMO_CELLS,
"" // precache
},
// 35
/*QUAKED ammo_rockets (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"ammo_rockets",
Pickup_Ammo,
NULL,
Drop_Ammo,
NULL,
"misc/am_pkup.wav",
"models/items/ammo/rockets/medium/tris.md2", 0, 0,
NULL,
"a_rockets", // icon
"Rockets", // pickup
3, // width
5,
NULL,
IT_AMMO,
0,
NULL,
AMMO_ROCKETS,
"" // precache
},
// 36
/*QUAKED ammo_homing_missiles (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"ammo_homing_missiles",
Pickup_Ammo,
NULL,
Drop_Ammo,
NULL,
"misc/am_pkup.wav",
"models/items/ammo/homing/medium/tris.md2", 0, 0,
NULL,
"a_homing", // icon
"Homing Rockets", // pickup
3, // width
5,
NULL,
IT_AMMO|IT_LAZARUS,
0,
NULL,
AMMO_HOMING_ROCKETS,
"" // precache
},
// 37
/*QUAKED ammo_slugs (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"ammo_slugs",
Pickup_Ammo,
NULL,
Drop_Ammo,
NULL,
"misc/am_pkup.wav",
"models/items/ammo/slugs/medium/tris.md2", 0, 0,
NULL,
"a_slugs", // icon
"Slugs", // pickup
3, // width
10,
NULL,
IT_AMMO,
0,
NULL,
AMMO_SLUGS,
"" // precache
},
// 38
/*QUAKED ammo_magslug (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"ammo_magslug",
Pickup_Ammo,
NULL,
Drop_Ammo,
NULL,
"misc/am_pkup.wav",
"models/objects/ammo/tris.md2", 0, 0,
NULL,
"a_mslugs", // icon
"Magslug", // pickup
3, // width
10,
NULL,
IT_AMMO|IT_XATRIX,
0,
NULL,
AMMO_MAGSLUG,
/* precache */ "" // precache
},
// 39
/*QUAKED ammo_flechettes (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"ammo_flechettes",
Pickup_Ammo,
NULL,
Drop_Ammo,
NULL,
"misc/am_pkup.wav",
"models/ammo/am_flechette/tris.md2", 0, 0,
NULL,
"a_flechettes",
"Flechettes",
3,
50,
NULL,
IT_AMMO|IT_ROGUE,
0,
NULL,
AMMO_FLECHETTES,
},
// 40
/*QUAKED ammo_disruptor (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"ammo_disruptor", // Classname
Pickup_Ammo, // pickup function
NULL, // use function
Drop_Ammo, // drop function
NULL, // weapon think function
"misc/am_pkup.wav", // pickup sound
"models/ammo/am_disr/tris.md2", 0, 0, // world model, world model flags
NULL, // view model
"a_disruptor", // icon
"Disruptors", // pickup
3, // number of digits for status bar
15, // amount contained
NULL, // ammo type used
IT_AMMO|IT_ROGUE, // inventory flags
0, // vwep index
NULL, // info (void *)
AMMO_DISRUPTOR, // tag
},
// 41
/*QUAKED ammo_prox (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"ammo_prox", // Classname
Pickup_Ammo, // pickup function
NULL, // use function
Drop_Ammo, // drop function
NULL, // weapon think function
"misc/am_pkup.wav", // pickup sound
"models/ammo/am_prox/tris.md2", 0, 0, // world model, world model flags
NULL, // view model
"a_prox", // icon
"Prox", // Name printed when picked up
3, // number of digits for status bar
5, // amount contained
NULL, // ammo type used
IT_AMMO|IT_ROGUE, // inventory flags
0, // vwep index
NULL, // info (void *)
AMMO_PROX, // tag
"models/weapons/g_prox/tris.md2 weapons/proxwarn.wav" // precaches
},
// 42
/*QUAKED ammo_shocksphere (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"ammo_shocksphere", // Classname
Pickup_Ammo, // pickup function
NULL, // use function
Drop_Ammo, // drop function
NULL, // weapon think function
"misc/am_pkup.wav", // pickup sound
"models/items/tagtoken/tris.md2", 0, 0, // world model, world model flags
NULL, // view model
"i_tagtoken", // icon
"Shocksphere", // Name printed when picked up
3, // number of digits for status bar
1, // amount contained
NULL, // ammo type used
IT_AMMO, // inventory flags
0, // vwep index
NULL, // info (void *)
AMMO_SHOCKSPHERE, // tag
"" // precache
},
// 43
/*QUAKED ammo_flares (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"ammo_flares",
Pickup_Ammo,
NULL,
Drop_Ammo,
NULL,
"misc/am_pkup.wav",
"models/items/ammo/flares/tris.md2", 0, 0,
NULL,
"a_flares", // icon
"Flares", // pickup
3, // width
3,
NULL,
IT_AMMO|IT_ZAERO,
0,
NULL,
AMMO_FLARES,
"" // precache
},
// 44
/*QUAKED ammo_tesla (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"ammo_tesla",
Pickup_Ammo,
Use_Weapon, // PGM
Drop_Ammo,
Weapon_Tesla, // PGM
"misc/am_pkup.wav",
// "models/weapons/g_tesla/tris.md2", 0,
"models/ammo/am_tesl/tris.md2", 0, 0,
"models/weapons/v_tesla/tris.md2",
"a_tesla",
"Tesla",
3,
5,
"Tesla", // PGM
IT_AMMO|IT_WEAPON|IT_ROGUE, // inventory flags
WEAP_GRENADES,
NULL, // info (void *)
AMMO_TESLA, // tag
"models/weapons/v_tesla2/tris.md2 weapons/teslaopen.wav weapons/hgrenb1a.wav weapons/hgrenb2a.wav models/weapons/g_tesla/tris.md2" // precache
},
// 45
/*QUAKED ammo_trap (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"ammo_trap",
Pickup_Ammo,
Use_Weapon,
Drop_Ammo,
Weapon_Trap,
"misc/am_pkup.wav",
"models/weapons/g_trap/tris.md2", 0, EF_ROTATE,
"models/weapons/v_trap/tris.md2",
"a_trap", // icon
"Trap", // pickup
3, // width
1,
"trap",
IT_AMMO|IT_WEAPON|IT_XATRIX,
WEAP_GRENADES, //WEAP_TRAP
NULL,
AMMO_TRAP,
"weapons/trapcock.wav weapons/traploop.wav weapons/trapsuck.wav weapons/trapdown.wav" // precache
},
// 46
/*QUAKED ammo_nuke (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"ammo_nuke",
Pickup_Nuke,
Use_Nuke, // PMM
Drop_Ammo,
NULL, // PMM
"misc/am_pkup.wav",
"models/weapons/g_nuke/tris.md2", 0, EF_ROTATE,
NULL,
"p_nuke", // icon
"A-M Bomb", // pickup
3, // width
1, // quantity
"A-M Bomb",
IT_POWERUP|IT_ROGUE,
0,
NULL,
0,
"weapons/nukewarn2.wav world/rumble.wav"
},
// 47
/*QUAKED ammo_nbomb (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"ammo_nbomb",
Pickup_Nbomb,
Use_Nbomb, // PMM
Drop_Ammo,
NULL, // PMM
"misc/am_pkup.wav",
"models/items/ammo/nbomb/tris.md2", 0, 0,
NULL,
"w_nbomb", // icon
#ifdef CITADELMOD_FEATURES
"CBU-71", // pickup
#else
"BLU-86", // pickup
#endif
3, // width
1, // quantity
"BLU-86",
IT_POWERUP,
0,
NULL,
0,
"weapons/nukewarn2.wav world/rumble.wav" // precache
},
// 48
/*QUAKED ammo_empnuke (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"ammo_empnuke",
Pickup_Ammo,
Use_Weapon,
Drop_Ammo,
Weapon_EMPNuke,
"misc/am_pkup.wav",
"models/weapons/g_enuke/tris.md2", 0, EF_ROTATE,
"models/weapons/v_enuke/tris.md2",
"w_enuke", // icon
"EMPNuke", // pickup
3, // width
1,
"EMPNuke",
IT_AMMO|IT_ZAERO,
0,
NULL,
AMMO_EMPNUKE,
"items/empnuke/emp_trg.wav" //items/empnuke/emp_act.wav items/empnuke/emp_spin.wav items/empnuke/emp_idle.wav // precache
},
// 49
/*QUAKED ammo_fuel (.3 .3 1) (-16 -16 -16) (16 16 16)
model="models/items/ammo/fuel/medium/"
*/
{
"ammo_fuel",
Pickup_Ammo,
NULL,
Drop_Ammo,
NULL,
"misc/am_pkup.wav",
"models/items/ammo/fuel/medium/tris.md2", 0, 0,
NULL,
"a_fuel", // icon
"Fuel", // pickup
4, // width
500, // quantity
NULL,
IT_AMMO|IT_LAZARUS,
0,
NULL,
AMMO_FUEL,
"" // precache
},
//
// POWERUP ITEMS
//
// 50
/*QUAKED item_quad (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_quad",
Pickup_Powerup,
Use_Quad,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/quaddama/tris.md2", 0, EF_ROTATE,
NULL,
"p_quad", // icon
"Quad Damage", // pickup
2, // width
60,
NULL,
IT_POWERUP,
0,
NULL,
0,
"items/damage.wav items/damage2.wav items/damage3.wav" // precache
},
// 51
/*QUAKED item_double (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_double",
Pickup_Powerup,
Use_Double,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/ddamage/tris.md2", 0, EF_ROTATE,
NULL,
"p_double", // icon
"Double Damage", // pickup
2, // width
60,
NULL,
IT_POWERUP|IT_ROGUE,
0,
NULL,
0,
"misc/ddamage1.wav misc/ddamage2.wav misc/ddamage3.wav" // precache
},
// 52
/*QUAKED item_quadfire (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"item_quadfire",
Pickup_Powerup,
Use_QuadFire,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/quadfire/tris.md2", 0, EF_ROTATE,
NULL,
"p_quadfire", // icon
"DualFire Damage", // pickup
2, // width
60,
NULL,
IT_POWERUP|IT_XATRIX,
0,
NULL,
0,
"items/quadfire1.wav items/quadfire2.wav items/quadfire3.wav" // precache
},
// 53
/*QUAKED item_invulnerability (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_invulnerability",
Pickup_Powerup,
Use_Invulnerability,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/invulner/tris.md2", 0, EF_ROTATE,
NULL,
"p_invulnerability", // icon
"Invulnerability", // pickup
2, // width
300,
NULL,
IT_POWERUP,
0,
NULL,
0,
/* precache */ "items/protect.wav items/protect2.wav items/protect4.wav" // precache
},
// 54
/*QUAKED item_silencer (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_silencer",
Pickup_Powerup,
Use_Silencer,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/silencer/tris.md2", 0, EF_ROTATE,
NULL,
"p_silencer", // icon
"Silencer", // pickup
2, // width
60,
NULL,
IT_POWERUP,
0,
NULL,
0,
"" // precache
},
// 55
/*QUAKED item_breather (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_breather",
Pickup_Powerup,
Use_Breather,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/breather/tris.md2", 0, EF_ROTATE,
NULL,
"p_rebreather", // icon
"Rebreather", // pickup
2, // width
60,
NULL,
IT_STAY_COOP|IT_POWERUP,
0,
NULL,
0,
"player/u_breath1.wav player/u_breath2.wav items/airout.wav" // precache
},
// 56
/*QUAKED item_enviro (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_enviro",
Pickup_Powerup,
Use_Envirosuit,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/enviro/tris.md2", 0, EF_ROTATE,
NULL,
"p_envirosuit", // icon
"Environment Suit", // pickup
2, // width
60,
NULL,
IT_STAY_COOP|IT_POWERUP,
0,
NULL,
0,
"player/u_breath1.wav player/u_breath2.wav items/airout.wav" // precache
},
// 57
/*QUAKED item_ir_goggles (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
gives +1 to maximum health
*/
{
"item_ir_goggles",
Pickup_Powerup,
Use_IR,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/goggles/tris.md2", 0, EF_ROTATE,
NULL,
"p_ir", // icon
"IR Goggles", // pickup
2, // width
60,
NULL,
IT_POWERUP|IT_ROGUE,
0,
NULL,
0,
"misc/ir_start.wav" // precache
},
// 58
/*QUAKED item_visor (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"item_visor",
Pickup_Visor,
Use_Visor,
Drop_Visor,
NULL,
"items/pkup.wav",
"models/items/visor/tris.md2", 0, EF_ROTATE,
NULL,
"i_visor", // icon
"Visor", // pickup
1, // width
30,
"Cells",
IT_STAY_COOP|IT_POWERUP|IT_ZAERO,
0,
NULL,
0,
"items/visor/act.wav items/visor/deact.wav" // items/visor/next.wav" // precache
},
// 59
/*QUAKED ammo_plasmashield (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"ammo_plasmashield",
Pickup_Ammo,
Use_PlasmaShield,
Drop_Ammo,
NULL,
"misc/ar3_pkup.wav",
"models/items/plasma/tris.md2", 0, EF_ROTATE,
NULL,
"i_plasma", // icon
"Plasma Shield", // pickup
1, // width
5,
"",
IT_AMMO|IT_ZAERO,
0,
NULL,
AMMO_PLASMASHIELD,
"items/plasmashield/psactive.wav sprites/plasmashield.sp2" // precache
// "items/plasmashield/psfire.wav items/plasmashield/psactive.wav items/plasmashield/psdie.wav sprites/plasmashield.sp2"
},
// 60
/*QUAKED item_ancient_head (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
Special item that gives +2 to maximum health
*/
{
"item_ancient_head",
Pickup_AncientHead,
NULL,
NULL,
NULL,
"items/pkup.wav",
"models/items/c_head/tris.md2", 0, EF_ROTATE,
NULL,
"i_fixme", // icon
"Ancient Head", // pickup
2, // width
60,
NULL,
0,
0,
NULL,
0,
"" // precache
},
// New item (sorta) for Citadel pack by Andrea Rosa
#ifdef CITADELMOD_FEATURES
// 61
/*QUAKED item_steroid_pack (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
Special item that gives +2 to maximum health
*/
{
"item_steroid_pack",
Pickup_AncientHead,
NULL,
NULL,
NULL,
"items/pkup.wav",
"models/items/steroid/tris.md2", 0, EF_ROTATE,
NULL,
"i_stero", // icon
"Steroids", // pickup
2, // width
60,
NULL,
0,
0,
NULL,
0,
"" // precache
},
#endif
// 61
/*QUAKED item_adrenaline (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
gives +1 to maximum health
*/
{
"item_adrenaline",
Pickup_Adrenaline,
NULL,
NULL,
NULL,
"items/pkup.wav",
"models/items/adrenal/tris.md2", 0, EF_ROTATE,
NULL,
"p_adrenaline", // icon
"Adrenaline", // pickup
2, // width
60,
NULL,
0,
0,
NULL,
0,
"" // precache
},
// 62
/*QUAKED item_bandolier (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_bandolier",
Pickup_Bandolier,
NULL,
NULL,
NULL,
"items/pkup.wav",
"models/items/band/tris.md2", 0, EF_ROTATE,
NULL,
"p_bandolier", // icon
"Bandolier", // pickup
2, // width
60,
NULL,
0,
0,
NULL,
0,
"" // precache
},
// 63
/*QUAKED item_pack (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_pack",
Pickup_Pack,
NULL,
NULL,
NULL,
"items/pkup.wav",
"models/items/pack/tris.md2", 0, EF_ROTATE,
NULL,
"i_pack", // icon
"Ammo Pack", // pickup
2, // width
180,
NULL,
0,
0,
NULL,
0,
"" // precache
},
#ifdef JETPACK_MOD
// 64
/*QUAKED item_jetpack (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
model="models/items/jet/"
*/
{
"item_jetpack",
Pickup_Powerup,
Use_Jet,
Drop_Jetpack,
NULL,
"items/pkup.wav",
"models/items/jet/tris.md2", 0, EF_ROTATE,
NULL,
"p_jet",
"Jetpack",
2,
600,
"Fuel",
IT_POWERUP|IT_LAZARUS,
0,
NULL,
0,
"jetpack/activate.wav jetpack/rev1.wav jetpack/revrun.wav jetpack/running.wav jetpack/shutdown.wav jetpack/stutter.wav"
},
#endif
// ======================================
// PGM
/*QUAKED item_torch (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
/*
{
"item_torch",
Pickup_Powerup,
Use_Torch,
Drop_General,
NULL,
"items/pkup.wav",
"models/objects/fire/tris.md2", 0, EF_ROTATE,
NULL,
"p_torch",
"torch",
2,
60,
NULL,
IT_POWERUP|IT_ROGUE,
0,
NULL,
0,
"" // precache
},*/
// 65
/*QUAKED item_flashlight (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_flashlight",
Pickup_Powerup,
Use_Flashlight,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/f_light/tris.md2", 0, EF_ROTATE,
NULL,
"p_flash",
"Flashlight",
2,
60,
NULL,
IT_POWERUP|IT_LAZARUS,
0,
NULL,
0,
"" // precache
},
// 66
/*QUAKED item_compass (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_compass",
Pickup_Powerup,
Use_Compass,
NULL,
NULL,
"items/pkup.wav",
"models/objects/fire/tris.md2", 0, EF_ROTATE,
NULL,
"p_compass", // icon
"Compass", // pickup
2, // width
60,
NULL,
IT_POWERUP|IT_ROGUE,
0,
NULL,
0,
"" // precache
},
// 67
/*QUAKED item_sphere_vengeance (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_sphere_vengeance",
Pickup_Sphere,
Use_Vengeance,
NULL,
NULL,
"items/pkup.wav",
"models/items/vengnce/tris.md2", 0, EF_ROTATE,
NULL,
"p_vengeance", // icon
"Vengeance Sphere", // pickup
2, // width
60,
NULL,
IT_POWERUP|IT_ROGUE,
0,
NULL,
0,
"spheres/v_idle.wav" // precache
},
// 68
/*QUAKED item_sphere_hunter (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_sphere_hunter",
Pickup_Sphere,
Use_Hunter,
NULL,
NULL,
"items/pkup.wav",
"models/items/hunter/tris.md2", 0, EF_ROTATE,
NULL,
"p_hunter", // icon
"Hunter Sphere", // pickup
2, // width
120,
NULL,
IT_POWERUP|IT_ROGUE,
0,
NULL,
0,
"spheres/h_idle.wav spheres/h_active.wav spheres/h_lurk.wav" // precache
},
// 69
/*QUAKED item_sphere_defender (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_sphere_defender",
Pickup_Sphere,
Use_Defender,
NULL,
NULL,
"items/pkup.wav",
"models/items/defender/tris.md2", 0, EF_ROTATE,
NULL,
"p_defender", // icon
"Defender Sphere", // pickup
2, // width
60, // respawn time
NULL, // ammo type used
IT_POWERUP|IT_ROGUE, // inventory flags
0,
NULL, // info (void *)
0, // tag
"models/proj/laser2/tris.md2 models/items/shell/tris.md2 spheres/d_idle.wav" // precache
},
// 70
/*QUAKED item_doppleganger (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_doppleganger", // classname
Pickup_Doppleganger, // pickup function
Use_Doppleganger, // use function
Drop_General, // drop function
NULL, // weapon think function
"items/pkup.wav", // pick up sound
"models/items/dopple/tris.md2", 0, EF_ROTATE, // world model, skinnum, world model flags
NULL, // view model
"p_doppleganger", // icon
"Doppleganger", // name printed when picked up
0, // number of digits for statusbar
90, // respawn time
NULL, // ammo type used
IT_POWERUP|IT_ROGUE, // inventory flags
0,
NULL, // info (void *)
0, // tag
"models/objects/dopplebase/tris.md2 models/items/spawngro2/tris.md2 models/items/hunter/tris.md2 models/items/vengnce/tris.md2", // precaches
},
// 71
/*QUAKED item_freeze (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"item_freeze",
Pickup_Powerup,
Use_Stasis,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/stasis/tris.md2", 0, EF_ROTATE,
NULL,
"p_freeze",
"Stasis Generator",
2,
30,
NULL,
IT_POWERUP|IT_LAZARUS,
0,
NULL,
0,
"items/stasis_start.wav items/stasis.wav items/stasis_stop.wav"
},
// 72
{
"dm_tag_token", // classname
// NULL, // classname
Tag_PickupToken, // pickup function
NULL, // use function
NULL, // drop function
NULL, // weapon think function
"items/pkup.wav", // pick up sound
"models/items/tagtoken/tris.md2", 0, EF_ROTATE | EF_TAGTRAIL, // world model, skinnum, world model flags
NULL, // view model
"i_tagtoken", // icon
"Tag Token", // name printed when picked up
0, // number of digits for statusbar
0, // amount used / contained
NULL, // ammo type used
IT_POWERUP|IT_NOT_GIVEABLE|IT_ROGUE, // inventory flags
0,
NULL, // info (void *)
1, // tag
NULL, // precaches
},
// PGM
// ======================================
//
// KEYS
//
// 73
/*QUAKED key_data_cd (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
key for computer centers
*/
{
"key_data_cd",
Pickup_Key,
NULL,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/keys/data_cd/tris.md2", 0, EF_ROTATE,
NULL,
"k_datacd",
"Data CD",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY,
0,
NULL,
0,
"" // precache
},
// 74
/*QUAKED key_dstarchart (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
starchart in Makron's tomb
*/
{
"key_dstarchart",
Pickup_Key,
NULL,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/keys/data_cd/tris.md2", 1, EF_ROTATE,
NULL,
"k_dstarchart",
"Digital Starchart",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY,
0,
NULL,
0,
"" // precache
},
// 75
/*QUAKED key_power_cube (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN NO_TOUCH
warehouse circuits
*/
{
"key_power_cube",
Pickup_Key,
NULL,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/keys/power/tris.md2", 0, EF_ROTATE,
NULL,
"k_powercube",
"Power Cube",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY,
0,
NULL,
0,
"" // precache
},
// 76
/*QUAKED key_pyramid (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
key for the entrance of jail3
*/
{
"key_pyramid",
Pickup_Key,
NULL,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/keys/pyramid/tris.md2", 0, EF_ROTATE,
NULL,
"k_pyramid",
"Pyramid Key",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY,
0,
NULL,
0,
"" // precache
},
// 77
/*QUAKED key_data_spinner (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
key for the city computer
*/
{
"key_data_spinner",
Pickup_Key,
NULL,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/keys/spinner/tris.md2", 0, EF_ROTATE,
NULL,
"k_dataspin",
"Data Spinner",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY,
0,
NULL,
0,
"" // precache
},
// 78
/*QUAKED key_pass (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
security pass for the security level
*/
{
"key_pass",
Pickup_Key,
NULL,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/keys/pass/tris.md2", 0, EF_ROTATE,
NULL,
"k_security",
"Security Pass",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY,
0,
NULL,
0,
"" // precache
},
// 79
/*QUAKED key_blue_key (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
normal door key - blue
*/
{
"key_blue_key",
Pickup_Key,
NULL,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/keys/key/tris.md2", 0, EF_ROTATE,
NULL,
"k_bluekey",
"Blue Key",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY,
0,
NULL,
0,
"" // precache
},
// 80
/*QUAKED key_red_key (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
normal door key - red
*/
{
"key_red_key",
Pickup_Key,
NULL,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/keys/red_key/tris.md2", 0, EF_ROTATE,
NULL,
"k_redkey",
"Red Key",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY,
0,
NULL,
0,
"" // precache
},
// 81
// RAFAEL
/*QUAKED key_green_key (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
normal door key - green
*/
{
"key_green_key",
Pickup_Key,
NULL,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/keys/green_key/tris.md2", 0, EF_ROTATE,
NULL,
"k_green",
"Green Key",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY|IT_XATRIX,
0,
NULL,
0,
"" // precache
},
// 82
/*QUAKED key_commander_head (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
tank commander's head
*/
{
"key_commander_head",
Pickup_Key,
NULL,
Drop_General,
NULL,
"items/pkup.wav",
"models/monsters/commandr/head/tris.md2", 0, EF_GIB,
NULL,
"k_comhead", // icon
"Commander's Head", // pickup
2, // width
0,
NULL,
IT_STAY_COOP|IT_KEY,
0,
NULL,
0,
"" // precache
},
// 83
/*QUAKED key_airstrike_target (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
marker for airstrike
*/
{
"key_airstrike_target",
Pickup_Key,
NULL,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/keys/target/tris.md2", 0, EF_ROTATE,
NULL,
"i_airstrike", // icon
"Airstrike Marker", // pickup
2, // width
0,
NULL,
IT_STAY_COOP|IT_KEY,
0,
NULL,
0,
"" // precache
},
// ======================================
// PGM
// 84
/*QUAKED key_nuke_container (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"key_nuke_container", // classname
Pickup_Key, // pickup function
NULL, // use function
Drop_General, // drop function
NULL, // weapon think function
"items/pkup.wav", // pick up sound
"models/weapons/g_nuke/tris.md2", 0, EF_ROTATE, // world model, skinnum, world model flags
NULL, // view model
"i_contain", // icon
"Antimatter Pod", // name printed when picked up
2, // number of digits for statusbar
0, // respawn time
NULL, // ammo type used
IT_STAY_COOP|IT_KEY|IT_ROGUE, // inventory flags
0,
NULL, // info (void *)
0, // tag
"" // precache
},
// 85
/*QUAKED key_nuke (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
{
"key_nuke", // classname
Pickup_Key, // pickup function
NULL, // use function
Drop_General, // drop function
NULL, // weapon think function
"items/pkup.wav", // pick up sound
"models/weapons/g_nuke/tris.md2", 0, EF_ROTATE, // world model, skinnum, world model flags
NULL, // view model
"i_nuke", // icon
"Antimatter Bomb", // name printed when picked up
2, // number of digits for statusbar
0, // respawn time
NULL, // ammo type used
IT_STAY_COOP|IT_KEY|IT_ROGUE, // inventory flags
0,
NULL, // info (void *)
0, // tag
"" // precache
},
// PGM
// ======================================
// 86
// New item (sorta) for Citadel pack by Andrea Rosa
/*QUAKED key_mystery (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
key for Citadel Pack 3.0
*/
{
"key_mystery",
Pickup_Key,
NULL,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/keys/mystery/tris.md2", 0, EF_ROTATE,
NULL,
"k_mystery",
"Mystery Key",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY,
0,
NULL,
0,
"" // precache
},
// Zaero keys
// 87
/*QUAKED key_landing_arena (0 .5 .8) (-16 -16 -16) (16 16 16)
landing arena key - blue
*/
{
"key_landing_area",
Pickup_Key,
NULL,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/keys/key/tris.md2", 0, EF_ROTATE,
NULL,
"k_bluekey",
"Airfield Pass",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY,
0,
NULL,
0,
/* precache */ ""
},
// 88
/*QUAKED key_lab (0 .5 .8) (-16 -16 -16) (16 16 16)
security pass for the laboratory
*/
{
"key_lab",
Pickup_Key,
NULL,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/keys/pass/tris.md2", 0, EF_ROTATE,
NULL,
"k_security",
"Laboratory Key",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY,
0,
NULL,
0,
/* precache */ ""
},
// 89
/*QUAKED key_clearancepass (0 .5 .8) (-16 -16 -16) (16 16 16)
*/
{
"key_clearancepass",
Pickup_Key,
NULL,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/keys/pass/tris.md2", 0, EF_ROTATE,
NULL,
"k_security",
"Clearance Pass",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY,
0,
NULL,
0,
/* precache */ ""
},
// 90
/*QUAKED key_energy (0 .5 .8) (-16 -16 -16) (16 16 16)
*/
{
"key_energy",
Pickup_Key,
NULL,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/keys/energy/tris.md2", 0, EF_ROTATE,
NULL,
"k_energy",
"Energy Key",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY,
0,
NULL,
0,
/* precache */ ""
},
// 91
/*QUAKED key_lava (0 .5 .8) (-16 -16 -16) (16 16 16)
*/
{
"key_lava",
Pickup_Key,
NULL,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/keys/lava/tris.md2", 0, EF_ROTATE,
NULL,
"k_lava",
"Lava Key",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY,
0,
NULL,
0,
/* precache */ ""
},
// 92
/*QUAKED key_slime (0 .5 .8) (-16 -16 -16) (16 16 16)
*/
{
"key_slime",
Pickup_Key,
NULL,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/keys/slime/tris.md2", 0, EF_ROTATE,
NULL,
"k_slime",
"Slime Key",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY,
0,
NULL,
0,
/* precache */ ""
},
// 93
/*QUAKED key_q1_gold (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
medevial door key - gold
model="models/items/q1keys/gold/tris.md2"
*/
{
"key_q1_gold",
Pickup_Key,
NULL,
Drop_General,
NULL,
"q1items/medkey.wav",
"models/items/q1keys/gold/tris.md2", 0, EF_ROTATE,
NULL,
"k_med_gold",
"Gold Key",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY|IT_Q1,
0,
NULL,
0,
/* precache */ ""
},
// 94
/*QUAKED key_q1_silver (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
medevial door key - silver
model="models/items/q1keys/silver/tris.md2"
*/
{
"key_q1_silver",
Pickup_Key,
NULL,
Drop_General,
NULL,
"q1items/medkey.wav",
"models/items/q1keys/silver/tris.md2", 0, EF_ROTATE,
NULL,
"k_med_silver",
"Silver Key",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY|IT_Q1,
0,
NULL,
0,
/* precache */ ""
},
// 95
/*QUAKED runekey_q1_gold (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
runic door key - gold
model="models/items/q1keys/gold/rune/tris.md2"
*/
{
"runekey_q1_gold",
Pickup_Key,
NULL,
Drop_General,
NULL,
"q1items/runekey.wav",
"models/items/q1keys/gold/rune/tris.md2", 0, EF_ROTATE,
NULL,
"k_rune_gold",
"Gold Rune Key",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY|IT_Q1,
0,
NULL,
0,
/* precache */ ""
},
// 96
/*QUAKED runekey_q1_silver (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
runic door key - silver
model="models/items/q1keys/silver/rune/tris.md2"
*/
{
"runekey_q1_silver",
Pickup_Key,
NULL,
Drop_General,
NULL,
"q1items/runekey.wav",
"models/items/q1keys/silver/rune/tris.md2", 0, EF_ROTATE,
NULL,
"k_rune_silver",
"Silver Rune Key",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY|IT_Q1,
0,
NULL,
0,
/* precache */ ""
},
// 97
/*QUAKED basekey_q1_gold (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
base door key - gold
model="models/items/q1keys/gold/base/tris.md2"
*/
{
"basekey_q1_gold",
Pickup_Key,
NULL,
Drop_General,
NULL,
"q1items/basekey.wav",
"models/items/q1keys/gold/base/tris.md2", 0, EF_ROTATE,
NULL,
"k_base_gold",
"Gold Keycard",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY|IT_Q1,
0,
NULL,
0,
/* precache */ ""
},
// 98
/*QUAKED basekey_q1_silver (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
base door key - silver
model="models/items/q1keys/silver/base/tris.md2"
*/
{
"basekey_q1_silver",
Pickup_Key,
NULL,
Drop_General,
NULL,
"q1items/basekey.wav",
"models/items/q1keys/silver/base/tris.md2", 0, EF_ROTATE,
NULL,
"k_base_silver",
"Silver Keycard",
2,
0,
NULL,
IT_STAY_COOP|IT_KEY|IT_Q1,
0,
NULL,
0,
/* precache */ ""
},
/*
Insert new key items here
Key item template fields:
classname
pickup sound
model
skinnum
effects?
icon name
full (pickup) name
*/
// 99
{
NULL,
Pickup_Health,
NULL,
NULL,
NULL,
"items/pkup.wav",
NULL, 0, 0,
NULL,
"i_health", // icon
"Health", // pickup
3, // width
0,
NULL,
0,
0,
NULL,
0,
"items/s_health.wav items/n_health.wav items/l_health.wav items/m_health.wav" // precache PMM - health sound fix
},
// end of list marker
{NULL}
};
/*QUAKED item_health (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
void SP_item_health (edict_t *self)
{
if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
{
G_FreeEdict (self);
return;
}
self->model = "models/items/healing/medium/tris.md2";
self->count = 10;
SpawnItem (self, FindItem ("Health"));
gi.soundindex ("items/n_health.wav");
}
/*QUAKED item_health_small (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
void SP_item_health_small (edict_t *self)
{
if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
{
G_FreeEdict (self);
return;
}
self->model = "models/items/healing/stimpack/tris.md2";
self->count = sk_health_bonus_value->value; // Knightmare- made this cvar
SpawnItem (self, FindItem ("Health"));
self->style = HEALTH_IGNORE_MAX;
gi.soundindex ("items/s_health.wav");
}
/*QUAKED item_health_large (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
void SP_item_health_large (edict_t *self)
{
if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
{
G_FreeEdict (self);
return;
}
self->model = "models/items/healing/large/tris.md2";
self->count = 25;
SpawnItem (self, FindItem ("Health"));
gi.soundindex ("items/l_health.wav");
}
/*QUAKED item_health_mega (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
*/
void SP_item_health_mega (edict_t *self)
{
if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
{
G_FreeEdict (self);
return;
}
self->model = "models/items/mega_h/tris.md2";
self->count = 100;
SpawnItem (self, FindItem ("Health"));
gi.soundindex ("items/m_health.wav");
self->style = HEALTH_IGNORE_MAX|HEALTH_TIMED;
}
// RAFAEL
void SP_item_foodcube (edict_t *self)
{
if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
{
G_FreeEdict (self);
return;
}
self->model = "models/objects/trapfx/tris.md2";
SpawnItem (self, FindItem ("Health"));
self->spawnflags |= DROPPED_ITEM;
self->style = HEALTH_IGNORE_MAX|HEALTH_FOODCUBE;
//gi.soundindex ("items/s_health.wav");
gi.soundindex ("items/m_health.wav");
self->classname = "foodcube";
}
void InitItems (void)
{
game.num_items = sizeof(itemlist)/sizeof(itemlist[0]) - 1;
}
/*
===============
SetItemNames
Called by worldspawn
===============
*/
void SetItemNames (void)
{
int i;
gitem_t *it;
for (i=0 ; i<game.num_items ; i++)
{
it = &itemlist[i];
gi.configstring (CS_ITEMS+i, it->pickup_name);
}
noweapon_index = ITEM_INDEX(FindItem("No Weapon"));
jacket_armor_index = ITEM_INDEX(FindItem("Jacket Armor"));
combat_armor_index = ITEM_INDEX(FindItem("Combat Armor"));
body_armor_index = ITEM_INDEX(FindItem("Body Armor"));
power_screen_index = ITEM_INDEX(FindItem("Power Screen"));
power_shield_index = ITEM_INDEX(FindItem("Power Shield"));
shells_index = ITEM_INDEX(FindItem("Shells"));
bullets_index = ITEM_INDEX(FindItem("Bullets"));
grenades_index = ITEM_INDEX(FindItem("Grenades"));
rockets_index = ITEM_INDEX(FindItem("Rockets"));
cells_index = ITEM_INDEX(FindItem("Cells"));
slugs_index = ITEM_INDEX(FindItem("Slugs"));
fuel_index = ITEM_INDEX(FindItem("Fuel"));
homing_index = ITEM_INDEX(FindItem("Homing Rockets"));
rl_index = ITEM_INDEX(FindItem("Rocket Launcher"));
pr_index = ITEM_INDEX(FindItem(PLASMA_PICKUP_NAME)); // SKWiD MOD
hml_index = ITEM_INDEX(FindItem("Homing Rocket Launcher"));
pl_index = ITEM_INDEX(FindItem("prox launcher"));
magslug_index = ITEM_INDEX(FindItem("Magslug"));
flechettes_index = ITEM_INDEX(FindItem("Flechettes"));
prox_index = ITEM_INDEX(FindItem("Prox"));
disruptors_index = ITEM_INDEX(FindItem("Disruptors"));
tesla_index = ITEM_INDEX(FindItem("Tesla"));
trap_index = ITEM_INDEX(FindItem("Trap"));
shocksphere_index = ITEM_INDEX(FindItem("Shocksphere"));
flares_index = ITEM_INDEX(FindItem("Flares"));
tbombs_index = ITEM_INDEX(FindItem("IRED"));
empnuke_index = ITEM_INDEX(FindItem("EMPNuke"));
plasmashield_index = ITEM_INDEX(FindItem("Plasma Shield"));
// added for convenience with triger_key sound hack
key_q1_med_silver_index = ITEM_INDEX(FindItem("Silver Key"));
key_q1_med_gold_index = ITEM_INDEX(FindItem("Gold Key"));
key_q1_rune_silver_index = ITEM_INDEX(FindItem("Silver Rune Key"));
key_q1_rune_gold_index = ITEM_INDEX(FindItem("Gold Rune Key"));
key_q1_base_silver_index = ITEM_INDEX(FindItem("Silver Keycard"));
key_q1_base_gold_index = ITEM_INDEX(FindItem("Gold Keycard"));
}
#ifdef JETPACK_MOD
//==============================================================================
void Use_Jet ( edict_t *ent, gitem_t *item )
{
if(ent->client->jetpack)
{
// Currently on... turn it off and store remaining time
ent->client->jetpack = false;
ent->client->jetpack_framenum = 0;
// Force frame. While using the jetpack ClientThink forces the frame to
// stand20 when it really SHOULD be jump2. This is fine, but if we leave
// it at that then the player cycles through the wrong frames to complete
// his "jump" when the jetpack is turned off. The same thing is done in
// ClientThink when jetpack timer expires.
ent->s.frame = 67;
gi.sound(ent,CHAN_GIZMO,gi.soundindex("jetpack/shutdown.wav"), 1, ATTN_NORM, 0);
}
else
{
// Knightmare- don't allow activating during stasis- or player can't descend
if (level.freeze)
{
gi.dprintf("Cannot use jetpack while using stasis generator\n");
return;
}
// Currently off. Turn it on, and add time, if any, remaining
// from last jetpack.
if( ent->client->pers.inventory[ITEM_INDEX(item)] )
{
ent->client->jetpack = true;
// Lazarus: Never remove jetpack from inventory (unless dropped)
// ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
ent->client->jetpack_framenum = level.framenum;
ent->client->jetpack_activation = level.framenum;
}
else if(ent->client->pers.inventory[fuel_index] > 0)
{
ent->client->jetpack = true;
ent->client->jetpack_framenum = level.framenum;
ent->client->jetpack_activation = level.framenum;
}
else
return; // Shouldn't have been able to get here, but I'm a pessimist
gi.sound( ent, CHAN_GIZMO, gi.soundindex("jetpack/activate.wav"), 1, ATTN_NORM, 0);
}
}
#endif
// added stasis generator support
// Lazarus: Stasis field generator
void Use_Stasis ( edict_t *ent, gitem_t *item )
{
if(ent->client->jetpack)
{
gi.dprintf("Cannot use stasis generator while using jetpack\n");
return;
}
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
level.freeze = true;
level.freezeframes = 0;
gi.sound(ent, CHAN_ITEM, gi.soundindex("items/stasis_start.wav"), 1, ATTN_NORM, 0);
}
//===============
//ROGUE
void SP_xatrix_item (edict_t *self)
{
gitem_t *item;
int i;
char *spawnClass;
if (!self->classname)
return;
if (!strcmp(self->classname, "ammo_magslug"))
spawnClass = "ammo_flechettes";
else if (!strcmp(self->classname, "ammo_trap"))
spawnClass = "weapon_proxlauncher";
else if (!strcmp(self->classname, "item_quadfire"))
{
float chance;
chance = random();
if (chance < 0.2)
spawnClass = "item_sphere_hunter";
else if (chance < 0.6)
spawnClass = "item_sphere_vengeance";
else
spawnClass = "item_sphere_defender";
}
else if (!strcmp(self->classname, "weapon_boomer"))
spawnClass = "weapon_etf_rifle";
else if (!strcmp(self->classname, "weapon_phalanx"))
spawnClass = "weapon_plasmabeam";
// check item spawn functions
for (i=0,item=itemlist ; i<game.num_items ; i++,item++)
{
if (!item->classname)
continue;
if (!strcmp(item->classname, spawnClass))
{ // found it
SpawnItem (self, item);
return;
}
}
}
//ROGUE
//===============