iw6-scripts/maps/mp/alien/_collectibles.gsc
2024-02-13 13:20:49 +01:00

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;
}