2020-01-05 02:25:00 +00:00
|
|
|
#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);
|
2020-08-09 06:45:19 +00:00
|
|
|
void Weapon_Plasma_Rifle (edict_t *ent); // SKWiD MOD
|
2020-01-05 02:25:00 +00:00
|
|
|
void Weapon_HomingMissileLauncher (edict_t *ent);
|
|
|
|
void Weapon_Null(edict_t *ent);
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// *** 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);
|
|
|
|
|
|
|
|
|
2020-01-05 02:25:00 +00:00
|
|
|
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;
|
2020-08-09 06:45:19 +00:00
|
|
|
int pr_index; // SKWiD MOD
|
2020-01-05 02:25:00 +00:00
|
|
|
int magslug_index;
|
|
|
|
int flechettes_index;
|
|
|
|
int prox_index;
|
|
|
|
int disruptors_index;
|
|
|
|
int tesla_index;
|
|
|
|
int trap_index;
|
|
|
|
int shocksphere_index;
|
2020-08-09 06:45:19 +00:00
|
|
|
int flares_index;
|
|
|
|
int tbombs_index;
|
|
|
|
int empnuke_index;
|
|
|
|
int plasmashield_index;
|
2020-01-05 02:25:00 +00:00
|
|
|
|
2020-03-08 08:07:40 +00:00
|
|
|
// 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;
|
|
|
|
|
|
|
|
|
2020-01-05 02:25:00 +00:00
|
|
|
#define HEALTH_IGNORE_MAX 1
|
|
|
|
#define HEALTH_TIMED 2
|
|
|
|
#define HEALTH_FOODCUBE 4
|
2020-12-03 08:38:07 +00:00
|
|
|
#define HEALTH_SMALL 8
|
|
|
|
#define HEALTH_LARGE 16
|
2020-01-05 02:25:00 +00:00
|
|
|
|
|
|
|
|
|
|
|
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;
|
2020-08-09 06:45:19 +00:00
|
|
|
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;
|
2020-01-05 02:25:00 +00:00
|
|
|
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
|
2020-09-04 07:39:59 +00:00
|
|
|
if (randomrespawn && randomrespawn->value)
|
2020-01-05 02:25:00 +00:00
|
|
|
{
|
|
|
|
edict_t *newEnt;
|
|
|
|
|
|
|
|
newEnt = DoRandomRespawn (ent);
|
|
|
|
|
|
|
|
// if we've changed entities, then do some sleight of hand.
|
|
|
|
// otherwise, the old entity will respawn
|
2020-09-04 07:39:59 +00:00
|
|
|
if (newEnt)
|
2020-01-05 02:25:00 +00:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
|
2021-04-12 01:07:08 +00:00
|
|
|
// Can only pickup one flashlight
|
2020-01-05 02:25:00 +00:00
|
|
|
if (!strcmp(ent->classname, "item_flashlight") && quantity >= 1)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
#ifdef JETPACK_MOD
|
2020-09-04 07:39:59 +00:00
|
|
|
if ( !Q_stricmp(ent->classname,"item_jetpack") )
|
2020-01-05 02:25:00 +00:00
|
|
|
{
|
|
|
|
gitem_t *fuel;
|
|
|
|
|
2020-09-04 07:39:59 +00:00
|
|
|
if ( quantity >= 1 )
|
2020-01-05 02:25:00 +00:00
|
|
|
return false;
|
|
|
|
|
|
|
|
fuel = FindItem("Fuel");
|
2020-09-04 07:39:59 +00:00
|
|
|
if (ent->count < 0)
|
2020-01-05 02:25:00 +00:00
|
|
|
{
|
|
|
|
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)]++;
|
|
|
|
|
2021-04-12 01:07:08 +00:00
|
|
|
// Knightmare- set cell usage for flashlight
|
2020-01-05 02:25:00 +00:00
|
|
|
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
|
2020-09-04 07:39:59 +00:00
|
|
|
if (ent->item->use == Use_Jet) return true;
|
2020-01-05 02:25:00 +00:00
|
|
|
#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
|
2020-09-04 07:39:59 +00:00
|
|
|
/* if (ent->item->use)
|
2020-01-05 02:25:00 +00:00
|
|
|
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)
|
|
|
|
{
|
2020-09-04 07:39:59 +00:00
|
|
|
if (ent->client->jetpack)
|
2020-01-05 02:25:00 +00:00
|
|
|
gi.cprintf(ent,PRINT_HIGH,"Cannot drop jetpack in use\n");
|
|
|
|
else
|
|
|
|
{
|
|
|
|
edict_t *dropped;
|
|
|
|
|
|
|
|
dropped = Drop_Item (ent, item);
|
2020-09-04 07:39:59 +00:00
|
|
|
if (ent->client->jetpack_infinite)
|
2020-01-05 02:25:00 +00:00
|
|
|
{
|
|
|
|
dropped->count = -1;
|
|
|
|
ent->client->pers.inventory[fuel_index] = 0;
|
|
|
|
ent->client->jetpack_infinite = false;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
dropped->count = ent->client->pers.inventory[fuel_index];
|
2020-09-04 07:39:59 +00:00
|
|
|
if (dropped->count > 500)
|
2020-01-05 02:25:00 +00:00
|
|
|
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)
|
|
|
|
{
|
2020-08-17 04:41:24 +00:00
|
|
|
if (!deathmatch->value) {
|
2020-01-05 02:25:00 +00:00
|
|
|
other->max_health += 1;
|
2020-08-17 04:41:24 +00:00
|
|
|
// Knightmare- copy max health to client_persistant_t
|
|
|
|
// Fixes health reverting to prev max_health value on
|
|
|
|
// map change when game is not saved first
|
|
|
|
if (other->client)
|
|
|
|
other->client->pers.max_health = other->max_health;
|
|
|
|
}
|
2020-01-05 02:25:00 +00:00
|
|
|
|
|
|
|
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;
|
2020-08-17 04:41:24 +00:00
|
|
|
// Knightmare- copy max health to client_persistant_t
|
|
|
|
// Fixes health reverting to prev max_health value on
|
|
|
|
// map change when game is not saved first
|
|
|
|
if (other->client)
|
|
|
|
other->client->pers.max_health = other->max_health;
|
2020-01-05 02:25:00 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
|
2020-04-07 06:02:54 +00:00
|
|
|
// Knightmare- override ammo pickup values with cvars
|
2020-01-05 02:25:00 +00:00
|
|
|
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;
|
|
|
|
|
2020-04-07 06:02:54 +00:00
|
|
|
// PMM
|
2020-01-05 02:25:00 +00:00
|
|
|
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;
|
2020-04-07 06:02:54 +00:00
|
|
|
// pmm
|
|
|
|
|
2020-01-05 02:25:00 +00:00
|
|
|
if (other->client->pers.max_fuel < sk_bando_fuel->value)
|
|
|
|
other->client->pers.max_fuel = sk_bando_fuel->value;
|
|
|
|
|
2020-04-07 06:02:54 +00:00
|
|
|
// Zaero
|
2020-08-09 06:45:19 +00:00
|
|
|
if (other->client->pers.max_flares < sk_bando_flares->value)
|
|
|
|
other->client->pers.max_flares = sk_bando_flares->value;
|
2020-04-07 06:02:54 +00:00
|
|
|
// end Zaero
|
2020-01-05 02:25:00 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
|
2020-04-07 06:02:54 +00:00
|
|
|
// Knightmare- override ammo pickup values with cvars
|
2020-01-05 02:25:00 +00:00
|
|
|
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;
|
|
|
|
|
2020-04-07 06:02:54 +00:00
|
|
|
// PMM
|
2020-01-05 02:25:00 +00:00
|
|
|
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;
|
2020-04-07 06:02:54 +00:00
|
|
|
// pmm
|
|
|
|
|
2020-01-05 02:25:00 +00:00
|
|
|
if (other->client->pers.max_fuel < sk_pack_fuel->value)
|
|
|
|
other->client->pers.max_fuel = sk_pack_fuel->value;
|
2020-04-07 06:02:54 +00:00
|
|
|
|
|
|
|
// Zaero
|
2020-08-09 06:45:19 +00:00
|
|
|
if (other->client->pers.max_flares < sk_pack_flares->value)
|
2020-04-07 06:02:54 +00:00
|
|
|
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;
|
2020-08-09 06:45:19 +00:00
|
|
|
/* if (other->client->pers.max_a2k < sk_pack_a2k->value)
|
|
|
|
other->client->pers.max_a2k = sk_pack_a2k->value;*/
|
2020-04-07 06:02:54 +00:00
|
|
|
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)
|
2020-08-09 06:45:19 +00:00
|
|
|
other->client->pers.max_plasmashield = sk_pack_plasmashield->value;
|
2020-04-07 06:02:54 +00:00
|
|
|
// end Zaero
|
|
|
|
|
2020-01-05 02:25:00 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
2020-08-09 06:45:19 +00:00
|
|
|
|
2020-01-05 02:25:00 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2020-04-07 06:02:54 +00:00
|
|
|
// PMM
|
2020-01-05 02:25:00 +00:00
|
|
|
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;
|
|
|
|
}
|
2020-04-07 06:02:54 +00:00
|
|
|
// pmm
|
2020-08-09 06:45:19 +00:00
|
|
|
|
|
|
|
// 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
|
|
|
|
|
2020-01-05 02:25:00 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// Knightmare
|
2020-01-05 02:25:00 +00:00
|
|
|
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]);
|
2020-09-04 07:39:59 +00:00
|
|
|
if (ang<0)
|
2020-01-05 02:25:00 +00:00
|
|
|
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);
|
|
|
|
|
2020-09-04 07:39:59 +00:00
|
|
|
if (!FindSpawnPoint(createPt, ent->mins, ent->maxs, spawnPt, 32))
|
2020-01-05 02:25:00 +00:00
|
|
|
return;
|
|
|
|
|
2020-09-04 07:39:59 +00:00
|
|
|
if (!CheckGroundSpawnPoint(spawnPt, ent->mins, ent->maxs, 64, -1))
|
2020-01-05 02:25:00 +00:00
|
|
|
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;
|
|
|
|
|
2020-09-04 07:39:59 +00:00
|
|
|
//if (!(deathmatch->value)) // item is DM only
|
2020-01-05 02:25:00 +00:00
|
|
|
//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;
|
|
|
|
|
2020-09-04 07:39:59 +00:00
|
|
|
if (other->client && other->client->owned_sphere)
|
2020-01-05 02:25:00 +00:00
|
|
|
{
|
|
|
|
// 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
|
2020-09-04 07:39:59 +00:00
|
|
|
if (ent->item->use)
|
2020-01-05 02:25:00 +00:00
|
|
|
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)
|
|
|
|
{
|
2020-09-04 07:39:59 +00:00
|
|
|
if (ent->client && ent->client->owned_sphere)
|
2020-01-05 02:25:00 +00:00
|
|
|
{
|
|
|
|
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)
|
|
|
|
{
|
2020-09-04 07:39:59 +00:00
|
|
|
if (ent->client && ent->client->owned_sphere)
|
2020-01-05 02:25:00 +00:00
|
|
|
{
|
|
|
|
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)
|
|
|
|
{
|
2020-09-04 07:39:59 +00:00
|
|
|
if (ent->client && ent->client->owned_sphere)
|
2020-01-05 02:25:00 +00:00
|
|
|
{
|
|
|
|
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;
|
2020-08-09 06:45:19 +00:00
|
|
|
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;
|
2020-01-05 02:25:00 +00:00
|
|
|
|
|
|
|
// 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;
|
|
|
|
}
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// Knightmare- this function overrides ammo pickup values with cvars
|
|
|
|
void SetAmmoPickupValues (void)
|
2020-01-05 02:25:00 +00:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
item = FindItem("Trap");
|
|
|
|
if (item)
|
|
|
|
item->quantity = sk_box_trap->value;
|
|
|
|
|
2020-01-05 02:25:00 +00:00
|
|
|
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;
|
2020-08-09 06:45:19 +00:00
|
|
|
|
|
|
|
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;
|
2020-01-05 02:25:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
qboolean Pickup_Ammo (edict_t *ent, edict_t *other)
|
|
|
|
{
|
|
|
|
int oldcount;
|
|
|
|
int count;
|
|
|
|
qboolean weapon;
|
|
|
|
|
2020-10-29 17:03:20 +00:00
|
|
|
// Knightmare- override ammo pickup values with cvars
|
2020-01-05 02:25:00 +00:00
|
|
|
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;
|
|
|
|
|
2020-10-29 17:03:20 +00:00
|
|
|
// backup current health upon getting megahealth
|
2020-01-05 02:25:00 +00:00
|
|
|
/* 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;
|
|
|
|
|
2020-10-29 17:03:20 +00:00
|
|
|
// stimpacks shouldn't rot away
|
2020-01-05 02:25:00 +00:00
|
|
|
/* 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;
|
|
|
|
}
|
|
|
|
|
2020-05-14 07:38:00 +00:00
|
|
|
// Knightmare- rewrote this to differentiate between power shield and power screen
|
2020-01-05 02:25:00 +00:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
|
|
|
//======================================================================
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 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
|
|
|
|
|
|
|
|
//======================================================================
|
|
|
|
|
2020-01-05 02:25:00 +00:00
|
|
|
/*
|
|
|
|
===============
|
|
|
|
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);
|
2020-12-03 08:38:07 +00:00
|
|
|
else if (ent->style == (HEALTH_IGNORE_MAX|HEALTH_TIMED)) // if (ent->count == 100)
|
|
|
|
gi.sound(other, CHAN_ITEM, gi.soundindex("items/m_health.wav"), 1, ATTN_NORM, 0);
|
|
|
|
else if (ent->style & HEALTH_SMALL) // if (ent->count < 10) // Knightmare
|
2020-01-05 02:25:00 +00:00
|
|
|
gi.sound(other, CHAN_ITEM, gi.soundindex("items/s_health.wav"), 1, ATTN_NORM, 0);
|
2020-12-03 08:38:07 +00:00
|
|
|
else if (ent->style & HEALTH_LARGE) // if (ent->count == 25)
|
2020-01-05 02:25:00 +00:00
|
|
|
gi.sound(other, CHAN_ITEM, gi.soundindex("items/l_health.wav"), 1, ATTN_NORM, 0);
|
2020-12-03 08:38:07 +00:00
|
|
|
else // if (ent->count == 10)
|
|
|
|
gi.sound(other, CHAN_ITEM, gi.soundindex("items/n_health.wav"), 1, ATTN_NORM, 0);
|
2020-01-05 02:25:00 +00:00
|
|
|
}
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-29 17:03:20 +00:00
|
|
|
// Knightmare added
|
|
|
|
/*
|
|
|
|
===============
|
|
|
|
Touch_Q1Backpack
|
|
|
|
===============
|
|
|
|
*/
|
|
|
|
void Touch_Q1Backpack (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf)
|
|
|
|
{
|
|
|
|
qboolean taken;
|
|
|
|
|
|
|
|
// if (other == ent->owner) // can't be touched by the entity that dropped us
|
|
|
|
// return;
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
// gi.sound(other, CHAN_ITEM, gi.soundindex("q1weapons/lock4.wav"), 1, ATTN_NORM, 0);
|
|
|
|
/* if (ent->noise_index != 0) {
|
|
|
|
gi.sound(other, CHAN_ITEM, ent->noise_index, 1, ATTN_NORM, 0);
|
|
|
|
}*/
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!taken)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Lazarus reflections
|
|
|
|
DeleteReflection (ent, -1);
|
|
|
|
|
|
|
|
// just delete it, no respawning
|
|
|
|
G_FreeEdict (ent);
|
|
|
|
}
|
|
|
|
// end Knightmare
|
|
|
|
|
2020-01-05 02:25:00 +00:00
|
|
|
//======================================================================
|
|
|
|
|
|
|
|
/*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*/
|
2020-10-29 17:03:20 +00:00
|
|
|
if (ent->solid != SOLID_BSP) // Knightmare- hack for items dropped by shootable boxes
|
2020-01-05 02:25:00 +00:00
|
|
|
VectorScale (forward, 100, dropped->velocity);
|
|
|
|
|
2020-10-29 17:03:20 +00:00
|
|
|
if (!strcmp(ent->classname, "func_pushable")) // Make items dropped by movable crates destroyable
|
2020-01-05 02:25:00 +00:00
|
|
|
{
|
|
|
|
dropped->spawnflags |= ITEM_SHOOTABLE;
|
|
|
|
dropped->solid = SOLID_BBOX;
|
|
|
|
dropped->health = 20;
|
|
|
|
dropped->takedamage = DAMAGE_YES;
|
2020-10-29 17:03:20 +00:00
|
|
|
// dropped->die = BecomeExplosion1;
|
|
|
|
// Knightmare- this compiles cleaner
|
2020-01-05 02:25:00 +00:00
|
|
|
dropped->die = Item_Die;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
dropped->velocity[2] += 300;
|
|
|
|
|
|
|
|
dropped->think = drop_make_touchable;
|
|
|
|
dropped->nextthink = level.time + 1;
|
|
|
|
|
|
|
|
gi.linkentity (dropped);
|
|
|
|
|
|
|
|
return dropped;
|
|
|
|
}
|
|
|
|
|
2020-10-29 17:03:20 +00:00
|
|
|
// Knightmare added
|
|
|
|
/*
|
|
|
|
============
|
|
|
|
Drop_Q1Backpack
|
|
|
|
|
|
|
|
Spawns backpack dropped by Q1 monsters.
|
|
|
|
Similar to Drop_Item, but the backpack is not an item in the item table.
|
|
|
|
It contains an item instead.
|
|
|
|
============
|
|
|
|
*/
|
|
|
|
edict_t *Drop_Q1Backpack (edict_t *ent, gitem_t *item, int count)
|
|
|
|
{
|
|
|
|
edict_t *backpack;
|
|
|
|
vec3_t forward, right;
|
|
|
|
vec3_t offset;
|
|
|
|
|
|
|
|
if (!ent)
|
|
|
|
return NULL;
|
|
|
|
if (!item) {
|
|
|
|
gi.dprintf ("Drop_Q1Backpack: invalid item\n");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
backpack = G_Spawn();
|
|
|
|
|
|
|
|
backpack->classname = "misc_q1_backpack";
|
|
|
|
backpack->item = item;
|
|
|
|
backpack->count = count;
|
|
|
|
backpack->touch = Touch_Q1Backpack;
|
|
|
|
backpack->spawnflags = DROPPED_ITEM;
|
|
|
|
backpack->s.skinnum = 0;
|
|
|
|
backpack->s.effects = EF_ROTATE;
|
|
|
|
backpack->s.renderfx = RF_GLOW | RF_IR_VISIBLE;
|
|
|
|
backpack->s.angles[1] = ent->s.angles[1]; // Knightmare- preserve yaw from dropping entity
|
|
|
|
backpack->s.angles[1] += crandom() * 45;
|
|
|
|
// backpack->noise_index = gi.soundindex("q1weapons/lock4.wav");
|
|
|
|
|
|
|
|
VectorSet (backpack->mins, -16, -16, -16);
|
|
|
|
VectorSet (backpack->maxs, 16, 16, 16);
|
|
|
|
gi.setmodel (backpack, "models/items/q1backpack/tris.md2");
|
|
|
|
backpack->solid = SOLID_TRIGGER;
|
|
|
|
backpack->movetype = MOVETYPE_TOSS;
|
|
|
|
backpack->touch = drop_temp_touch;
|
|
|
|
backpack->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, backpack->s.origin);
|
|
|
|
trace = gi.trace (ent->s.origin, backpack->mins, backpack->maxs,
|
|
|
|
backpack->s.origin, ent, CONTENTS_SOLID);
|
|
|
|
VectorCopy (trace.endpos, backpack->s.origin);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
AngleVectors (ent->s.angles, forward, right, NULL);
|
|
|
|
VectorCopy (ent->s.origin, backpack->s.origin);
|
|
|
|
}
|
|
|
|
|
|
|
|
VectorScale (forward, 100, backpack->velocity);
|
|
|
|
|
|
|
|
backpack->velocity[2] += 300;
|
|
|
|
|
|
|
|
backpack->think = G_FreeEdict;
|
|
|
|
backpack->nextthink = level.time + 1800;
|
|
|
|
|
|
|
|
gi.linkentity (backpack);
|
|
|
|
|
|
|
|
return backpack;
|
|
|
|
}
|
|
|
|
// end Knightmare
|
|
|
|
|
2020-01-05 02:25:00 +00:00
|
|
|
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;
|
|
|
|
|
2020-05-14 07:38:00 +00:00
|
|
|
if (!(ent->spawnflags & ITEM_NO_DROPTOFLOOR)) // Knightmare- allow marked items to spawn in solids
|
2020-01-05 02:25:00 +00:00
|
|
|
{
|
|
|
|
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.
|
2020-09-04 07:39:59 +00:00
|
|
|
if (!strcmp(ent->classname, "key_power_cube"))
|
2020-01-05 02:25:00 +00:00
|
|
|
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;
|
2020-11-23 09:07:08 +00:00
|
|
|
if (ent->skinnum) // Knightmare- use mapper-specified skinnum
|
|
|
|
ent->s.skinnum = ent->skinnum;
|
|
|
|
else
|
|
|
|
ent->s.skinnum = item->world_model_skinnum; // Knightmare- skinnum specified in item table
|
2020-01-05 02:25:00 +00:00
|
|
|
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
|
|
|
|
//
|
|
|
|
|
2020-03-08 08:07:40 +00:00
|
|
|
// 1
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"i_bodyarmor", // icon
|
|
|
|
"Body Armor", // pickup
|
|
|
|
3, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
IT_ARMOR,
|
|
|
|
0,
|
|
|
|
&bodyarmor_info,
|
|
|
|
ARMOR_BODY,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-03-08 08:07:40 +00:00
|
|
|
// 2
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"i_combatarmor", // icon
|
|
|
|
"Combat Armor", // pickup
|
|
|
|
3, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
IT_ARMOR,
|
|
|
|
0,
|
|
|
|
&combatarmor_info,
|
|
|
|
ARMOR_COMBAT,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-03-08 08:07:40 +00:00
|
|
|
// 3
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"i_jacketarmor", // icon
|
|
|
|
"Jacket Armor", // pickup
|
|
|
|
3, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
IT_ARMOR,
|
|
|
|
0,
|
|
|
|
&jacketarmor_info,
|
|
|
|
ARMOR_JACKET,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-03-08 08:07:40 +00:00
|
|
|
// 4
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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
|
2020-08-09 06:45:19 +00:00
|
|
|
"i_shard", // icon
|
2020-01-05 02:25:00 +00:00
|
|
|
#else
|
2020-08-09 06:45:19 +00:00
|
|
|
"i_jacketarmor", // icon
|
2020-01-05 02:25:00 +00:00
|
|
|
#endif
|
2020-08-09 06:45:19 +00:00
|
|
|
"Armor Shard", // pickup
|
|
|
|
3, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
IT_ARMOR,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
ARMOR_SHARD,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
//Knightmare- armor shard that lies flat on the ground
|
2020-03-08 08:07:40 +00:00
|
|
|
// 5
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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
|
2020-08-09 06:45:19 +00:00
|
|
|
"i_shard", // icon
|
2020-01-05 02:25:00 +00:00
|
|
|
#else
|
2020-08-09 06:45:19 +00:00
|
|
|
"i_jacketarmor", // icon
|
2020-01-05 02:25:00 +00:00
|
|
|
#endif
|
2020-08-09 06:45:19 +00:00
|
|
|
"Armor Shard", // pickup
|
|
|
|
3, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
IT_ARMOR,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
ARMOR_SHARD,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-03-08 08:07:40 +00:00
|
|
|
// 6
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"i_powerscreen", // icon
|
|
|
|
"Power Screen", // pickup
|
|
|
|
0, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
60,
|
|
|
|
NULL,
|
|
|
|
IT_ARMOR,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"misc/power2.wav misc/power1.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-03-08 08:07:40 +00:00
|
|
|
// 7
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"i_powershield", // icon
|
|
|
|
"Power Shield", // pickup
|
|
|
|
0, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
60,
|
|
|
|
NULL,
|
|
|
|
IT_ARMOR,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"misc/power2.wav misc/power1.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
//
|
|
|
|
// WEAPONS
|
|
|
|
//
|
2020-03-08 08:07:40 +00:00
|
|
|
// 8
|
2020-08-09 06:45:19 +00:00
|
|
|
/*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
|
2020-01-05 02:25:00 +00:00
|
|
|
/* 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",
|
2020-08-09 06:45:19 +00:00
|
|
|
"w_blaster", // icon
|
|
|
|
"Blaster", // pickup
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
IT_WEAPON|IT_STAY_COOP,
|
|
|
|
WEAP_BLASTER,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"weapons/blastf1a.wav misc/lasfly.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 10
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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",
|
2020-08-09 06:45:19 +00:00
|
|
|
"w_shotgun", // icon
|
|
|
|
"Shotgun", // pickup
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
1,
|
|
|
|
"Shells",
|
|
|
|
IT_WEAPON|IT_STAY_COOP,
|
|
|
|
WEAP_SHOTGUN,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"weapons/shotgf1b.wav weapons/shotgr1b.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 11
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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",
|
2020-08-09 06:45:19 +00:00
|
|
|
"w_sshotgun", // icon
|
|
|
|
"Super Shotgun", // pickup
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
2,
|
|
|
|
"Shells",
|
|
|
|
IT_WEAPON|IT_STAY_COOP,
|
|
|
|
WEAP_SUPERSHOTGUN,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"weapons/sshotf1b.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 12
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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",
|
2020-08-09 06:45:19 +00:00
|
|
|
"w_machinegun", // icon
|
|
|
|
"Machinegun", // pickup
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
1,
|
|
|
|
"Bullets",
|
|
|
|
IT_WEAPON|IT_STAY_COOP,
|
|
|
|
WEAP_MACHINEGUN,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"weapons/machgf1b.wav weapons/machgf2b.wav weapons/machgf3b.wav weapons/machgf4b.wav weapons/machgf5b.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 13
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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",
|
2020-08-09 06:45:19 +00:00
|
|
|
"w_chaingun", // icon
|
|
|
|
"Chaingun", // pickup
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
1,
|
|
|
|
"Bullets",
|
|
|
|
IT_WEAPON|IT_STAY_COOP,
|
|
|
|
WEAP_CHAINGUN,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-23 22:04:50 +00:00
|
|
|
"weapons/chngnu1a.wav weapons/chngnl1a.wav weapons/machgf3b.wav weapons/chngnd1a.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 14
|
2020-01-05 02:25:00 +00:00
|
|
|
// 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
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 15
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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",
|
2020-08-09 06:45:19 +00:00
|
|
|
"a_grenades", // icon
|
|
|
|
"Grenades", // pickup
|
|
|
|
3, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
5,
|
|
|
|
"grenades",
|
|
|
|
IT_AMMO|IT_WEAPON,
|
|
|
|
WEAP_GRENADES,
|
|
|
|
NULL,
|
|
|
|
AMMO_GRENADES,
|
2021-04-23 09:08:26 +00:00
|
|
|
"models/objects/grenade2/tris.md2 weapons/hgrent1a.wav weapons/hgrena1b.wav weapons/hgrenc1b.wav weapons/hgrenb1a.wav weapons/hgrenb2a.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 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
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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",
|
2020-08-09 06:45:19 +00:00
|
|
|
"w_glauncher", // icon
|
|
|
|
"Grenade Launcher", // pickup
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
1,
|
|
|
|
"Grenades",
|
|
|
|
IT_WEAPON|IT_STAY_COOP,
|
|
|
|
WEAP_GRENADELAUNCHER,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"models/objects/grenade/tris.md2 weapons/grenlf1a.wav weapons/grenlr1b.wav weapons/grenlb1b.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 18
|
2020-01-05 02:25:00 +00:00
|
|
|
// 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
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 19
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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",
|
2020-08-09 06:45:19 +00:00
|
|
|
"w_rlauncher", // icon
|
|
|
|
"Rocket Launcher", // pickup
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
1,
|
|
|
|
"Rockets",
|
|
|
|
IT_WEAPON|IT_STAY_COOP,
|
|
|
|
WEAP_ROCKETLAUNCHER,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"models/objects/rocket/tris.md2 weapons/rockfly.wav weapons/rocklf1a.wav weapons/rocklr1b.wav models/objects/debris2/tris.md2" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 20
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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",
|
2020-08-09 06:45:19 +00:00
|
|
|
"w_hyperblaster", // icon
|
|
|
|
"HyperBlaster", // pickup
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
1,
|
|
|
|
"Cells",
|
|
|
|
IT_WEAPON|IT_STAY_COOP,
|
|
|
|
WEAP_HYPERBLASTER,
|
|
|
|
NULL,
|
|
|
|
0,
|
2021-07-09 23:54:05 +00:00
|
|
|
"weapons/hyprbl1a.wav weapons/hyprbf1a.wav weapons/hyprbd1a.wav misc/lasfly.wav" // removed weapons/hyprbu1a.wav
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 21
|
2020-01-05 02:25:00 +00:00
|
|
|
// 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
|
|
|
|
},
|
2020-08-09 06:45:19 +00:00
|
|
|
// ROGUE
|
2020-01-05 02:25:00 +00:00
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 22
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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",
|
2020-08-09 06:45:19 +00:00
|
|
|
"w_ripper", // icon
|
|
|
|
"ION Ripper", /// pickup
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
2,
|
|
|
|
"Cells",
|
|
|
|
IT_WEAPON|IT_STAY_COOP|IT_XATRIX,
|
|
|
|
WEAP_BOOMER,
|
|
|
|
NULL,
|
|
|
|
0,
|
|
|
|
#ifdef KMQUAKE2_ENGINE_MOD
|
2020-08-09 06:45:19 +00:00
|
|
|
"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
|
2020-01-05 02:25:00 +00:00
|
|
|
#else
|
2020-08-09 06:45:19 +00:00
|
|
|
"weapons/rippfire.wav misc/lasfly.wav models/objects/boomrang/tris.md2" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
#endif
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 23
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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",
|
2020-08-09 06:45:19 +00:00
|
|
|
"w_railgun", // icon
|
|
|
|
"Railgun", // pickup
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
1,
|
|
|
|
"Slugs",
|
|
|
|
IT_WEAPON|IT_STAY_COOP,
|
|
|
|
WEAP_RAILGUN,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"weapons/rg_hum.wav weapons/railgf1a.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 24
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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",
|
2020-08-09 06:45:19 +00:00
|
|
|
"w_phallanx", // icon
|
|
|
|
"Phalanx", // pickup
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
1,
|
|
|
|
"Magslug",
|
|
|
|
IT_WEAPON|IT_STAY_COOP|IT_XATRIX,
|
|
|
|
WEAP_PHALANX,
|
|
|
|
NULL,
|
|
|
|
0,
|
|
|
|
#ifdef KMQUAKE2_ENGINE_MOD
|
2020-08-09 06:45:19 +00:00
|
|
|
"sprites/s_photon.sp2 eapons/plasshot.wav weapons/phaloop.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
#else
|
2020-08-09 06:45:19 +00:00
|
|
|
"sprites/s_photon.sp2 weapons/plasshot.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
#endif
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 25
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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",
|
2020-08-09 06:45:19 +00:00
|
|
|
"w_bfg", // icon
|
|
|
|
"BFG10K", // pickup
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
50,
|
|
|
|
"Cells",
|
|
|
|
IT_WEAPON|IT_STAY_COOP,
|
|
|
|
WEAP_BFG,
|
|
|
|
NULL,
|
|
|
|
0,
|
|
|
|
#ifdef KMQUAKE2_ENGINE_MOD
|
2020-08-09 06:45:19 +00:00
|
|
|
"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
|
2020-01-05 02:25:00 +00:00
|
|
|
#else
|
2020-08-09 06:45:19 +00:00
|
|
|
"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
|
2020-01-05 02:25:00 +00:00
|
|
|
#endif
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 26
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 27
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 28
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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"
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 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
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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",
|
2020-08-09 06:45:19 +00:00
|
|
|
NULL, // icon
|
|
|
|
"Homing Rocket Launcher", // pickup
|
2020-01-05 02:25:00 +00:00
|
|
|
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"
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 31
|
2020-01-05 02:25:00 +00:00
|
|
|
// 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
|
|
|
|
//
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 32
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"a_shells", // icon
|
|
|
|
"Shells", // pickup
|
|
|
|
3, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
10,
|
|
|
|
NULL,
|
|
|
|
IT_AMMO,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
AMMO_SHELLS,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 33
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"a_bullets", // icon
|
|
|
|
"Bullets", // pickup
|
|
|
|
3, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
50,
|
|
|
|
NULL,
|
|
|
|
IT_AMMO,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
AMMO_BULLETS,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 34
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"a_cells", // icon
|
|
|
|
"Cells", // pickup
|
|
|
|
3, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
50,
|
|
|
|
NULL,
|
|
|
|
IT_AMMO,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
AMMO_CELLS,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 35
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"a_rockets", // icon
|
|
|
|
"Rockets", // pickup
|
|
|
|
3, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
5,
|
|
|
|
NULL,
|
|
|
|
IT_AMMO,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
AMMO_ROCKETS,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 36
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"a_homing", // icon
|
|
|
|
"Homing Rockets", // pickup
|
|
|
|
3, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
5,
|
|
|
|
NULL,
|
|
|
|
IT_AMMO|IT_LAZARUS,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
AMMO_HOMING_ROCKETS,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 37
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"a_slugs", // icon
|
|
|
|
"Slugs", // pickup
|
|
|
|
3, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
10,
|
|
|
|
NULL,
|
|
|
|
IT_AMMO,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
AMMO_SLUGS,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 38
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"a_mslugs", // icon
|
|
|
|
"Magslug", // pickup
|
|
|
|
3, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
10,
|
|
|
|
NULL,
|
|
|
|
IT_AMMO|IT_XATRIX,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
AMMO_MAGSLUG,
|
2020-08-09 06:45:19 +00:00
|
|
|
/* precache */ "" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 39
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
AMMO_FLECHETTES,
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 40
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 41
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 42
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 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
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 45
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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",
|
2020-08-09 06:45:19 +00:00
|
|
|
"a_trap", // icon
|
|
|
|
"Trap", // pickup
|
|
|
|
3, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
1,
|
|
|
|
"trap",
|
|
|
|
IT_AMMO|IT_WEAPON|IT_XATRIX,
|
|
|
|
WEAP_GRENADES, //WEAP_TRAP
|
|
|
|
NULL,
|
|
|
|
AMMO_TRAP,
|
2020-08-09 06:45:19 +00:00
|
|
|
"weapons/trapcock.wav weapons/traploop.wav weapons/trapsuck.wav weapons/trapdown.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 46
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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"
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 47
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"weapons/nukewarn2.wav world/rumble.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 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
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
//
|
|
|
|
// POWERUP ITEMS
|
|
|
|
//
|
2020-08-09 06:45:19 +00:00
|
|
|
|
|
|
|
// 50
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"p_quad", // icon
|
|
|
|
"Quad Damage", // pickup
|
|
|
|
2, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
60,
|
|
|
|
NULL,
|
|
|
|
IT_POWERUP,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"items/damage.wav items/damage2.wav items/damage3.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 51
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"p_double", // icon
|
|
|
|
"Double Damage", // pickup
|
|
|
|
2, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
60,
|
|
|
|
NULL,
|
|
|
|
IT_POWERUP|IT_ROGUE,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"misc/ddamage1.wav misc/ddamage2.wav misc/ddamage3.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 52
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"p_quadfire", // icon
|
|
|
|
"DualFire Damage", // pickup
|
|
|
|
2, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
60,
|
|
|
|
NULL,
|
|
|
|
IT_POWERUP|IT_XATRIX,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"items/quadfire1.wav items/quadfire2.wav items/quadfire3.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 53
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"p_invulnerability", // icon
|
|
|
|
"Invulnerability", // pickup
|
|
|
|
2, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
300,
|
|
|
|
NULL,
|
|
|
|
IT_POWERUP,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
/* precache */ "items/protect.wav items/protect2.wav items/protect4.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 54
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"p_silencer", // icon
|
|
|
|
"Silencer", // pickup
|
|
|
|
2, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
60,
|
|
|
|
NULL,
|
|
|
|
IT_POWERUP,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 55
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"p_rebreather", // icon
|
|
|
|
"Rebreather", // pickup
|
|
|
|
2, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
60,
|
|
|
|
NULL,
|
|
|
|
IT_STAY_COOP|IT_POWERUP,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"player/u_breath1.wav player/u_breath2.wav items/airout.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 56
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"p_envirosuit", // icon
|
|
|
|
"Environment Suit", // pickup
|
|
|
|
2, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
60,
|
|
|
|
NULL,
|
|
|
|
IT_STAY_COOP|IT_POWERUP,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"player/u_breath1.wav player/u_breath2.wav items/airout.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 57
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"p_ir", // icon
|
|
|
|
"IR Goggles", // pickup
|
|
|
|
2, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
60,
|
|
|
|
NULL,
|
|
|
|
IT_POWERUP|IT_ROGUE,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"misc/ir_start.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 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
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"i_fixme", // icon
|
|
|
|
"Ancient Head", // pickup
|
|
|
|
2, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
60,
|
|
|
|
NULL,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
// New item (sorta) for Citadel pack by Andrea Rosa
|
|
|
|
#ifdef CITADELMOD_FEATURES
|
2020-08-09 06:45:19 +00:00
|
|
|
// 61
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"i_stero", // icon
|
|
|
|
"Steroids", // pickup
|
|
|
|
2, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
60,
|
|
|
|
NULL,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
#endif
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 61
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"p_adrenaline", // icon
|
|
|
|
"Adrenaline", // pickup
|
|
|
|
2, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
60,
|
|
|
|
NULL,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 62
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"p_bandolier", // icon
|
|
|
|
"Bandolier", // pickup
|
|
|
|
2, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
60,
|
|
|
|
NULL,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 63
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"i_pack", // icon
|
|
|
|
"Ammo Pack", // pickup
|
|
|
|
2, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
180,
|
|
|
|
NULL,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
#ifdef JETPACK_MOD
|
2020-08-09 06:45:19 +00:00
|
|
|
// 64
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},*/
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 65
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 66
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"p_compass", // icon
|
|
|
|
"Compass", // pickup
|
|
|
|
2, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
60,
|
|
|
|
NULL,
|
|
|
|
IT_POWERUP|IT_ROGUE,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 67
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"p_vengeance", // icon
|
|
|
|
"Vengeance Sphere", // pickup
|
|
|
|
2, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
60,
|
|
|
|
NULL,
|
|
|
|
IT_POWERUP|IT_ROGUE,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"spheres/v_idle.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 68
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"p_hunter", // icon
|
|
|
|
"Hunter Sphere", // pickup
|
|
|
|
2, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
120,
|
|
|
|
NULL,
|
|
|
|
IT_POWERUP|IT_ROGUE,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"spheres/h_idle.wav spheres/h_active.wav spheres/h_lurk.wav" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 69
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"p_defender", // icon
|
|
|
|
"Defender Sphere", // pickup
|
|
|
|
2, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
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
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 70
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 71
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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"
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 72
|
2020-01-05 02:25:00 +00:00
|
|
|
{
|
|
|
|
"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
|
|
|
|
//
|
2020-08-09 06:45:19 +00:00
|
|
|
// 73
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 74
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 75
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 76
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 77
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 78
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 79
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 80
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 81
|
2020-01-05 02:25:00 +00:00
|
|
|
// RAFAEL
|
2020-03-08 08:07:40 +00:00
|
|
|
/*QUAKED key_green_key (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
|
2020-01-05 02:25:00 +00:00
|
|
|
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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 82
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"k_comhead", // icon
|
|
|
|
"Commander's Head", // pickup
|
|
|
|
2, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
IT_STAY_COOP|IT_KEY,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 83
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"i_airstrike", // icon
|
|
|
|
"Airstrike Marker", // pickup
|
|
|
|
2, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
IT_STAY_COOP|IT_KEY,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
// ======================================
|
|
|
|
// PGM
|
2020-08-09 06:45:19 +00:00
|
|
|
// 84
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 85
|
2020-01-05 02:25:00 +00:00
|
|
|
/*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
|
|
|
|
// ======================================
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 86
|
2020-04-07 06:02:54 +00:00
|
|
|
// 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,
|
2020-08-09 06:45:19 +00:00
|
|
|
"" // precache
|
2020-04-07 06:02:54 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
// Zaero keys
|
2020-08-09 06:45:19 +00:00
|
|
|
// 87
|
2020-04-07 06:02:54 +00:00
|
|
|
/*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 */ ""
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 88
|
2020-04-07 06:02:54 +00:00
|
|
|
/*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 */ ""
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 89
|
2020-04-07 06:02:54 +00:00
|
|
|
/*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 */ ""
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 90
|
2020-04-07 06:02:54 +00:00
|
|
|
/*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 */ ""
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 91
|
2020-04-07 06:02:54 +00:00
|
|
|
/*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 */ ""
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 92
|
2020-04-07 06:02:54 +00:00
|
|
|
/*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 */ ""
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 93
|
2020-03-08 08:07:40 +00:00
|
|
|
/*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,
|
2020-10-29 17:03:20 +00:00
|
|
|
"q1misc/medkey.wav",
|
2020-03-08 08:07:40 +00:00
|
|
|
"models/items/q1keys/gold/tris.md2", 0, EF_ROTATE,
|
|
|
|
NULL,
|
2020-04-18 04:24:32 +00:00
|
|
|
"k_med_gold",
|
2020-03-08 08:07:40 +00:00
|
|
|
"Gold Key",
|
|
|
|
2,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
IT_STAY_COOP|IT_KEY|IT_Q1,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
|
|
|
/* precache */ ""
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 94
|
2020-03-08 08:07:40 +00:00
|
|
|
/*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,
|
2020-10-29 17:03:20 +00:00
|
|
|
"q1misc/medkey.wav",
|
2020-03-08 08:07:40 +00:00
|
|
|
"models/items/q1keys/silver/tris.md2", 0, EF_ROTATE,
|
|
|
|
NULL,
|
2020-04-18 04:24:32 +00:00
|
|
|
"k_med_silver",
|
2020-03-08 08:07:40 +00:00
|
|
|
"Silver Key",
|
|
|
|
2,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
IT_STAY_COOP|IT_KEY|IT_Q1,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
|
|
|
/* precache */ ""
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 95
|
2020-03-08 08:07:40 +00:00
|
|
|
/*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,
|
2020-10-29 17:03:20 +00:00
|
|
|
"q1misc/runekey.wav",
|
2020-03-08 08:07:40 +00:00
|
|
|
"models/items/q1keys/gold/rune/tris.md2", 0, EF_ROTATE,
|
|
|
|
NULL,
|
2020-04-18 04:24:32 +00:00
|
|
|
"k_rune_gold",
|
2020-03-08 08:07:40 +00:00
|
|
|
"Gold Rune Key",
|
|
|
|
2,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
IT_STAY_COOP|IT_KEY|IT_Q1,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
|
|
|
/* precache */ ""
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 96
|
2020-03-08 08:07:40 +00:00
|
|
|
/*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,
|
2020-10-29 17:03:20 +00:00
|
|
|
"q1misc/runekey.wav",
|
2020-03-08 08:07:40 +00:00
|
|
|
"models/items/q1keys/silver/rune/tris.md2", 0, EF_ROTATE,
|
|
|
|
NULL,
|
2020-04-18 04:24:32 +00:00
|
|
|
"k_rune_silver",
|
2020-03-08 08:07:40 +00:00
|
|
|
"Silver Rune Key",
|
|
|
|
2,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
IT_STAY_COOP|IT_KEY|IT_Q1,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
|
|
|
/* precache */ ""
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 97
|
2020-03-08 08:07:40 +00:00
|
|
|
/*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,
|
2020-10-29 17:03:20 +00:00
|
|
|
"q1misc/basekey.wav",
|
2020-03-08 08:07:40 +00:00
|
|
|
"models/items/q1keys/gold/base/tris.md2", 0, EF_ROTATE,
|
|
|
|
NULL,
|
2020-04-18 04:24:32 +00:00
|
|
|
"k_base_gold",
|
2020-03-08 08:07:40 +00:00
|
|
|
"Gold Keycard",
|
|
|
|
2,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
IT_STAY_COOP|IT_KEY|IT_Q1,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
|
|
|
/* precache */ ""
|
|
|
|
},
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 98
|
2020-03-08 08:07:40 +00:00
|
|
|
/*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,
|
2020-10-29 17:03:20 +00:00
|
|
|
"q1misc/basekey.wav",
|
2020-03-08 08:07:40 +00:00
|
|
|
"models/items/q1keys/silver/base/tris.md2", 0, EF_ROTATE,
|
|
|
|
NULL,
|
2020-04-18 04:24:32 +00:00
|
|
|
"k_base_silver",
|
2020-03-08 08:07:40 +00:00
|
|
|
"Silver Keycard",
|
|
|
|
2,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
IT_STAY_COOP|IT_KEY|IT_Q1,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
|
|
|
/* precache */ ""
|
|
|
|
},
|
|
|
|
|
2020-01-05 02:25:00 +00:00
|
|
|
/*
|
|
|
|
Insert new key items here
|
|
|
|
|
|
|
|
Key item template fields:
|
|
|
|
classname
|
|
|
|
pickup sound
|
|
|
|
model
|
|
|
|
skinnum
|
|
|
|
effects?
|
|
|
|
icon name
|
|
|
|
full (pickup) name
|
|
|
|
*/
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
// 99
|
2020-01-05 02:25:00 +00:00
|
|
|
{
|
|
|
|
NULL,
|
|
|
|
Pickup_Health,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
"items/pkup.wav",
|
|
|
|
NULL, 0, 0,
|
|
|
|
NULL,
|
2020-08-09 06:45:19 +00:00
|
|
|
"i_health", // icon
|
|
|
|
"Health", // pickup
|
|
|
|
3, // width
|
2020-01-05 02:25:00 +00:00
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
0,
|
2020-08-09 06:45:19 +00:00
|
|
|
"items/s_health.wav items/n_health.wav items/l_health.wav items/m_health.wav" // precache PMM - health sound fix
|
2020-01-05 02:25:00 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
// 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;
|
|
|
|
}
|
2020-09-04 07:39:59 +00:00
|
|
|
self->class_id = ENTITY_ITEM_HEALTH;
|
2020-01-05 02:25:00 +00:00
|
|
|
|
2020-11-23 09:07:08 +00:00
|
|
|
if (!self->model) // Knightmare- allow mapper-spcified model
|
|
|
|
self->model = "models/items/healing/medium/tris.md2";
|
|
|
|
if (!self->count) // Knightmare- allow mapper-spcified count
|
|
|
|
self->count = 10;
|
2020-01-05 02:25:00 +00:00
|
|
|
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;
|
|
|
|
}
|
2020-09-04 07:39:59 +00:00
|
|
|
self->class_id = ENTITY_ITEM_HEALTH_SMALL;
|
2020-01-05 02:25:00 +00:00
|
|
|
|
2020-11-23 09:07:08 +00:00
|
|
|
if (!self->model) // Knightmare- allow mapper-spcified model
|
|
|
|
self->model = "models/items/healing/stimpack/tris.md2";
|
|
|
|
if (!self->count) // Knightmare- allow mapper-spcified count
|
|
|
|
self->count = sk_health_bonus_value->value; // Knightmare- made this cvar
|
2020-01-05 02:25:00 +00:00
|
|
|
SpawnItem (self, FindItem ("Health"));
|
2020-12-03 08:38:07 +00:00
|
|
|
self->style = HEALTH_IGNORE_MAX|HEALTH_SMALL;
|
2020-01-05 02:25:00 +00:00
|
|
|
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;
|
|
|
|
}
|
2020-09-04 07:39:59 +00:00
|
|
|
self->class_id = ENTITY_ITEM_HEALTH_LARGE;
|
2020-01-05 02:25:00 +00:00
|
|
|
|
2020-11-23 09:07:08 +00:00
|
|
|
if (!self->model) // Knightmare- allow mapper-spcified model
|
|
|
|
self->model = "models/items/healing/large/tris.md2";
|
|
|
|
if (!self->count) // Knightmare- allow mapper-spcified count
|
|
|
|
self->count = 25;
|
2020-01-05 02:25:00 +00:00
|
|
|
SpawnItem (self, FindItem ("Health"));
|
2020-12-03 08:38:07 +00:00
|
|
|
self->style = HEALTH_LARGE;
|
2020-01-05 02:25:00 +00:00
|
|
|
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;
|
|
|
|
}
|
2020-09-04 07:39:59 +00:00
|
|
|
self->class_id = ENTITY_ITEM_HEALTH_MEGA;
|
2020-01-05 02:25:00 +00:00
|
|
|
|
2020-11-23 09:07:08 +00:00
|
|
|
if (!self->model) // Knightmare- allow mapper-spcified model
|
|
|
|
self->model = "models/items/mega_h/tris.md2";
|
|
|
|
if (!self->count) // Knightmare- allow mapper-spcified count
|
|
|
|
self->count = 100;
|
2020-01-05 02:25:00 +00:00
|
|
|
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;
|
|
|
|
}
|
2020-09-04 07:39:59 +00:00
|
|
|
self->class_id = ENTITY_ITEM_FOODCUBE;
|
2020-01-05 02:25:00 +00:00
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
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"));
|
2020-01-05 02:25:00 +00:00
|
|
|
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"));
|
2020-08-09 06:45:19 +00:00
|
|
|
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"));
|
2020-03-08 08:07:40 +00:00
|
|
|
|
|
|
|
// added for convenience with triger_key sound hack
|
2020-08-09 06:45:19 +00:00
|
|
|
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"));
|
2020-01-05 02:25:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef JETPACK_MOD
|
|
|
|
//==============================================================================
|
|
|
|
void Use_Jet ( edict_t *ent, gitem_t *item )
|
|
|
|
{
|
2020-09-04 07:39:59 +00:00
|
|
|
if (ent->client->jetpack)
|
2020-01-05 02:25:00 +00:00
|
|
|
{
|
|
|
|
// 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.
|
2020-09-04 07:39:59 +00:00
|
|
|
if ( ent->client->pers.inventory[ITEM_INDEX(item)] )
|
2020-01-05 02:25:00 +00:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
}
|
2020-09-04 07:39:59 +00:00
|
|
|
else if (ent->client->pers.inventory[fuel_index] > 0)
|
2020-01-05 02:25:00 +00:00
|
|
|
{
|
|
|
|
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 )
|
|
|
|
{
|
2020-09-04 07:39:59 +00:00
|
|
|
if (ent->client->jetpack)
|
2020-01-05 02:25:00 +00:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
if (!self->classname)
|
2020-01-05 02:25:00 +00:00
|
|
|
return;
|
|
|
|
|
2020-08-09 06:45:19 +00:00
|
|
|
if (!strcmp(self->classname, "ammo_magslug"))
|
2020-01-05 02:25:00 +00:00
|
|
|
spawnClass = "ammo_flechettes";
|
2020-08-09 06:45:19 +00:00
|
|
|
else if (!strcmp(self->classname, "ammo_trap"))
|
2020-01-05 02:25:00 +00:00
|
|
|
spawnClass = "weapon_proxlauncher";
|
2020-08-09 06:45:19 +00:00
|
|
|
else if (!strcmp(self->classname, "item_quadfire"))
|
2020-01-05 02:25:00 +00:00
|
|
|
{
|
|
|
|
float chance;
|
|
|
|
|
|
|
|
chance = random();
|
2020-08-09 06:45:19 +00:00
|
|
|
if (chance < 0.2)
|
2020-01-05 02:25:00 +00:00
|
|
|
spawnClass = "item_sphere_hunter";
|
|
|
|
else if (chance < 0.6)
|
|
|
|
spawnClass = "item_sphere_vengeance";
|
|
|
|
else
|
|
|
|
spawnClass = "item_sphere_defender";
|
|
|
|
}
|
2020-08-09 06:45:19 +00:00
|
|
|
else if (!strcmp(self->classname, "weapon_boomer"))
|
2020-01-05 02:25:00 +00:00
|
|
|
spawnClass = "weapon_etf_rifle";
|
2020-08-09 06:45:19 +00:00
|
|
|
else if (!strcmp(self->classname, "weapon_phalanx"))
|
2020-01-05 02:25:00 +00:00
|
|
|
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
|
|
|
|
//===============
|