1495 lines
42 KiB
Plaintext
1495 lines
42 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
pre_load()
|
|
{
|
|
if ( !maps\mp\alien\_utility::alien_mode_has( "collectible" ) )
|
|
return;
|
|
|
|
if ( !isdefined( level.alien_collectibles_table ) )
|
|
level.alien_collectibles_table = "mp/alien/collectibles.csv";
|
|
|
|
collectibles_model_precache();
|
|
level._effect["Fire_Cloud"] = loadfx( "vfx/gameplay/alien/vfx_alien_gas_fire" );
|
|
level._effect["Propane_explosion"] = loadfx( "vfx/gameplay/alien/vfx_alien_propane_tank_explosion" );
|
|
level._effect["Propane_explosion_cheap"] = loadfx( "vfx/gameplay/alien/vfx_alien_propane_tank_exp_cheaper" );
|
|
level._effect["Propane_explosion_cheapest"] = loadfx( "vfx/gameplay/alien/vfx_alien_propane_tank_exp_cheapest" );
|
|
level.collectibles = [];
|
|
collectibles_table_init( 0, 99 );
|
|
collectibles_table_init( 100, 199 );
|
|
var_0 = [[ level.hintprecachefunc ]]();
|
|
|
|
foreach ( var_2 in level.collectibles )
|
|
{
|
|
foreach ( var_5, var_4 in var_0 )
|
|
{
|
|
if ( var_2.desc == var_5 )
|
|
{
|
|
var_2.desc = get_localized_hint( var_2, var_4 );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
level.pistol_ammo_cost = 1500;
|
|
}
|
|
|
|
get_localized_hint( var_0, var_1 )
|
|
{
|
|
if ( maps\mp\alien\_utility::is_chaos_mode() && var_0.isweapon )
|
|
return &"ALIEN_CHAOS_WEAPON_PICKUP_HINT";
|
|
|
|
return var_1;
|
|
}
|
|
|
|
collectibles_model_precache()
|
|
{
|
|
precachemodel( "propane_tank_aliens_iw6" );
|
|
}
|
|
|
|
post_load()
|
|
{
|
|
if ( !maps\mp\alien\_utility::alien_mode_has( "collectible" ) )
|
|
return;
|
|
|
|
collectibles_world_init();
|
|
level.collectibles_lootcount = 0;
|
|
level.alien_loot_initialized = 1;
|
|
}
|
|
|
|
player_loot_init()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
|
|
if ( !maps\mp\alien\_utility::alien_mode_has( "loot" ) )
|
|
return;
|
|
|
|
self.lootbag = [];
|
|
self.has_health_pack = 0;
|
|
self notify( "loot_initialized" );
|
|
level.firecloudduration = getdvarint( "scr_fireCloudDuration", "9" );
|
|
level.firecloudradius = getdvarint( "scr_fireCloudRadius", "125" );
|
|
level.firecloudheight = getdvarint( "scr_fireCloudHeight", "120" );
|
|
level.firecloudtickdamage = getdvarint( "scr_fireCloudTickDamage", "100" );
|
|
level.firecloudhivetickdamage = getdvarint( "scr_fireCloudHiveTickDamage", "100" );
|
|
level.firecloudplayertickdamage = getdvarint( "scr_fireCloudPlayerTickDamage", "3" );
|
|
level.firecloudlingertime = getdvarint( "scr_fireCloudLingerTime", "6" );
|
|
}
|
|
|
|
collectibles_world_init()
|
|
{
|
|
level.itemexplodethisframe = 0;
|
|
level.collectibles_worldcount = [];
|
|
var_0 = common_scripts\utility::getstructarray( "item", "targetname" );
|
|
|
|
if ( isdefined( level.additional_boss_weapon ) )
|
|
{
|
|
var_1 = [[ level.additional_boss_weapon ]]();
|
|
|
|
if ( isdefined( var_1 ) )
|
|
var_0 = common_scripts\utility::array_add( var_0, var_1 );
|
|
}
|
|
|
|
if ( maps\mp\alien\_utility::is_chaos_mode() )
|
|
var_0 = maps\mp\alien\_chaos::swap_weapon_items( var_0 );
|
|
|
|
level.world_items = var_0;
|
|
|
|
foreach ( var_3 in level.world_items )
|
|
{
|
|
var_3.item_ref = var_3.script_noteworthy;
|
|
var_3 setup_item_data();
|
|
level.collectibles_worldcount[var_3.item_ref] = level.collectibles[var_3.item_ref].count;
|
|
}
|
|
|
|
init_throwableitems();
|
|
var_5 = maps\mp\alien\_utility::get_current_area_name();
|
|
|
|
if ( maps\mp\alien\_utility::is_chaos_mode() )
|
|
var_5 = maps\mp\alien\_utility::get_chaos_area();
|
|
|
|
thread spawn_items_in_area( var_5 );
|
|
|
|
if ( isdefined( level.enter_area_func ) )
|
|
[[ level.enter_area_func ]]( var_5 );
|
|
}
|
|
|
|
init_throwableitems()
|
|
{
|
|
level.thrown_entities = [];
|
|
level.throwable_items = [];
|
|
level.throwable_items["alienpropanetank_mp"] = init_throwable( 10000, "propane_tank_aliens_iw6", 1, &"ALIEN_COLLECTIBLES_PICKUP_PROPANE_TANK", ::propanetankwatchuse );
|
|
}
|
|
|
|
init_throwable( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
var_5 = spawnstruct();
|
|
var_5.force = var_0;
|
|
var_5.model = var_1;
|
|
var_5.canbepickedup = var_2;
|
|
var_5.hintstring = var_3;
|
|
var_5.pickupfunc = var_4;
|
|
return var_5;
|
|
}
|
|
|
|
spawn_items_in_area( var_0 )
|
|
{
|
|
var_1 = common_scripts\utility::array_randomize( level.world_items );
|
|
|
|
foreach ( var_3 in var_1 )
|
|
{
|
|
if ( !var_3.data["persist"] && var_0 != "all" && !common_scripts\utility::array_contains( var_3.areas, var_0 ) )
|
|
continue;
|
|
|
|
if ( level.collectibles_worldcount[var_3.item_ref] > 0 )
|
|
{
|
|
if ( isdefined( var_3.item_ent ) )
|
|
continue;
|
|
|
|
var_3 spawn_item();
|
|
var_3 thread item_pickup_listener();
|
|
level.collectibles_worldcount[var_3.item_ref]--;
|
|
}
|
|
}
|
|
}
|
|
|
|
remove_items_in_area( var_0 )
|
|
{
|
|
foreach ( var_2 in level.world_items )
|
|
{
|
|
if ( isdefined( var_2.item_ent ) )
|
|
{
|
|
if ( !var_2.data["persist"] && var_0 != "all" && !common_scripts\utility::array_contains( var_2.areas, var_0 ) )
|
|
continue;
|
|
|
|
var_2 remove_world_item();
|
|
level.collectibles_worldcount[var_2.item_ref]++;
|
|
}
|
|
}
|
|
}
|
|
|
|
setup_item_data()
|
|
{
|
|
self.override = spawnstruct();
|
|
|
|
if ( !isdefined( self.script_noteworthy ) )
|
|
self.script_noteworthy = self.item_ref;
|
|
|
|
self.isloot = is_collectible_loot( self.item_ref );
|
|
self.isweapon = is_collectible_weapon( self.item_ref );
|
|
self.isitem = is_collectible_item( self.item_ref );
|
|
self.areas = get_item_areas();
|
|
|
|
if ( isdefined( self.script_parameters ) )
|
|
{
|
|
var_0 = strtok( self.script_parameters, " " );
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
var_3 = strtok( self.script_parameters, "=" );
|
|
|
|
if ( var_3.size == 0 )
|
|
continue;
|
|
|
|
var_4 = var_3[0];
|
|
var_5 = var_3[1];
|
|
|
|
switch ( var_4 )
|
|
{
|
|
case "respawn_max":
|
|
self.override.respawn_max = int( var_5 );
|
|
break;
|
|
case "unlock":
|
|
self.override.unlock = int( var_5 );
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
self.data = [];
|
|
self.data["count"] = level.collectibles[self.item_ref].count;
|
|
self.data["respawn_count"] = level.collectibles[self.item_ref].respawn_max;
|
|
self.data["times_collected"] = 0;
|
|
self.data["last_collector"] = undefined;
|
|
self.data["vis"] = 1;
|
|
self.data["unlock"] = 1;
|
|
self.data["persist"] = level.collectibles[self.item_ref].persist;
|
|
self.data["cost"] = level.collectibles[self.item_ref].cost;
|
|
|
|
if ( isdefined( self.override ) )
|
|
{
|
|
if ( isdefined( self.override.respawn_max ) )
|
|
self.data["respawn_count"] = self.override.respawn_max;
|
|
|
|
if ( isdefined( self.override.unlock ) )
|
|
self.data["unlock"] = self.override.unlock;
|
|
}
|
|
}
|
|
|
|
get_item_areas()
|
|
{
|
|
if ( !isdefined( level.world_areas ) )
|
|
return;
|
|
|
|
var_0 = [];
|
|
|
|
foreach ( var_3, var_2 in level.world_areas )
|
|
{
|
|
if ( ispointinvolume( self.origin, var_2 ) )
|
|
var_0[var_0.size] = var_3;
|
|
}
|
|
|
|
return var_0;
|
|
}
|
|
|
|
spawn_world_item( var_0, var_1 )
|
|
{
|
|
var_2 = self.item_ref;
|
|
var_3 = spawn( "script_model", get_world_item_spawn_pos( var_0 ) );
|
|
var_3 setmodel( level.collectibles[var_2].model );
|
|
|
|
if ( maps\mp\alien\_utility::is_chaos_mode() && maps\mp\alien\_utility::is_true( self.isweapon ) )
|
|
var_3.weapon_ref = getsubstr( var_2, 7 );
|
|
|
|
if ( isdefined( self.angles ) )
|
|
var_3.angles = self.angles;
|
|
else
|
|
var_3.angles = ( 0, 0, 0 );
|
|
|
|
self.item_ent = var_3;
|
|
|
|
if ( var_1 )
|
|
{
|
|
make_item_ent_useable( self.item_ent, get_item_desc( var_2 ) );
|
|
self.use_ent = self.item_ent;
|
|
}
|
|
else
|
|
self.use_ent = spawn( "trigger_radius", var_3.origin, 0, 32, 32 );
|
|
|
|
if ( should_explode_on_damage( var_2 ) )
|
|
self.item_ent thread explodeondamage( 0 );
|
|
|
|
self notify( "spawned" );
|
|
|
|
if ( maps\mp\alien\_utility::alien_mode_has( "outline" ) )
|
|
{
|
|
if ( getsubstr( var_2, 0, 6 ) == "weapon" )
|
|
maps\mp\alien\_outline_proto::add_to_outline_weapon_watch_list( var_3, self.data["cost"] );
|
|
else
|
|
maps\mp\alien\_outline_proto::add_to_outline_watch_list( var_3, self.data["cost"] );
|
|
}
|
|
}
|
|
|
|
get_world_item_spawn_pos( var_0 )
|
|
{
|
|
var_1 = ( 0, 0, 16 );
|
|
|
|
if ( var_0 )
|
|
return common_scripts\utility::drop_to_ground( self.origin, 32, -32 ) + var_1;
|
|
else
|
|
return self.origin;
|
|
}
|
|
|
|
make_item_ent_useable( var_0, var_1 )
|
|
{
|
|
var_0 setcursorhint( "HINT_NOICON" );
|
|
var_0 sethintstring( var_1 );
|
|
var_0 makeusable();
|
|
}
|
|
|
|
should_explode_on_damage( var_0 )
|
|
{
|
|
switch ( var_0 )
|
|
{
|
|
case "item_alienpropanetank_mp":
|
|
return 1;
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
spawn_item()
|
|
{
|
|
spawn_world_item( 0, 1 );
|
|
}
|
|
|
|
spawn_loot( var_0 )
|
|
{
|
|
spawn_world_item( 1, 0 );
|
|
self.item_ent.loot_owner = var_0;
|
|
level.collectibles_lootcount++;
|
|
thread loot_collection_timeout();
|
|
}
|
|
|
|
loot_collection_timeout()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "deleted" );
|
|
|
|
for ( self.loot_collection_timeout = 5; self.loot_collection_timeout; self.loot_collection_timeout-- )
|
|
wait 1;
|
|
}
|
|
|
|
clear_item_pickup()
|
|
{
|
|
self endon( "disconnect" );
|
|
wait 1;
|
|
self.picking_up_item = 0;
|
|
}
|
|
|
|
item_pickup_listener()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "timedout" );
|
|
level endon( "game_ended" );
|
|
|
|
for (;;)
|
|
{
|
|
self.use_ent waittill( "trigger", var_0 );
|
|
var_0 notify( "cancel_watch" );
|
|
var_0 notify( "kill_spendhint" );
|
|
var_0.picking_up_item = 1;
|
|
var_0 thread clear_item_pickup();
|
|
|
|
if ( var_0 [[ get_func_cangive( self.item_ref ) ]]( self ) )
|
|
{
|
|
switch ( self.item_ref )
|
|
{
|
|
case "item_alienpropanetank_mp":
|
|
var_0 playlocalsound( "weap_pickup_propanetank_plr" );
|
|
break;
|
|
default:
|
|
var_0 playlocalsound( "extinction_item_pickup" );
|
|
}
|
|
|
|
var_0 [[ get_func_give( self.item_ref ) ]]( self );
|
|
self.data["last_collector"] = var_0;
|
|
self.data["times_collected"]++;
|
|
level.collectibles_worldcount[self.item_ref]++;
|
|
var_0 notify( "loot_pickup", self );
|
|
}
|
|
else
|
|
{
|
|
wait 0.05;
|
|
continue;
|
|
}
|
|
|
|
if ( self.data["persist"] > 0 )
|
|
continue;
|
|
else
|
|
{
|
|
remove_world_item();
|
|
|
|
if ( self.data["respawn_count"] <= 0 )
|
|
return;
|
|
|
|
level waittill( "alien_cycle_ended" );
|
|
self.data["respawn_count"]--;
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
loot_pickup_listener( var_0, var_1 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "timedout" );
|
|
level endon( "game_ended" );
|
|
var_2 = is_collectible_loot( self.item_ref );
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = 0;
|
|
|
|
if ( !var_1 )
|
|
make_item_ent_useable( self.item_ent, get_item_desc( self.item_ref ) );
|
|
|
|
for (;;)
|
|
{
|
|
self.use_ent waittill( "trigger", var_3 );
|
|
|
|
if ( !isdefined( var_3 ) || !isplayer( var_3 ) )
|
|
{
|
|
wait 0.05;
|
|
continue;
|
|
}
|
|
|
|
if ( var_3 [[ get_func_cangive( self.item_ref ) ]]( self ) )
|
|
{
|
|
var_3 playlocalsound( "extinction_item_pickup" );
|
|
var_3 thread [[ get_func_give( self.item_ref ) ]]( self );
|
|
var_3 notify( "loot_pickup", self );
|
|
}
|
|
else
|
|
{
|
|
wait 0.05;
|
|
continue;
|
|
}
|
|
|
|
if ( self.data["persist"] > 0 )
|
|
continue;
|
|
else
|
|
remove_loot();
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
loot_pickup_timeout( var_0, var_1 )
|
|
{
|
|
self endon( "death" );
|
|
level endon( "game_ended" );
|
|
|
|
for ( var_2 = var_1; var_2; var_2-- )
|
|
wait 1;
|
|
|
|
if ( self.data["persist"] > 0 )
|
|
{
|
|
self notify( "timedout" );
|
|
remove_world_item();
|
|
}
|
|
}
|
|
|
|
remove_loot()
|
|
{
|
|
remove_world_item();
|
|
level.collectibles_lootcount--;
|
|
}
|
|
|
|
remove_world_item()
|
|
{
|
|
if ( maps\mp\alien\_utility::alien_mode_has( "outline" ) )
|
|
maps\mp\alien\_outline_proto::remove_from_outline_watch_list( self.item_ent );
|
|
|
|
self.item_ent delete();
|
|
|
|
if ( isdefined( self.use_ent ) )
|
|
self.use_ent delete();
|
|
}
|
|
|
|
item_min_distance_from_players()
|
|
{
|
|
return !maps\mp\alien\_utility::any_player_nearby( self.origin, 1048580.0 );
|
|
}
|
|
|
|
is_item( var_0 )
|
|
{
|
|
return issubstr( var_0, "item" );
|
|
}
|
|
|
|
collectibles_table_init( var_0, var_1 )
|
|
{
|
|
for ( var_2 = var_0; var_2 < var_1; var_2++ )
|
|
{
|
|
var_3 = tablelookup( level.alien_collectibles_table, 0, var_2, 1 );
|
|
|
|
if ( var_3 == "" )
|
|
break;
|
|
|
|
var_4 = spawnstruct();
|
|
var_4.index = var_2;
|
|
var_4.ref = var_3;
|
|
var_4.model = tablelookup( level.alien_collectibles_table, 0, var_2, 2 );
|
|
var_4.name = tablelookup( level.alien_collectibles_table, 0, var_2, 3 );
|
|
var_4.desc = tablelookup( level.alien_collectibles_table, 0, var_2, 4 );
|
|
var_4.count = int( tablelookup( level.alien_collectibles_table, 0, var_2, 5 ) );
|
|
var_4.ownership = tablelookup( level.alien_collectibles_table, 0, var_2, 7 );
|
|
var_4.respawn = float( tablelookup( level.alien_collectibles_table, 0, var_2, 8 ) );
|
|
var_4.respawn_max = int( tablelookup( level.alien_collectibles_table, 0, var_2, 9 ) );
|
|
var_4.vis = int( tablelookup( level.alien_collectibles_table, 0, var_2, 10 ) );
|
|
var_4.unlock = int( tablelookup( level.alien_collectibles_table, 0, var_2, 11 ) );
|
|
var_4.player_max = int( tablelookup( level.alien_collectibles_table, 0, var_2, 12 ) );
|
|
var_4.persist = int( tablelookup( level.alien_collectibles_table, 0, var_2, 13 ) );
|
|
var_4.cost = int( tablelookup( level.alien_collectibles_table, 0, var_2, 15 ) );
|
|
var_4.cost_display = tablelookup( level.alien_collectibles_table, 0, var_2, 15 );
|
|
var_4.func_give = get_func_give( var_4.ref );
|
|
var_4.func_cangive = get_func_cangive( var_4.ref );
|
|
var_4.isloot = is_collectible_loot( var_4.ref );
|
|
var_4.isweapon = is_collectible_weapon( var_4.ref );
|
|
var_4.isitem = is_collectible_item( var_4.ref );
|
|
|
|
if ( maps\mp\alien\_utility::is_chaos_mode() )
|
|
var_4.cost = 0;
|
|
|
|
level.collectibles[var_4.ref] = var_4;
|
|
}
|
|
}
|
|
|
|
is_collectible_loot( var_0 )
|
|
{
|
|
if ( isdefined( level.collectibles ) && isdefined( level.collectibles[var_0] ) && isdefined( level.collectibles[var_0].isloot ) )
|
|
return level.collectibles[var_0].isloot;
|
|
else
|
|
return getsubstr( var_0, 0, 5 ) == "loot_";
|
|
}
|
|
|
|
is_collectible_weapon( var_0 )
|
|
{
|
|
if ( isdefined( level.collectibles ) && isdefined( level.collectibles[var_0] ) && isdefined( level.collectibles[var_0].isweapon ) )
|
|
return level.collectibles[var_0].isweapon;
|
|
else
|
|
return getsubstr( var_0, 0, 7 ) == "weapon_";
|
|
}
|
|
|
|
is_collectible_item( var_0 )
|
|
{
|
|
if ( isdefined( level.collectibles ) && isdefined( level.collectibles[var_0] ) && isdefined( level.collectibles[var_0].isitem ) )
|
|
return level.collectibles[var_0].isitem;
|
|
else
|
|
return getsubstr( var_0, 0, 5 ) == "item_";
|
|
}
|
|
|
|
item_exist( var_0 )
|
|
{
|
|
return isdefined( level.collectibles[var_0] );
|
|
}
|
|
|
|
get_item_desc( var_0 )
|
|
{
|
|
return level.collectibles[var_0].desc;
|
|
}
|
|
|
|
get_item_name( var_0 )
|
|
{
|
|
return level.collectibles[var_0].name;
|
|
}
|
|
|
|
get_maxstock( var_0 )
|
|
{
|
|
return level.collectibles[var_0].player_max;
|
|
}
|
|
|
|
give_default( var_0 )
|
|
{
|
|
return;
|
|
}
|
|
|
|
cangive_default( var_0 )
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
get_func_give( var_0 )
|
|
{
|
|
if ( item_exist( var_0 ) )
|
|
return level.collectibles[var_0].func_give;
|
|
|
|
var_1 = ::give_default;
|
|
|
|
switch ( var_0 )
|
|
{
|
|
case "item_alienpropanetank_mp":
|
|
var_1 = ::give_throwable_weapon;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if ( strtok( var_0, "_" )[0] == "weapon" )
|
|
var_1 = ::give_weapon;
|
|
|
|
return var_1;
|
|
}
|
|
|
|
get_func_cangive( var_0 )
|
|
{
|
|
if ( item_exist( var_0 ) )
|
|
return level.collectibles[var_0].func_cangive;
|
|
|
|
var_1 = ::cangive_default;
|
|
|
|
switch ( var_0 )
|
|
{
|
|
case "item_alienpropanetank_mp":
|
|
var_1 = ::cangive_throwable_weapon;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if ( strtok( var_0, "_" )[0] == "weapon" )
|
|
var_1 = ::cangive_weapon;
|
|
|
|
return var_1;
|
|
}
|
|
|
|
give_weapon( var_0, var_1 )
|
|
{
|
|
var_2 = undefined;
|
|
var_3 = var_0.item_ref;
|
|
var_4 = getsubstr( var_3, 7 );
|
|
var_5 = var_0.data["cost"];
|
|
|
|
if ( maps\mp\alien\_perk_utility::perk_getpistoloverkill() == 0 )
|
|
var_6 = 2;
|
|
else
|
|
var_6 = 3;
|
|
|
|
if ( isdefined( self.numadditionalprimaries ) )
|
|
var_6 = var_6 + self.numadditionalprimaries;
|
|
|
|
var_7 = maps\mp\alien\_utility::getrawbaseweaponname( var_4 );
|
|
var_8 = maps\mp\alien\_utility::player_has_specialized_ammo( var_7 );
|
|
var_9 = [];
|
|
|
|
if ( !has_weapon_variation( var_4 ) && !maps\mp\alien\_utility::has_pistols_only_relic_and_no_deployables() )
|
|
{
|
|
var_10 = get_replaceable_weapon();
|
|
|
|
if ( isdefined( var_10 ) )
|
|
{
|
|
var_11 = self getweaponammoclip( var_10 );
|
|
var_12 = self getweaponammostock( var_10 );
|
|
var_2 = 1;
|
|
|
|
if ( maps\mp\alien\_utility::is_chaos_mode() )
|
|
{
|
|
var_13 = var_10;
|
|
self takeweapon( var_13 );
|
|
}
|
|
|
|
if ( !self.hasriotshieldequipped && var_10 != "aliensoflam_mp" )
|
|
{
|
|
if ( ( self hasweapon( "aliensoflam_mp" ) || self.hasriotshield || maps\mp\alien\_utility::has_special_weapon() ) && self getweaponslistprimaries().size < var_6 + 1 )
|
|
var_2 = 0;
|
|
|
|
if ( self hasweapon( "aliensoflam_mp" ) && self.hasriotshield && self getweaponslistprimaries().size < var_6 + 2 )
|
|
var_2 = 0;
|
|
|
|
if ( isdefined( level.custom_give_weapon_func ) )
|
|
{
|
|
var_14 = [[ level.custom_give_weapon_func ]]( var_6 );
|
|
|
|
if ( isdefined( var_14 ) )
|
|
var_2 = var_14;
|
|
}
|
|
|
|
if ( var_2 )
|
|
self takeweapon( var_10 );
|
|
}
|
|
}
|
|
|
|
if ( isdefined( var_10 ) && maps\mp\_utility::getweaponclass( var_10 ) != "weapon_pistol" && var_2 == 1 )
|
|
var_9 = getweaponattachments( var_10 );
|
|
|
|
maps\mp\alien\_persistence::take_player_currency( var_5, 0, "weapon", var_4 );
|
|
|
|
if ( maps\mp\alien\_utility::is_chaos_mode() )
|
|
maps\mp\alien\_chaos::update_weapon_pickup( self, var_4 );
|
|
else if ( !maps\mp\alien\_utility::is_true( var_1 ) && isdefined( var_10 ) )
|
|
var_4 = maps\mp\alien\_utility::return_weapon_with_like_attachments( var_4, var_9 );
|
|
else if ( maps\mp\alien\_utility::is_true( var_1 ) )
|
|
var_4 = maps\mp\alien\_utility::ark_attachment_transfer_to_locker_weapon( var_4, var_9, var_2 );
|
|
|
|
self giveweapon( var_4 );
|
|
self switchtoweapon( var_4 );
|
|
|
|
if ( !maps\mp\alien\_utility::is_true( var_1 ) )
|
|
scale_ammo_based_on_nerf( var_4 );
|
|
|
|
give_pistol_ammo_if_nerf_active();
|
|
level notify( "new_weapon_purchased", self );
|
|
}
|
|
else
|
|
{
|
|
if ( !self hasweapon( var_4 ) )
|
|
var_4 = get_weapon_ref( var_4 );
|
|
|
|
if ( maps\mp\alien\_utility::has_pistols_only_relic_and_no_deployables() )
|
|
var_4 = maps\mp\alien\_utility::get_current_pistol();
|
|
|
|
var_15 = weaponmaxammo( var_4 );
|
|
var_16 = maps\mp\alien\_prestige::prestige_getminammo();
|
|
var_17 = int( var_16 * var_15 );
|
|
var_18 = self getammocount( var_4 );
|
|
|
|
if ( var_18 < var_17 )
|
|
{
|
|
if ( var_8 )
|
|
return;
|
|
|
|
self givemaxammo( var_4 );
|
|
self switchtoweapon( var_4 );
|
|
self setweaponammostock( var_4, var_17 );
|
|
|
|
if ( !maps\mp\alien\_utility::has_pistols_only_relic_and_no_deployables() )
|
|
give_pistol_ammo_if_nerf_active();
|
|
else
|
|
var_5 = level.pistol_ammo_cost;
|
|
|
|
maps\mp\_utility::clearlowermessage( "ammo_warn" );
|
|
maps\mp\_utility::setlowermessage( "ammo_taken", &"ALIEN_COLLECTIBLES_DEPLOYABLE_AMMO_TAKEN", 3 );
|
|
maps\mp\alien\_persistence::take_player_currency( var_5, 0, "weapon", var_4 );
|
|
}
|
|
else if ( !var_8 )
|
|
{
|
|
maps\mp\_utility::clearlowermessage( "ammo_warn" );
|
|
maps\mp\_utility::setlowermessage( "ammo_taken", &"ALIEN_COLLECTIBLES_AMMO_MAX", 3 );
|
|
}
|
|
}
|
|
}
|
|
|
|
scale_ammo_based_on_nerf( var_0 )
|
|
{
|
|
var_1 = maps\mp\alien\_deployablebox_functions::check_for_nerf_min_ammo();
|
|
|
|
if ( var_1 != 1.0 )
|
|
{
|
|
var_2 = weaponmaxammo( var_0 );
|
|
self setweaponammostock( var_0, int( var_2 * var_1 ) );
|
|
}
|
|
}
|
|
|
|
give_pistol_ammo_if_nerf_active()
|
|
{
|
|
if ( maps\mp\alien\_prestige::prestige_getnodeployables() == 1 )
|
|
{
|
|
var_0 = self getweaponslistprimaries();
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
var_3 = maps\mp\_utility::getweaponclass( var_2 );
|
|
|
|
if ( var_3 == "weapon_pistol" )
|
|
{
|
|
var_4 = weaponmaxammo( var_2 );
|
|
var_5 = int( var_4 * 0.25 );
|
|
var_6 = self getammocount( var_2 );
|
|
|
|
if ( var_5 > var_6 )
|
|
self setweaponammostock( var_2, var_5 );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
get_replaceable_weapon()
|
|
{
|
|
var_0 = self getweaponslistprimaries();
|
|
|
|
if ( maps\mp\alien\_utility::is_chaos_mode() )
|
|
{
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
var_3 = maps\mp\_utility::getweaponclass( var_2 );
|
|
|
|
switch ( var_3 )
|
|
{
|
|
case "weapon_projectile":
|
|
case "weapon_shotgun":
|
|
case "weapon_lmg":
|
|
case "weapon_dmr":
|
|
case "weapon_sniper":
|
|
case "weapon_assault":
|
|
case "weapon_smg":
|
|
return var_2;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( maps\mp\alien\_perk_utility::perk_getpistoloverkill() == 0 )
|
|
var_5 = 2;
|
|
else
|
|
var_5 = 3;
|
|
|
|
if ( isdefined( self.numadditionalprimaries ) )
|
|
var_5 = var_5 + self.numadditionalprimaries;
|
|
|
|
if ( var_0.size >= var_5 )
|
|
{
|
|
var_6 = self getcurrentweapon();
|
|
|
|
if ( weaponinventorytype( var_6 ) == "altmode" )
|
|
var_6 = get_weapon_name_from_alt( var_6 );
|
|
|
|
if ( isdefined( var_6 ) && weaponinventorytype( var_6 ) == "primary" )
|
|
return var_6;
|
|
else
|
|
{
|
|
var_7 = self getweaponslist( "primary" );
|
|
|
|
foreach ( var_2 in var_7 )
|
|
{
|
|
if ( weaponclass( var_2 ) != "item" && weaponclass( var_2 ) != "pistol" && weapontype( var_2 ) != "riotshield" )
|
|
return var_2;
|
|
}
|
|
}
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
get_weapon_name_from_alt( var_0 )
|
|
{
|
|
if ( weaponinventorytype( var_0 ) != "altmode" )
|
|
return var_0;
|
|
|
|
return getsubstr( var_0, 4 );
|
|
}
|
|
|
|
cangive_weapon( var_0 )
|
|
{
|
|
var_1 = var_0.item_ref;
|
|
var_2 = getsubstr( var_1, 7 );
|
|
var_3 = self getweaponslistprimaries();
|
|
var_4 = self getcurrentweapon();
|
|
var_5 = maps\mp\_utility::getweaponclass( var_4 );
|
|
|
|
if ( maps\mp\alien\_utility::is_chaos_mode() )
|
|
{
|
|
if ( maps\mp\alien\_chaos::is_weapon_recently_picked_up( self, var_2 ) || maps\mp\alien\_utility::has_special_weapon() )
|
|
{
|
|
maps\mp\_utility::setlowermessage( "cant_buy", &"ALIEN_COLLECTIBLES_PLAYER_HAS_SPECIALWEAPON", 3 );
|
|
return 0;
|
|
}
|
|
else
|
|
return 1;
|
|
}
|
|
|
|
if ( maps\mp\alien\_perk_utility::perk_getpistoloverkill() == 0 )
|
|
var_6 = 2;
|
|
else
|
|
var_6 = 3;
|
|
|
|
if ( isdefined( self.numadditionalprimaries ) )
|
|
var_6 = var_6 + self.numadditionalprimaries;
|
|
|
|
if ( maps\mp\alien\_prestige::prestige_getpistolsonly() == 1 )
|
|
{
|
|
if ( maps\mp\alien\_prestige::prestige_getnodeployables() != 1 )
|
|
{
|
|
maps\mp\_utility::setlowermessage( "cant_buy", &"ALIEN_COLLECTIBLES_PLAYER_NERFED", 3 );
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
if ( self isswitchingweapon() )
|
|
return 0;
|
|
|
|
if ( var_4 == "none" )
|
|
{
|
|
maps\mp\_utility::setlowermessage( "cant_buy", &"ALIEN_COLLECTIBLES_PLAYER_HOLDING", 3 );
|
|
return 0;
|
|
}
|
|
|
|
if ( isdefined( level.custom_cangive_weapon_func ) )
|
|
{
|
|
if ( ![[ level.custom_cangive_weapon_func ]]( var_3, var_4, var_5, var_6 ) )
|
|
{
|
|
maps\mp\_utility::setlowermessage( "cant_buy", &"ALIEN_COLLECTIBLES_PLAYER_HAS_SPECIALWEAPON", 3 );
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
if ( maps\mp\alien\_utility::has_special_weapon() )
|
|
{
|
|
maps\mp\_utility::setlowermessage( "cant_buy", &"ALIEN_COLLECTIBLES_PLAYER_HAS_SPECIALWEAPON", 3 );
|
|
return 0;
|
|
}
|
|
|
|
if ( var_5 == "weapon_pistol" && var_3.size >= var_6 && !self.hasriotshield && !self hasweapon( "aliensoflam_mp" ) )
|
|
{
|
|
maps\mp\_utility::setlowermessage( "cant_buy", &"ALIEN_COLLECTIBLES_PLAYER_HAS_SPECIALWEAPON", 3 );
|
|
return 0;
|
|
}
|
|
|
|
if ( var_5 == "weapon_pistol" && var_3.size >= var_6 + 1 && self.hasriotshield && !self hasweapon( "aliensoflam_mp" ) )
|
|
{
|
|
maps\mp\_utility::setlowermessage( "cant_buy", &"ALIEN_COLLECTIBLES_PLAYER_HAS_SPECIALWEAPON", 3 );
|
|
return 0;
|
|
}
|
|
|
|
if ( var_5 == "weapon_pistol" && var_3.size >= var_6 + 1 && self hasweapon( "aliensoflam_mp" ) && !self.hasriotshield )
|
|
{
|
|
maps\mp\_utility::setlowermessage( "cant_buy", &"ALIEN_COLLECTIBLES_PLAYER_HAS_SPECIALWEAPON", 3 );
|
|
return 0;
|
|
}
|
|
|
|
if ( var_5 == "weapon_pistol" && var_3.size >= var_6 + 2 && self.hasriotshield && self hasweapon( "aliensoflam_mp" ) )
|
|
{
|
|
maps\mp\_utility::setlowermessage( "cant_buy", &"ALIEN_COLLECTIBLES_PLAYER_HAS_SPECIALWEAPON", 3 );
|
|
return 0;
|
|
}
|
|
|
|
if ( var_4 == "aliensoflam_mp" && var_3.size >= var_6 + 1 && !self.hasriotshieldequipped )
|
|
{
|
|
maps\mp\_utility::setlowermessage( "cant_buy", &"ALIEN_COLLECTIBLES_PLAYER_HAS_SPECIALWEAPON", 3 );
|
|
return 0;
|
|
}
|
|
|
|
if ( var_4 == "aliensoflam_mp" && var_3.size >= var_6 + 2 && self.hasriotshieldequipped )
|
|
{
|
|
maps\mp\_utility::setlowermessage( "cant_buy", &"ALIEN_COLLECTIBLES_PLAYER_HAS_SPECIALWEAPON", 3 );
|
|
return 0;
|
|
}
|
|
|
|
if ( self.hasriotshieldequipped && var_3.size >= var_6 + 1 && !self hasweapon( "aliensoflam_mp" ) )
|
|
{
|
|
maps\mp\_utility::setlowermessage( "cant_buy", &"ALIEN_COLLECTIBLES_PLAYER_HAS_SPECIALWEAPON", 3 );
|
|
return 0;
|
|
}
|
|
|
|
if ( self.hasriotshieldequipped && var_3.size >= var_6 + 1 && self hasweapon( "aliensoflam_mp" ) )
|
|
{
|
|
maps\mp\_utility::setlowermessage( "cant_buy", &"ALIEN_COLLECTIBLES_PLAYER_HAS_SPECIALWEAPON", 3 );
|
|
return 0;
|
|
}
|
|
|
|
if ( !maps\mp\alien\_utility::is_holding_deployable() )
|
|
{
|
|
if ( maps\mp\alien\_utility::has_pistols_only_relic_and_no_deployables() )
|
|
var_7 = maps\mp\alien\_persistence::player_has_enough_currency( level.pistol_ammo_cost );
|
|
else
|
|
var_7 = maps\mp\alien\_persistence::player_has_enough_currency( var_0.data["cost"] );
|
|
|
|
if ( !var_7 )
|
|
{
|
|
maps\mp\_utility::clearlowermessage( "ammo_warn" );
|
|
maps\mp\_utility::setlowermessage( "no_money", &"ALIEN_COLLECTIBLES_NO_MONEY", 3 );
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
maps\mp\_utility::setlowermessage( "cant_buy", &"ALIEN_COLLECTIBLES_PLAYER_HOLDING", 3 );
|
|
return 0;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
give_throwable_weapon( var_0 )
|
|
{
|
|
var_1 = var_0.item_ref;
|
|
var_2 = getsubstr( var_1, 5 );
|
|
maps\mp\_utility::_giveweapon( var_2 );
|
|
self switchtoweapon( var_2 );
|
|
self disableweaponswitch();
|
|
displaythrowmessage();
|
|
}
|
|
|
|
cangive_throwable_weapon( var_0 )
|
|
{
|
|
var_1 = var_0.item_ref;
|
|
var_2 = getsubstr( var_1, 5 );
|
|
|
|
if ( maps\mp\_utility::ischangingweapon() || maps\mp\alien\_utility::is_holding_deployable() || maps\mp\alien\_utility::has_special_weapon() || self getcurrentprimaryweapon() == "aliensoflam_mp" )
|
|
{
|
|
maps\mp\_utility::setlowermessage( "cant_buy", &"ALIEN_COLLECTIBLES_PLAYER_HOLDING", 3 );
|
|
return 0;
|
|
}
|
|
|
|
if ( !self hasweapon( var_2 ) && !maps\mp\alien\_utility::is_holding_deployable() && !maps\mp\alien\_utility::has_special_weapon() )
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
watchthrowableitems()
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
var_0 = self.pers["team"];
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "grenade_fire", var_1, var_2 );
|
|
|
|
if ( isgrenade( var_2 ) )
|
|
continue;
|
|
|
|
var_3 = anglestoforward( self getplayerangles() );
|
|
var_4 = bullettrace( self geteye(), self geteye() + var_3 * 64, 1, self, 0, 0, 1 );
|
|
var_4["position"] = self geteye() + var_3 * 30;
|
|
|
|
if ( var_4["fraction"] < 1 )
|
|
{
|
|
if ( var_2 == "alienpropanetank_mp" )
|
|
var_4["position"] = self geteye() + var_3;
|
|
}
|
|
|
|
if ( isthrowableitem( var_2 ) )
|
|
{
|
|
self takeweapon( var_2 );
|
|
self enableweaponswitch();
|
|
var_1 delete();
|
|
level thread watchthrowableitemstopped( var_2, var_0, self geteye(), self getplayerangles(), self, var_4 );
|
|
}
|
|
}
|
|
}
|
|
|
|
watchthrowableitemstopped( var_0, var_1, var_2, var_3, var_4, var_5 )
|
|
{
|
|
level endon( "game_ended" );
|
|
common_scripts\utility::waitframe();
|
|
var_6 = level.throwable_items[var_0];
|
|
var_7 = anglestoforward( var_3 );
|
|
var_8 = anglestoup( var_3 );
|
|
var_9 = spawn( "script_model", var_5["position"] );
|
|
var_9.angles = vectortoangles( var_8 );
|
|
var_9 setmodel( var_6.model );
|
|
var_9.owner = var_4;
|
|
var_9 endon( "death" );
|
|
add_to_thrown_entity_list( var_9 );
|
|
var_9 thread clean_up_on_death();
|
|
common_scripts\utility::waitframe();
|
|
var_10 = var_6.force;
|
|
|
|
if ( var_5["fraction"] < 1 )
|
|
var_10 = 5;
|
|
|
|
var_9 physicslaunchserver( ( 0, 0, 0 ), var_7 * var_10 );
|
|
wait 0.5;
|
|
var_9 thread explodeondamage( 1 );
|
|
|
|
if ( var_6.canbepickedup )
|
|
{
|
|
make_item_ent_useable( var_9, var_6.hintstring );
|
|
var_9 thread [[ var_6.pickupfunc ]]( var_0 );
|
|
}
|
|
|
|
if ( !isdefined( level.placedims ) || level.placedims.size < 1 )
|
|
return;
|
|
|
|
var_11 = 576;
|
|
|
|
foreach ( var_13 in level.placedims )
|
|
{
|
|
if ( distancesquared( var_9.origin, var_13.origin ) < var_11 )
|
|
var_9 notify( "damage", 100, var_9.owner );
|
|
}
|
|
}
|
|
|
|
add_to_thrown_entity_list( var_0 )
|
|
{
|
|
if ( maps\mp\alien\_utility::alien_mode_has( "outline" ) )
|
|
maps\mp\alien\_outline_proto::add_to_outline_watch_list( var_0, 0 );
|
|
|
|
level.thrown_entities[level.thrown_entities.size] = var_0;
|
|
}
|
|
|
|
clean_up_on_death()
|
|
{
|
|
level endon( "game_ended" );
|
|
self waittill( "death" );
|
|
|
|
if ( maps\mp\alien\_utility::alien_mode_has( "outline" ) )
|
|
maps\mp\alien\_outline_proto::remove_from_outline_watch_list( self );
|
|
|
|
level.thrown_entities = common_scripts\utility::array_remove( level.thrown_entities, self );
|
|
}
|
|
|
|
propanetankwatchuse( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "trigger", var_1 );
|
|
var_1 notify( "cancel_watch" );
|
|
var_1 notify( "kill_spendhint" );
|
|
var_1.picking_up_item = 1;
|
|
var_1 thread clear_item_pickup();
|
|
|
|
if ( !isplayer( var_1 ) || var_1 hasweapon( var_0 ) )
|
|
continue;
|
|
|
|
if ( var_1 maps\mp\alien\_utility::is_holding_deployable() || var_1 maps\mp\alien\_utility::has_special_weapon() )
|
|
{
|
|
var_1 maps\mp\_utility::setlowermessage( "cant_buy", &"ALIEN_COLLECTIBLES_PLAYER_HOLDING", 3 );
|
|
continue;
|
|
}
|
|
|
|
if ( var_1 maps\mp\_utility::ischangingweapon() || var_1 getcurrentprimaryweapon() == "aliensoflam_mp" )
|
|
{
|
|
var_1 maps\mp\_utility::setlowermessage( "cant_buy", &"ALIEN_COLLECTIBLES_PLAYER_HOLDING", 3 );
|
|
continue;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
var_1 playlocalsound( "weap_pickup_propanetank_plr" );
|
|
var_1 maps\mp\_utility::_giveweapon( var_0 );
|
|
var_1 switchtoweapon( var_0 );
|
|
var_1 disableweaponswitch();
|
|
var_1 displaythrowmessage();
|
|
self delete();
|
|
}
|
|
|
|
isthrowableitem( var_0 )
|
|
{
|
|
return isdefined( level.throwable_items[var_0] );
|
|
}
|
|
|
|
displaythrowmessage()
|
|
{
|
|
maps\mp\_utility::setlowermessage( "throw_item", &"ALIEN_COLLECTIBLES_THROW_ITEM", 3 );
|
|
}
|
|
|
|
explodeondamage( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self setcandamage( 1 );
|
|
self.maxhealth = 100000;
|
|
self.health = self.maxhealth;
|
|
var_1 = 0;
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "damage", var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11 );
|
|
|
|
if ( var_0 && is_hive_explosion( var_3, var_6 ) )
|
|
{
|
|
var_1 = 1;
|
|
break;
|
|
}
|
|
|
|
if ( !isplayer( var_3 ) && !isplayer( var_3.owner ) )
|
|
continue;
|
|
|
|
if ( isdefined( var_6 ) && var_6 == "MOD_MELEE" )
|
|
continue;
|
|
|
|
break;
|
|
}
|
|
|
|
if ( isdefined( var_3 ) && isplayer( var_3 ) )
|
|
self.owner = var_3;
|
|
else if ( isdefined( var_3.owner ) && isplayer( var_3.owner ) )
|
|
self.owner = var_3.owner;
|
|
|
|
if ( isdefined( level.recent_propane_explosions ) && level.recent_propane_explosions > 4 )
|
|
playfx( level._effect["Propane_explosion_cheapest"], common_scripts\utility::drop_to_ground( self.origin, 32, -500 ) );
|
|
else if ( isdefined( level.recent_propane_explosions ) && level.recent_propane_explosions > 2 )
|
|
playfx( level._effect["Propane_explosion_cheap"], common_scripts\utility::drop_to_ground( self.origin, 32, -500 ) );
|
|
else
|
|
playfx( level._effect["Propane_explosion"], common_scripts\utility::drop_to_ground( self.origin, 32, -500 ) );
|
|
|
|
var_12 = 1000 * self.owner maps\mp\alien\_perk_utility::perk_gettrapdamagescalar();
|
|
var_13 = 1000 * self.owner maps\mp\alien\_perk_utility::perk_gettrapdamagescalar();
|
|
var_14 = self.origin + ( 0, 0, 22 );
|
|
var_15 = 256;
|
|
|
|
if ( var_1 )
|
|
radiusdamage( var_14, var_15, var_12, var_13, var_3, "MOD_EXPLOSIVE", "alienpropanetank_mp" );
|
|
else
|
|
radiusdamage( var_14, var_15, var_12, var_13, self.owner, "MOD_EXPLOSIVE", "alienpropanetank_mp" );
|
|
|
|
self playsound( "grenade_explode_metal" );
|
|
level thread firecloudmonitor( self.owner, level.firecloudduration, self.origin );
|
|
level thread firecloudsfx( level.firecloudduration, self.origin );
|
|
|
|
if ( maps\mp\alien\_utility::alien_mode_has( "outline" ) )
|
|
maps\mp\alien\_outline_proto::remove_from_outline_watch_list( self );
|
|
|
|
self delete();
|
|
}
|
|
|
|
is_hive_explosion( var_0, var_1 )
|
|
{
|
|
if ( !isdefined( var_0 ) || !isdefined( var_0.classname ) )
|
|
return 0;
|
|
|
|
return var_0.classname == "scriptable" && var_1 == "MOD_EXPLOSIVE";
|
|
}
|
|
|
|
firecloudsfx( var_0, var_1 )
|
|
{
|
|
var_2 = spawn( "script_origin", var_1 );
|
|
var_3 = spawn( "script_origin", var_1 );
|
|
wait 0.01;
|
|
var_2 playloopsound( "fire_trap_fire_lp" );
|
|
wait( var_0 );
|
|
var_3 playsound( "fire_trap_fire_end_lp" );
|
|
wait 0.5;
|
|
var_2 stoploopsound();
|
|
wait 5;
|
|
var_2 delete();
|
|
var_3 delete();
|
|
}
|
|
|
|
firecloudmonitor( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = level.firecloudradius;
|
|
var_4 = level.firecloudheight;
|
|
var_5 = level.firecloudtickdamage * var_0 full_damage_scaler();
|
|
var_6 = level.firecloudlingertime;
|
|
var_7 = level.firecloudplayertickdamage;
|
|
var_8 = level.firecloudhivetickdamage * var_0 full_damage_scaler();
|
|
|
|
if ( !isdefined( level.recent_propane_explosions ) )
|
|
level.recent_propane_explosions = 0;
|
|
|
|
level.recent_propane_explosions++;
|
|
var_9 = spawn( "trigger_radius", var_2, 0, var_3, var_4 );
|
|
var_9.owner = var_0;
|
|
var_10 = spawnfx( level._effect["Fire_Cloud"], var_2 );
|
|
triggerfx( var_10 );
|
|
var_11 = 0.0;
|
|
var_12 = 0.25;
|
|
var_13 = 1;
|
|
var_14 = 0;
|
|
wait( var_13 );
|
|
var_11 = var_11 + var_13;
|
|
var_1 = var_1 * var_0 maps\mp\alien\_perk_utility::perk_gettrapdurationscalar();
|
|
level thread maps\mp\alien\_utility::mark_dangerous_nodes( var_2, var_3, var_1 );
|
|
|
|
while ( var_11 < var_1 )
|
|
{
|
|
foreach ( var_16 in level.agentarray )
|
|
{
|
|
if ( isdefined( var_16.isactive ) && var_16.isactive && isalive( var_16 ) && var_16 istouching( var_9 ) && ( !isdefined( var_16.burning ) || !var_16.burning ) )
|
|
var_16 thread fire_cloud_burn_alien( var_5, var_0, var_6, var_9 );
|
|
}
|
|
|
|
foreach ( var_19 in level.players )
|
|
{
|
|
if ( isalive( var_19 ) && var_19 istouching( var_9 ) && ( !isdefined( var_19.burning ) || !var_19.burning ) )
|
|
var_19 thread fire_cloud_burn_player( var_7 );
|
|
}
|
|
|
|
if ( isdefined( level.thrown_entities ) )
|
|
{
|
|
foreach ( var_22 in level.thrown_entities )
|
|
{
|
|
if ( isdefined( var_22 ) && var_22 istouching( var_9 ) )
|
|
var_22 dodamage( var_7, var_2, var_0 );
|
|
}
|
|
}
|
|
|
|
if ( isdefined( level.blocker_hives ) )
|
|
{
|
|
foreach ( var_25 in level.blocker_hives )
|
|
{
|
|
var_26 = maps\mp\alien\_spawnlogic::get_blocker_hive( var_25 );
|
|
|
|
if ( !isdefined( var_26 ) )
|
|
continue;
|
|
|
|
var_27 = var_26.attackable_ent;
|
|
|
|
if ( isdefined( var_27 ) && distance( var_27.origin, var_2 ) <= var_3 * 0.8 )
|
|
{
|
|
if ( isdefined( var_27.health ) && var_27.health > 0 && ( !isdefined( var_27.burn_mitigation ) || !var_27.burn_mitigation ) )
|
|
{
|
|
var_27 thread burn_mitigation( 0.2 );
|
|
var_27 dodamage( var_8, var_2, var_0 );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
wait( var_12 );
|
|
var_11 = var_11 + var_12;
|
|
var_14 = var_14 + 1;
|
|
}
|
|
|
|
level.recent_propane_explosions = int( max( 0, level.recent_propane_explosions - 1 ) );
|
|
var_9 delete();
|
|
var_10 delete();
|
|
}
|
|
|
|
burn_mitigation( var_0 )
|
|
{
|
|
self notify( "burn_mitigating" );
|
|
self endon( "burn_mitigating" );
|
|
self endon( "death" );
|
|
self.burn_mitigation = 1;
|
|
wait( var_0 );
|
|
self.burn_mitigation = 0;
|
|
}
|
|
|
|
full_damage_scaler()
|
|
{
|
|
return maps\mp\alien\_perk_utility::perk_gettrapdamagescalar() * level.alien_health_per_player_scalar[level.players.size];
|
|
}
|
|
|
|
fire_cloud_burn_player( var_0 )
|
|
{
|
|
self notify( "fire_cloud_burning" );
|
|
self endon( "fire_cloud_burning" );
|
|
self endon( "last_stand" );
|
|
self.burning = 1;
|
|
thread reset_burn_on_death();
|
|
|
|
if ( !maps\mp\alien\_perk_utility::has_perk( "perk_rigger", [ 0, 1, 2, 3, 4 ] ) )
|
|
self dodamage( var_0, self.origin );
|
|
|
|
wait 1;
|
|
self.burning = undefined;
|
|
}
|
|
|
|
fire_cloud_burn_alien( var_0, var_1, var_2, var_3 )
|
|
{
|
|
self notify( "fire_cloud_burning" );
|
|
self endon( "fire_cloud_burning" );
|
|
self endon( "death" );
|
|
|
|
if ( !isdefined( var_2 ) )
|
|
var_2 = 6;
|
|
|
|
self.burning = 1;
|
|
thread reset_burn_on_death();
|
|
maps\mp\alien\_alien_fx::alien_fire_on();
|
|
var_4 = 0;
|
|
|
|
while ( var_4 < var_2 )
|
|
{
|
|
var_1.burning_victim = 1;
|
|
|
|
if ( isdefined( var_3 ) )
|
|
self dodamage( var_0, self.origin, var_1, var_3 );
|
|
else
|
|
self dodamage( var_0, self.origin, var_1 );
|
|
|
|
var_4 = var_4 + 1;
|
|
wait 1;
|
|
}
|
|
|
|
maps\mp\alien\_alien_fx::alien_fire_off();
|
|
self.burning = undefined;
|
|
}
|
|
|
|
reset_burn_on_death()
|
|
{
|
|
common_scripts\utility::waittill_any( "death", "last_stand" );
|
|
self.burning = undefined;
|
|
}
|
|
|
|
advance_to_next_area()
|
|
{
|
|
var_0 = maps\mp\alien\_utility::get_current_area_name();
|
|
remove_items_in_area( var_0 );
|
|
remove_thrown_entity_in_area( var_0 );
|
|
|
|
if ( isdefined( level.leave_area_func ) )
|
|
[[ level.leave_area_func ]]( var_0 );
|
|
|
|
maps\mp\alien\_utility::inc_current_area_index();
|
|
var_1 = maps\mp\alien\_utility::get_current_area_name();
|
|
spawn_items_in_area( var_1 );
|
|
|
|
if ( isdefined( level.enter_area_func ) )
|
|
[[ level.enter_area_func ]]( var_1 );
|
|
}
|
|
|
|
remove_thrown_entity_in_area( var_0 )
|
|
{
|
|
foreach ( var_2 in level.thrown_entities )
|
|
{
|
|
var_3 = var_2 get_item_areas();
|
|
|
|
if ( common_scripts\utility::array_contains( var_3, var_0 ) )
|
|
{
|
|
level.thrown_entities = common_scripts\utility::array_remove( level.thrown_entities, var_2 );
|
|
|
|
if ( maps\mp\alien\_utility::alien_mode_has( "outline" ) )
|
|
maps\mp\alien\_outline_proto::remove_from_outline_watch_list( var_2 );
|
|
|
|
var_2 delete();
|
|
}
|
|
}
|
|
}
|
|
|
|
isgrenade( var_0 )
|
|
{
|
|
var_1 = weaponclass( var_0 );
|
|
var_2 = weaponinventorytype( var_0 );
|
|
|
|
if ( var_1 != "grenade" )
|
|
return 0;
|
|
|
|
if ( var_2 != "offhand" )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
has_weapon_variation( var_0 )
|
|
{
|
|
var_1 = self getweaponslistprimaries();
|
|
|
|
foreach ( var_3 in var_1 )
|
|
{
|
|
var_4 = maps\mp\alien\_persistence::get_base_weapon_name( var_3 );
|
|
|
|
if ( issubstr( var_0, var_4 ) )
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
get_weapon_ref( var_0 )
|
|
{
|
|
var_1 = self getweaponslistprimaries();
|
|
|
|
foreach ( var_3 in var_1 )
|
|
{
|
|
var_4 = maps\mp\alien\_persistence::get_base_weapon_name( var_3 );
|
|
|
|
if ( issubstr( var_0, var_4 ) )
|
|
return var_3;
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
check_for_player_near_weapon()
|
|
{
|
|
self endon( "disconnect" );
|
|
var_0 = 21025;
|
|
|
|
for (;;)
|
|
{
|
|
if ( isdefined( self.inlaststand ) && self.inlaststand || isdefined( self.usingremote ) || maps\mp\alien\_utility::is_true( self.iscarrying ) )
|
|
{
|
|
wait 0.25;
|
|
continue;
|
|
}
|
|
|
|
foreach ( var_3, var_2 in level.outline_weapon_watch_list )
|
|
{
|
|
if ( isdefined( var_2 ) && distancesquared( var_2.origin, self.origin ) < var_0 )
|
|
{
|
|
if ( !isdefined( var_2.targetname ) )
|
|
maps\mp\_utility::setlowermessage( "ammo_warn", &"ALIENS_PRESTIGE_PISTOLS_ONLY_AMMO_DIST", undefined, 10 );
|
|
|
|
while ( player_should_see_ammo_message( var_2, var_0, 0 ) )
|
|
wait 0.25;
|
|
}
|
|
|
|
maps\mp\_utility::clearlowermessage( "ammo_warn" );
|
|
}
|
|
|
|
wait 1;
|
|
}
|
|
}
|
|
|
|
player_should_see_ammo_message( var_0, var_1, var_2 )
|
|
{
|
|
if ( distancesquared( var_0.origin, self.origin ) > var_1 )
|
|
return 0;
|
|
|
|
if ( self.inlaststand )
|
|
return 0;
|
|
|
|
if ( isdefined( self.usingremote ) )
|
|
return 0;
|
|
|
|
if ( maps\mp\alien\_utility::is_true( var_2 ) )
|
|
return 1;
|
|
else if ( maps\mp\alien\_utility::is_true( self.iscarrying ) )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|