// IW6 GSC SOURCE // Generated by https://github.com/xensik/gsc-tool init() { if ( !isdefined( level.boxsettings ) ) level.boxsettings = []; } begindeployableviamarker( var_0, var_1 ) { thread watchdeployablemarkercancel( var_1 ); thread watchdeployablemarkerplacement( var_1, var_0 ); for (;;) { var_2 = common_scripts\utility::waittill_any_return( "deployable_canceled", "deployable_deployed", "death", "disconnect" ); return var_2 == "deployable_deployed"; } } tryusedeployable( var_0, var_1 ) { thread watchdeployablemarkercancel( var_1 ); thread watchdeployablemarkerplacement( var_1, var_0 ); for (;;) { var_2 = common_scripts\utility::waittill_any_return( "deployable_canceled", "deployable_deployed", "death", "disconnect" ); return var_2 == "deployable_deployed"; } } watchdeployablemarkercancel( var_0 ) { self endon( "death" ); self endon( "disconnect" ); self endon( "deployable_deployed" ); var_1 = level.boxsettings[var_0]; var_2 = self getcurrentweapon(); while ( var_2 == var_1.weaponinfo ) self waittill( "weapon_change", var_2 ); self notify( "deployable_canceled" ); } watchdeployablemarkerplacement( var_0, var_1 ) { self endon( "spawned_player" ); self endon( "disconnect" ); self endon( "deployable_canceled" ); for (;;) { self waittill( "grenade_fire", var_2, var_3 ); if ( maps\mp\_utility::isreallyalive( self ) ) break; else var_2 delete(); } self notify( "deployable_deployed" ); var_2.owner = self; var_2.weaponname = var_3; self.marker = var_2; var_2 playsoundtoplayer( level.boxsettings[var_0].deployedsfx, self ); var_2 thread markeractivate( var_1, var_0, ::box_setactive ); } override_box_moving_platform_death( var_0 ) { self notify( "death" ); } markeractivate( var_0, var_1, var_2 ) { self notify( "markerActivate" ); self endon( "markerActivate" ); self waittill( "missile_stuck" ); var_3 = self.owner; var_4 = self.origin; if ( !isdefined( var_3 ) ) return; var_5 = createboxforplayer( var_1, var_4, var_3 ); var_6 = spawnstruct(); var_6.linkparent = self getlinkedparent(); if ( isdefined( var_6.linkparent ) && isdefined( var_6.linkparent.model ) && deployableexclusion( var_6.linkparent.model ) ) { var_5.origin = var_6.linkparent.origin; var_7 = var_6.linkparent getlinkedparent(); if ( isdefined( var_7 ) ) var_6.linkparent = var_7; else var_6.linkparent = undefined; } var_6.deathoverridecallback = ::override_box_moving_platform_death; var_5 thread maps\mp\_movers::handle_moving_platforms( var_6 ); var_5.moving_platform = var_6.linkparent; var_5 setotherent( var_3 ); wait 0.05; var_5 thread [[ var_2 ]](); self delete(); if ( isdefined( var_5 ) && var_5 maps\mp\_utility::touchingbadtrigger() ) var_5 notify( "death" ); } deployableexclusion( var_0 ) { if ( var_0 == "weapon_alien_laser_drill" ) return 1; else if ( issubstr( var_0, "crafting" ) ) return 1; else if ( issubstr( var_0, "scorpion_body" ) ) return 1; return 0; } isholdingdeployablebox() { var_0 = self getcurrentweapon(); if ( isdefined( var_0 ) ) { foreach ( var_2 in level.boxsettings ) { if ( var_0 == var_2.weaponinfo ) return 1; } } return 0; } get_box_icon( var_0, var_1, var_2 ) { return level.alien_combat_resources[var_0][var_1].upgrades[var_2].dpad_icon; } get_resource_type( var_0 ) { if ( !isdefined( var_0 ) ) return undefined; foreach ( var_3, var_2 in level.alien_combat_resources ) { if ( isdefined( var_2[var_0] ) ) return var_3; } return undefined; } createboxforplayer( var_0, var_1, var_2 ) { var_3 = level.boxsettings[var_0]; var_4 = spawn( "script_model", var_1 ); var_4 setmodel( var_3.modelbase ); var_4.health = 999999; var_4.maxhealth = var_3.maxhealth; var_4.angles = var_2.angles; var_4.boxtype = var_0; var_4.owner = var_2; var_4.team = var_2.team; if ( isdefined( var_3.dpadname ) ) var_4.dpadname = var_3.dpadname; if ( isdefined( var_3.maxuses ) ) var_4.usesremaining = var_3.maxuses; var_5 = var_4.owner; var_6 = get_resource_type( var_4.dpadname ); if ( is_combat_resource( var_6 ) ) { var_4.upgrade_rank = var_5 maps\mp\alien\_persistence::get_upgrade_level( var_6 ); var_4.icon_name = get_box_icon( var_6, var_4.dpadname, var_4.upgrade_rank ); } else { var_4.upgrade_rank = 0; var_4.icon_name = var_3.icon_name; } level.alienbbdata["team_item_deployed"]++; var_5 maps\mp\alien\_persistence::eog_player_update_stat( "deployables", 1 ); var_4 box_setinactive(); var_4 thread box_handleownerdisconnect(); var_4 addboxtolevelarray(); return var_4; } is_combat_resource( var_0 ) { return isdefined( var_0 ); } box_setactive( var_0 ) { self setcursorhint( "HINT_NOICON" ); var_1 = level.boxsettings[self.boxtype]; self sethintstring( var_1.hintstring ); self.inuse = 0; var_2 = maps\mp\gametypes\_gameobjects::getnextobjid(); objective_add( var_2, "invisible", ( 0, 0, 0 ) ); objective_position( var_2, self.origin ); objective_state( var_2, "active" ); if ( isdefined( var_1.shadername ) ) objective_icon( var_2, var_1.shadername ); self.objidfriendly = var_2; if ( ( !isdefined( var_0 ) || !var_0 ) && isdefined( var_1.onusecallback ) && ( !isdefined( var_1.canusecallback ) || self.owner [[ var_1.canusecallback ]]() ) ) { if ( maps\mp\_utility::isreallyalive( self.owner ) ) self.owner [[ var_1.onusecallback ]]( self ); } if ( level.teambased ) { objective_team( var_2, self.team ); foreach ( var_4 in level.players ) { if ( self.team == var_4.team && ( !isdefined( var_1.canusecallback ) || var_4 [[ var_1.canusecallback ]]( self ) ) ) box_seticon( var_4, var_1.streakname, var_1.headiconoffset ); } } else { objective_player( var_2, self.owner getentitynumber() ); if ( !isdefined( var_1.canusecallback ) || self.owner [[ var_1.canusecallback ]]( self ) ) box_seticon( self.owner, var_1.streakname, var_1.headiconoffset ); } self makeusable(); self.isusable = 1; self setcandamage( 1 ); thread box_handledamage(); thread box_handledeath(); thread box_timeout(); common_scripts\utility::make_entity_sentient_mp( self.team, 1 ); if ( isdefined( self.owner ) ) self.owner notify( "new_deployable_box", self ); if ( level.teambased ) { foreach ( var_4 in level.participants ) _box_setactivehelper( var_4, self.team == var_4.team, var_1.canusecallback ); } else { foreach ( var_4 in level.participants ) _box_setactivehelper( var_4, isdefined( self.owner ) && self.owner == var_4, var_1.canusecallback ); } if ( ( !isdefined( self.air_dropped ) || !self.air_dropped ) && !maps\mp\alien\_utility::isplayingsolo() ) level thread maps\mp\_utility::teamplayercardsplash( var_1.splashname, self.owner, self.team ); thread box_playerconnected(); thread box_agentconnected(); } _box_setactivehelper( var_0, var_1, var_2 ) { if ( var_1 ) { if ( !isdefined( var_2 ) || var_0 [[ var_2 ]]( self ) ) box_enableplayeruse( var_0 ); else { box_disableplayeruse( var_0 ); thread doubledip( var_0 ); } thread boxthink( var_0 ); } else box_disableplayeruse( var_0 ); } box_playerconnected() { self endon( "death" ); for (;;) { level waittill( "connected", var_0 ); childthread box_waittill_player_spawn_and_add_box( var_0 ); } } box_agentconnected() { self endon( "death" ); for (;;) { level waittill( "spawned_agent_player", var_0 ); box_addboxforplayer( var_0 ); } } box_waittill_player_spawn_and_add_box( var_0 ) { var_0 waittill( "spawned_player" ); if ( level.teambased ) box_addboxforplayer( var_0 ); } box_playerjoinedteam( var_0 ) { self endon( "death" ); var_0 endon( "disconnect" ); for (;;) { var_0 waittill( "joined_team" ); if ( level.teambased ) box_addboxforplayer( var_0 ); } } box_addboxforplayer( var_0 ) { if ( self.team == var_0.team ) { box_enableplayeruse( var_0 ); thread boxthink( var_0 ); box_seticon( var_0, level.boxsettings[self.boxtype].streakname, level.boxsettings[self.boxtype].headiconoffset ); } else { box_disableplayeruse( var_0 ); maps\mp\_entityheadicons::setheadicon( var_0, "", ( 0, 0, 0 ) ); } } box_seticon( var_0, var_1, var_2 ) { maps\mp\_entityheadicons::setheadicon( var_0, self.icon_name, ( 0, 0, var_2 ), 14, 14, undefined, undefined, undefined, undefined, undefined, 0 ); } box_enableplayeruse( var_0 ) { if ( isplayer( var_0 ) ) self enableplayeruse( var_0 ); self.disabled_use_for[var_0 getentitynumber()] = 0; } box_disableplayeruse( var_0 ) { if ( isplayer( var_0 ) ) self disableplayeruse( var_0 ); self.disabled_use_for[var_0 getentitynumber()] = 1; } box_setinactive() { self makeunusable(); self.isusable = 0; maps\mp\_entityheadicons::setheadicon( "none", "", ( 0, 0, 0 ) ); if ( isdefined( self.objidfriendly ) ) maps\mp\_utility::_objective_delete( self.objidfriendly ); } box_handledamage() { var_0 = level.boxsettings[self.boxtype]; maps\mp\gametypes\_damage::monitordamage( var_0.maxhealth, var_0.damagefeedback, ::boxmodifydamage, ::boxhandledeathdamage, 1 ); } boxmodifydamage( var_0, var_1, var_2, var_3 ) { var_4 = var_3; if ( isexplosivedamagemod( var_2 ) ) var_4 = var_3 * 1.5; var_4 = maps\mp\gametypes\_damage::handlemeleedamage( var_1, var_2, var_4 ); var_4 = maps\mp\gametypes\_damage::handlemissiledamage( var_1, var_2, var_4 ); var_4 = maps\mp\gametypes\_damage::handleapdamage( var_1, var_2, var_4, var_0 ); return var_4; } boxhandledeathdamage( var_0, var_1, var_2, var_3 ) { var_4 = level.boxsettings[self.boxtype]; maps\mp\gametypes\_damage::onkillstreakkilled( var_0, var_1, var_2, var_3, var_4.xppopup, var_4.vodestroyed ); } box_handledeath() { self waittill( "death" ); if ( !isdefined( self ) ) return; box_setinactive(); removeboxfromlevelarray(); var_0 = level.boxsettings[self.boxtype]; playfx( common_scripts\utility::getfx( "deployablebox_crate_destroy" ), self.origin ); if ( isdefined( var_0.deathdamagemax ) ) { var_1 = undefined; if ( isdefined( self.owner ) ) var_1 = self.owner; radiusdamage( self.origin + ( 0, 0, var_0.headiconoffset ), var_0.deathdamageradius, var_0.deathdamagemax, var_0.deathdamagemin, var_1, "MOD_EXPLOSIVE", var_0.deathweaponinfo ); } wait 0.1; self notify( "deleting" ); self delete(); } box_handleownerdisconnect() { self endon( "death" ); level endon( "game_ended" ); self notify( "box_handleOwner" ); self endon( "box_handleOwner" ); var_0 = self.owner; self.owner waittill( "killstreak_disowned" ); if ( isdefined( self.air_dropped ) && self.air_dropped ) { foreach ( var_2 in level.players ) { if ( !isdefined( var_2 ) || isdefined( var_0 ) && var_0 == var_2 ) continue; self.owner = var_2; thread box_handleownerdisconnect(); return; } } self notify( "death" ); } boxthink( var_0 ) { self endon( "death" ); thread boxcapturethink( var_0 ); if ( !isdefined( var_0.boxes ) ) var_0.boxes = []; var_0.boxes[var_0.boxes.size] = self; var_1 = level.boxsettings[self.boxtype]; for (;;) { self waittill( "captured", var_2 ); if ( var_2 == var_0 ) { var_0 playlocalsound( var_1.onusesfx ); if ( isdefined( var_1.onusecallback ) ) { var_0 [[ var_1.onusecallback ]]( self ); if ( maps\mp\alien\_utility::is_chaos_mode() ) maps\mp\alien\_chaos::update_pickup_deployable_box_event(); } if ( isdefined( self.owner ) && var_0 != self.owner ) { self.owner thread maps\mp\gametypes\_rank::xpeventpopup( var_1.event ); self.owner thread maps\mp\gametypes\_rank::giverankxp( "support", var_1.usexp ); } if ( isdefined( self.usesremaining ) ) { self.usesremaining--; if ( self.usesremaining == 0 ) { box_leave(); break; } } maps\mp\_entityheadicons::setheadicon( var_0, "", ( 0, 0, 0 ) ); box_disableplayeruse( var_0 ); thread doubledip( var_0 ); } } } doubledip( var_0 ) { self endon( "death" ); var_0 endon( "disconnect" ); if ( isdefined( self.air_dropped ) && self.air_dropped ) return; var_0 waittill( "death" ); if ( level.teambased ) { if ( self.team == var_0.team ) { box_seticon( var_0, level.boxsettings[self.boxtype].streakname, level.boxsettings[self.boxtype].headiconoffset ); box_enableplayeruse( var_0 ); } } else if ( isdefined( self.owner ) && self.owner == var_0 ) { box_seticon( var_0, level.boxsettings[self.boxtype].streakname, level.boxsettings[self.boxtype].headiconoffset ); box_enableplayeruse( var_0 ); } } boxcapturethink( var_0 ) { while ( isdefined( self ) ) { self waittill( "trigger", var_1 ); if ( maps\mp\_utility::is_aliens() ) { if ( [[ level.boxcapturethink_alien_func ]]( var_1 ) ) continue; } if ( maps\mp\alien\_utility::is_chaos_mode() ) { switch ( self.boxtype ) { case "medic_skill": case "engineer_skill": case "tank_skill": case "specialist_skill": if ( maps\mp\alien\_utility::is_true( var_1.haschaosclassskill ) ) { var_1 maps\mp\_utility::setlowermessage( "cant_use", &"ALIEN_CHAOS_CANT_PICKUP_BONUS", 3 ); continue; } else if ( maps\mp\alien\_utility::is_true( var_1.chaosclassskillinuse ) ) { var_1 maps\mp\_utility::setlowermessage( "skill_in_use", &"ALIEN_CHAOS_SKILL_IN_USE", 3 ); continue; } break; case "combo_freeze": if ( maps\mp\alien\_utility::is_true( var_1.hascombofreeze ) ) { var_1 maps\mp\_utility::setlowermessage( "cant_use", &"ALIEN_CHAOS_CANT_PICKUP_BONUS", 3 ); continue; } break; default: break; } } if ( var_1 == var_0 && useholdthink( var_0, level.boxsettings[self.boxtype].usetime ) ) self notify( "captured", var_0 ); } } isfriendlytobox( var_0 ) { return level.teambased && self.team == var_0.team; } box_timeout() { self endon( "death" ); level endon( "game_ended" ); if ( box_should_leave_immediately() ) wait 0.05; else { var_0 = level.boxsettings[self.boxtype].lifespan; maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( var_0 ); } box_leave(); } box_should_leave_immediately() { if ( self.boxtype == "deployable_ammo" && self.upgrade_rank == 4 || self.boxtype == "deployable_specialammo_comb" && self.upgrade_rank == 4 ) return 0; if ( maps\mp\alien\_utility::isplayingsolo() && ( !isdefined( self.air_dropped ) || !self.air_dropped ) ) return 1; return 0; } box_leave() { playfx( common_scripts\utility::getfx( "deployablebox_crate_destroy" ), self.origin ); wait 0.05; self notify( "death" ); } deleteonownerdeath( var_0 ) { wait 0.25; self linkto( var_0, "tag_origin", ( 0, 0, 0 ), ( 0, 0, 0 ) ); var_0 waittill( "death" ); box_leave(); } box_modelteamupdater( var_0 ) { self endon( "death" ); self hide(); foreach ( var_2 in level.players ) { if ( var_2.team == var_0 ) self showtoplayer( var_2 ); } for (;;) { level waittill( "joined_team" ); self hide(); foreach ( var_2 in level.players ) { if ( var_2.team == var_0 ) self showtoplayer( var_2 ); } } } useholdthink( var_0, var_1 ) { if ( isplayer( var_0 ) ) var_0 playerlinkto( self ); else var_0 linkto( self ); var_0 playerlinkedoffsetenable(); var_0.boxparams = spawnstruct(); var_0.boxparams.curprogress = 0; var_0.boxparams.inuse = 1; var_0.boxparams.userate = 0; if ( isdefined( var_1 ) ) var_0.boxparams.usetime = var_1; else var_0.boxparams.usetime = 3000; var_0 maps\mp\alien\_utility::disable_weapon_timeout( var_1 + 0.05, "deployable_weapon_management" ); if ( isplayer( var_0 ) ) var_0 thread personalusebar( self ); var_2 = useholdthinkloop( var_0 ); if ( isalive( var_0 ) ) { var_0 maps\mp\alien\_utility::enable_weapon_wrapper( "deployable_weapon_management" ); var_0 unlink(); } if ( !isdefined( self ) ) return 0; var_0.boxparams.inuse = 0; var_0.boxparams.curprogress = 0; return var_2; } personalusebar( var_0 ) { self endon( "disconnect" ); var_1 = maps\mp\gametypes\_hud_util::createprimaryprogressbar( 0, 25 ); var_2 = maps\mp\gametypes\_hud_util::createprimaryprogressbartext( 0, 25 ); var_2 settext( level.boxsettings[var_0.boxtype].capturingstring ); var_3 = -1; while ( maps\mp\_utility::isreallyalive( self ) && isdefined( var_0 ) && self.boxparams.inuse && var_0.isusable && !level.gameended ) { if ( var_3 != self.boxparams.userate ) { if ( self.boxparams.curprogress > self.boxparams.usetime ) self.boxparams.curprogress = self.boxparams.usetime; var_1 maps\mp\gametypes\_hud_util::updatebar( self.boxparams.curprogress / self.boxparams.usetime, 1000 / self.boxparams.usetime * self.boxparams.userate ); if ( !self.boxparams.userate ) { var_1 maps\mp\gametypes\_hud_util::hideelem(); var_2 maps\mp\gametypes\_hud_util::hideelem(); } else { var_1 maps\mp\gametypes\_hud_util::showelem(); var_2 maps\mp\gametypes\_hud_util::showelem(); } } var_3 = self.boxparams.userate; wait 0.05; } var_1 maps\mp\gametypes\_hud_util::destroyelem(); var_2 maps\mp\gametypes\_hud_util::destroyelem(); } useholdthinkloop( var_0 ) { while ( !level.gameended && isdefined( self ) && maps\mp\_utility::isreallyalive( var_0 ) && var_0 usebuttonpressed() && var_0.boxparams.curprogress < var_0.boxparams.usetime ) { var_0.boxparams.curprogress = var_0.boxparams.curprogress + 50 * var_0.boxparams.userate; if ( isdefined( var_0.objectivescaler ) ) var_0.boxparams.userate = 1 * var_0.objectivescaler; else var_0.boxparams.userate = 1; if ( var_0.boxparams.curprogress >= var_0.boxparams.usetime ) return maps\mp\_utility::isreallyalive( var_0 ); wait 0.05; } return 0; } disablewhenjuggernaut() { level endon( "game_ended" ); self endon( "death" ); for (;;) { level waittill( "juggernaut_equipped", var_0 ); maps\mp\_entityheadicons::setheadicon( var_0, "", ( 0, 0, 0 ) ); box_disableplayeruse( var_0 ); thread doubledip( var_0 ); } } addboxtolevelarray() { level.deployable_box[self.boxtype][self getentitynumber()] = self; } removeboxfromlevelarray() { level.deployable_box[self.boxtype][self getentitynumber()] = undefined; } default_canusedeployable( var_0 ) { if ( ( isdefined( var_0 ) && var_0.owner == self || maps\mp\alien\_prestige::prestige_getnodeployables() == 1.0 ) && !isdefined( var_0.air_dropped ) ) return 0; return 1; } default_onusedeployable( var_0 ) { thread maps\mp\alien\_persistence::deployablebox_used_track( var_0 ); maps\mp\alien\_utility::deployable_box_onuse_message( var_0 ); } default_tryusedeployable( var_0, var_1 ) { var_2 = maps\mp\alien\_combat_resources::alien_begindeployableviamarker( var_0, var_1 ); if ( !isdefined( var_2 ) || !var_2 ) return 0; return 1; } init_deployable( var_0, var_1 ) { if ( !isdefined( level.boxsettings ) ) level.boxsettings = []; level.boxsettings[var_0] = var_1; if ( !isdefined( level.killstreakfuncs ) ) level.killstreakfuncs = []; level.deployable_box[var_0] = []; }