2020-02-23 21:15:28 +00:00
# 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 ;
# define HEALTH_IGNORE_MAX 1
# define HEALTH_TIMED 2
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 = jacketarmor_info . max_count ;
else if ( item_index = = combat_armor_index )
value = combatarmor_info . max_count ;
else if ( item_index = = body_armor_index )
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 > = 2 ) | | ( skill - > value > = 2 & & quantity > = 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 ;
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 < 250 )
other - > client - > pers . max_bullets = 250 ;
if ( other - > client - > pers . max_shells < 150 )
other - > client - > pers . max_shells = 150 ;
if ( other - > client - > pers . max_cells < 250 )
other - > client - > pers . max_cells = 250 ;
if ( other - > client - > pers . max_slugs < 75 )
other - > client - > pers . max_slugs = 75 ;
// RAFAEL
if ( other - > client - > pers . max_magslug < 75 )
other - > client - > pers . max_magslug = 75 ;
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 < 300 )
other - > client - > pers . max_bullets = 300 ;
if ( other - > client - > pers . max_shells < 200 )
other - > client - > pers . max_shells = 200 ;
if ( other - > client - > pers . max_rockets < 100 )
other - > client - > pers . max_rockets = 100 ;
if ( other - > client - > pers . max_grenades < 100 )
other - > client - > pers . max_grenades = 100 ;
if ( other - > client - > pers . max_cells < 300 )
other - > client - > pers . max_cells = 300 ;
if ( other - > client - > pers . max_slugs < 100 )
other - > client - > pers . max_slugs = 100 ;
// RAFAEL
if ( other - > client - > pers . max_magslug < 100 )
other - > client - > pers . max_magslug = 100 ;
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 )
{
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 ;
}
//======================================================================
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 = 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 = 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 + = 300 ;
else
ent - > client - > breather_framenum = level . framenum + 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 + = 300 ;
else
ent - > client - > enviro_framenum = level . framenum + 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 + = 300 ;
else
ent - > client - > invincible_framenum = level . framenum + 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 + = 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 ;
}
qboolean Pickup_Ammo ( edict_t * ent , edict_t * other )
{
int count ;
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 ] ;
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 ;
//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
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 " ;
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 ;
// 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 ] = 2 ;
else
other - > client - > pers . inventory [ old_armor_index ] + = 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 ;
else if ( old_armor_index = = combat_armor_index )
oldinfo = & combatarmor_info ;
else // (old_armor_index == body_armor_index)
oldinfo = & bodyarmor_info ;
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 ;
// 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 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_ARMOR ) )
return POWER_ARMOR_NONE ;
if ( ent - > client - > pers . inventory [ power_shield_index ] > 0 )
return POWER_ARMOR_SHIELD ;
if ( ent - > client - > pers . inventory [ power_screen_index ] > 0 )
return POWER_ARMOR_SCREEN ;
return POWER_ARMOR_NONE ;
}
void Use_PowerArmor ( edict_t * ent , gitem_t * item )
{
int index ;
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 )
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 ) ;
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 ' )
{
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 . 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 ;
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 ,
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 ,
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 ,
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 ,
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 " , 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 " , 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 " , 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 " , EF_ROTATE ,
NULL ,
/* icon */ " i_jacketarmor " ,
/* 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 " , 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 " , 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 ,
" 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 ,
" 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 " , 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 " , 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 " , 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 " , EF_ROTATE ,
" models/weapons/v_chain/tris.md2 " ,
/* icon */ " w_chaingun " ,
/* pickup */ " Chaingun " ,
0 ,
1 ,
" Bullets " ,
IT_WEAPON ,
// WEAP_CHAINGUN,
NULL ,
0 ,
2020-08-23 22:04:50 +00:00
/* precache */ " weapons/chngnu1a.wav weapons/chngnl1a.wav weapons/machgf3b.wav weapons/chngnd1a.wav "
2020-02-23 21:15:28 +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 " , 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 " , 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 " , 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 " , 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 " , EF_ROTATE ,
" models/weapons/v_boomer/tris.md2 " ,
/* icon */ " w_ripper " ,
/* pickup */ " Ionripper " ,
0 ,
2 ,
" Cells " ,
IT_WEAPON ,
// WEAP_BOOMER,
NULL ,
0 ,
/* precache */ " weapons/rg_hum.wav weapons/rippfire.wav "
} ,
// 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 " , 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 "
} ,
// 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 " , EF_ROTATE ,
" models/weapons/v_shotx/tris.md2 " ,
/* icon */ " w_phallanx " ,
/* pickup */ " Phalanx " ,
0 ,
1 ,
" Mag Slug " ,
IT_WEAPON ,
// WEAP_PHALANX,
NULL ,
0 ,
/* precache */ " weapons/plasshot.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 " , 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 " , 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 ,
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 ,
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 ,
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 ,
" 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 ,
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 ,
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 ,
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 " , 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 " , 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 " , 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 " , 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 " , 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 " , 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 " , 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 " , 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 " , 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 " , 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 " , 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 " , 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 " , 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 " , 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 " , 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 " , 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 " , 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 " , 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 " , 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 " , 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 " , 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 ,
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 " , 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 " , 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 " , 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 " , 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 " , 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 " , 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 " , EF_ROTATE ,
NULL ,
/* icon */ " tech4 " ,
/* pickup */ " AutoDoc " ,
/* width */ 2 ,
0 ,
NULL ,
IT_TECH ,
NULL ,
0 ,
/* precache */ " ctf/tech4.wav "
} ,
//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 = 2 ;
SpawnItem ( self , FindItem ( " Health " ) ) ;
self - > style = HEALTH_IGNORE_MAX ;
gi . soundindex ( " items/s_health.wav " ) ;
}
/*QUAKED item_health_large (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
void SP_item_health_large ( edict_t * self )
{
if ( deathmatch - > value & & ( ( int ) dmflags - > value & DF_NO_HEALTH ) )
{
G_FreeEdict ( self ) ;
return ;
}
self - > model = " models/items/healing/large/tris.md2 " ;
self - > count = 25 ;
SpawnItem ( self , FindItem ( " Health " ) ) ;
gi . soundindex ( " items/l_health.wav " ) ;
}
/*QUAKED item_health_mega (.3 .3 1) (-16 -16 -16) (16 16 16)
*/
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 ;
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 ( " Magslug " ) ) ;
trap_index = ITEM_INDEX ( FindItem ( " Trap " ) ) ;
}