thirtyflightsofloving/3zb2/g_items.c
Knightmare66 95295401a4 Added support for custom client railgun colors in 3ZB2, Awakening2, and Zaero DLLs.
Added weapon balancing and tech control cvars to 3ZB2 DLL.
Added Vampire and Ammogen techs to 3ZB2 game DLL.
Fixed func_door_secret movement bug (when built with origin brush) in Zaero DLL.
Fixed armor stacking bug in default Lazarus, missionpack, and Zaero DLLs.
Removed unused tech cvars in default Lazarus DLL.
Changed parsing of TE_BLASTER_COLORED tempent.
2021-10-31 03:53:09 -04:00

3752 lines
84 KiB
C
Raw Blame History

#include "g_local.h"
#include "bot.h"
#include "g_ctf.h"
qboolean Pickup_Weapon (edict_t *ent, edict_t *other);
void Use_Weapon (edict_t *ent, gitem_t *inv);
void Use_Weapon2 (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);
*/
gitem_armor_t jacketarmor_info = { 25, 50, .30, .00, ARMOR_JACKET};
gitem_armor_t combatarmor_info = { 50, 100, .60, .30, ARMOR_COMBAT};
gitem_armor_t bodyarmor_info = {100, 200, .80, .60, ARMOR_BODY};
int jacket_armor_index;
int combat_armor_index;
int body_armor_index;
int power_screen_index;
int power_shield_index;
// Knightmare added
int shells_index;
int bullets_index;
int grenades_index;
int rockets_index;
int cells_index;
int slugs_index;
int magslug_index;
int trap_index;
int blaster_index;
int rg_index;
#define HEALTH_IGNORE_MAX 1
#define HEALTH_TIMED 2
#define HEALTH_FOODCUBE 4
#define HEALTH_SMALL 8
#define HEALTH_LARGE 16
void Use_Quad (edict_t *ent, gitem_t *item);
// RAFAEL
void Use_QuadFire (edict_t *ent, gitem_t *item);
// Knightmare- addded double damage
void Use_Double (edict_t *ent, gitem_t *item);
static int quad_drop_timeout_hack;
// Knightmare- addded double damage
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
Knightmare added
===============
*/
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 == magslug_index)
value = client->pers.max_magslug;
else if (item_index == trap_index)
value = client->pers.max_trap;
else
value = 0;
return value;
}
/*
===============
GetMaxArmorByIndex
Knightmare added
===============
*/
int GetMaxArmorByIndex (int item_index)
{
int value;
if (item_index == jacket_armor_index)
value = sk_max_armor_jacket->value; // jacketarmor_info.max_count
else if (item_index == combat_armor_index)
value = sk_max_armor_combat->value; // combatarmor_info.max_count
else if (item_index == body_armor_index)
value = sk_max_armor_body->value; // bodyarmor_info.max_count
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;
//ZOID
//in ctf, when we are weapons stay, only the master of a team of weapons
//is spawned
if (ctf->value &&
((int)dmflags->value & DF_WEAPONS_STAY) &&
master->item && (master->item->flags & IT_WEAPON))
ent = master;
else {
//ZOID
for (count = 0, ent = master; ent; ent = ent->chain, count++)
;
choice = rand() % count;
for (count = 0, ent = master; count < choice; ent = ent->chain, count++)
;
}
}
ent->svflags &= ~SVF_NOCLIENT;
ent->solid = SOLID_TRIGGER;
gi.linkentity (ent);
if (ent->classname[0] == 'R') return;
// 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;
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) || ((ent->item->use == Use_Quad) && (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;
ent->item->use (other, ent->item);
}
// Knightmare- addded double damage
else if (((int)dmflags->value & DF_INSTANT_ITEMS) || ((ent->item->use == Use_Double) && (ent->spawnflags & DROPPED_PLAYER_ITEM)))
{
if ((ent->item->use == Use_Double) && (ent->spawnflags & DROPPED_PLAYER_ITEM))
double_drop_timeout_hack = (ent->nextthink - level.time) / FRAMETIME;
ent->item->use (other, ent->item);
}
// RAFAEL
else if (((int)dmflags->value & DF_INSTANT_ITEMS) || ((ent->item->use == Use_QuadFire) && (ent->spawnflags & DROPPED_PLAYER_ITEM)))
{
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);
}
}
return true;
}
void Drop_General (edict_t *ent, gitem_t *item)
{
Drop_Item (ent, item);
ent->client->pers.inventory[ITEM_INDEX(item)]--;
ValidateSelectedItem (ent);
}
float Get_yaw (vec3_t vec);
//edict_t *GetBotFlag1(); //<2F>`<60>[<5B><>1<EFBFBD>̊<EFBFBD>
//edict_t *GetBotFlag2(); //<2F>`<60>[<5B><>2<EFBFBD>̊<EFBFBD>
//======================================================================
qboolean Pickup_Navi (edict_t *ent, edict_t *other)
{
edict_t *flage,*flagf;
vec3_t v;
int i,j,k;
qboolean flg;
if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
if ( ent->item->quantity && ent->classname[6] != 'F') SetRespawn (ent, ent->item->quantity);
//on door(up & down)
if ( ent->classname[6] == '3' && ent->union_ent)
{
if (ent->target_ent == other /*->client->zc.second_target == ent*/)
{
//gi.bprintf(PRINT_HIGH,"get target!\n");
other->client->zc.zcstate &= ~STS_WAITS;
other->client->zc.waitin_obj = ent->union_ent;
if (ent->union_ent->spawnflags & PDOOR_TOGGLE)
{
if (ent->union_ent->moveinfo.state == PSTATE_DOWN
|| ent->union_ent->moveinfo.state == PSTATE_BOTTOM) other->client->zc.zcstate |= STS_W_ONDOORDWN;
else other->client->zc.zcstate |= STS_W_ONDOORUP;
}
else
{
if (ent->union_ent->moveinfo.state == PSTATE_DOWN
|| ent->union_ent->moveinfo.state == PSTATE_TOP) other->client->zc.zcstate |= STS_W_ONDOORDWN;
else if (ent->union_ent->moveinfo.state == PSTATE_UP
|| ent->union_ent->moveinfo.state == PSTATE_BOTTOM) other->client->zc.zcstate |= STS_W_ONDOORUP;
}
//j = other->client->zc.routeindex - 10;
//<2F><><EFBFBD>[<5B>g<EFBFBD>̃A<CC83>b<EFBFBD>v<EFBFBD>f<EFBFBD>[<5B>g
for(i = - MAX_DOORSEARCH; i < MAX_DOORSEARCH ;i++)
{
if (i <= 0) j = other->client->zc.routeindex - (MAX_DOORSEARCH - i) ;
else j = other->client->zc.routeindex + i;
if (j < 0) continue;
if (j >= CurrentIndex) continue;
// if (!Route[j].index) break;
if ((Route[j].state == GRS_ONDOOR
&& Route[j].ent == ent->union_ent) || Route[j].state == GRS_PUSHBUTTON)
{
k = 1;
flg = false;
while(1)
{
if ((j + k) >= CurrentIndex)
{
//gi.bprintf(PRINT_HIGH,"overflow!!!\n");
break;
}
if ((j + k) >= other->client->zc.routeindex)
{
Get_RouteOrigin(j + k,v);
if (fabs(v[2] - other->s.origin[2])> JumpMax)
{
if (0/*Route[j].state == GRS_PUSHBUTTON*/)
{
if (fabs(Route[j].ent->union_ent->s.origin[2] + 8 - other->s.origin[2])< JumpMax) flg = true;
}
else flg = true;
//gi.bprintf(PRINT_HIGH,"hoooo!!!\n");
break;
}
}
k++;
}
if ((j + k) < CurrentIndex && flg)
{
//gi.bprintf(PRINT_HIGH,"set!!!\n");
other->client->zc.routeindex = j + k;
break;
}
}
//j++;
}
if (!flg)
{
other->client->zc.zcstate |= STS_W_DONT;
// gi.bprintf(PRINT_HIGH,"failed!\n");
}
ent->target_ent = NULL;
}
//else gi.bprintf(PRINT_HIGH,"not target!\n");
SetRespawn (ent, 1000000);
ent->solid = SOLID_NOT;
}
//roamnavi <20><><EFBFBD>߂<EFBFBD>
else if ( ent->classname[6] == '2')
{
//<2F><><EFBFBD>[<5B>g<EFBFBD>̃A<CC83>b<EFBFBD>v<EFBFBD>f<EFBFBD>[<5B>g
for(i = 0;i < 10;i++)
{
if ((other->client->zc.routeindex + i) >= CurrentIndex) break;
if (!Route[other->client->zc.routeindex + i].index) break;
if (Route[other->client->zc.routeindex + i].state == GRS_PUSHBUTTON
&& Route[other->client->zc.routeindex + i].ent == ent->union_ent)
{
other->client->zc.routeindex += i + 1;
break;
}
}
}
if (!ctf->value || ent->classname[6] != 'F') return true;
//ctf navi
if ( ctf->value && ent->classname[6] == 'F')
{
if (other->client->resp.ctf_team == CTF_TEAM1)
{
flage = bot_team_flag2;//GetBotFlag2();
flagf = bot_team_flag1;//GetBotFlag1();
if ( other->moveinfo.state == CARRIER || other->moveinfo.state == SUPPORTER)
{
if (ent->owner != NULL) other->target_ent = ent->owner;
}
else if (other->moveinfo.state == GETTER)
{
if (flage->solid == SOLID_NOT && flagf->solid != SOLID_NOT)
{
if (ent->owner != NULL) other->target_ent = ent->owner;
}
else
{
if (ent->target_ent != NULL) other->target_ent = ent->target_ent;
}
}
else if ( other->moveinfo.state == DEFENDER)
{
if (ent->owner != NULL) other->target_ent = ent->owner;
}
}
else if (other->client->resp.ctf_team == CTF_TEAM2)
{
flage = bot_team_flag1;//GetBotFlag1();
flagf = bot_team_flag2;//GetBotFlag2();
if ( other->moveinfo.state == CARRIER || other->moveinfo.state == SUPPORTER)
{
if (ent->target_ent != NULL) other->target_ent = ent->target_ent;
}
else if (other->moveinfo.state == GETTER)
{
if (flage->solid == SOLID_NOT && flagf->solid != SOLID_NOT)
{
if (ent->target_ent != NULL) other->target_ent = ent->target_ent;
}
else
{
if (ent->owner != NULL) other->target_ent = ent->owner;
}
}
else if ( other->moveinfo.state == DEFENDER)
{
if (ent->target_ent != NULL) other->target_ent = ent->target_ent;
}
}
}
return true;
}
qboolean Pickup_Adrenaline (edict_t *ent, edict_t *other)
{
if (!deathmatch->value) {
other->max_health += 1;
// 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;
}
if (other->health < other->max_health)
other->health = other->max_health;
if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
SetRespawn (ent, ent->item->quantity);
return true;
}
qboolean Pickup_AncientHead (edict_t *ent, edict_t *other)
{
other->max_health += 2;
if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
SetRespawn (ent, ent->item->quantity);
return true;
}
qboolean Pickup_Bandolier (edict_t *ent, edict_t *other)
{
gitem_t *item;
int index;
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;
item = Fdi_BULLETS;//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 = Fdi_SHELLS;//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;
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;
// RAFAEL
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;
item = Fdi_BULLETS; // 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 = Fdi_SHELLS;//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 = Fdi_CELLS;//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;
}
if (item)
{
item = Fdi_GRENADES;//FindItem("Grenades");
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 = Fdi_ROCKETS;//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 = Fdi_SLUGS;//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;
}
// RAFAEL
item = Fdi_MAGSLUGS;//FindItem ("Mag Slug");
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;
}
if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
SetRespawn (ent, ent->item->quantity);
return true;
}
// Knightmare added- Ammogen tech-spawned backpack
qboolean Pickup_AmmogenPack (edict_t *ent, edict_t *other)
{
gitem_t *item;
if (!ent || !other)
return false;
// Knightmare- override ammo pickup values with cvars
SetAmmoPickupValues ();
item = FindItem("Bullets");
if (item && other->client->pers.inventory[ITEM_INDEX(item)])
Add_Ammo (other, item, item->quantity);
item = FindItem("Shells");
if (item && other->client->pers.inventory[ITEM_INDEX(item)])
Add_Ammo (other, item, item->quantity);
item = FindItem("Cells");
if (item && other->client->pers.inventory[ITEM_INDEX(item)])
Add_Ammo (other, item, item->quantity);
item = FindItem("Grenades");
if (item && other->client->pers.inventory[ITEM_INDEX(item)])
Add_Ammo (other, item, item->quantity);
item = FindItem("Rockets");
if (item && other->client->pers.inventory[ITEM_INDEX(item)])
Add_Ammo (other, item, item->quantity);
item = FindItem("Slugs");
if (item && other->client->pers.inventory[ITEM_INDEX(item)])
Add_Ammo (other, item, item->quantity);
item = FindItem("Mag Slug");
if (item && other->client->pers.inventory[ITEM_INDEX(item)])
Add_Ammo (other, item, item->quantity);
return true;
}
//======================================================================
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 = 300;
}
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);
}
//======================================================================
// Knightmare- addded double damage
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_quad_time->value * 10); // was 300
if (ent->client->double_framenum > level.framenum)
ent->client->double_framenum += timeout;
else
ent->client->double_framenum = level.framenum + timeout;
gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/ddamage1.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); // was 300
}
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); // was 300
else
ent->client->breather_framenum = level.framenum + (sk_breather_time->value * 10); // was 300
// 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); // was 300
else
ent->client->enviro_framenum = level.framenum + (sk_enviro_time->value * 10); // was 300
// 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); // was 300
else
ent->client->invincible_framenum = level.framenum + (sk_inv_time->value * 10); // was 300
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; // was 30
// gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
}
//======================================================================
qboolean Pickup_Key (edict_t *ent, edict_t *other)
{
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;
// RAFAEL
else if (item->tag == AMMO_MAGSLUG)
max = ent->client->pers.max_magslug;
// RAFAEL
else if (item->tag == AMMO_TRAP)
max = ent->client->pers.max_trap;
else
return false;
index = ITEM_INDEX(item);
if (ent->client->pers.inventory[index] == max)
return false;
ent->client->pers.inventory[index] += count;
//ponko
if (chedit->value && ent == &g_edicts[1]) ent->client->pers.inventory[index] = 0;
//ponko
if (ent->client->pers.inventory[index] > max)
ent->client->pers.inventory[index] = max;
return true;
}
// Knightmare- this function overrides ammo pickup values with cvars
void SetAmmoPickupValues (void)
{
gitem_t *item;
item = FindItem("Shells");
if (item)
item->quantity = sk_box_shells->value;
item = FindItem("Bullets");
if (item)
item->quantity = sk_box_bullets->value;
item = FindItem("Grenades");
if (item)
item->quantity = sk_box_grenades->value;
item = FindItem("Rockets");
if (item)
item->quantity = sk_box_rockets->value;
/*
item = FindItem("Homing Rockets");
if (item)
item->quantity = sk_box_rockets->value;
*/
item = FindItem("Cells");
if (item)
item->quantity = sk_box_cells->value;
item = FindItem("Slugs");
if (item)
item->quantity = sk_box_slugs->value;
item = FindItem("Magslug");
if (item)
item->quantity = sk_box_magslugs->value;
item = FindItem("Trap");
if (item)
item->quantity = sk_box_trap->value;
/*
item = FindItem("Flechettes");
if (item)
item->quantity = sk_box_flechettes->value;
item = FindItem("Prox");
if (item)
item->quantity = sk_box_prox->value;
item = FindItem("Tesla");
if (item)
item->quantity = sk_box_tesla->value;
item = FindItem("Disruptors");
if (item)
item->quantity = sk_box_disruptors->value;
item = FindItem("Shocksphere");
if (item)
item->quantity = sk_box_shocksphere->value;
*/
}
qboolean Pickup_Ammo (edict_t *ent, edict_t *other)
{
int count;
qboolean weapon;
// Knightmare- override ammo pickup values with cvars
SetAmmoPickupValues ();
weapon = (ent->item->flags & IT_WEAPON);
if ( (weapon) && ( (int)dmflags->value & DF_INFINITE_AMMO ) )
count = 1000;
else if (ent->count)
count = ent->count;
else
count = ent->item->quantity;
if (!Add_Ammo (other, ent->item, count))
return false;
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
//ZOID
&& !CTFHasRegeneration(self->owner)
//ZOID
)
{
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;
//ZOID
if (other->health >= 250 && ent->count > 25)
return false;
//ZOID
other->health += ent->count;
//ZOID
if (other->health > 250 && ent->count > 25)
other->health = 250;
//ZOID
// 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;
}
//ZOID
if ((ent->style & HEALTH_TIMED)
&& !CTFHasRegeneration(other)
//ZOID
)
{
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, old_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; // was 2
else
other->client->pers.inventory[old_armor_index] += sk_armor_bonus_value->value; // was 2
}
// 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;
old_armor_maximum = sk_max_armor_jacket->value;
}
else if (old_armor_index == combat_armor_index) {
oldinfo = &combatarmor_info;
old_armor_maximum = sk_max_armor_combat->value;
}
else { // (old_armor_index == body_armor_index)
oldinfo = &bodyarmor_info;
old_armor_maximum = sk_max_armor_body->value;
}
// if stronger 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 > newinfo->max_count)
// newcount = newinfo->max_count;
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;
//ponko
if (chedit->value && other == &g_edicts[1])
other->client->pers.inventory[ITEM_INDEX(ent->item)] = 0;
//ponko
}
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 > oldinfo->max_count)
// newcount = oldinfo->max_count;
if (newcount > old_armor_maximum)
newcount = old_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;
//ponko
if (chedit->value && other == &g_edicts[1])
other->client->pers.inventory[old_armor_index] = 0;
//ponko
}
}
if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
SetRespawn (ent, 20);
return true;
}
//======================================================================
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;
}
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);
}
}
/* if (ent->flags & FL_POWER_ARMOR)
{
ent->flags &= ~FL_POWER_ARMOR;
gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/power2.wav"), 1, ATTN_NORM, 0); //FIXME powering down sound
}
else
{
index = ITEM_INDEX(Fdi_CELLS); // FindItem("Cells")
if (!ent->client->pers.inventory[index] && !(ent->svflags & SVF_MONSTER))
{
gi.cprintf (ent, PRINT_HIGH, "No cells for power armor.\n");
return;
}
ent->flags |= FL_POWER_ARMOR;
gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/power1.wav"), 1, ATTN_NORM, 0); //FIXME powering up sound
} */
}
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)]++;
//ponko
if (chedit->value && other == &g_edicts[1])
other->client->pers.inventory[ITEM_INDEX(ent->item)] = 0;
//ponko
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;
}
void Drop_PowerArmor (edict_t *ent, gitem_t *item)
{
// if ((ent->flags & FL_POWER_ARMOR) && (ent->client->pers.inventory[ITEM_INDEX(item)] == 1))
// Use_PowerArmor (ent, 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);
}
//======================================================================
/*
===============
Touch_Item
===============
*/
void Touch_Item (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf)
{
int k;
//don't pickup tech when chaining
if (ctf->value && chedit->value)
{
if (ent->classname[5] =='t') return;
}
if (strcmp(other->classname, "player"))
return;
if (ent->classname[0] == 'R')
{
if (!(other->svflags & SVF_MONSTER)) return;
if (ent->classname[6] == 'F'&& other->target_ent != NULL)
{
if (other->target_ent != ent) return;
// else if (other->moveinfo.state == SUPPORTER) return;
}
}
if (other->health < 1)
return; // dead people can't pickup
if (!ent->item->pickup)
return; // not a grabbable item?
if (!ent->item->pickup(ent, other))
return; // player can't hold it
if (!(other->svflags & SVF_MONSTER))
{
// 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);
}
else
{
// change selected item
if (ent->item->use)
{
k = Get_KindWeapon(ent->item);
if (k > WEAP_BLASTER)
{
if (Bot[other->client->zc.botindex].param[BOP_PRIWEP] == k) ent->item->use(other,ent->item);
else if (k != Get_KindWeapon(other->client->pers.weapon))
{
if (Bot[other->client->zc.botindex].param[BOP_SECWEP] == k) ent->item->use(other,ent->item);
}
}
}
}
if (ent->classname[0] != 'R')
{
// 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);
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
gi.sound(other, CHAN_ITEM, gi.soundindex("items/s_health.wav"), 1, ATTN_NORM, 0);
else if (ent->style & HEALTH_LARGE) // if (ent->count == 25)
gi.sound(other, CHAN_ITEM, gi.soundindex("items/l_health.wav"), 1, ATTN_NORM, 0);
else // if (ent->count == 10)
gi.sound(other, CHAN_ITEM, gi.soundindex("items/n_health.wav"), 1, ATTN_NORM, 0);
}
else if (ent->item->pickup_sound) // PGM - paranoia
{
gi.sound(other, CHAN_ITEM, gi.soundindex(ent->item->pickup_sound), 1, ATTN_NORM, 0);
}
PlayerNoise(ent, ent->s.origin, PNOISE_SELF); //ponko
G_UseTargets (ent, other);
}
// else
// gi.bprintf(PRINT_HIGH,"get %s %x inv %i!\n",ent->classname,ent->spawnflags,other->client->pers.inventory[ITEM_INDEX(ent->item)]);
k = false;
//flag set <20>t<EFBFBD>@<40><><EFBFBD>N<EFBFBD>V<EFBFBD><56><EFBFBD><EFBFBD><EFBFBD>̏<EFBFBD><CC8F>ɂ<EFBFBD><C982><EFBFBD><EFBFBD><EFBFBD>͖<EFBFBD><CD96><EFBFBD>
if (ent->groundentity) if (ent->groundentity->union_ent) k = true;
// route update
if (!k && chedit->value && CurrentIndex < MAXNODES && other == &g_edicts[1])
{
if ((ent->classname[0] == 'w'
|| (ent->classname[0] =='i' &&
(ent->classname[5] == 'q'
|| ent->classname[5] =='t'
|| ent->classname[5] =='f'
|| ent->classname[5] =='i'
|| ent->classname[5] =='p'
|| ent->classname[5] =='s'
|| ent->classname[5] =='b'
|| ent->classname[5] =='e'
|| ent->classname[5] =='a'))
|| (ent->classname[0] =='i' && ent->classname[5] =='h' && ent->classname[12] =='m')
|| (ent->classname[0] =='a')
)
&& !(ent->spawnflags & (DROPPED_ITEM | DROPPED_PLAYER_ITEM)))
{
// gi.bprintf(PRINT_HIGH,"woohoo!\n");
VectorCopy(/*ent->s.origin*/ent->monsterinfo.last_sighting,Route[CurrentIndex].Pt);
Route[CurrentIndex].ent = ent;
if (ent == bot_team_flag1) { Route[CurrentIndex].state = GRS_REDFLAG;/*gi.bprintf(PRINT_HIGH,"woohoo!\n");*/}
else if (ent == bot_team_flag2) { Route[CurrentIndex].state = GRS_BLUEFLAG;/*gi.bprintf(PRINT_HIGH,"woohoo!\n");*/}
else Route[CurrentIndex].state = GRS_ITEMS;
if (++CurrentIndex < MAXNODES)
{
gi.bprintf(PRINT_HIGH,"Last %i pod(s).\n",MAXNODES - CurrentIndex);
memset(&Route[CurrentIndex],0,sizeof(route_t));
Route[CurrentIndex].index = Route[CurrentIndex - 1].index +1;
}
}
}
// respawn set
if (ent->flags & FL_RESPAWN)
ent->flags &= ~FL_RESPAWN;
else if (ent->classname[6] != 'F')
G_FreeEdict (ent);
}
//======================================================================
static void drop_temp_touch (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf)
{
if (other == ent->owner)
return;
Touch_Item (ent, other, plane, surf);
}
static void drop_make_touchable (edict_t *ent)
{
ent->touch = Touch_Item;
if (deathmatch->value)
{
ent->nextthink = level.time + 29;
ent->think = G_FreeEdict;
}
}
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;
VectorSet (dropped->mins, -15, -15, -15);
VectorSet (dropped->maxs, 15, 15, 15);
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);
}
VectorScale (forward, 100, dropped->velocity);
dropped->velocity[2] = 300;
dropped->think = drop_make_touchable;
dropped->nextthink = level.time + 1;
gi.linkentity (dropped);
return dropped;
}
void Use_Item (edict_t *ent, edict_t *other, edict_t *activator)
{
ent->svflags &= ~SVF_NOCLIENT;
ent->use = NULL;
if (ent->spawnflags & 2) // 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)
{
vec3_t trmin,trmax,min,mins,maxs;
float i,j,k,yaw;
gitem_t *it; //j
edict_t *it_ent; //j
trace_t tr,trx;
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
gi.setmodel (ent, ent->item->world_model);
if (ent->classname[6] == 'F') ent->s.modelindex = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ent->solid = SOLID_TRIGGER;
ent->movetype = MOVETYPE_TOSS;
ent->touch = Touch_Item;
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 && !chedit->value && ent->classname[6] != 'F')
{
// gi.dprintf ("droptofloor: %s startsolid at %s\n", ent->classname, vtos(ent->s.origin));
// RAFAEL
if (strcmp (ent->classname, "foodcube") == 0)
{
VectorCopy (ent->s.origin, tr.endpos);
ent->velocity[2] = 0;
}
else
{
// 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 & 2) // NO_TOUCH
{
ent->solid = SOLID_BBOX;
ent->touch = NULL;
ent->s.effects &= ~EF_ROTATE;
ent->s.renderfx &= ~RF_GLOW;
}
if (ent->spawnflags & 1) // TRIGGER_SPAWN
{
ent->svflags |= SVF_NOCLIENT;
ent->solid = SOLID_NOT;
ent->use = Use_Item;
}
gi.linkentity (ent);
if (ent->spawnflags & (DROPPED_ITEM | DROPPED_PLAYER_ITEM)) return;
// if (ctf->value && chedit->value) ent->moveinfo.speed = 0;
if (ent->classname[0] == 'w' || ent->classname[0] == 'i' || ent->classname[0] == 'a')
{
k = 0;
VectorCopy(ent->s.origin,min);
VectorSet (mins, -16, -16, -16);
VectorSet (maxs, 16, 16, 16);
min[2] -= 128;
for(i = 0 ; i < 8;i++)
{
if (i < 4 )
{
yaw = 90 * i -180;
yaw = yaw * M_PI * 2 / 360;
for( j = 32 ; j < 100 ; j +=2 )
{
trmin[0] = ent->s.origin[0] + cos(yaw) * j;
trmin[1] = ent->s.origin[1] + sin(yaw) * j;
trmin[2] = ent->s.origin[2];
VectorCopy(trmin,trmax);
trmax[2] -= 128;
tr = gi.trace (trmin, mins, maxs, trmax,ent, MASK_PLAYERSOLID );
trx = gi.trace (trmin, mins, maxs, trmax,ent, CONTENTS_WATER );
VectorCopy(tr.endpos,trmax);
//trmax[2] += 16;
if ( 0/*(trmin[2] - trx.endpos[2]) <= 39
&&ent->classname[0] == 'w' && k == 0
&& !(gi.pointcontents (trmin) & CONTENTS_WATER)
&& (gi.pointcontents (trmax) & CONTENTS_WATER)*/)
{
it = FindItem("Roam Navi");
it_ent = G_Spawn();
it_ent->classname = it->classname;
trmin[0] = ent->s.origin[0] + cos(yaw) * (j + trmin[2] - tr.endpos[2] + 100);
trmin[1] = ent->s.origin[1] + sin(yaw) * (j + trmin[2] - tr.endpos[2] + 100);
trmin[2] = trmax[2]+8;
trx = gi.trace (trmax, mins, maxs, trmin,ent, CONTENTS_WATER );
VectorCopy(trx.endpos,it_ent->s.origin);
SpawnItem3 (it_ent, it);
k = -1;
}
if (tr.endpos[2] < ent->s.origin[2] - 16
&& tr.endpos[2] > min[2] && !tr.allsolid && !tr.startsolid)
{
min[2] = tr.endpos[2];
min[0] = ent->s.origin[0] + cos(yaw) * (j + 16);
min[1] = ent->s.origin[1] + sin(yaw) * (j + 16);
break;
}
}
}
else
{
yaw = 90 * (i - 4) -135;
yaw = yaw * M_PI * 2 / 360;
for( j = 32 ; j < 80 ; j +=2 )
{
trmin[0] = ent->s.origin[0] + cos(yaw) *46;
trmin[1] = ent->s.origin[1] + sin(yaw) *46;
trmin[2] = ent->s.origin[2];
VectorCopy(trmin,trmax);
trmax[2] -= 128;
tr = gi.trace (trmin, NULL, NULL, trmax,ent, MASK_PLAYERSOLID );
if (tr.endpos[2] < ent->s.origin[2] - 16 && tr.endpos[2] > min[2] && !tr.allsolid && !tr.startsolid)
{
VectorCopy(tr.endpos,min);
break;
}
}
}
}
VectorCopy(min,ent->moveinfo.start_origin);
}
}
/*
================
droptofloor2
================
*/
void droptofloor2 (edict_t *ent)
{
vec3_t trmin,trmax,min,mins,maxs;
float i,j,yaw;
trace_t tr;
vec3_t dest;
float *v;
v = tv(-15,-15,-15);
VectorCopy (v, ent->mins);
v = tv(8,8,15);
VectorCopy (v, ent->maxs);
/////////
if (ent->union_ent && Q_stricmp (ent->classname,"R_navi2")) //2<>͈ړ<CD88><DA93>Ȃ<EFBFBD>
{
// dest[0] = (ent->union_ent->s.origin[0] + ent->union_ent->mins[0] + ent->union_ent->s.origin[0] + ent->union_ent->maxs[0])/2;//ent->s.origin[0];
// dest[1] = (ent->union_ent->s.origin[1] + ent->union_ent->mins[1] + ent->union_ent->s.origin[1] + ent->union_ent->maxs[1])/2;
dest[0] = (ent->union_ent->s.origin[0] + ent->union_ent->mins[0] + ent->union_ent->s.origin[0] + ent->union_ent->maxs[0])/2;//ent->s.origin[0];
dest[1] = (ent->union_ent->s.origin[1] + ent->union_ent->mins[1] + ent->union_ent->s.origin[1] + ent->union_ent->maxs[1])/2;
j = 0;
for( i = ent->union_ent->s.origin[2] + ent->union_ent->mins[2] /*moveinfo.start_origin[2]+15*/
; i <= ent->union_ent->s.origin[2] + ent->union_ent->maxs[2] +16/*ent->moveinfo.end_origin[2]+16*/
; i++)
{
dest[2] = i;
tr = gi.trace(dest,ent->mins,ent->maxs,dest,ent,MASK_SOLID); // | MASK_WATER);
if ((!tr.startsolid && !tr.allsolid) && j == 1)
{
j = 2;
break;
}
else if ((tr.startsolid || tr.allsolid) && j == 0 && tr.ent == ent->union_ent) j = 1;
}
VectorCopy (dest,ent->s.origin);
VectorSubtract(ent->s.origin,ent->union_ent->s.origin,ent->moveinfo.dir);
}
//////////
/* if (ent->model)
gi.setmodel (ent, ent->model);
else
gi.setmodel (ent, ent->item->world_model);*/
ent->s.modelindex = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>I
//ent->s.modelindex =gi.modelindex ("models/items/armor/body/tris.md2");
if (Q_stricmp (ent->classname,"R_navi3") == 0) ent->solid = SOLID_NOT;
else ent->solid = SOLID_TRIGGER;
ent->movetype = MOVETYPE_TOSS;
ent->touch = Touch_Item;
ent->use = NULL;
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 && ent->classname[0] != 'R' && ent->classname[6] != 'X')
{
// 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 & 2) // NO_TOUCH
{
ent->solid = SOLID_BBOX;
ent->touch = NULL;
ent->s.effects &= ~EF_ROTATE;
ent->s.renderfx &= ~RF_GLOW;
}
if (ent->spawnflags & 1) // TRIGGER_SPAWN
{
ent->svflags |= SVF_NOCLIENT;
ent->solid = SOLID_NOT;
ent->use = Use_Item;
}
gi.linkentity (ent);
if (1)
{
VectorCopy(ent->s.origin,min);
VectorSet (mins, -15, -15, -15);
VectorSet (maxs, 8, 8, 0);
min[2] -= 128;
for(i = 0 ; i < 8;i++)
{
if (i < 4 )
{
yaw = 90 * i -180;
yaw = yaw * M_PI * 2 / 360;
for( j = 32 ; j < 80 ; j +=2 )
{
trmin[0] = ent->s.origin[0] + cos(yaw) * j;
trmin[1] = ent->s.origin[1] + sin(yaw) * j;
trmin[2] = ent->s.origin[2];
VectorCopy(trmin,trmax);
trmax[2] -= 128;
tr = gi.trace (trmin, mins, maxs, trmax,ent, MASK_PLAYERSOLID );
if (tr.endpos[2] < ent->s.origin[2] - 16 && tr.endpos[2] > min[2] && !tr.allsolid && !tr.startsolid)
{
min[2] = tr.endpos[2];
min[0] = ent->s.origin[0] + cos(yaw) * (j + 16);
min[1] = ent->s.origin[1] + sin(yaw) * (j + 16);
break;
}
}
}
else
{
yaw = 90 * (i - 4) -135;
yaw = yaw * M_PI * 2 / 360;
for( j = 32 ; j < 80 ; j +=2 )
{
trmin[0] = ent->s.origin[0] + cos(yaw) *46;
trmin[1] = ent->s.origin[1] + sin(yaw) *46;
trmin[2] = ent->s.origin[2];
VectorCopy(trmin,trmax);
trmax[2] -= 128;
tr = gi.trace (trmin, NULL, NULL, trmax,ent, MASK_PLAYERSOLID );
if (tr.endpos[2] < ent->s.origin[2] - 16 && tr.endpos[2] > min[2] && !tr.allsolid && !tr.startsolid)
{
VectorCopy(tr.endpos,min);
break;
}
}
}
}
VectorCopy(min,ent->moveinfo.start_origin);
}
}
/*
===============
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);
}
}
void ZIGFlagThink(edict_t *ent)
{
static unsigned short count;
int i;
count ++;
if (count > 4)
{
edict_t *tre;
vec3_t v,vv;
i = gi.pointcontents (ent->s.origin);
if (i & MASK_OPAQUE)
{
SelectSpawnPoint (ent, v, vv);
VectorCopy (v, ent->s.origin);
}
for ( i=maxclients->value+1 ; i<globals.num_edicts ; i++)
{
tre = &g_edicts[i];
if (!tre->inuse || tre->deadflag) continue;
if (tre->classname[0] == 'p' && tre->movetype != MOVETYPE_NOCLIP && tre->client)
{
if (tre->client->zc.second_target) continue;
VectorSubtract(tre->s.origin,ent->s.origin,v);
if (VectorLength(v) < 350 && Bot_traceS(ent,tre) && v[2] < -JumpMax )
{
tre->client->zc.second_target = ent;
}
}
}
count = 0;
}
ent->owner = NULL;
ent->s.frame = 173 + (((ent->s.frame - 173) + 1) % 16);
ent->nextthink = level.time + FRAMETIME;
}
qboolean ZIGDrop_Flag(edict_t *ent, gitem_t *item)
{
edict_t *tech;
if (zflag_ent) return false;
tech = Drop_Item(ent, item);
tech->nextthink = level.time + FRAMETIME * 10;//level.time + CTF_TECH_TIMEOUT;
tech->think = ZIGFlagThink;//TechThink;
if (ent->client) ent->client->pers.inventory[ITEM_INDEX(item)] = 0;
/*ent*/tech->s.frame = 173;
zflag_ent = tech;
tech->inuse = true;
return true;
}
qboolean ZIGPickup_Flag (edict_t *ent, edict_t *other)
{
// gitem_t *item;
// other->client->pers.selected_item = ITEM_INDEX(item);
zflag_ent = NULL;
other->client->pers.inventory[ITEM_INDEX(zflag_item)] = 1;
// other->client->resp.score += 1;
other->s.modelindex3 = gi.modelindex("models/zflag.md2"/*item->world_model*/);
return true;
}
/*
============
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 SetBotFlag1(edict_t *ent); //<2F>`<60>[<5B><>1<EFBFBD>̊<EFBFBD>
void SetBotFlag2(edict_t *ent); //<2F>`<60>[<5B><>2<EFBFBD>̊<EFBFBD>
void SpawnItem (edict_t *ent, gitem_t *item)
{
PrecacheItem (item);
if (ent->spawnflags)
{
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;
}
}
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;
}
}
}
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;
}
//ZOID
//Don't spawn the flags unless enabled
if (!ctf->value &&
(strcmp(ent->classname, "item_flag_team1") == 0 ||
strcmp(ent->classname, "item_flag_team2") == 0)) {
G_FreeEdict(ent);
return;
}
//ZOID
ent->item = item;
ent->nextthink = level.time + 2 * FRAMETIME; // items start after other solids
ent->think = droptofloor;
if (ent->skinnum) // Knightmare- use mapper-specified skinnum
ent->s.skinnum = ent->skinnum;
else
// if (!ent->s.skinnum) // Knightmare- allow mapper-specified skinnum
ent->s.skinnum = item->world_model_skinnum; // Knightmare- skinnum specified in item table
ent->s.effects = item->world_model_flags;
ent->s.renderfx = RF_GLOW;
if (ent->model)
gi.modelindex (ent->model);
VectorCopy(ent->s.origin,ent->monsterinfo.last_sighting);
//ZOID
//flags are server animated and have special handling
if (strcmp(ent->classname, "item_flag_team1") == 0 ||
strcmp(ent->classname, "item_flag_team2") == 0) {
ent->think = CTFFlagSetup;
}
//ZOID
}
void SpawnItem3 (edict_t *ent, gitem_t *item)
{
// PrecacheItem (item);
ent->item = item;
ent->nextthink = level.time + 2 * FRAMETIME; // items start after other solids
ent->think = droptofloor2;
ent->s.effects = 0;
ent->s.renderfx = 0;
ent->s.modelindex = 0;
// if (ent->model)
// gi.modelindex (0/*ent->model*/);
}
//======================================================================
gitem_t itemlist[] =
{
{
NULL
}, // leave index 0 alone
//
// NAVI
//
/*QUAKED r_navi (.3 .3 1) (-16 -16 -16) (16 16 16) 0
*/
{
"R_naviF",
Pickup_Navi,
NULL,
NULL,
NULL,
NULL,
"models/items/armor/body/tris.md2", 0, 0,
NULL,
/* icon */ NULL,
/* pickup */ "Roam NaviF",
/* width */ 2,
5,
NULL,
0,
NULL,
0,
/* precache */ ""
},
{
"R_naviX",
Pickup_Navi,
NULL,
NULL,
NULL,
NULL,
"models/items/armor/body/tris.md2", 0, 0,
NULL,
/* icon */ NULL,
/* pickup */ "Roam Navi",
/* width */ 2,
10,
NULL,
0,
NULL,
0,
/* precache */ ""
},
{
"R_navi2",
Pickup_Navi,
NULL,
NULL,
NULL,
NULL,
"models/items/armor/body/tris.md2", 0, 0,
NULL,
/* icon */ NULL,
/* pickup */ "Roam Navi2",
/* width */ 2,
30,
NULL,
0,
NULL,
0,
/* precache */ ""
},
{
"R_navi3",
Pickup_Navi,
NULL,
NULL,
NULL,
NULL,
"models/items/armor/body/tris.md2", 0, 0,
NULL,
/* icon */ NULL,
/* pickup */ "Roam Navi3",
/* width */ 2,
20,
NULL,
0,
NULL,
0,
/* precache */ ""
},
//
// ARMOR
//
/*QUAKED item_armor_body (.3 .3 1) (-16 -16 -16) (16 16 16) 0
*/
{
"item_armor_body",
Pickup_Armor,
NULL,
NULL,
NULL,
"misc/ar1_pkup.wav",
"models/items/armor/body/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "i_bodyarmor",
/* pickup */ "Body Armor",
/* width */ 3,
0,
NULL,
IT_ARMOR,
&bodyarmor_info,
ARMOR_BODY,
/* precache */ ""
},
/*QUAKED item_armor_combat (.3 .3 1) (-16 -16 -16) (16 16 16) 1
*/
{
"item_armor_combat",
Pickup_Armor,
NULL,
NULL,
NULL,
"misc/ar1_pkup.wav",
"models/items/armor/combat/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "i_combatarmor",
/* pickup */ "Combat Armor",
/* width */ 3,
0,
NULL,
IT_ARMOR,
&combatarmor_info,
ARMOR_COMBAT,
/* precache */ ""
},
/*QUAKED item_armor_jacket (.3 .3 1) (-16 -16 -16) (16 16 16) 2
*/
{
"item_armor_jacket",
Pickup_Armor,
NULL,
NULL,
NULL,
"misc/ar1_pkup.wav",
"models/items/armor/jacket/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "i_jacketarmor",
/* pickup */ "Jacket Armor",
/* width */ 3,
0,
NULL,
IT_ARMOR,
&jacketarmor_info,
ARMOR_JACKET,
/* precache */ ""
},
/*QUAKED item_armor_shard (.3 .3 1) (-16 -16 -16) (16 16 16) 3
*/
{
"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
/* icon */ "i_shard",
#else
/* icon */ "i_jacketarmor",
#endif
/* pickup */ "Armor Shard",
/* width */ 3,
0,
NULL,
IT_ARMOR,
NULL,
ARMOR_SHARD,
/* precache */ ""
},
/*QUAKED item_power_screen (.3 .3 1) (-16 -16 -16) (16 16 16) 4
*/
{
"item_power_screen",
Pickup_Powerup,
Use_PowerArmor,
Drop_PowerArmor,
NULL,
"misc/ar3_pkup.wav",
"models/items/armor/screen/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "i_powerscreen",
/* pickup */ "Power Screen",
/* width */ 0,
60,
NULL,
IT_ARMOR,
NULL,
0,
/* precache */ ""
},
/*QUAKED item_power_shield (.3 .3 1) (-16 -16 -16) (16 16 16) 5
*/
{
"item_power_shield",
Pickup_Powerup,
Use_PowerArmor,
Drop_PowerArmor,
NULL,
"misc/ar3_pkup.wav",
"models/items/armor/shield/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "i_powershield",
/* pickup */ "Power Shield",
/* width */ 0,
60,
NULL,
IT_ARMOR,
NULL,
0,
/* precache */ "misc/power2.wav misc/power1.wav"
},
//
// WEAPONS
//
/* weapon_grapple (.3 .3 1) (-16 -16 -16) (16 16 16)
always owned, never in the world
*/
{
"weapon_grapple",
NULL,
Use_Weapon,
NULL,
CTFWeapon_Grapple,
"misc/w_pkup.wav",
NULL, 0, 0,
"models/weapons/grapple/tris.md2",
/* icon */ "w_grapple",
/* pickup */ "Grapple",
0,
0,
NULL,
IT_WEAPON,
// 0,
NULL,
0,
/* precache */ "weapons/grapple/grfire.wav weapons/grapple/grpull.wav weapons/grapple/grhang.wav weapons/grapple/grreset.wav weapons/grapple/grhit.wav"
},
/* weapon_blaster (.3 .3 1) (-16 -16 -16) (16 16 16) 6
always owned, never in the world
*/
{
"weapon_blaster",
NULL,
Use_Weapon,
NULL,
Weapon_Blaster,
"misc/w_pkup.wav",
NULL, 0, 0,
"models/weapons/v_blast/tris.md2",
/* icon */ "w_blaster",
/* pickup */ "Blaster",
0,
0,
NULL,
IT_WEAPON,
// WEAP_BLASTER,
NULL,
0,
/* precache */ "weapons/blastf1a.wav misc/lasfly.wav"
},
/*QUAKED weapon_shotgun (.3 .3 1) (-16 -16 -16) (16 16 16) 7
*/
{
"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",
/* icon */ "w_shotgun",
/* pickup */ "Shotgun",
0,
1,
"Shells",
IT_WEAPON,
// WEAP_SHOTGUN,
NULL,
0,
/* precache */ "weapons/shotgf1b.wav weapons/shotgr1b.wav"
},
/*QUAKED weapon_supershotgun (.3 .3 1) (-16 -16 -16) (16 16 16) 8
*/
{
"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",
/* icon */ "w_sshotgun",
/* pickup */ "Super Shotgun",
0,
2,
"Shells",
IT_WEAPON,
// WEAP_SUPERSHOTGUN,
NULL,
0,
/* precache */ "weapons/sshotf1b.wav"
},
/*QUAKED weapon_machinegun (.3 .3 1) (-16 -16 -16) (16 16 16) 9
*/
{
"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",
/* icon */ "w_machinegun",
/* pickup */ "Machinegun",
0,
1,
"Bullets",
IT_WEAPON,
// WEAP_MACHINEGUN,
NULL,
0,
/* precache */ "weapons/machgf1b.wav weapons/machgf2b.wav weapons/machgf3b.wav weapons/machgf4b.wav weapons/machgf5b.wav"
},
/*QUAKED weapon_chaingun (.3 .3 1) (-16 -16 -16) (16 16 16) 10
*/
{
"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",
/* icon */ "w_chaingun",
/* pickup */ "Chaingun",
0,
1,
"Bullets",
IT_WEAPON,
// WEAP_CHAINGUN,
NULL,
0,
/* precache */ "weapons/chngnu1a.wav weapons/chngnl1a.wav weapons/machgf3b.wav weapons/chngnd1a.wav"
},
/*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",
/* icon */ "a_trap",
/* pickup */ "Trap",
/* width */ 3,
1,
"trap",
IT_AMMO|IT_WEAPON,
// 0,
NULL,
AMMO_TRAP,
/* precache */ "weapons/trapcock.wav weapons/traploop.wav weapons/trapsuck.wav weapons/trapdown.wav"
// "weapons/hgrent1a.wav weapons/hgrena1b.wav weapons/hgrenc1b.wav weapons/hgrenb1a.wav weapons/hgrenb2a.wav "
},
/*QUAKED weapon_grenadelauncher (.3 .3 1) (-16 -16 -16) (16 16 16) 11
*/
{
"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",
/* icon */ "w_glauncher",
/* pickup */ "Grenade Launcher",
0,
1,
"Grenades",
IT_WEAPON,
NULL,
0,
/* precache */ "models/objects/grenade/tris.md2 weapons/grenlf1a.wav weapons/grenlr1b.wav weapons/grenlb1b.wav"
},
/*QUAKED weapon_rocketlauncher (.3 .3 1) (-16 -16 -16) (16 16 16) 12
*/
{
"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",
/* icon */ "w_rlauncher",
/* pickup */ "Rocket Launcher",
0,
1,
"Rockets",
IT_WEAPON,
NULL,
0,
/* precache */ "models/objects/rocket/tris.md2 weapons/rockfly.wav weapons/rocklf1a.wav weapons/rocklr1b.wav models/objects/debris2/tris.md2"
},
/*QUAKED weapon_hyperblaster (.3 .3 1) (-16 -16 -16) (16 16 16) 13
*/
{
"weapon_hyperblaster",
Pickup_Weapon,
// RAFAEL
Use_Weapon2,
/* 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",
/* icon */ "w_hyperblaster",
/* pickup */ "HyperBlaster",
0,
1,
"Cells",
IT_WEAPON,
NULL,
0,
/* precache */ "weapons/hyprbu1a.wav weapons/hyprbl1a.wav weapons/hyprbf1a.wav weapons/hyprbd1a.wav misc/lasfly.wav"
},
/*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",
/* icon */ "w_ripper",
/* pickup */ "Ionripper",
0,
2,
"Cells",
IT_WEAPON,
// WEAP_BOOMER,
NULL,
0,
#ifdef KMQUAKE2_ENGINE_MOD
/* precache */ "weapons/ionactive.wav weapons/ion_hum.wav weapons/ionaway.wav weapons/rippfire.wav misc/lasfly.wav weapons/ionhit1.wav weapons/ionhit2.wav weapons/ionhit3.wav weapons/ionexp.wav models/objects/boomrang/tris.md2" // precache
#else
/* precache */ "weapons/rippfire.wav misc/lasfly.wav models/objects/boomrang/tris.md2"
#endif
},
// END 14-APR-98
/*QUAKED weapon_railgun (.3 .3 1) (-16 -16 -16) (16 16 16) 14
*/
{
"weapon_railgun",
Pickup_Weapon,
// RAFAEL
Use_Weapon2,
/* 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",
/* icon */ "w_railgun",
/* pickup */ "Railgun",
0,
1,
"Slugs",
IT_WEAPON,
NULL,
0,
/* precache */ "weapons/rg_hum.wav weapons/railgf1a.wav"
},
// RAFAEL 14-APR-98
/*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",
/* icon */ "w_phallanx",
/* pickup */ "Phalanx",
0,
1,
"Mag Slug",
IT_WEAPON,
// WEAP_PHALANX,
NULL,
0,
/* precache */ "sprites/s_photon.sp2 weapons/plasshot.wav weapons/phaloop.wav"
},
/*QUAKED weapon_bfg (.3 .3 1) (-16 -16 -16) (16 16 16) 15
*/
{
"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",
/* icon */ "w_bfg",
/* pickup */ "BFG10K",
0,
50,
"Cells",
IT_WEAPON,
NULL,
0,
/* precache */ "sprites/s_bfg1.sp2 sprites/s_bfg2.sp2 sprites/s_bfg3.sp2 weapons/bfg__f1y.wav weapons/bfg__l1a.wav weapons/bfg__x1b.wav weapons/bfg_hum.wav"
},
#if 0
//ZOID
/*QUAKED weapon_laser (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"weapon_laser",
Pickup_Weapon,
Use_Weapon,
Drop_Weapon,
Weapon_Laser,
"misc/w_pkup.wav",
"models/weapons/g_laser/tris.md2", 0, EF_ROTATE,
"models/weapons/v_laser/tris.md2",
/* icon */ "w_bfg",
/* pickup */ "Flashlight Laser",
0,
1,
"Cells",
IT_WEAPON,
NULL,
0,
/* precache */ ""
},
#endif
//
// AMMO ITEMS
//
/*QUAKED ammo_shells (.3 .3 1) (-16 -16 -16) (16 16 16) 16
*/
{
"ammo_shells",
Pickup_Ammo,
NULL,
Drop_Ammo,
NULL,
"misc/am_pkup.wav",
"models/items/ammo/shells/medium/tris.md2", 0, 0,
NULL,
/* icon */ "a_shells",
/* pickup */ "Shells",
/* width */ 3,
10,
NULL,
IT_AMMO,
NULL,
AMMO_SHELLS,
/* precache */ ""
},
/*QUAKED ammo_bullets (.3 .3 1) (-16 -16 -16) (16 16 16) 17
*/
{
"ammo_bullets",
Pickup_Ammo,
NULL,
Drop_Ammo,
NULL,
"misc/am_pkup.wav",
"models/items/ammo/bullets/medium/tris.md2", 0, 0,
NULL,
/* icon */ "a_bullets",
/* pickup */ "Bullets",
/* width */ 3,
50,
NULL,
IT_AMMO,
NULL,
AMMO_BULLETS,
/* precache */ ""
},
/*QUAKED ammo_cells (.3 .3 1) (-16 -16 -16) (16 16 16) 18
*/
{
"ammo_cells",
Pickup_Ammo,
NULL,
Drop_Ammo,
NULL,
"misc/am_pkup.wav",
"models/items/ammo/cells/medium/tris.md2", 0, 0,
NULL,
/* icon */ "a_cells",
/* pickup */ "Cells",
/* width */ 3,
50,
NULL,
IT_AMMO,
NULL,
AMMO_CELLS,
/* precache */ ""
},
/*QUAKED ammo_grenades (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"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",
/* icon */ "a_grenades",
/* pickup */ "Grenades",
/* width */ 3,
5,
"grenades",
IT_AMMO|IT_WEAPON,
NULL,
AMMO_GRENADES,
/* precache */ "weapons/hgrent1a.wav weapons/hgrena1b.wav weapons/hgrenc1b.wav weapons/hgrenb1a.wav weapons/hgrenb2a.wav "
},
/*QUAKED ammo_rockets (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"ammo_rockets",
Pickup_Ammo,
NULL,
Drop_Ammo,
NULL,
"misc/am_pkup.wav",
"models/items/ammo/rockets/medium/tris.md2", 0, 0,
NULL,
/* icon */ "a_rockets",
/* pickup */ "Rockets",
/* width */ 3,
5,
NULL,
IT_AMMO,
NULL,
AMMO_ROCKETS,
/* precache */ ""
},
/*QUAKED ammo_slugs (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"ammo_slugs",
Pickup_Ammo,
NULL,
Drop_Ammo,
NULL,
"misc/am_pkup.wav",
"models/items/ammo/slugs/medium/tris.md2", 0, 0,
NULL,
/* icon */ "a_slugs",
/* pickup */ "Slugs",
/* width */ 3,
10,
NULL,
IT_AMMO,
NULL,
AMMO_SLUGS,
/* precache */ ""
},
/*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,
/* icon */ "a_mslugs",
/* pickup */ "Mag Slug",
/* width */ 3,
10,
NULL,
IT_AMMO,
// 0,
NULL,
AMMO_MAGSLUG,
/* precache */ ""
},
//
// POWERUP ITEMS
//
/*QUAKED item_quad (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"item_quad",
Pickup_Powerup,
Use_Quad,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/quaddama/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "p_quad",
/* pickup */ "Quad Damage",
/* width */ 2,
60,
NULL,
0,
NULL,
0,
/* precache */ "items/damage.wav items/damage2.wav items/damage3.wav"
},
// Knightmare- addded double damage
/*QUAKED item_double (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"item_double",
Pickup_Powerup,
Use_Double,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/ddamage/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "p_double",
/* pickup */ "Double Damage",
/* width */ 2,
60,
NULL,
0,
NULL,
0,
/* precache */ "misc/ddamage1.wav misc/ddamage2.wav misc/ddamage3.wav"
},
/*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,
/* icon */ "p_quadfire",
/* pickup */ "DualFire Damage",
/* width */ 2,
60,
NULL,
// IT_POWERUP,
0,
NULL,
0,
/* precache */ "items/quadfire1.wav items/quadfire2.wav items/quadfire3.wav"
},
/*QUAKED item_invulnerability (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"item_invulnerability",
Pickup_Powerup,
Use_Invulnerability,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/invulner/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "p_invulnerability",
/* pickup */ "Invulnerability",
/* width */ 2,
300,
NULL,
0,
NULL,
0,
/* precache */ "items/protect.wav items/protect2.wav items/protect3.wav"
},
/*QUAKED item_silencer (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"item_silencer",
Pickup_Powerup,
Use_Silencer,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/silencer/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "p_silencer",
/* pickup */ "Silencer",
/* width */ 2,
60,
NULL,
0,
NULL,
0,
/* precache */ ""
},
/*QUAKED item_breather (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"item_breather",
Pickup_Powerup,
Use_Breather,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/breather/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "p_rebreather",
/* pickup */ "Rebreather",
/* width */ 2,
60,
NULL,
0,
NULL,
0,
/* precache */ "items/airout.wav"
},
/*QUAKED item_enviro (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"item_enviro",
Pickup_Powerup,
Use_Envirosuit,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/enviro/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "p_envirosuit",
/* pickup */ "Environment Suit",
/* width */ 2,
60,
NULL,
0,
NULL,
0,
/* precache */ "items/airout.wav"
},
/*QUAKED item_ancient_head (.3 .3 1) (-16 -16 -16) (16 16 16)
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,
/* icon */ "i_fixme",
/* pickup */ "Ancient Head",
/* width */ 2,
60,
NULL,
0,
NULL,
0,
/* precache */ ""
},
/*QUAKED item_adrenaline (.3 .3 1) (-16 -16 -16) (16 16 16)
gives +1 to maximum health
*/
{
"item_adrenaline",
Pickup_Adrenaline,
NULL,
NULL,
NULL,
"items/pkup.wav",
"models/items/adrenal/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "p_adrenaline",
/* pickup */ "Adrenaline",
/* width */ 2,
60,
NULL,
0,
NULL,
0,
/* precache */ ""
},
/*QUAKED item_bandolier (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"item_bandolier",
Pickup_Bandolier,
NULL,
NULL,
NULL,
"items/pkup.wav",
"models/items/band/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "p_bandolier",
/* pickup */ "Bandolier",
/* width */ 2,
60,
NULL,
0,
NULL,
0,
/* precache */ ""
},
/*QUAKED item_pack (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
{
"item_pack",
Pickup_Pack,
NULL,
NULL,
NULL,
"items/pkup.wav",
"models/items/pack/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "i_pack",
/* pickup */ "Ammo Pack",
/* width */ 2,
180,
NULL,
0,
NULL,
0,
/* precache */ ""
},
#if 0
//
// KEYS
//
/*QUAKED key_data_cd (0 .5 .8) (-16 -16 -16) (16 16 16)
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,
0,
NULL,
0,
/* precache */ ""
},
/*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,
0,
NULL,
0,
/* precache */ ""
},
/*QUAKED key_pyramid (0 .5 .8) (-16 -16 -16) (16 16 16)
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,
0,
NULL,
0,
/* precache */ ""
},
/*QUAKED key_data_spinner (0 .5 .8) (-16 -16 -16) (16 16 16)
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,
0,
NULL,
0,
/* precache */ ""
},
/*QUAKED key_pass (0 .5 .8) (-16 -16 -16) (16 16 16)
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,
0,
NULL,
0,
/* precache */ ""
},
/*QUAKED key_blue_key (0 .5 .8) (-16 -16 -16) (16 16 16)
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,
0,
NULL,
0,
/* precache */ ""
},
/*QUAKED key_red_key (0 .5 .8) (-16 -16 -16) (16 16 16)
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,
0,
NULL,
0,
/* precache */ ""
},
// RAFAEL
/*QUAKED key_green_key (0 .5 .8) (-16 -16 -16) (16 16 16)
normal door key - blue
*/
{
"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,
// 0,
NULL,
0,
/* precache */ ""
},
/*QUAKED key_commander_head (0 .5 .8) (-16 -16 -16) (16 16 16)
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,
/* icon */ "k_comhead",
/* pickup */ "Commander's Head",
/* width */ 2,
0,
NULL,
0,
NULL,
0,
/* precache */ ""
},
/*QUAKED key_airstrike_target (0 .5 .8) (-16 -16 -16) (16 16 16)
tank commander's head
*/
{
"key_airstrike_target",
Pickup_Key,
NULL,
Drop_General,
NULL,
"items/pkup.wav",
"models/items/keys/target/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "i_airstrike",
/* pickup */ "Airstrike Marker",
/* width */ 2,
0,
NULL,
0,
NULL,
0,
/* precache */ ""
},
#endif
{
NULL,
Pickup_Health,
NULL,
NULL,
NULL,
"items/pkup.wav",
NULL, 0, 0,
NULL,
/* icon */ "i_health",
/* pickup */ "Health",
/* width */ 3,
0,
NULL,
0,
NULL,
0,
/* precache */ ""
},
//ZOID
/*QUAKED item_flag_team1 (1 0.2 0) (-16 -16 -24) (16 16 32)
*/
{
"item_flag_team1",
CTFPickup_Flag,
NULL,
CTFDrop_Flag, //Should this be null if we don't want players to drop it manually?
NULL,
"ctf/flagtk.wav",
"players/male/flag1.md2", 0, EF_FLAG1,
NULL,
/* icon */ "i_ctf1",
/* pickup */ "Red Flag",
/* width */ 2,
0,
NULL,
0,
NULL,
0,
/* precache */ "ctf/flagcap.wav"
},
/*QUAKED item_flag_team2 (1 0.2 0) (-16 -16 -24) (16 16 32)
*/
{
"item_flag_team2",
CTFPickup_Flag,
NULL,
CTFDrop_Flag, //Should this be null if we don't want players to drop it manually?
NULL,
"ctf/flagtk.wav",
"players/male/flag2.md2", 0, EF_FLAG2,
NULL,
/* icon */ "i_ctf2",
/* pickup */ "Blue Flag",
/* width */ 2,
0,
NULL,
0,
NULL,
0,
/* precache */ "ctf/flagcap.wav"
},
/*QUAKED item_flag_zig (1 0.2 0) (-16 -16 -24) (16 16 32)
*/
{
"item_flag_zig",
ZIGPickup_Flag,
NULL,
ZIGDrop_Flag, //Should this be null if we don't want players to drop it manually?
NULL,
"3zb/emgcall.wav",
"models/zflag.md2", 0, EF_FLAG2,
NULL,
/* icon */ "i_zig",
/* pickup */ "Zig Flag",
/* width */ 2,
0,
NULL,
0,
NULL,
0,
/* precache */ "ctf/flagcap.wav"
},
/* Resistance Tech */
{
"item_tech1",
CTFPickup_Tech,
NULL,
CTFDrop_Tech, //Should this be null if we don't want players to drop it manually?
NULL,
"items/pkup.wav",
"models/ctf/resistance/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "tech1",
/* pickup */ "Disruptor Shield",
/* width */ 2,
0,
NULL,
IT_TECH,
NULL,
0,
/* precache */ "ctf/tech1.wav"
},
/* Strength Tech */
{
"item_tech2",
CTFPickup_Tech,
NULL,
CTFDrop_Tech, //Should this be null if we don't want players to drop it manually?
NULL,
"items/pkup.wav",
"models/ctf/strength/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "tech2",
/* pickup */ "Power Amplifier",
/* width */ 2,
0,
NULL,
IT_TECH,
NULL,
0,
/* precache */ "ctf/tech2.wav ctf/tech2x.wav"
},
/* Haste Tech */
{
"item_tech3",
CTFPickup_Tech,
NULL,
CTFDrop_Tech, //Should this be null if we don't want players to drop it manually?
NULL,
"items/pkup.wav",
"models/ctf/haste/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "tech3",
/* pickup */ "Time Accel",
/* width */ 2,
0,
NULL,
IT_TECH,
NULL,
0,
/* precache */ "ctf/tech3.wav"
},
/* Regeneration Tech */
{
"item_tech4",
CTFPickup_Tech,
NULL,
CTFDrop_Tech, //Should this be null if we don't want players to drop it manually?
NULL,
"items/pkup.wav",
"models/ctf/regeneration/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "tech4",
/* pickup */ "AutoDoc",
/* width */ 2,
0,
NULL,
IT_TECH,
NULL,
0,
/* precache */ "ctf/tech4.wav"
},
/* Vampire Tech */
{
"item_tech5",
CTFPickup_Tech,
NULL,
CTFDrop_Tech, // Should this be null if we don't want players to drop it manually?
NULL,
"items/pkup.wav",
"models/ctf/vampire/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "tech5",
/* pickup */ "Vampire",
/* width */ 2,
0,
NULL,
IT_TECH,
// 0,
NULL,
0,
/* precache */ "ctf/tech5.wav"
},
/* Ammogen Tech */
{
"item_tech6",
CTFPickup_Tech,
NULL,
CTFDrop_Tech, // Should this be null if we don't want players to drop it manually?
NULL,
"items/pkup.wav",
"models/ctf/ammogen/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "tech6",
/* pickup */ "Ammogen",
/* width */ 2,
0,
NULL,
IT_TECH,
// 0,
NULL,
0,
/* precache */ "ctf/tech6.wav"
},
/* Ammogen-spawned Backpack */
{
"item_ammogen_pack",
Pickup_AmmogenPack,
NULL,
NULL,
NULL,
"items/pkup.wav",
"models/items/pack/tris.md2", 0, EF_ROTATE,
NULL,
/* icon */ "i_pack",
/* pickup */ "Backpack",
/* width */ 2,
0,
NULL,
0,
// 0,
NULL,
0,
/* precache */ ""
},
//ZOID
// end of list marker
{NULL}
};
/*QUAKED item_health (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
void SP_item_health (edict_t *self)
{
if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
{
G_FreeEdict (self);
return;
}
self->model = "models/items/healing/medium/tris.md2";
self->count = 10;
SpawnItem (self, FindItem ("Health"));
gi.soundindex ("items/n_health.wav");
}
/*QUAKED item_health_small (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
void SP_item_health_small (edict_t *self)
{
if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
{
G_FreeEdict (self);
return;
}
self->model = "models/items/healing/stimpack/tris.md2";
self->count = sk_health_bonus_value->value; // was 2
SpawnItem (self, FindItem ("Health"));
self->style = HEALTH_IGNORE_MAX|HEALTH_SMALL;
gi.soundindex ("items/s_health.wav");
}
/*QUAKED item_health_large (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
void SP_item_health_large (edict_t *self)
{
if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
{
G_FreeEdict (self);
return;
}
self->model = "models/items/healing/large/tris.md2";
self->count = 25;
SpawnItem (self, FindItem ("Health"));
self->style = HEALTH_LARGE;
gi.soundindex ("items/l_health.wav");
}
/*QUAKED item_health_mega (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
void SP_item_health_mega (edict_t *self)
{
if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
{
G_FreeEdict (self);
return;
}
self->model = "models/items/mega_h/tris.md2";
self->count = 100;
SpawnItem (self, FindItem ("Health"));
gi.soundindex ("items/m_health.wav");
self->style = HEALTH_IGNORE_MAX|HEALTH_TIMED;
}
// RAFAEL
void SP_item_foodcube (edict_t *self)
{
if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
{
G_FreeEdict (self);
return;
}
self->model = "models/objects/trapfx/tris.md2";
SpawnItem (self, FindItem ("Health"));
self->spawnflags |= DROPPED_ITEM;
self->style = HEALTH_IGNORE_MAX|HEALTH_FOODCUBE;
gi.soundindex ("items/s_health.wav");
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);
}
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"));
// Knightmare added
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"));
magslug_index = ITEM_INDEX(FindItem("Mag Slug"));
trap_index = ITEM_INDEX(FindItem("Trap"));
blaster_index = ITEM_INDEX(FindItem("Blaster"));
rg_index = ITEM_INDEX(FindItem("Railgun"));
}