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

692 lines
18 KiB
Plaintext

// 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();
}
var_2 makecollidewithitemclip( 1 );
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 == "mp_satcom" )
return 1;
else if ( issubstr( var_0, "paris_catacombs_iron" ) )
return 1;
else if ( issubstr( var_0, "mp_warhawk_iron_gate" ) )
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;
}
createboxforplayer( var_0, var_1, var_2 )
{
var_3 = level.boxsettings[var_0];
var_4 = spawn( "script_model", var_1 - ( 0, 0, 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;
var_4.id = var_3.id;
if ( isdefined( var_3.dpadname ) )
var_4.dpadname = var_3.dpadname;
if ( isdefined( var_3.maxuses ) )
var_4.usesremaining = var_3.maxuses;
var_4 box_setinactive();
var_4 thread box_handleownerdisconnect();
var_4 addboxtolevelarray();
return var_4;
}
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 ) );
if ( !isdefined( self getlinkedparent() ) )
objective_position( var_2, self.origin );
else
objective_onentity( var_2, self );
objective_state( var_2, "active" );
objective_icon( var_2, var_1.shadername );
self.objidfriendly = var_2;
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();
thread disablewhenjuggernaut();
common_scripts\utility::make_entity_sentient_mp( self.team, 1 );
if ( issentient( self ) )
self setthreatbiasgroup( "DogsDontAttack" );
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 );
if ( !isai( var_4 ) )
thread box_playerjoinedteam( var_4 );
}
}
else
{
foreach ( var_4 in level.participants )
_box_setactivehelper( var_4, isdefined( self.owner ) && self.owner == var_4, var_1.canusecallback );
}
level thread maps\mp\_utility::teamplayercardsplash( var_1.splashname, self.owner, self.team );
thread box_playerconnected();
thread box_agentconnected();
if ( isdefined( var_1.ondeploycallback ) )
self [[ var_1.ondeploycallback ]]( var_1 );
thread createbombsquadmodel( self.boxtype );
}
_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 );
thread box_playerjoinedteam( 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, maps\mp\_utility::getkillstreakoverheadicon( var_1 ), ( 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, ::box_handledeathdamage, ::box_modifydamage, 1 );
}
box_modifydamage( var_0, var_1, var_2, var_3 )
{
var_4 = var_3;
var_5 = level.boxsettings[self.boxtype];
if ( var_5.allowmeleedamage )
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::handlegrenadedamage( var_1, var_2, var_4 );
var_4 = maps\mp\gametypes\_damage::handleapdamage( var_1, var_2, var_4, var_0 );
return var_4;
}
box_handledeathdamage( var_0, var_1, var_2, var_3 )
{
var_4 = level.boxsettings[self.boxtype];
var_5 = maps\mp\gametypes\_damage::onkillstreakkilled( var_0, var_1, var_2, var_3, var_4.xppopup, var_4.vodestroyed );
if ( var_5 )
var_0 notify( "destroyed_equipment" );
}
box_handledeath()
{
self waittill( "death" );
if ( !isdefined( self ) )
return;
box_setinactive();
removeboxfromlevelarray();
var_0 = level.boxsettings[self.boxtype];
playfx( var_0.deathvfx, self.origin );
self playsound( "mp_killstreak_disappear" );
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 );
}
self notify( "deleting" );
self delete();
}
box_handleownerdisconnect()
{
self endon( "death" );
level endon( "game_ended" );
self notify( "box_handleOwner" );
self endon( "box_handleOwner" );
self.owner waittill( "killstreak_disowned" );
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 ( 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;
}
}
if ( isdefined( var_1.canuseotherboxes ) && var_1.canuseotherboxes )
{
foreach ( var_4 in level.deployable_box[var_1.streakname] )
{
var_4 box_disableplayeruse( self );
var_4 maps\mp\_entityheadicons::setheadicon( self, "", ( 0, 0, 0 ) );
var_4 thread doubledip( self );
}
continue;
}
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" );
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 )
{
level endon( "game_ended" );
while ( isdefined( self ) )
{
self waittill( "trigger", var_1 );
if ( isdefined( level.boxsettings[self.boxtype].nousekillstreak ) && level.boxsettings[self.boxtype].nousekillstreak && maps\mp\_utility::iskillstreakweapon( var_0 getcurrentweapon() ) )
continue;
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" );
var_0 = level.boxsettings[self.boxtype];
var_1 = var_0.lifespan;
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( var_1 );
if ( isdefined( var_0.vogone ) )
self.owner thread maps\mp\_utility::leaderdialogonplayer( var_0.vogone );
box_leave();
}
box_leave()
{
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 )
{
maps\mp\_movers::script_mover_link_to_use_object( var_0 );
var_0 common_scripts\utility::_disableweapon();
var_0.boxparams = spawnstruct();
var_0.boxparams.curprogress = 0;
var_0.boxparams.inuse = 1;
var_0.boxparams.userate = 0;
var_0.boxparams.id = self.id;
if ( isdefined( var_1 ) )
var_0.boxparams.usetime = var_1;
else
var_0.boxparams.usetime = 3000;
var_2 = useholdthinkloop( var_0 );
if ( isalive( var_0 ) )
{
var_0 common_scripts\utility::_enableweapon();
maps\mp\_movers::script_mover_unlink_from_use_object( var_0 );
}
if ( !isdefined( self ) )
return 0;
var_0.boxparams.inuse = 0;
var_0.boxparams.curprogress = 0;
return var_2;
}
useholdthinkloop( var_0 )
{
var_1 = var_0.boxparams;
while ( var_0 isplayerusingbox( var_1 ) )
{
if ( !var_0 maps\mp\_movers::script_mover_use_can_link( self ) )
{
var_0 maps\mp\gametypes\_gameobjects::updateuiprogress( var_1, 0 );
return 0;
}
var_1.curprogress = var_1.curprogress + 50 * var_1.userate;
if ( isdefined( var_0.objectivescaler ) )
var_1.userate = 1 * var_0.objectivescaler;
else
var_1.userate = 1;
var_0 maps\mp\gametypes\_gameobjects::updateuiprogress( var_1, 1 );
if ( var_1.curprogress >= var_1.usetime )
{
var_0 maps\mp\gametypes\_gameobjects::updateuiprogress( var_1, 0 );
return maps\mp\_utility::isreallyalive( var_0 );
}
wait 0.05;
}
var_0 maps\mp\gametypes\_gameobjects::updateuiprogress( var_1, 0 );
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;
}
createbombsquadmodel( var_0 )
{
var_1 = level.boxsettings[var_0];
if ( isdefined( var_1.modelbombsquad ) )
{
var_2 = spawn( "script_model", self.origin );
var_2.angles = self.angles;
var_2 hide();
var_2 thread maps\mp\gametypes\_weapons::bombsquadvisibilityupdater( self.owner );
var_2 setmodel( var_1.modelbombsquad );
var_2 linkto( self );
var_2 setcontents( 0 );
self.bombsquadmodel = var_2;
self waittill( "death" );
if ( isdefined( var_2 ) )
{
var_2 delete();
self.bombsquadmodel = undefined;
}
}
}
isplayerusingbox( var_0 )
{
return !level.gameended && isdefined( var_0 ) && maps\mp\_utility::isreallyalive( self ) && self usebuttonpressed() && !self isonladder() && !self meleebuttonpressed() && !isdefined( self.throwinggrenade ) && var_0.curprogress < var_0.usetime && ( !isdefined( self.teleporting ) || !self.teleporting );
}