This commit is contained in:
2024-02-13 13:20:49 +01:00
commit 872504afef
1761 changed files with 871764 additions and 0 deletions

View File

@ -0,0 +1,732 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
precachelocationselector( "map_artillery_selector" );
var_0 = spawnstruct();
var_0.modelnames = [];
var_0.modelnames["allies"] = "vehicle_a10_warthog_iw6_mp";
var_0.modelnames["axis"] = "vehicle_a10_warthog_iw6_mp";
var_0.vehicle = "a10_warthog_mp";
var_0.inboundsfx = "veh_mig29_dist_loop";
var_0.speed = 3000;
var_0.halfdistance = 12500;
var_0.heightrange = 750;
var_0.choosedirection = 1;
var_0.selectlocationvo = "KS_hqr_airstrike";
var_0.inboundvo = "KS_ast_inbound";
var_0.cannonfirevfx = loadfx( "fx/smoke/smoke_trail_white_heli" );
var_0.cannonrumble = "ac130_25mm_fire";
var_0.turretname = "a10_30mm_turret_mp";
var_0.turretattachpoint = "tag_barrel";
var_0.rocketmodelname = "maverick_projectile_mp";
var_0.numrockets = 4;
var_0.delaybetweenrockets = 0.125;
var_0.delaybetweenlockon = 0.4;
var_0.lockonicon = "veh_hud_target_chopperfly";
var_0.maxhealth = 1000;
var_0.xppopup = "destroyed_a10_strafe";
var_0.callout = "callout_destroyed_a10";
var_0.vodestroyed = undefined;
var_0.explodevfx = loadfx( "fx/explosions/aerial_explosion" );
var_0.sfxcannonfireloop_1p = "veh_a10_plr_fire_gatling_lp";
var_0.sfxcannonfirestop_1p = "veh_a10_plr_fire_gatling_cooldown";
var_0.sfxcannonfireloop_3p = "veh_a10_npc_fire_gatling_lp";
var_0.sfxcannonfirestop_3p = "veh_a10_npc_fire_gatling_cooldown";
var_0.sfxcannonfireburptime = 500;
var_0.sfxcannonfireburpshort_3p = "veh_a10_npc_fire_gatling_short_burst";
var_0.sfxcannonfireburplong_3p = "veh_a10_npc_fire_gatling_long_burst";
var_0.sfxcannonbulletimpact = "veh_a10_bullet_impact_lp";
var_0.sfxmissilefire_1p = [];
var_0.sfxmissilefire_1p[0] = "veh_a10_plr_missile_ignition_left";
var_0.sfxmissilefire_1p[1] = "veh_a10_plr_missile_ignition_right";
var_0.sfxmissilefire_3p = "veh_a10_npc_missile_fire";
var_0.sfxmissile = "veh_a10_missile_loop";
var_0.sfxengine_1p = "veh_a10_plr_engine_lp";
var_0.sfxengine_3p = "veh_a10_dist_loop";
level.planeconfigs["a10_strafe"] = var_0;
level.killstreakfuncs["a10_strafe"] = ::onuse;
buildallflightpathsdefault();
}
onuse( var_0, var_1 )
{
if ( isdefined( level.a10strafeactive ) )
{
self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
return 0;
}
else if ( maps\mp\_utility::isusingremote() || maps\mp\_utility::iskillstreakdenied() )
return 0;
else if ( getcsplinecount() < 2 )
return 0;
else
{
thread dostrike( var_0, "a10_strafe" );
return 1;
}
}
dostrike( var_0, var_1 )
{
self endon( "end_remote" );
self endon( "death" );
level endon( "game_ended" );
var_2 = getpathindex();
var_3 = startstrafesequence( var_1, var_0 );
if ( var_3 )
{
var_4 = spawnaircraft( var_1, var_0, level.a10splinesin[var_2] );
if ( isdefined( var_4 ) )
{
var_4 dooneflyby();
switchaircraft( var_4, var_1 );
var_4 = spawnaircraft( var_1, var_0, level.a10splinesin[var_2] );
if ( isdefined( var_4 ) )
{
thread maps\mp\killstreaks\_killstreaks::clearrideintro( 1.0, 0.75 );
var_4 dooneflyby();
var_4 thread endflyby( var_1 );
endstrafesequence( var_1 );
}
}
}
}
startstrafesequence( var_0, var_1 )
{
maps\mp\_utility::setusingremote( "a10_strafe" );
if ( getdvarint( "camera_thirdPerson" ) )
maps\mp\_utility::setthirdpersondof( 0 );
self.restoreangles = self.angles;
maps\mp\_utility::freezecontrolswrapper( 1 );
var_2 = maps\mp\killstreaks\_killstreaks::initridekillstreak( "a10_strafe" );
if ( var_2 != "success" )
{
if ( var_2 != "disconnect" )
maps\mp\_utility::clearusingremote();
if ( isdefined( self.disabledweapon ) && self.disabledweapon )
common_scripts\utility::_enableweapon();
self notify( "death" );
return 0;
}
if ( maps\mp\_utility::isjuggernaut() && isdefined( self.juggernautoverlay ) )
self.juggernautoverlay.alpha = 0;
maps\mp\_utility::freezecontrolswrapper( 0 );
level.a10strafeactive = 1;
self.using_remote_a10 = 1;
level thread maps\mp\_utility::teamplayercardsplash( "used_" + var_0, self, self.team );
return 1;
}
endstrafesequence( var_0 )
{
maps\mp\_utility::clearusingremote();
if ( getdvarint( "camera_thirdPerson" ) )
maps\mp\_utility::setthirdpersondof( 1 );
if ( maps\mp\_utility::isjuggernaut() && isdefined( self.juggernautoverlay ) )
self.juggernautoverlay.alpha = 1;
self setplayerangles( self.restoreangles );
self.restoreangles = undefined;
thread a10_freezebuffer();
level.a10strafeactive = undefined;
self.using_remote_a10 = undefined;
}
switchaircraft( var_0, var_1 )
{
self.usingremote = undefined;
self visionsetnakedforplayer( "black_bw", 0.75 );
thread maps\mp\_utility::set_visionset_for_watching_players( "black_bw", 0.75, 0.75 );
wait 0.75;
if ( isdefined( var_0 ) )
var_0 thread endflyby( var_1 );
}
spawnaircraft( var_0, var_1, var_2 )
{
var_3 = createplaneasheli( var_0, var_1, var_2 );
if ( !isdefined( var_3 ) )
return undefined;
var_3.streakname = var_0;
self remotecontrolvehicle( var_3 );
var_3 setplanesplineid( self, var_2 );
thread watchintrocleared( var_0, var_3 );
var_4 = level.planeconfigs[var_0];
var_3 playloopsound( var_4.sfxengine_1p );
var_3 thread a10_handledamage();
maps\mp\killstreaks\_plane::starttrackingplane( var_3 );
return var_3;
}
attachturret( var_0 )
{
var_1 = level.planeconfigs[var_0];
var_2 = self gettagorigin( var_1.turretattachpoint );
var_3 = spawnturret( "misc_turret", self.origin + var_2, var_1.turretname, 0 );
var_3 linkto( self, var_1.turretattachpoint, ( 0, 0, 0 ), ( 0, 0, 0 ) );
var_3 setmodel( "vehicle_ugv_talon_gun_mp" );
var_3.angles = self.angles;
var_3.owner = self.owner;
var_3 maketurretinoperable();
var_3 setturretmodechangewait( 0 );
var_3 setmode( "sentry_offline" );
var_3 makeunusable();
var_3 setcandamage( 0 );
var_3 setsentryowner( self.owner );
self.owner remotecontrolturret( var_3 );
self.turret = var_3;
}
cleanupaircraft()
{
if ( isdefined( self.turret ) )
self.turret delete();
foreach ( var_1 in self.targetlist )
{
if ( isdefined( var_1["icon"] ) )
{
var_1["icon"] destroy();
var_1["icon"] = undefined;
}
}
self delete();
}
getpathindex()
{
return randomint( level.a10splinesin.size );
}
dooneflyby()
{
self endon( "death" );
level endon( "game_ended" );
for (;;)
{
self waittill( "splinePlaneReachedNode", var_0 );
if ( isdefined( var_0 ) && var_0 == "End" )
{
self notify( "a10_end_strafe" );
break;
}
}
}
endflyby( var_0 )
{
if ( !isdefined( self ) )
return;
self.owner remotecontrolvehicleoff( self );
if ( isdefined( self.turret ) )
self.owner remotecontrolturretoff( self.turret );
self notify( "end_remote" );
self.owner setclientomnvar( "ui_a10", 0 );
self.owner thermalvisionfofoverlayoff();
var_1 = level.planeconfigs[var_0];
self stoploopsound( var_1.sfxcannonfireloop_1p );
maps\mp\killstreaks\_plane::stoptrackingplane( self );
wait 5;
if ( isdefined( self ) )
{
self stoploopsound( var_1.sfxengine_1p );
cleanupaircraft();
}
}
createplaneasheli( var_0, var_1, var_2 )
{
var_3 = level.planeconfigs[var_0];
var_4 = getcsplinepointposition( var_2, 0 );
var_5 = getcsplinepointtangent( var_2, 0 );
var_6 = vectortoangles( var_5 );
var_7 = spawnhelicopter( self, var_4, var_6, var_3.vehicle, var_3.modelnames[self.team] );
if ( !isdefined( var_7 ) )
return undefined;
var_7 makevehiclesolidcapsule( 18, -9, 18 );
var_7.owner = self;
var_7.team = self.team;
var_7.lifeid = var_1;
var_7 thread maps\mp\killstreaks\_plane::playplanefx();
return var_7;
}
handledeath()
{
level endon( "game_ended" );
self endon( "delete" );
self waittill( "death" );
level.a10strafeactive = undefined;
self.owner.using_remote_a10 = undefined;
self delete();
}
a10_freezebuffer()
{
self endon( "disconnect" );
self endon( "death" );
level endon( "game_ended" );
maps\mp\_utility::freezecontrolswrapper( 1 );
wait 0.5;
maps\mp\_utility::freezecontrolswrapper( 0 );
}
monitorrocketfire( var_0, var_1 )
{
var_1 endon( "end_remote" );
var_1 endon( "death" );
self endon( "death" );
level endon( "game_ended" );
var_2 = level.planeconfigs[var_0];
var_1.numrocketsleft = var_2.numrockets;
self notifyonplayercommand( "rocket_fire_pressed", "+speed_throw" );
self notifyonplayercommand( "rocket_fire_pressed", "+ads_akimbo_accessible" );
if ( !level.console )
self notifyonplayercommand( "rocket_fire_pressed", "+toggleads_throw" );
self setclientomnvar( "ui_a10_rocket", var_1.numrocketsleft );
while ( var_1.numrocketsleft > 0 )
{
self waittill( "rocket_fire_pressed" );
var_1 onfirerocket( var_0 );
wait( var_2.delaybetweenrockets );
}
}
monitorrocketfire2( var_0, var_1 )
{
var_1 endon( "end_remote" );
var_1 endon( "death" );
self endon( "death" );
level endon( "game_ended" );
var_2 = level.planeconfigs[var_0];
var_1.numrocketsleft = var_2.numrockets;
self notifyonplayercommand( "rocket_fire_pressed", "+speed_throw" );
self notifyonplayercommand( "rocket_fire_pressed", "+ads_akimbo_accessible" );
if ( !level.console )
self notifyonplayercommand( "rocket_fire_pressed", "+toggleads_throw" );
var_1.targetlist = [];
self setclientomnvar( "ui_a10_rocket", var_1.numrocketsleft );
while ( var_1.numrocketsleft > 0 )
{
if ( !self adsbuttonpressed() )
self waittill( "rocket_fire_pressed" );
var_1 missileacquiretargets();
if ( var_1.targetlist.size > 0 )
var_1 thread firemissiles();
}
}
missilegetbesttarget()
{
var_0 = [];
foreach ( var_2 in level.players )
{
if ( missileisgoodtarget( var_2 ) )
var_0[var_0.size] = var_2;
}
foreach ( var_5 in level.uplinks )
{
if ( missileisgoodtarget( var_5 ) )
var_0[var_0.size] = var_5;
}
if ( var_0.size > 0 )
{
var_7 = sortbydistance( var_0, self.origin );
return var_7[0];
}
return undefined;
}
missileisgoodtarget( var_0 )
{
return isalive( var_0 ) && var_0.team != self.owner.team && !ismissiletargeted( var_0 ) && ( isplayer( var_0 ) && !var_0 maps\mp\_utility::_hasperk( "specialty_blindeye" ) ) && missiletargetangle( var_0 ) > 0.25;
}
missiletargetangle( var_0 )
{
var_1 = vectornormalize( var_0.origin - self.origin );
var_2 = anglestoforward( self.angles );
return vectordot( var_1, var_2 );
}
missileacquiretargets()
{
self endon( "death" );
self endon( "end_remote" );
level endon( "game_ended" );
self endon( "a10_missiles_fired" );
var_0 = level.planeconfigs[self.streakname];
self.owner setclientomnvar( "ui_a10_rocket_lock", 1 );
thread missilewaitfortriggerrelease();
var_1 = undefined;
while ( self.targetlist.size < self.numrocketsleft )
{
if ( !isdefined( var_1 ) )
{
var_1 = missilegetbesttarget();
if ( isdefined( var_1 ) )
{
thread missilelocktarget( var_1 );
wait( var_0.delaybetweenlockon );
var_1 = undefined;
continue;
}
}
wait 0.1;
}
self.owner setclientomnvar( "ui_a10_rocket_lock", 0 );
self notify( "a10_missiles_fired" );
}
missilewaitfortriggerrelease()
{
self endon( "end_remote" );
self endon( "death" );
level endon( "game_ended" );
self endon( "a10_missiles_fired" );
var_0 = self.owner;
var_0 notifyonplayercommand( "rocket_fire_released", "-speed_throw" );
var_0 notifyonplayercommand( "rocket_fire_released", "-ads_akimbo_accessible" );
if ( !level.console )
var_0 notifyonplayercommand( "rocket_fire_released", "-toggleads_throw" );
self.owner waittill( "rocket_fire_released" );
var_0 setclientomnvar( "ui_a10_rocket_lock", 0 );
self notify( "a10_missiles_fired" );
}
missilelocktarget( var_0 )
{
var_1 = level.planeconfigs[self.streakname];
var_2 = [];
var_2["icon"] = var_0 maps\mp\_entityheadicons::setheadicon( self.owner, var_1.lockonicon, ( 0, 0, -70 ), 10, 10, 0, 0.05, 1, 0, 0, 0 );
var_2["target"] = var_0;
self.targetlist[var_0 getentitynumber()] = var_2;
self.owner playlocalsound( "recondrone_lockon" );
}
ismissiletargeted( var_0 )
{
return isdefined( self.targetlist[var_0 getentitynumber()] );
}
firemissiles()
{
self endon( "death" );
level endon( "game_ended" );
var_0 = level.planeconfigs[self.streakname];
foreach ( var_2 in self.targetlist )
{
if ( self.numrocketsleft > 0 )
{
var_3 = onfirehomingmissile( self.streakname, var_2["target"], ( 0, 0, -70 ) );
if ( isdefined( var_2["icon"] ) )
{
var_3.icon = var_2["icon"];
var_2["icon"] = undefined;
}
wait( var_0.delaybetweenrockets );
continue;
}
break;
}
var_5 = [];
}
onfirehomingmissile( var_0, var_1, var_2 )
{
var_3 = self.numrocketsleft % 2;
var_4 = "tag_missile_" + ( var_3 + 1 );
var_5 = self gettagorigin( var_4 );
if ( isdefined( var_5 ) )
{
var_6 = self.owner;
var_7 = level.planeconfigs[var_0];
var_8 = magicbullet( var_7.rocketmodelname, var_5, var_5 + 100 * anglestoforward( self.angles ), self.owner );
var_8 thread a10_missile_set_target( var_1, var_2 );
earthquake( 0.25, 0.05, self.origin, 512 );
self.numrocketsleft--;
self.owner setclientomnvar( "ui_a10_rocket", self.numrocketsleft );
var_7 = level.planeconfigs[var_0];
var_8 playsoundonmovingent( var_7.sfxmissilefire_1p[var_3] );
var_8 playloopsound( var_7.sfxmissile );
return var_8;
}
return undefined;
}
onfirerocket( var_0 )
{
var_1 = "tag_missile_" + self.numrocketsleft;
var_2 = self gettagorigin( var_1 );
if ( isdefined( var_2 ) )
{
var_3 = self.owner;
var_4 = level.planeconfigs[var_0];
var_5 = magicbullet( var_4.rocketmodelname, var_2, var_2 + 100 * anglestoforward( self.angles ), self.owner );
earthquake( 0.25, 0.05, self.origin, 512 );
self.numrocketsleft--;
self.owner setclientomnvar( "ui_a10_rocket", self.numrocketsleft );
var_5 playsoundonmovingent( var_4.sfxmissilefire_1p[self.numrocketsleft] );
var_5 playloopsound( var_4.sfxmissile );
self playsoundonmovingent( "a10p_missile_launch" );
}
}
a10_missile_set_target( var_0, var_1 )
{
thread a10_missile_cleanup();
wait 0.2;
self missile_settargetent( var_0, var_1 );
}
a10_missile_cleanup()
{
self waittill( "death" );
if ( isdefined( self.icon ) )
self.icon destroy();
}
monitorweaponfire( var_0, var_1 )
{
var_1 endon( "end_remote" );
var_1 endon( "death" );
self endon( "death" );
level endon( "game_ended" );
var_2 = level.planeconfigs[var_0];
var_1.ammocount = 1350;
self setclientomnvar( "ui_a10_cannon", var_1.ammocount );
self notifyonplayercommand( "a10_cannon_start", "+attack" );
self notifyonplayercommand( "a10_cannon_stop", "-attack" );
while ( var_1.ammocount > 0 )
{
if ( !self attackbuttonpressed() )
self waittill( "a10_cannon_start" );
var_3 = gettime() + var_2.sfxcannonfireburptime;
var_1 playloopsound( var_2.sfxcannonfireloop_1p );
var_1 thread updatecannonshake( var_0 );
self waittill( "a10_cannon_stop" );
var_1 stoploopsound( var_2.sfxcannonfireloop_1p );
var_1 playsoundonmovingent( var_2.sfxcannonfirestop_1p );
if ( gettime() < var_3 )
{
playsoundatpos( var_1.origin, var_2.sfxcannonfireburpshort_3p );
continue;
}
playsoundatpos( var_1.origin, var_2.sfxcannonfireburplong_3p );
}
}
updatecannonshake( var_0 )
{
self.owner endon( "a10_cannon_stop" );
self endon( "death" );
level endon( "game_ended" );
var_1 = level.planeconfigs[var_0];
while ( self.ammocount > 0 )
{
earthquake( 0.2, 0.5, self.origin, 512 );
self.ammocount = self.ammocount - 10;
self.owner setclientomnvar( "ui_a10_cannon", self.ammocount );
var_2 = self gettagorigin( "tag_flash_attach" ) + 20 * anglestoforward( self.angles );
playfx( var_1.cannonfirevfx, var_2 );
self playrumbleonentity( var_1.cannonrumble );
wait 0.1;
}
self.turret turretfiredisable();
}
monitoraltitude( var_0, var_1 )
{
var_1 endon( "end_remote" );
var_1 endon( "death" );
self endon( "death" );
level endon( "game_ended" );
self setclientomnvar( "ui_a10_alt_warn", 0 );
for (;;)
{
var_2 = int( clamp( var_1.origin[2], 0, 16383 ) );
self setclientomnvar( "ui_a10_alt", var_2 );
if ( var_2 <= 1000 && !isdefined( var_1.altwarning ) )
{
var_1.altwarning = 1;
self setclientomnvar( "ui_a10_alt_warn", 1 );
}
else if ( var_2 > 1000 && isdefined( var_1.altwarning ) )
{
var_1.altwarning = undefined;
self setclientomnvar( "ui_a10_alt_warn", 0 );
}
wait 0.1;
}
}
watchintrocleared( var_0, var_1 )
{
self endon( "disconnect" );
level endon( "game_ended" );
self waittill( "intro_cleared" );
self setclientomnvar( "ui_a10", 1 );
thread monitoraltitude( var_0, var_1 );
thread monitorrocketfire2( var_0, var_1 );
thread monitorweaponfire( var_0, var_1 );
thread watchroundend( var_1, var_0 );
self thermalvisionfofoverlayon();
thread watchearlyexit( var_1 );
}
watchroundend( var_0, var_1 )
{
var_0 endon( "death" );
var_0 endon( "leaving" );
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "joined_spectators" );
level common_scripts\utility::waittill_any( "round_end_finished", "game_ended" );
var_0 thread endflyby( var_1 );
endstrafesequence( var_1 );
a10_explode();
}
buildallflightpathsdefault()
{
var_0 = [];
var_0[0] = 1;
var_0[1] = 2;
var_0[2] = 3;
var_0[3] = 4;
var_0[4] = 1;
var_0[5] = 2;
var_0[6] = 4;
var_0[7] = 3;
var_1 = [];
var_1[0] = 2;
var_1[1] = 1;
var_1[2] = 4;
var_1[3] = 3;
var_1[4] = 1;
var_1[5] = 4;
var_1[6] = 3;
var_1[7] = 2;
buildallflightpaths( var_0, var_1 );
}
buildallflightpaths( var_0, var_1 )
{
level.a10splinesin = var_0;
level.a10splinesout = var_1;
}
a10_cockpit_breathing()
{
level endon( "remove_player_control" );
for (;;)
wait( randomfloatrange( 3.0, 7.0 ) );
}
watchearlyexit( var_0 )
{
level endon( "game_ended" );
var_0 endon( "death" );
var_0 endon( "a10_end_strafe" );
var_0 thread maps\mp\killstreaks\_killstreaks::allowridekillstreakplayerexit();
var_0 waittill( "killstreakExit" );
self notify( "end_remote" );
var_0 thread endflyby( var_0.streakname );
endstrafesequence( var_0.streakname );
var_0 a10_explode();
}
a10_handledamage()
{
self endon( "end_remote" );
var_0 = level.planeconfigs[self.streakname];
maps\mp\gametypes\_damage::monitordamage( var_0.maxhealth, "helicopter", ::handledeathdamage, ::modifydamage, 1 );
}
modifydamage( var_0, var_1, var_2, var_3 )
{
var_4 = var_3;
var_4 = maps\mp\gametypes\_damage::handleempdamage( 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;
}
handledeathdamage( var_0, var_1, var_2, var_3 )
{
var_4 = level.planeconfigs[self.streakname];
maps\mp\gametypes\_damage::onkillstreakkilled( var_0, var_1, var_2, var_3, var_4.vodestroyed, var_4.xppopup, var_4.callout );
a10_explode();
}
a10_explode()
{
var_0 = level.planeconfigs[self.streakname];
maps\mp\killstreaks\_plane::stoptrackingplane( self );
playfx( var_0.explodevfx, self.origin );
self delete();
}

View File

@ -0,0 +1,136 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.killstreakfuncs["aa_launcher"] = ::tryuseaalauncher;
maps\mp\_laserguidedlauncher::lgm_init( "vfx/gameplay/mp/killstreaks/vfx_maaws_split", "vfx/gameplay/mp/killstreaks/vfx_maaws_homing" );
}
getaalaunchername()
{
return "iw6_maaws_mp";
}
getaalauncherchildname()
{
return "iw6_maawschild_mp";
}
getaalauncherhomingname()
{
return "iw6_maawshoming_mp";
}
getaalauncherammo( var_0 )
{
var_1 = getaalauncheruniqueindex( var_0 );
var_2 = 0;
if ( isdefined( var_0.pers["aaLauncherAmmo"][var_1] ) )
var_2 = var_0.pers["aaLauncherAmmo"][var_1];
return var_2;
}
clearaalauncherammo( var_0 )
{
var_1 = getaalauncheruniqueindex( var_0 );
var_0.pers["aaLauncherAmmo"][var_1] = undefined;
}
setaalauncherammo( var_0, var_1, var_2 )
{
var_3 = getaalauncheruniqueindex( var_0 );
var_0.pers["aaLauncherAmmo"][var_3] = var_1;
if ( !isdefined( var_2 ) || var_2 )
{
if ( var_0 hasweapon( getaalaunchername() ) )
var_0 setweaponammoclip( getaalaunchername(), var_1 );
}
}
getaalauncheruniqueindex( var_0 )
{
return var_0.pers["killstreaks"][var_0.killstreakindexweapon].kid;
}
tryuseaalauncher( var_0, var_1 )
{
return useaalauncher( self, var_0 );
}
useaalauncher( var_0, var_1 )
{
if ( !isdefined( self.pers["aaLauncherAmmo"] ) )
self.pers["aaLauncherAmmo"] = [];
if ( getaalauncherammo( var_0 ) == 0 )
setaalauncherammo( self, 2, 0 );
level thread monitorweaponswitch( var_0 );
level thread monitorlauncherammo( var_0 );
thread maps\mp\_laserguidedlauncher::lgm_firing_monitormissilefire( getaalaunchername(), getaalauncherchildname(), getaalauncherhomingname() );
var_2 = 0;
var_3 = var_0 common_scripts\utility::waittill_any_return( "aa_launcher_switch", "aa_launcher_empty", "death", "disconnect" );
if ( var_3 == "aa_launcher_empty" )
{
var_0 common_scripts\utility::waittill_any( "weapon_change", "LGM_player_allMissilesDestroyed", "death", "disconnect" );
var_2 = 1;
}
else
{
if ( var_0 hasweapon( getaalaunchername() ) && var_0 getammocount( getaalaunchername() ) == 0 )
clearaalauncherammo( var_0 );
if ( getaalauncherammo( var_0 ) == 0 )
var_2 = 1;
}
var_0 notify( "aa_launcher_end" );
maps\mp\_laserguidedlauncher::lgm_firing_endmissilefire();
return var_2;
}
monitorweaponswitch( var_0 )
{
var_0 endon( "death" );
var_0 endon( "disconnect" );
var_0 endon( "aa_launcher_empty" );
var_0 endon( "aa_launcher_end" );
var_1 = var_0 getcurrentweapon();
while ( var_1 == getaalaunchername() )
var_0 waittill( "weapon_change", var_1 );
var_0 notify( "aa_launcher_switch" );
}
monitorlauncherammo( var_0 )
{
var_0 endon( "death" );
var_0 endon( "disconnect" );
var_0 endon( "aa_launcher_switch" );
var_0 endon( "aa_launcher_end" );
setaalauncherammo( var_0, getaalauncherammo( var_0 ), 1 );
for (;;)
{
var_0 waittill( "weapon_fired", var_1 );
if ( var_1 != getaalaunchername() )
continue;
var_2 = var_0 getammocount( getaalaunchername() );
setaalauncherammo( var_0, var_2, 0 );
if ( getaalauncherammo( var_0 ) == 0 )
{
clearaalauncherammo( var_0 );
var_0 notify( "aa_launcher_empty" );
break;
}
}
}

View File

@ -0,0 +1,202 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
precacheitem( "aamissile_projectile_mp" );
precacheshader( "ac130_overlay_grain" );
level.aamissilelaunchvert = 14000;
level.aamissilelaunchhorz = 30000;
level.aamissilelaunchtargetdist = 1500;
level.rockets = [];
level.killstreakfuncs["aamissile"] = ::tryuseaamissile;
}
tryuseaamissile( var_0, var_1 )
{
maps\mp\_utility::setusingremote( "aamissile" );
var_2 = maps\mp\killstreaks\_killstreaks::initridekillstreak();
if ( var_2 != "success" )
{
if ( var_2 != "disconnect" )
maps\mp\_utility::clearusingremote();
return 0;
}
level thread aa_missile_fire( var_0, self );
return 1;
}
gettargets()
{
var_0 = [];
var_1 = [];
if ( isdefined( level.littlebirds ) && level.littlebirds.size )
{
foreach ( var_3 in level.littlebirds )
{
if ( var_3.team != self.team )
var_0[var_0.size] = var_3;
}
}
if ( isdefined( level.helis ) && level.helis.size )
{
foreach ( var_6 in level.helis )
{
if ( var_6.team != self.team )
var_1[var_1.size] = var_6;
}
}
if ( isdefined( var_1 ) && var_1.size )
return var_1[0];
else if ( isdefined( var_0 ) && var_0.size )
return var_0[0];
}
aa_missile_fire( var_0, var_1 )
{
var_2 = undefined;
var_3 = ( 0, 0, level.aamissilelaunchvert );
var_4 = level.aamissilelaunchhorz;
var_5 = level.aammissilelaunchtargetdist;
var_6 = var_1 gettargets();
if ( !isdefined( var_6 ) )
var_7 = ( 0, 0, 0 );
else
{
var_7 = var_6.origin;
var_3 = ( 0, 0, 1 ) * var_7 + ( 0, 0, 1000 );
}
var_8 = anglestoforward( var_1.angles );
var_9 = var_1.origin + var_3 + var_8 * var_4 * -1;
var_10 = magicbullet( "aamissile_projectile_mp", var_9, var_7, var_1 );
if ( !isdefined( var_10 ) )
{
var_1 maps\mp\_utility::clearusingremote();
return;
}
var_10.lifeid = var_0;
var_10.type = "remote";
missileeyes( var_1, var_10 );
}
missileeyes( var_0, var_1 )
{
var_0 endon( "joined_team" );
var_0 endon( "joined_spectators" );
var_1 thread rocket_cleanupondeath();
var_0 thread player_cleanupongameended( var_1 );
var_0 thread player_cleanuponteamchange( var_1 );
var_0 visionsetmissilecamforplayer( "black_bw", 0 );
var_0 endon( "disconnect" );
if ( isdefined( var_1 ) )
{
var_0 visionsetmissilecamforplayer( game["thermal_vision"], 1.0 );
var_0 thread delayedfofoverlay();
var_0 cameralinkto( var_1, "tag_origin" );
var_0 controlslinkto( var_1 );
if ( getdvarint( "camera_thirdPerson" ) )
var_0 maps\mp\_utility::setthirdpersondof( 0 );
var_1 waittill( "death" );
if ( isdefined( var_1 ) )
var_0 maps\mp\_matchdata::logkillstreakevent( "predator_missile", var_1.origin );
var_0 controlsunlink();
var_0 maps\mp\_utility::freezecontrolswrapper( 1 );
if ( !level.gameended || isdefined( var_0.finalkill ) )
var_0 thread staticeffect( 0.5 );
wait 0.5;
var_0 thermalvisionfofoverlayoff();
var_0 cameraunlink();
if ( getdvarint( "camera_thirdPerson" ) )
var_0 maps\mp\_utility::setthirdpersondof( 1 );
}
var_0 maps\mp\_utility::clearusingremote();
}
delayedfofoverlay()
{
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
wait 0.15;
self thermalvisionfofoverlayon();
}
staticeffect( var_0 )
{
self endon( "disconnect" );
var_1 = newclienthudelem( self );
var_1.horzalign = "fullscreen";
var_1.vertalign = "fullscreen";
var_1 setshader( "white", 640, 480 );
var_1.archive = 1;
var_1.sort = 10;
var_2 = newclienthudelem( self );
var_2.horzalign = "fullscreen";
var_2.vertalign = "fullscreen";
var_2 setshader( "ac130_overlay_grain", 640, 480 );
var_2.archive = 1;
var_2.sort = 20;
wait( var_0 );
var_2 destroy();
var_1 destroy();
}
player_cleanuponteamchange( var_0 )
{
var_0 endon( "death" );
self endon( "disconnect" );
common_scripts\utility::waittill_any( "joined_team", "joined_spectators" );
if ( self.team != "spectator" )
{
self thermalvisionfofoverlayoff();
self controlsunlink();
self cameraunlink();
if ( getdvarint( "camera_thirdPerson" ) )
maps\mp\_utility::setthirdpersondof( 1 );
}
maps\mp\_utility::clearusingremote();
level.remotemissileinprogress = undefined;
}
rocket_cleanupondeath()
{
var_0 = self getentitynumber();
level.rockets[var_0] = self;
self waittill( "death" );
level.rockets[var_0] = undefined;
}
player_cleanupongameended( var_0 )
{
var_0 endon( "death" );
self endon( "death" );
level waittill( "game_ended" );
self thermalvisionfofoverlayoff();
self controlsunlink();
self cameraunlink();
if ( getdvarint( "camera_thirdPerson" ) )
maps\mp\_utility::setthirdpersondof( 1 );
}

View File

@ -0,0 +1,251 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
precacheitem( "aamissile_projectile_mp" );
precachemodel( "vehicle_av8b_harrier_jet_mp" );
level.teamairdenied["axis"] = 0;
level.teamairdenied["allies"] = 0;
level.rockets = [];
level.killstreakfuncs["aastrike"] = ::tryuseaastrike;
}
tryuseaastrike( var_0, var_1 )
{
maps\mp\_matchdata::logkillstreakevent( "aastrike", self.origin );
thread finishaastrike( var_0 );
thread maps\mp\_utility::teamplayercardsplash( "used_aastrike", self, self.team );
return 1;
}
cycletargets()
{
self endon( "stopFindingTargets" );
self endon( "disconnect" );
self endon( "owner_gone" );
self endon( "game_ended" );
for (;;)
{
wait 0.05;
findtargets();
wait( randomintrange( 4, 5 ) );
}
}
findtargets()
{
self endon( "disconnect" );
self endon( "owner_gone" );
self endon( "game_ended" );
var_0 = [];
var_1 = [];
var_2 = [];
if ( isdefined( level.littlebirds ) && level.littlebirds.size )
{
foreach ( var_4 in level.littlebirds )
{
if ( isdefined( var_4.team ) && var_4.team != self.team )
var_0[var_0.size] = var_4;
}
}
if ( isdefined( level.helis ) && level.helis.size )
{
foreach ( var_7 in level.helis )
{
if ( var_7.team != self.team )
var_1[var_1.size] = var_7;
}
}
var_9 = maps\mp\_utility::getotherteam( self.team );
if ( isdefined( level.activeuavs[var_9] ) )
{
foreach ( var_11 in level.uavmodels[var_9] )
var_2[var_2.size] = var_11;
}
var_13 = 0;
foreach ( var_4 in var_0 )
{
wait 3;
if ( var_13 % 2 )
thread fireattarget( var_4, self.team, 1 );
else
thread fireattarget( var_4, self.team, 0 );
var_13++;
}
foreach ( var_7 in var_1 )
{
wait 3;
thread fireattarget( var_7, self.team, 1 );
}
foreach ( var_11 in var_2 )
{
wait 0.5;
thread fireattarget( var_11, self.team, 0 );
}
}
earlyabortwatcher()
{
self endon( "stopFindingTargets" );
var_0 = self.team;
if ( maps\mp\_utility::bot_is_fireteam_mode() )
self waittill( "killstreak_disowned" );
else
common_scripts\utility::waittill_either( "killstreak_disowned", "game_ended" );
self notify( "owner_gone" );
level.teamairdenied[maps\mp\_utility::getotherteam( var_0 )] = 0;
level.airdeniedplayer = undefined;
}
finishaastrike( var_0 )
{
self endon( "disconnect" );
self endon( "owner_gone" );
self endon( "game_ended" );
level.teamairdenied[maps\mp\_utility::getotherteam( self.team )] = 1;
level.airdeniedplayer = self;
thread earlyabortwatcher();
thread cycletargets();
for ( var_1 = 0; var_1 < 4; var_1++ )
{
wait 6;
if ( var_1 == 1 || var_1 == 3 )
{
thread doflyby( 1 );
continue;
}
thread doflyby( 0 );
}
wait 3;
self notify( "stopFindingTargets" );
level.teamairdenied[maps\mp\_utility::getotherteam( self.team )] = 0;
level.airdeniedplayer = undefined;
}
fireattarget( var_0, var_1, var_2 )
{
if ( !isdefined( var_0 ) )
return;
var_3 = ( 0, 0, 14000 );
var_4 = ( 0, 0, 1500 );
var_5 = 15000;
var_6 = 20000;
var_7 = var_0.origin;
var_3 = ( 0, 0, 1 ) * var_7 + ( 0, 0, 1000 );
var_8 = var_0.angles * ( 0, 1, 0 );
var_9 = anglestoforward( var_8 );
var_10 = var_0.origin + var_4 + var_9 * var_5 * -1;
var_11 = var_0.origin + var_4 + var_9 * var_6;
var_12 = magicbullet( "aamissile_projectile_mp", var_10 + ( 0, 0, -75 ), var_0.origin, self );
var_12 missile_settargetent( var_0 );
var_12 missile_setflightmodedirect();
var_13 = magicbullet( "aamissile_projectile_mp", var_10 + ( randomint( 500 ), randomint( 500 ), -75 ), var_0.origin, self );
var_13 missile_settargetent( var_0 );
var_13 missile_setflightmodedirect();
if ( var_2 )
var_14 = spawnplane( self, "script_model", var_10, "compass_objpoint_airstrike_friendly", "compass_objpoint_airstrike_friendly" );
else
var_14 = spawnplane( self, "script_model", var_10 );
if ( self.team == "allies" )
var_14 setmodel( "vehicle_av8b_harrier_jet_mp" );
else
var_14 setmodel( "vehicle_av8b_harrier_jet_opfor_mp" );
var_15 = distance( var_10, var_11 );
var_14.angles = vectortoangles( var_11 - var_10 );
var_14 thread aasoundmanager( var_15 );
var_14 thread playplanefx();
var_15 = distance( var_10, var_11 );
var_14 moveto( var_11 * 2, var_15 / 2000, 0, 0 );
wait( var_15 / 3000 );
var_14 delete();
}
aasoundmanager( var_0 )
{
self playloopsound( "veh_aastrike_flyover_loop" );
wait( var_0 / 2 / 2000 );
self stoploopsound();
self playloopsound( "veh_aastrike_flyover_outgoing_loop" );
}
doflyby( var_0 )
{
self endon( "disconnect" );
var_1 = randomint( level.spawnpoints.size - 1 );
var_2 = level.spawnpoints[var_1].origin * ( 1, 1, 0 );
var_3 = 20000;
var_4 = 20000;
var_5 = getent( "airstrikeheight", "targetname" );
var_6 = ( 0, 0, var_5.origin[2] + randomintrange( -100, 600 ) );
var_7 = anglestoforward( ( 0, randomint( 45 ), 0 ) );
var_8 = var_2 + var_6 + var_7 * var_3 * -1;
var_9 = var_2 + var_6 + var_7 * var_4;
var_10 = var_8 + ( randomintrange( 400, 500 ), randomintrange( 400, 500 ), randomintrange( 200, 300 ) );
var_11 = var_9 + ( randomintrange( 400, 500 ), randomintrange( 400, 500 ), randomintrange( 200, 300 ) );
if ( var_0 )
var_12 = spawnplane( self, "script_model", var_8, "hud_minimap_harrier_green", "hud_minimap_harrier_red" );
else
var_12 = spawnplane( self, "script_model", var_8 );
var_13 = spawnplane( self, "script_model", var_10 );
if ( self.team == "allies" )
{
var_12 setmodel( "vehicle_av8b_harrier_jet_mp" );
var_13 setmodel( "vehicle_av8b_harrier_jet_mp" );
}
else
{
var_12 setmodel( "vehicle_av8b_harrier_jet_opfor_mp" );
var_13 setmodel( "vehicle_av8b_harrier_jet_opfor_mp" );
}
var_12.angles = vectortoangles( var_9 - var_8 );
var_12 playloopsound( "veh_aastrike_flyover_loop" );
var_12 thread playplanefx();
var_13.angles = vectortoangles( var_9 - var_10 );
var_13 thread playplanefx();
var_14 = distance( var_8, var_9 );
var_12 moveto( var_9 * 2, var_14 / 1800, 0, 0 );
wait( randomfloatrange( 0.25, 0.5 ) );
var_13 moveto( var_11 * 2, var_14 / 1800, 0, 0 );
wait( var_14 / 1600 );
var_12 delete();
var_13 delete();
}
playplanefx()
{
self endon( "death" );
wait 0.5;
playfxontag( level.fx_airstrike_afterburner, self, "tag_engine_right" );
wait 0.5;
playfxontag( level.fx_airstrike_afterburner, self, "tag_engine_left" );
wait 0.5;
playfxontag( level.fx_airstrike_contrail, self, "tag_right_wingtip" );
wait 0.5;
playfxontag( level.fx_airstrike_contrail, self, "tag_left_wingtip" );
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,145 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.killstreakfuncs["agent"] = ::tryusesquadmate;
level.killstreakfuncs["recon_agent"] = ::tryusereconsquadmate;
}
setup_callbacks()
{
level.agent_funcs["squadmate"] = level.agent_funcs["player"];
level.agent_funcs["squadmate"]["think"] = ::squadmate_agent_think;
level.agent_funcs["squadmate"]["on_killed"] = ::on_agent_squadmate_killed;
level.agent_funcs["squadmate"]["on_damaged"] = maps\mp\agents\_agents::on_agent_player_damaged;
level.agent_funcs["squadmate"]["gametype_update"] = ::no_gametype_update;
}
no_gametype_update()
{
return 0;
}
tryusesquadmate( var_0, var_1 )
{
return usesquadmate( "agent" );
}
tryusereconsquadmate( var_0, var_1 )
{
return usesquadmate( "reconAgent" );
}
usesquadmate( var_0 )
{
if ( maps\mp\agents\_agent_utility::getnumactiveagents( "squadmate" ) >= 5 )
{
self iprintlnbold( &"KILLSTREAKS_AGENT_MAX" );
return 0;
}
if ( maps\mp\agents\_agent_utility::getnumownedactiveagents( self ) >= 2 )
{
self iprintlnbold( &"KILLSTREAKS_AGENT_MAX" );
return 0;
}
var_1 = maps\mp\agents\_agent_utility::getvalidspawnpathnodenearplayer( 0, 1 );
if ( !isdefined( var_1 ) )
return 0;
if ( !maps\mp\_utility::isreallyalive( self ) )
return 0;
var_2 = var_1.origin;
var_3 = vectortoangles( self.origin - var_1.origin );
var_4 = maps\mp\agents\_agents::add_humanoid_agent( "squadmate", self.team, undefined, var_2, var_3, self, 0, 0, "veteran" );
if ( !isdefined( var_4 ) )
{
self iprintlnbold( &"KILLSTREAKS_AGENT_MAX" );
return 0;
}
var_4.killstreaktype = var_0;
if ( var_4.killstreaktype == "reconAgent" )
{
var_4 thread sendagentweaponnotify( "iw6_riotshield_mp" );
var_4 thread finishreconagentloadout();
var_4 thread maps\mp\gametypes\_class::giveloadout( self.pers["team"], "reconAgent", 0 );
var_4 maps\mp\agents\_agent_common::set_agent_health( 250 );
var_4 maps\mp\perks\_perkfunctions::setlightarmor();
}
else
var_4 maps\mp\perks\_perkfunctions::setlightarmor();
var_4 maps\mp\_utility::_setnameplatematerial( "player_name_bg_green_agent", "player_name_bg_red_agent" );
maps\mp\_matchdata::logkillstreakevent( var_4.killstreaktype, self.origin );
return 1;
}
finishreconagentloadout()
{
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
self waittill( "giveLoadout" );
maps\mp\perks\_perkfunctions::setlightarmor();
maps\mp\_utility::giveperk( "specialty_quickswap", 0 );
maps\mp\_utility::giveperk( "specialty_regenfaster", 0 );
self botsetdifficultysetting( "minInaccuracy", 1.5 * self botgetdifficultysetting( "minInaccuracy" ) );
self botsetdifficultysetting( "maxInaccuracy", 1.5 * self botgetdifficultysetting( "maxInaccuracy" ) );
self botsetdifficultysetting( "minFireTime", 1.5 * self botgetdifficultysetting( "minFireTime" ) );
self botsetdifficultysetting( "maxFireTime", 1.25 * self botgetdifficultysetting( "maxFireTime" ) );
}
sendagentweaponnotify( var_0 )
{
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
self waittill( "giveLoadout" );
if ( !isdefined( var_0 ) )
var_0 = "iw6_riotshield_mp";
self notify( "weapon_change", var_0 );
}
squadmate_agent_think()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "owner_disconnect" );
level endon( "game_ended" );
for (;;)
{
self botsetflag( "prefer_shield_out", 1 );
var_0 = self [[ maps\mp\agents\_agent_utility::agentfunc( "gametype_update" ) ]]();
if ( !var_0 )
{
if ( !maps\mp\bots\_bots_util::bot_is_guarding_player( self.owner ) )
maps\mp\bots\_bots_strategy::bot_guard_player( self.owner, 350 );
}
wait 0.05;
}
}
on_agent_squadmate_killed( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
{
maps\mp\agents\_agents::on_humanoid_agent_killed_common( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, 0 );
if ( isplayer( var_1 ) && isdefined( self.owner ) && var_1 != self.owner )
{
self.owner maps\mp\_utility::leaderdialogonplayer( "squad_killed" );
maps\mp\gametypes\_damage::onkillstreakkilled( var_1, var_4, var_3, var_2, "destroyed_squad_mate" );
}
maps\mp\agents\_agent_utility::deactivateagent();
}

View File

@ -0,0 +1,216 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
var_0 = spawnstruct();
var_0.modelnames = [];
var_0.modelnames["allies"] = "vehicle_a10_warthog_iw6_mp";
var_0.modelnames["axis"] = "vehicle_a10_warthog_iw6_mp";
var_0.inboundsfx = "veh_mig29_dist_loop";
var_0.compassiconfriendly = "compass_objpoint_airstrike_friendly";
var_0.compassiconenemy = "compass_objpoint_airstrike_busy";
var_0.speed = 4000;
var_0.halfdistance = 20000;
var_0.distfromplayer = 4000;
var_0.heightrange = 250;
var_0.nummissilevolleys = 3;
var_0.outboundflightanim = "airstrike_mp_roll";
var_0.sonicboomsfx = "veh_mig29_sonic_boom";
var_0.onattackdelegate = ::attackenemyaircraft;
var_0.onflybycompletedelegate = ::cleanupflyby;
var_0.xppopup = "destroyed_air_superiority";
var_0.callout = "callout_destroyed_air_superiority";
var_0.vodestroyed = undefined;
var_0.killcamoffset = ( -800, 0, 200 );
level.planeconfigs["air_superiority"] = var_0;
level.killstreakfuncs["air_superiority"] = ::onuse;
level.teamairdenied["axis"] = 0;
level.teamairdenied["allies"] = 0;
}
onuse( var_0, var_1 )
{
var_2 = maps\mp\_utility::getotherteam( self.team );
if ( level.teambased && level.teamairdenied[var_2] || !level.teambased && isdefined( level.airdeniedplayer ) && level.airdeniedplayer == self )
{
self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
return 0;
}
else
{
thread dostrike( var_0, "air_superiority" );
maps\mp\_matchdata::logkillstreakevent( "air_superiority", self.origin );
thread maps\mp\_utility::teamplayercardsplash( "used_air_superiority", self );
return 1;
}
}
dostrike( var_0, var_1 )
{
var_2 = level.planeconfigs[var_1];
var_3 = maps\mp\killstreaks\_plane::getplaneflightplan( var_2.distfromplayer );
wait 1;
var_4 = maps\mp\_utility::getotherteam( self.team );
level.teamairdenied[var_4] = 1;
level.airdeniedplayer = self;
dooneflyby( var_1, var_0, var_3.targetpos, var_3.flightdir, var_3.height );
self waittill( "aa_flyby_complete" );
wait 2;
maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
if ( isdefined( self ) )
{
dooneflyby( var_1, var_0, var_3.targetpos, -1 * var_3.flightdir, var_3.height );
self waittill( "aa_flyby_complete" );
}
level.teamairdenied[var_4] = 0;
level.airdeniedplayer = undefined;
}
dooneflyby( var_0, var_1, var_2, var_3, var_4 )
{
var_5 = level.planeconfigs[var_0];
var_6 = maps\mp\killstreaks\_plane::getflightpath( var_2, var_3, var_5.halfdistance, 1, var_4, var_5.speed, -0.5 * var_5.halfdistance, var_0 );
level thread maps\mp\killstreaks\_plane::doflyby( var_1, self, var_1, var_6["startPoint"] + ( 0, 0, randomint( var_5.heightrange ) ), var_6["endPoint"] + ( 0, 0, randomint( var_5.heightrange ) ), var_6["attackTime"], var_6["flyTime"], var_3, var_0 );
}
attackenemyaircraft( var_0, var_1, var_2, var_3, var_4 )
{
self endon( "death" );
self.owner endon( "killstreak_disowned" );
level endon( "game_ended" );
wait( var_2 );
var_5 = findalltargets( self.owner, self.team );
var_6 = level.planeconfigs[var_4];
var_7 = var_6.nummissilevolleys;
for ( var_8 = var_5.size - 1; var_8 >= 0 && var_7 > 0; var_8-- )
{
var_9 = var_5[var_8];
if ( isdefined( var_9 ) && isalive( var_9 ) )
{
fireattarget( var_9 );
var_7--;
wait 1;
}
}
}
cleanupflyby( var_0, var_1, var_2 )
{
var_0 notify( "aa_flyby_complete" );
}
findtargetsoftype( var_0, var_1, var_2, var_3, var_4 )
{
if ( isdefined( var_3 ) )
{
foreach ( var_6 in var_3 )
{
if ( [[ var_2 ]]( var_0, var_1, var_6 ) )
var_4.targets[var_4.targets.size] = var_6;
}
}
return var_4;
}
findalltargets( var_0, var_1 )
{
var_2 = spawnstruct();
var_2.targets = [];
var_3 = undefined;
if ( level.teambased )
var_3 = maps\mp\_utility::isvalidteamtarget;
else
var_3 = maps\mp\_utility::isvalidffatarget;
var_4 = undefined;
if ( isdefined( var_1 ) )
var_4 = maps\mp\_utility::getotherteam( var_1 );
findtargetsoftype( var_0, var_4, var_3, level.heli_pilot, var_2 );
if ( isdefined( level.lbsniper ) )
{
if ( [[ var_3 ]]( var_0, var_4, level.lbsniper ) )
var_2.targets[var_2.targets.size] = level.lbsniper;
}
findtargetsoftype( var_0, var_4, var_3, level.planes, var_2 );
findtargetsoftype( var_0, var_4, var_3, level.littlebirds, var_2 );
findtargetsoftype( var_0, var_4, var_3, level.helis, var_2 );
return var_2.targets;
}
fireattarget( var_0 )
{
if ( !isdefined( var_0 ) )
return;
var_1 = undefined;
if ( isdefined( self.owner ) )
var_1 = self.owner;
var_2 = 384 * anglestoforward( self.angles );
var_3 = self gettagorigin( "tag_missile_1" ) + var_2;
var_4 = magicbullet( "aamissile_projectile_mp", var_3, var_3 + var_2, var_1 );
var_4.vehicle_fired_from = self;
var_3 = self gettagorigin( "tag_missile_2" ) + var_2;
var_5 = magicbullet( "aamissile_projectile_mp", var_3, var_3 + var_2, var_1 );
var_5.vehicle_fired_from = self;
var_6 = [ var_4, var_5 ];
var_0 notify( "targeted_by_incoming_missile", var_6 );
thread startmissileguidance( var_0, 0.25, var_6 );
}
startmissileguidance( var_0, var_1, var_2 )
{
wait( var_1 );
if ( isdefined( var_0 ) )
{
var_3 = undefined;
if ( var_0.model != "vehicle_av8b_harrier_jet_mp" )
var_3 = var_0 gettagorigin( "tag_missile_target" );
if ( !isdefined( var_3 ) )
var_3 = var_0 gettagorigin( "tag_body" );
var_4 = var_3 - var_0.origin;
foreach ( var_6 in var_2 )
{
if ( isvalidmissile( var_6 ) )
{
var_6 missile_settargetent( var_0, var_4 );
var_6 missile_setflightmodedirect();
}
}
}
}
destroyactivevehicles( var_0, var_1 )
{
maps\mp\killstreaks\_killstreaks::destroytargetarray( var_0, var_1, "aamissile_projectile_mp", level.helis );
maps\mp\killstreaks\_killstreaks::destroytargetarray( var_0, var_1, "aamissile_projectile_mp", level.littlebirds );
maps\mp\killstreaks\_killstreaks::destroytargetarray( var_0, var_1, "aamissile_projectile_mp", level.heli_pilot );
if ( isdefined( level.lbsniper ) )
{
var_2 = [];
var_2[0] = level.lbsniper;
maps\mp\killstreaks\_killstreaks::destroytargetarray( var_0, var_1, "aamissile_projectile_mp", var_2 );
}
maps\mp\killstreaks\_killstreaks::destroytargetarray( var_0, var_1, "aamissile_projectile_mp", level.remote_uav );
maps\mp\killstreaks\_killstreaks::destroytargetarray( var_0, var_1, "aamissile_projectile_mp", level.planes );
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,997 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
precachelocationselector( "map_artillery_selector" );
level.airstrikefx = loadfx( "fx/explosions/clusterbomb" );
level.airstrikessfx = loadfx( "fx/explosions/clusterbomb_no_fount" );
level.airstrikeexplosion = loadfx( "fx/explosions/clusterbomb_exp_direct_runner_cheap" );
level.mortareffect = loadfx( "fx/explosions/clusterbomb_exp_direct_runner_stealth" );
level.bombstrike = loadfx( "fx/explosions/wall_explosion_pm_a" );
level.airburstbomb = loadfx( "fx/explosions/airburst" );
level.harriers = [];
level.fx_airstrike_afterburner = loadfx( "fx/fire/jet_afterburner" );
level.fx_airstrike_contrail = loadfx( "fx/smoke/jet_contrail" );
level.dangermaxradius["stealth_airstrike"] = 900;
level.dangerminradius["stealth_airstrike"] = 750;
level.dangerforwardpush["stealth_airstrike"] = 1;
level.dangerovalscale["stealth_airstrike"] = 6.0;
level.dangermaxradius["airstrike"] = 550;
level.dangerminradius["airstrike"] = 300;
level.dangerforwardpush["airstrike"] = 1.5;
level.dangerovalscale["airstrike"] = 6.0;
level.dangermaxradius["precision_airstrike"] = 550;
level.dangerminradius["precision_airstrike"] = 300;
level.dangerforwardpush["precision_airstrike"] = 2.0;
level.dangerovalscale["precision_airstrike"] = 6.0;
level.dangermaxradius["harrier_airstrike"] = 550;
level.dangerminradius["harrier_airstrike"] = 300;
level.dangerforwardpush["harrier_airstrike"] = 1.5;
level.dangerovalscale["harrier_airstrike"] = 6.0;
level.artillerydangercenters = [];
level.killstreakfuncs["airstrike"] = ::tryuseairstrike;
level.killstreakfuncs["precision_airstrike"] = ::tryuseairstrike;
level.killstreakfuncs["super_airstrike"] = ::tryuseairstrike;
level.killstreakfuncs["harrier_airstrike"] = ::tryuseairstrike;
level.killstreakfuncs["stealth_airstrike"] = ::tryuseairstrike;
level.planes = [];
}
tryuseairstrike( var_0, var_1 )
{
switch ( var_1 )
{
case "precision_airstrike":
break;
case "stealth_airstrike":
break;
case "harrier_airstrike":
if ( isdefined( level.harrier_incoming ) || level.harriers.size >= 1 )
{
self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
return 0;
}
break;
case "super_airstrike":
break;
}
var_2 = selectairstrikelocation( var_0, var_1 );
if ( !isdefined( var_2 ) || !var_2 )
return 0;
return 1;
}
doairstrike( var_0, var_1, var_2, var_3, var_4, var_5 )
{
if ( var_5 == "harrier_airstrike" )
level.harrier_incoming = 1;
if ( isdefined( level.airstrikeinprogress ) )
{
while ( isdefined( level.airstrikeinprogress ) )
level waittill( "begin_airstrike" );
level.airstrikeinprogress = 1;
wait 2.0;
}
if ( !isdefined( var_3 ) )
{
if ( var_5 == "harrier_airstrike" )
level.harrier_incoming = undefined;
return;
}
level.airstrikeinprogress = 1;
var_6 = bullettrace( var_1, var_1 + ( 0, 0, -1000000.0 ), 0, undefined );
var_7 = var_6["position"];
var_8 = spawnstruct();
var_8.origin = var_7;
var_8.forward = anglestoforward( ( 0, var_2, 0 ) );
var_8.streakname = var_5;
var_8.team = var_4;
level.artillerydangercenters[level.artillerydangercenters.size] = var_8;
callstrike( var_0, var_3, var_7, var_2, var_5 );
if ( var_5 == "harrier_airstrike" )
level.harrier_incoming = undefined;
wait 1.0;
level.airstrikeinprogress = undefined;
var_3 notify( "begin_airstrike" );
level notify( "begin_airstrike" );
wait 7.5;
var_9 = 0;
var_10 = [];
for ( var_11 = 0; var_11 < level.artillerydangercenters.size; var_11++ )
{
if ( !var_9 && level.artillerydangercenters[var_11].origin == var_7 )
{
var_9 = 1;
continue;
}
var_10[var_10.size] = level.artillerydangercenters[var_11];
}
level.artillerydangercenters = var_10;
}
clearprogress( var_0 )
{
wait 2.0;
level.airstrikeinprogress = undefined;
}
getairstrikedanger( var_0 )
{
var_1 = 0;
for ( var_2 = 0; var_2 < level.artillerydangercenters.size; var_2++ )
{
var_3 = level.artillerydangercenters[var_2].origin;
var_4 = level.artillerydangercenters[var_2].forward;
var_5 = level.artillerydangercenters[var_2].streakname;
var_1 = var_1 + getsingleairstrikedanger( var_0, var_3, var_4, var_5 );
}
return var_1;
}
getsingleairstrikedanger( var_0, var_1, var_2, var_3 )
{
var_4 = var_1 + level.dangerforwardpush[var_3] * level.dangermaxradius[var_3] * var_2;
var_5 = var_0 - var_4;
var_5 = ( var_5[0], var_5[1], 0 );
var_6 = vectordot( var_5, var_2 ) * var_2;
var_7 = var_5 - var_6;
var_8 = var_7 + var_6 / level.dangerovalscale[var_3];
var_9 = lengthsquared( var_8 );
if ( var_9 > level.dangermaxradius[var_3] * level.dangermaxradius[var_3] )
return 0;
if ( var_9 < level.dangerminradius[var_3] * level.dangerminradius[var_3] )
return 1;
var_10 = sqrt( var_9 );
var_11 = ( var_10 - level.dangerminradius[var_3] ) / ( level.dangermaxradius[var_3] - level.dangerminradius[var_3] );
return 1 - var_11;
}
pointisinairstrikearea( var_0, var_1, var_2, var_3 )
{
return distance2d( var_0, var_1 ) <= level.dangermaxradius[var_3] * 1.25;
}
losradiusdamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
var_7 = maps\mp\gametypes\_weapons::getdamageableents( var_0, var_1, 1 );
glassradiusdamage( var_0, var_1, var_2, var_3 );
for ( var_8 = 0; var_8 < var_7.size; var_8++ )
{
if ( var_7[var_8].entity == self )
continue;
var_9 = distance( var_0, var_7[var_8].damagecenter );
if ( var_7[var_8].isplayer || isdefined( var_7[var_8].issentry ) && var_7[var_8].issentry )
{
var_10 = !bullettracepassed( var_7[var_8].entity.origin, var_7[var_8].entity.origin + ( 0, 0, 130 ), 0, undefined );
if ( var_10 )
{
var_10 = !bullettracepassed( var_7[var_8].entity.origin + ( 0, 0, 130 ), var_0 + ( 0, 0, 114 ), 0, undefined );
if ( var_10 )
{
var_9 = var_9 * 4;
if ( var_9 > var_1 )
continue;
}
}
}
var_7[var_8].damage = int( var_2 + ( var_3 - var_2 ) * var_9 / var_1 );
var_7[var_8].pos = var_0;
var_7[var_8].damageowner = var_4;
var_7[var_8].einflictor = var_5;
level.airstrikedamagedents[level.airstrikedamagedentscount] = var_7[var_8];
level.airstrikedamagedentscount++;
}
thread airstrikedamageentsthread( var_6 );
}
airstrikedamageentsthread( var_0 )
{
self notify( "airstrikeDamageEntsThread" );
self endon( "airstrikeDamageEntsThread" );
while ( level.airstrikedamagedentsindex < level.airstrikedamagedentscount )
{
if ( !isdefined( level.airstrikedamagedents[level.airstrikedamagedentsindex] ) )
{
}
else
{
var_1 = level.airstrikedamagedents[level.airstrikedamagedentsindex];
if ( !isdefined( var_1.entity ) )
{
}
else if ( !var_1.isplayer || isalive( var_1.entity ) )
{
var_1 maps\mp\gametypes\_weapons::damageent( var_1.einflictor, var_1.damageowner, var_1.damage, "MOD_PROJECTILE_SPLASH", var_0, var_1.pos, vectornormalize( var_1.damagecenter - var_1.pos ) );
level.airstrikedamagedents[level.airstrikedamagedentsindex] = undefined;
if ( var_1.isplayer )
wait 0.05;
}
else
level.airstrikedamagedents[level.airstrikedamagedentsindex] = undefined;
}
level.airstrikedamagedentsindex++;
}
}
radiusartilleryshellshock( var_0, var_1, var_2, var_3, var_4 )
{
var_5 = level.players;
foreach ( var_7 in level.players )
{
if ( !isalive( var_7 ) )
continue;
if ( var_7.team == var_4 || var_7.team == "spectator" )
continue;
var_8 = var_7.origin + ( 0, 0, 32 );
var_9 = distance( var_0, var_8 );
if ( var_9 > var_1 )
continue;
var_10 = int( var_2 + ( var_3 - var_2 ) * var_9 / var_1 );
var_7 thread artilleryshellshock( "default", var_10 );
}
}
artilleryshellshock( var_0, var_1 )
{
self endon( "disconnect" );
if ( isdefined( self.beingartilleryshellshocked ) && self.beingartilleryshellshocked )
return;
self.beingartilleryshellshocked = 1;
self shellshock( var_0, var_1 );
wait( var_1 + 1 );
self.beingartilleryshellshocked = 0;
}
dobomberstrike( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
{
if ( !isdefined( var_1 ) )
return;
var_10 = 100;
var_11 = 150;
var_12 = var_4 + ( ( randomfloat( 2 ) - 1 ) * var_10, ( randomfloat( 2 ) - 1 ) * var_10, 4000 );
var_13 = var_5 + ( ( randomfloat( 2 ) - 1 ) * var_11, ( randomfloat( 2 ) - 1 ) * var_11, 4000 );
var_14 = spawnplane( var_1, "script_model", var_12, "compass_objpoint_b2_airstrike_friendly", "compass_objpoint_b2_airstrike_enemy" );
addplanetolist( var_14 );
var_14 thread handledeath();
var_14 playloopsound( "veh_b2_dist_loop" );
var_14 setmodel( "vehicle_b2_bomber" );
var_14 thread handleemp( var_1 );
var_14.lifeid = var_0;
var_14.angles = var_8;
var_15 = anglestoforward( var_8 );
var_14 moveto( var_13, var_7, 0, 0 );
thread stealthbomber_killcam( var_14, var_13, var_7, var_9 );
thread bomberdropbombs( var_14, var_3, var_1 );
var_14 endon( "death" );
wait( var_7 * 0.65 );
removeplanefromlist( var_14 );
var_14 notify( "delete" );
var_14 delete();
}
bomberdropbombs( var_0, var_1, var_2 )
{
var_0 endon( "death" );
while ( !targetisclose( var_0, var_1, 5000 ) )
wait 0.05;
var_3 = 1;
var_4 = 0;
var_0 notify( "start_bombing" );
var_5 = 0;
for ( var_6 = targetgetdist( var_0, var_1 ); var_6 < 5000; var_6 = targetgetdist( var_0, var_1 ) )
{
if ( var_6 < 1500 && !var_4 )
{
var_0 playsoundonmovingent( "veh_b2_sonic_boom" );
var_4 = 1;
}
if ( var_6 < 3000 && var_5 < 4 )
{
var_0 thread dropparachutebomb( var_0, var_2 );
var_5++;
wait( randomfloatrange( 0.15, 0.3 ) );
}
wait 0.1;
}
var_0 notify( "stop_bombing" );
}
dropparachutebomb( var_0, var_1 )
{
self endon( "stop_bombing" );
self endon( "death" );
var_2 = spawn( "script_model", self.origin );
var_2 setmodel( "parachute_cargo_static" );
var_2.team = var_1.team;
var_2.owner = var_1;
var_2 setcandamage( 1 );
var_3 = bullettrace( var_2.origin, var_2.origin - ( 0, 0, 20000 ), 0, var_2, 0, 0 );
var_4 = var_3["position"];
var_2 moveto( var_4, randomintrange( 8, 14 ) );
var_2 thread bombdamagewatcher( var_0, var_4 );
var_2 thread bombwatcher( var_0, var_4 );
}
bombdamagewatcher( var_0, var_1 )
{
var_2 = self;
self endon( "death" );
self setcandamage( 1 );
self.health = 999999;
self.maxhealth = 200;
self.damagetaken = 0;
for (;;)
{
self waittill( "damage", var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11, var_12 );
if ( !maps\mp\gametypes\_weapons::friendlyfirecheck( self.owner, var_4 ) )
continue;
if ( !isdefined( self ) )
return;
self.wasdamaged = 1;
self.damagetaken = self.damagetaken + var_3;
if ( isplayer( var_4 ) )
var_4 maps\mp\gametypes\_damagefeedback::updatedamagefeedback( "tactical_insertion" );
if ( self.damagetaken >= self.maxhealth )
{
radiusdamage( var_2.origin, 1024, 600, 65, var_2.owner, "MOD_EXPLOSIVE", "stealth_bomb_mp" );
playfx( level.airburstbomb, var_2.origin, anglestoforward( var_2.angles ), var_2.origin - var_1 );
if ( isdefined( var_2 ) )
var_2 delete();
self notify( "death" );
}
}
}
bombwatcher( var_0, var_1 )
{
var_2 = self;
var_2 endon( "death" );
while ( var_2.origin[2] > var_1[2] + 600 )
wait 0.1;
radiusdamage( var_1 + ( 0, 0, 64 ), 1024, 600, 65, var_0.owner, "MOD_EXPLOSIVE", "stealth_bomb_mp" );
playfx( level.airburstbomb, var_2.origin, anglestoforward( var_2.angles ), var_2.origin - var_1 );
var_2 delete();
}
playbombfx()
{
self endon( "stop_bombing" );
self endon( "death" );
for (;;)
{
playfxontag( level.stealthbombfx, self, "tag_left_alamo_missile" );
playfxontag( level.stealthbombfx, self, "tag_right_alamo_missile" );
wait 0.5;
}
}
stealthbomber_killcam( var_0, var_1, var_2, var_3 )
{
var_0 waittill( "start_bombing" );
var_4 = anglestoforward( var_0.angles );
var_5 = spawn( "script_model", var_0.origin + ( 0, 0, 100 ) - var_4 * 200 );
var_0.killcament = var_5;
var_0.killcament setscriptmoverkillcam( "airstrike" );
var_0.airstriketype = var_3;
var_5.starttime = gettime();
var_5 thread deleteaftertime( 15.0 );
var_5 linkto( var_0, "tag_origin", ( -256, 768, 768 ), ( 0, 0, 0 ) );
}
callstrike_bomb( var_0, var_1, var_2, var_3 )
{
if ( !isdefined( var_1 ) || var_1 maps\mp\_utility::iskillstreakdenied() )
{
self notify( "stop_bombing" );
return;
}
var_4 = 512;
var_5 = ( 0, randomint( 360 ), 0 );
var_6 = var_0 + anglestoforward( var_5 ) * randomfloat( var_4 );
var_7 = bullettrace( var_6, var_6 + ( 0, 0, -10000 ), 0, undefined );
var_6 = var_7["position"];
var_8 = distance( var_0, var_6 );
if ( var_8 > 5000 )
return;
wait( 0.85 * ( var_8 / 2000 ) );
if ( !isdefined( var_1 ) || var_1 maps\mp\_utility::iskillstreakdenied() )
{
self notify( "stop_bombing" );
return;
}
if ( var_3 )
{
playfx( level.mortareffect, var_6 );
level thread maps\mp\gametypes\_shellshock::stealthairstrike_earthquake( var_6 );
}
thread maps\mp\_utility::playsoundinspace( "exp_airstrike_bomb", var_6 );
radiusartilleryshellshock( var_6, 512, 8, 4, var_1.team );
losradiusdamage( var_6 + ( 0, 0, 16 ), 896, 300, 50, var_1, self, "stealth_bomb_mp" );
}
handleharrierairstrikeobjectiveicons()
{
self endon( "death" );
self.owner endon( "disconnect" );
wait 2;
maps\mp\killstreaks\_plane::setobjectiveicons( "hud_minimap_harrier_green", "hud_minimap_harrier_red" );
thread cleanupharrierairstrikeobjectiveicons();
}
cleanupharrierairstrikeobjectiveicons()
{
var_0 = self.friendlyteamid;
var_1 = self.enemyteamid;
common_scripts\utility::waittill_any_timeout( 3.5, "death" );
if ( isdefined( var_0 ) )
{
maps\mp\_utility::_objective_delete( var_0 );
maps\mp\_utility::_objective_delete( var_1 );
}
}
doplanestrike( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
{
if ( !isdefined( var_1 ) )
return;
var_10 = 100;
var_11 = 150;
var_12 = var_4 + ( ( randomfloat( 2 ) - 1 ) * var_10, ( randomfloat( 2 ) - 1 ) * var_10, 0 );
var_13 = var_5 + ( ( randomfloat( 2 ) - 1 ) * var_11, ( randomfloat( 2 ) - 1 ) * var_11, 0 );
var_14 = spawn( "script_model", var_12 );
var_14.owner = var_1;
var_14.origin = var_12;
var_14.angles = var_8;
var_14.team = var_1.team;
var_14 thread handledeath();
if ( var_9 == "harrier_airstrike" )
{
var_14 setmodel( "vehicle_av8b_harrier_jet_mp" );
var_14 playloopsound( "harrier_fly_in" );
}
else
{
var_14 setmodel( "vehicle_a10_warthog_iw6_mp" );
var_14 playloopsound( "veh_mig29_dist_loop" );
}
var_14 thread handleemp( var_1 );
var_14.lifeid = var_0;
var_14.angles = var_8;
var_15 = anglestoforward( var_8 );
var_14 thread playplanefx();
var_14 moveto( var_13, var_7, 0, 0 );
if ( var_9 == "harrier_airstrike" )
var_14 thread handleharrierairstrikeobjectiveicons();
thread callstrike_bombeffect( var_14, var_13, var_7, var_6 - 1.0, var_1, var_2, var_9 );
wait( var_6 - 0.75 );
var_14 scriptmodelplayanimdeltamotion( "airstrike_mp_roll" );
var_14 endon( "death" );
wait( var_7 - var_6 );
removeplanefromlist( var_14 );
var_14 notify( "delete" );
var_14 delete();
}
handledeath()
{
level endon( "game_ended" );
self endon( "delete" );
self waittill( "death" );
var_0 = anglestoforward( self.angles ) * 200;
playfx( level.harrier_deathfx, self.origin, var_0 );
removeplanefromlist( self );
self delete();
}
addplanetolist( var_0 )
{
level.planes[level.planes.size] = var_0;
}
removeplanefromlist( var_0 )
{
for ( var_1 = 0; var_1 < level.planes.size; var_1++ )
{
if ( isdefined( level.planes[var_1] ) && level.planes[var_1] == var_0 )
level.planes[var_1] = undefined;
}
}
callstrike_bombeffect( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
var_0 endon( "death" );
wait( var_3 );
if ( !isdefined( var_4 ) || var_4 maps\mp\_utility::iskillstreakdenied() )
return;
if ( var_6 == "harrier_airstrike" )
var_0 playsoundonmovingent( "harrier_sonic_boom" );
else
var_0 playsoundonmovingent( "veh_mig29_sonic_boom" );
var_7 = anglestoforward( var_0.angles );
var_8 = spawnbomb( var_0.origin, var_0.angles );
var_8 movegravity( anglestoforward( var_0.angles ) * 4666.67, 3.0 );
var_8.lifeid = var_5;
var_9 = spawn( "script_model", var_0.origin + ( 0, 0, 100 ) - var_7 * 200 );
var_8.killcament = var_9;
var_8.killcament setscriptmoverkillcam( "airstrike" );
var_8.airstriketype = var_6;
var_9.starttime = gettime();
var_9 thread deleteaftertime( 15.0 );
var_9.angles = var_7;
var_9 moveto( var_1 + ( 0, 0, 100 ), var_2, 0, 0 );
wait 0.4;
var_9 moveto( var_9.origin + var_7 * 4000, 1, 0, 0 );
wait 0.45;
var_9 moveto( var_9.origin + ( var_7 + ( 0, 0, -0.2 ) ) * 3500, 2, 0, 0 );
wait 0.15;
var_10 = spawn( "script_model", var_8.origin );
var_10 setmodel( "tag_origin" );
var_10.origin = var_8.origin;
var_10.angles = var_8.angles;
var_8 setmodel( "tag_origin" );
wait 0.1;
var_11 = var_10.origin;
var_12 = var_10.angles;
if ( level.splitscreen )
playfxontag( level.airstrikessfx, var_10, "tag_origin" );
else
playfxontag( level.airstrikefx, var_10, "tag_origin" );
wait 0.05;
var_9 moveto( var_9.origin + ( var_7 + ( 0, 0, -0.25 ) ) * 2500, 2, 0, 0 );
wait 0.25;
var_9 moveto( var_9.origin + ( var_7 + ( 0, 0, -0.35 ) ) * 2000, 2, 0, 0 );
wait 0.2;
var_9 moveto( var_9.origin + ( var_7 + ( 0, 0, -0.45 ) ) * 1500, 2, 0, 0 );
wait 0.5;
var_13 = 12;
var_14 = 5;
var_15 = 55;
var_16 = ( var_15 - var_14 ) / var_13;
var_17 = ( 0, 0, 0 );
for ( var_18 = 0; var_18 < var_13; var_18++ )
{
var_19 = anglestoforward( var_12 + ( var_15 - var_16 * var_18, randomint( 10 ) - 5, 0 ) );
var_20 = var_11 + var_19 * 10000;
var_21 = bullettrace( var_11, var_20, 0, undefined );
var_22 = var_21["position"];
var_17 = var_17 + var_22;
playfx( level.airstrikeexplosion, var_22 );
thread losradiusdamage( var_22 + ( 0, 0, 16 ), 512, 200, 30, var_4, var_8, "artillery_mp" );
if ( var_18 % 3 == 0 )
{
thread maps\mp\_utility::playsoundinspace( "exp_airstrike_bomb", var_22 );
level thread maps\mp\gametypes\_shellshock::airstrike_earthquake( var_22 );
}
wait 0.05;
}
var_17 = var_17 / var_13 + ( 0, 0, 128 );
var_9 moveto( var_8.killcament.origin * 0.35 + var_17 * 0.65, 1.5, 0, 0.5 );
wait 5.0;
var_10 delete();
var_8 delete();
}
spawnbomb( var_0, var_1 )
{
var_2 = spawn( "script_model", var_0 );
var_2.angles = var_1;
var_2 setmodel( "projectile_cbu97_clusterbomb" );
return var_2;
}
deleteaftertime( var_0 )
{
self endon( "death" );
wait 10.0;
self delete();
}
playplanefx()
{
self endon( "death" );
wait 0.5;
playfxontag( level.fx_airstrike_afterburner, self, "tag_engine_right" );
wait 0.5;
playfxontag( level.fx_airstrike_afterburner, self, "tag_engine_left" );
wait 0.5;
playfxontag( level.fx_airstrike_contrail, self, "tag_right_wingtip" );
wait 0.5;
playfxontag( level.fx_airstrike_contrail, self, "tag_left_wingtip" );
}
callstrike( var_0, var_1, var_2, var_3, var_4 )
{
var_5 = undefined;
var_6 = 0;
var_7 = ( 0, var_3, 0 );
var_5 = getent( "airstrikeheight", "targetname" );
if ( var_4 == "stealth_airstrike" )
{
thread maps\mp\_utility::teamplayercardsplash( "used_stealth_airstrike", var_1, var_1.team );
var_8 = 12000;
var_9 = 4000;
if ( !isdefined( var_5 ) )
{
var_10 = 950;
var_6 = 1500;
if ( isdefined( level.airstrikeheightscale ) )
var_10 = var_10 * level.airstrikeheightscale;
}
else
{
var_10 = var_5.origin[2];
if ( getdvar( "mapname" ) == "mp_exchange" )
var_10 = var_10 + 1024;
var_6 = getexplodedistance( var_10 );
}
}
else
{
if ( var_4 == "harrier_airstrike" )
thread maps\mp\_utility::teamplayercardsplash( "used_harrier", var_1 );
var_8 = 24000;
var_9 = 7000;
if ( !isdefined( var_5 ) )
{
var_10 = 850;
var_6 = 1500;
if ( isdefined( level.airstrikeheightscale ) )
var_10 = var_10 * level.airstrikeheightscale;
}
else
{
var_10 = var_5.origin[2];
var_6 = getexplodedistance( var_10 );
}
}
var_1 endon( "disconnect" );
var_11 = var_0;
level.airstrikedamagedents = [];
level.airstrikedamagedentscount = 0;
level.airstrikedamagedentsindex = 0;
if ( var_4 == "harrier_airstrike" )
{
var_12 = getflightpath( var_2, var_7, var_8, var_5, var_10, var_9, var_6, var_4 );
level thread doplanestrike( var_0, var_1, var_11, var_2, var_12["startPoint"] + ( 0, 0, randomint( 500 ) ), var_12["endPoint"] + ( 0, 0, randomint( 500 ) ), var_12["bombTime"], var_12["flyTime"], var_7, var_4 );
wait( randomfloatrange( 1.5, 2.5 ) );
maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
level thread doplanestrike( var_0, var_1, var_11, var_2, var_12["startPoint"] + ( 0, 0, randomint( 200 ) ), var_12["endPoint"] + ( 0, 0, randomint( 200 ) ), var_12["bombTime"], var_12["flyTime"], var_7, var_4 );
wait( randomfloatrange( 1.5, 2.5 ) );
maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
level thread doplanestrike( var_0, var_1, var_11, var_2, var_12["startPoint"] + ( 0, 0, randomint( 200 ) ), var_12["endPoint"] + ( 0, 0, randomint( 200 ) ), var_12["bombTime"], var_12["flyTime"], var_7, var_4 );
wait( randomfloatrange( 1.5, 2.5 ) );
maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
var_13 = maps\mp\killstreaks\_harrier::beginharrier( var_0, var_12["startPoint"], var_2 );
var_1 thread maps\mp\killstreaks\_harrier::defendlocation( var_13 );
}
else if ( var_4 == "stealth_airstrike" )
{
var_12 = getflightpath( var_2, var_7, var_8, var_5, var_10, var_9, var_6, var_4 );
level thread dobomberstrike( var_0, var_1, var_11, var_2, var_12["startPoint"] + ( 0, 0, randomint( 1000 ) ), var_12["endPoint"] + ( 0, 0, randomint( 1000 ) ), var_12["bombTime"], var_12["flyTime"], var_7, var_4 );
}
else
{
var_12 = getflightpath( var_2, var_7, var_8, var_5, var_10, var_9, var_6, var_4 );
level thread doplanestrike( var_0, var_1, var_11, var_2, var_12["startPoint"] + ( 0, 0, randomint( 500 ) ), var_12["endPoint"] + ( 0, 0, randomint( 500 ) ), var_12["bombTime"], var_12["flyTime"], var_7, var_4 );
wait( randomfloatrange( 1.5, 2.5 ) );
maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
level thread doplanestrike( var_0, var_1, var_11, var_2, var_12["startPoint"] + ( 0, 0, randomint( 200 ) ), var_12["endPoint"] + ( 0, 0, randomint( 200 ) ), var_12["bombTime"], var_12["flyTime"], var_7, var_4 );
wait( randomfloatrange( 1.5, 2.5 ) );
maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
level thread doplanestrike( var_0, var_1, var_11, var_2, var_12["startPoint"] + ( 0, 0, randomint( 200 ) ), var_12["endPoint"] + ( 0, 0, randomint( 200 ) ), var_12["bombTime"], var_12["flyTime"], var_7, var_4 );
if ( var_4 == "super_airstrike" )
{
wait( randomfloatrange( 2.5, 3.5 ) );
maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
level thread doplanestrike( var_0, var_1, var_11, var_2, var_12["startPoint"] + ( 0, 0, randomint( 200 ) ), var_12["endPoint"] + ( 0, 0, randomint( 200 ) ), var_12["bombTime"], var_12["flyTime"], var_7, var_4 );
}
}
}
getflightpath( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7 )
{
var_8 = var_0 + anglestoforward( var_1 ) * ( -1 * var_2 );
if ( isdefined( var_3 ) )
var_8 = var_8 * ( 1, 1, 0 );
var_8 = var_8 + ( 0, 0, var_4 );
if ( var_7 == "stealth_airstrike" )
var_9 = var_0 + anglestoforward( var_1 ) * ( var_2 * 4 );
else
var_9 = var_0 + anglestoforward( var_1 ) * var_2;
if ( isdefined( var_3 ) )
var_9 = var_9 * ( 1, 1, 0 );
var_9 = var_9 + ( 0, 0, var_4 );
var_10 = length( var_8 - var_9 );
var_11 = var_10 / var_5;
var_10 = abs( var_10 / 2 + var_6 );
var_12 = var_10 / var_5;
var_13["startPoint"] = var_8;
var_13["endPoint"] = var_9;
var_13["bombTime"] = var_12;
var_13["flyTime"] = var_11;
return var_13;
}
getexplodedistance( var_0 )
{
var_1 = 850;
var_2 = 1500;
var_3 = var_1 / var_0;
var_4 = var_3 * var_2;
return var_4;
}
targetgetdist( var_0, var_1 )
{
var_2 = targetisinfront( var_0, var_1 );
if ( var_2 )
var_3 = 1;
else
var_3 = -1;
var_4 = common_scripts\utility::flat_origin( var_0.origin );
var_5 = var_4 + anglestoforward( common_scripts\utility::flat_angle( var_0.angles ) ) * ( var_3 * 100000 );
var_6 = pointonsegmentnearesttopoint( var_4, var_5, var_1 );
var_7 = distance( var_4, var_6 );
return var_7;
}
targetisclose( var_0, var_1, var_2 )
{
if ( !isdefined( var_2 ) )
var_2 = 3000;
var_3 = targetisinfront( var_0, var_1 );
if ( var_3 )
var_4 = 1;
else
var_4 = -1;
var_5 = common_scripts\utility::flat_origin( var_0.origin );
var_6 = var_5 + anglestoforward( common_scripts\utility::flat_angle( var_0.angles ) ) * ( var_4 * 100000 );
var_7 = pointonsegmentnearesttopoint( var_5, var_6, var_1 );
var_8 = distance( var_5, var_7 );
if ( var_8 < var_2 )
return 1;
else
return 0;
}
targetisinfront( var_0, var_1 )
{
var_2 = anglestoforward( common_scripts\utility::flat_angle( var_0.angles ) );
var_3 = vectornormalize( common_scripts\utility::flat_origin( var_1 ) - var_0.origin );
var_4 = vectordot( var_2, var_3 );
if ( var_4 > 0 )
return 1;
else
return 0;
}
waitforairstrikecancel()
{
self waittill( "cancel_location" );
self setblurforplayer( 0, 0.3 );
}
selectairstrikelocation( var_0, var_1 )
{
var_2 = level.mapsize / 6.46875;
if ( level.splitscreen )
var_2 = var_2 * 1.5;
var_3 = 0;
switch ( var_1 )
{
case "precision_airstrike":
var_3 = 1;
self playlocalsound( game["voice"][self.team] + "KS_hqr_airstrike" );
break;
case "stealth_airstrike":
var_3 = 1;
self playlocalsound( game["voice"][self.team] + "KS_hqr_bomber" );
break;
}
if ( var_1 != "harrier_airstrike" )
{
maps\mp\_utility::_beginlocationselection( var_1, "map_artillery_selector", var_3, var_2 );
self endon( "stop_location_selection" );
self waittill( "confirm_location", var_4, var_5 );
}
else
{
var_6 = [];
foreach ( var_8 in level.players )
{
if ( !isdefined( var_8 ) )
continue;
if ( !isdefined( var_8.team ) )
continue;
if ( var_8.team == self.team )
continue;
var_6[var_6.size] = var_8.origin;
}
if ( var_6.size )
var_10 = averagepoint( var_6 );
else
var_10 = ( 0, 0, 0 );
var_4 = var_10;
var_5 = randomint( 360 );
}
if ( !var_3 )
var_5 = randomint( 360 );
self setblurforplayer( 0, 0.3 );
if ( var_1 == "harrier_airstrike" && ( isdefined( level.harrier_incoming ) || level.harriers.size > 1 ) )
{
self notify( "cancel_location" );
self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
return 0;
}
thread airstrikemadeselectionvo( var_1 );
maps\mp\_matchdata::logkillstreakevent( var_1, var_4 );
thread finishairstrikeusage( var_0, var_4, var_5, var_1 );
return 1;
}
finishairstrikeusage( var_0, var_1, var_2, var_3 )
{
self notify( "used" );
var_4 = bullettrace( level.mapcenter + ( 0, 0, 1000000.0 ), level.mapcenter, 0, undefined );
var_1 = ( var_1[0], var_1[1], var_4["position"][2] - 514 );
thread doairstrike( var_0, var_1, var_2, self, self.pers["team"], var_3 );
}
useairstrike( var_0, var_1, var_2 )
{
}
handleemp( var_0 )
{
self endon( "death" );
if ( var_0 maps\mp\_utility::isemped() )
{
self notify( "death" );
return;
}
for (;;)
{
level waittill( "emp_update" );
if ( !var_0 maps\mp\_utility::isemped() )
continue;
self notify( "death" );
}
}
airstrikemadeselectionvo( var_0 )
{
self endon( "death" );
self endon( "disconnect" );
switch ( var_0 )
{
case "precision_airstrike":
self playlocalsound( game["voice"][self.team] + "KS_ast_inbound" );
break;
case "stealth_airstrike":
self playlocalsound( game["voice"][self.team] + "KS_bmb_inbound" );
break;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,116 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.killstreakfuncs["auto_shotgun"] = ::tryuseautoshotgun;
level.killstreaksetupfuncs["auto_shotgun"] = ::shotgunsetup;
level.killstreakfuncs["thumper"] = ::tryusethumper;
level.killstreaksetupfuncs["thumper"] = ::thumpersetup;
thread onplayerconnect();
}
shotgunsetup()
{
self givemaxammo( "aa12_mp" );
thread saveweaponammoondeath( "aa12_mp" );
}
tryuseautoshotgun( var_0 )
{
thread removeweapononoutofammo( "aa12_mp" );
return 1;
}
thumpersetup()
{
self givemaxammo( "m79_mp" );
thread saveweaponammoondeath( "m79_mp" );
}
tryusethumper()
{
thread removeweapononoutofammo( "m79_mp" );
return 1;
}
onplayerconnect()
{
for (;;)
{
level waittill( "connected", var_0 );
var_0 thread onplayerspawned();
}
}
onplayerspawned()
{
self endon( "disconnect" );
for (;;)
{
self waittill( "spawned_player" );
if ( !isdefined( self.pers["ksWeapon_clip_ammo"] ) || !isdefined( self.pers["ksWeapon_name"] ) )
continue;
var_0 = self.pers["ksWeapon_name"];
if ( isdefined( self.pers["killstreak"] ) && maps\mp\_utility::getkillstreakweapon( self.pers["killstreak"] ) != var_0 )
{
self.pers["ksWeapon_name"] = undefined;
self.pers["ksWeapon_clip_ammo"] = undefined;
self.pers["ksWeapon_stock_ammo"] = undefined;
continue;
}
maps\mp\killstreaks\_killstreaks::givekillstreakweapon( var_0 );
self setweaponammostock( var_0, self.pers["ksWeapon_stock_ammo"] );
self setweaponammoclip( var_0, self.pers["ksWeapon_clip_ammo"] );
thread removeweapononoutofammo( var_0 );
thread saveweaponammoondeath( var_0 );
}
}
saveweaponammoondeath( var_0 )
{
self endon( "disconnect" );
self endon( "got_killstreak" );
self notify( "saveWeaponAmmoOnDeath" );
self endon( "saveWeaponAmmoOnDeath" );
self.pers["ksWeapon_name"] = undefined;
self.pers["ksWeapon_clip_ammo"] = undefined;
self.pers["ksWeapon_stock_ammo"] = undefined;
self waittill( "death" );
if ( !self hasweapon( var_0 ) )
return;
self.pers["ksWeapon_name"] = var_0;
self.pers["ksWeapon_clip_ammo"] = self getweaponammoclip( var_0 );
self.pers["ksWeapon_stock_ammo"] = self getweaponammostock( var_0 );
}
removeweapononoutofammo( var_0 )
{
self endon( "disconnect" );
self endon( "death" );
self notify( var_0 + "_ammo_monitor" );
self endon( var_0 + "_ammo_monitor" );
for (;;)
{
self waittill( "end_firing" );
if ( self getcurrentweapon() != var_0 )
continue;
var_1 = self getweaponammoclip( var_0 ) + self getweaponammostock( var_0 );
if ( var_1 )
continue;
self takeweapon( var_0 );
return;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,691 @@
// 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 );
}

View File

@ -0,0 +1,153 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
var_0 = spawnstruct();
var_0.weaponinfo = "deployable_vest_marker_mp";
var_0.modelbase = "mil_ammo_case_1_open";
var_0.hintstring = &"KILLSTREAKS_HINTS_DEPLOYABLE_AMMO_USE";
var_0.capturingstring = &"KILLSTREAKS_DEPLOYABLE_AMMO_TAKING";
var_0.event = "deployable_ammo_taken";
var_0.streakname = "deployable_ammo";
var_0.splashname = "used_deployable_ammo";
var_0.shadername = "compass_objpoint_deploy_ammo_friendly";
var_0.headiconoffset = 25;
var_0.lifespan = 90.0;
var_0.usexp = 50;
var_0.xppopup = "destroyed_vest";
var_0.vodestroyed = "ballistic_vest_destroyed";
var_0.deployedsfx = "mp_vest_deployed_ui";
var_0.onusesfx = "ammo_crate_use";
var_0.onusecallback = ::onusedeployable;
var_0.canusecallback = ::canusedeployable;
var_0.usetime = 500;
var_0.maxhealth = 150;
var_0.damagefeedback = "deployable_bag";
var_0.deathweaponinfo = "deployable_ammo_mp";
var_0.deathvfx = loadfx( "fx/explosions/clusterbomb_exp_direct_runner" );
var_0.deathdamageradius = 256;
var_0.deathdamagemax = 130;
var_0.deathdamagemin = 50;
var_0.allowmeleedamage = 1;
var_0.allowgrenadedamage = 1;
var_0.maxuses = 4;
level.boxsettings["deployable_ammo"] = var_0;
level.killstreakfuncs["deployable_ammo"] = ::tryusedeployableammo;
level.deployable_box["deployable_ammo"] = [];
}
tryusedeployableammo( var_0, var_1 )
{
var_2 = maps\mp\killstreaks\_deployablebox::begindeployableviamarker( var_0, "deployable_ammo" );
if ( !isdefined( var_2 ) || !var_2 )
return 0;
if ( !maps\mp\_utility::is_aliens() )
maps\mp\_matchdata::logkillstreakevent( "deployable_ammo", self.origin );
return 1;
}
onusedeployable( var_0 )
{
if ( maps\mp\_utility::is_aliens() )
addalienweaponammo( var_0 );
else
addallweaponammo();
}
addallweaponammo()
{
var_0 = self getweaponslistall();
if ( isdefined( var_0 ) )
{
foreach ( var_2 in var_0 )
{
if ( maps\mp\gametypes\_weapons::isbulletweapon( var_2 ) )
{
addoneweaponammo( var_2, 2 );
continue;
}
if ( weaponclass( var_2 ) == "rocketlauncher" )
addoneweaponammo( var_2, 1 );
}
}
}
addoneweaponammo( var_0, var_1 )
{
var_2 = weaponclipsize( var_0 );
var_3 = self getweaponammostock( var_0 );
self setweaponammostock( var_0, var_3 + var_1 * var_2 );
}
addratiomaxstocktoallweapons( var_0 )
{
var_1 = self getweaponslistprimaries();
foreach ( var_3 in var_1 )
{
if ( maps\mp\gametypes\_weapons::isbulletweapon( var_3 ) )
{
if ( var_3 != "iw6_alienminigun_mp" )
{
var_4 = self getweaponammostock( var_3 );
var_5 = weaponmaxammo( var_3 );
var_6 = var_4 + var_5 * var_0;
self setweaponammostock( var_3, int( min( var_6, var_5 ) ) );
}
}
}
}
addfullcliptoallweapons()
{
var_0 = self getweaponslistprimaries();
foreach ( var_2 in var_0 )
{
var_3 = weaponclipsize( var_2 );
self setweaponammoclip( var_2, var_3 );
}
}
addalienweaponammo( var_0 )
{
var_1 = self getweaponslistprimaries();
switch ( var_0.upgrade_rank )
{
case 0:
addratiomaxstocktoallweapons( 0.4 );
break;
case 1:
addratiomaxstocktoallweapons( 0.7 );
break;
case 2:
addratiomaxstocktoallweapons( 1.0 );
break;
case 3:
addratiomaxstocktoallweapons( 1.0 );
addfullcliptoallweapons();
break;
case 4:
addratiomaxstocktoallweapons( 1.0 );
addfullcliptoallweapons();
break;
}
}
canusedeployable( var_0 )
{
if ( maps\mp\_utility::is_aliens() && isdefined( var_0 ) && var_0.owner == self && !isdefined( var_0.air_dropped ) )
return 0;
if ( !maps\mp\_utility::is_aliens() )
return !maps\mp\_utility::isjuggernaut();
else
return 1;
}

View File

@ -0,0 +1,79 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
var_0 = spawnstruct();
var_0.weaponinfo = "deployable_vest_marker_mp";
var_0.modelbase = "afr_mortar_ammo_01";
var_0.hintstring = &"KILLSTREAKS_HINTS_DEPLOYABLE_GRENADES_PICKUP";
var_0.capturingstring = &"KILLSTREAKS_DEPLOYABLE_GRENADES_TAKING";
var_0.event = "deployable_grenades_taken";
var_0.streakname = "deployable_grenades";
var_0.splashname = "used_deployable_grenades";
var_0.shadername = "compass_objpoint_deploy_grenades_friendly";
var_0.headiconoffset = 25;
var_0.lifespan = 90.0;
var_0.usexp = 50;
var_0.xppopup = "destroyed_vest";
var_0.vodestroyed = "ballistic_vest_destroyed";
var_0.deployedsfx = "mp_vest_deployed_ui";
var_0.onusesfx = "ammo_crate_use";
var_0.onusecallback = ::onusedeployable;
var_0.canusecallback = ::canusedeployable;
var_0.usetime = 500;
var_0.maxhealth = 150;
var_0.damagefeedback = "deployable_bag";
var_0.deathweaponinfo = "deployable_grenades_mp";
var_0.deathvfx = loadfx( "fx/explosions/grenadeexp_default" );
var_0.deathdamageradius = 256;
var_0.deathdamagemax = 150;
var_0.deathdamagemin = 50;
var_0.allowmeleedamage = 1;
var_0.allowgrenadedamage = 1;
var_0.maxuses = 3;
level.boxsettings["deployable_grenades"] = var_0;
level.killstreakfuncs["deployable_grenades"] = ::tryusedeployablegrenades;
level.deployable_box["deployable_grenades"] = [];
}
tryusedeployablegrenades( var_0, var_1 )
{
var_2 = maps\mp\killstreaks\_deployablebox::begindeployableviamarker( var_0, "deployable_grenades" );
if ( !isdefined( var_2 ) || !var_2 )
return 0;
maps\mp\_matchdata::logkillstreakevent( "deployable_grenades", self.origin );
return 1;
}
onusedeployable( var_0 )
{
refillexplosiveweapons();
}
refillexplosiveweapons()
{
var_0 = self getweaponslistall();
if ( isdefined( var_0 ) )
{
foreach ( var_2 in var_0 )
{
if ( maps\mp\gametypes\_weapons::isgrenade( var_2 ) || maps\mp\gametypes\_weapons::isoffhandweapon( var_2 ) )
self givestartammo( var_2 );
}
}
if ( maps\mp\_utility::_hasperk( "specialty_tacticalinsertion" ) && self getammocount( "flare_mp" ) < 1 )
maps\mp\_utility::giveperkoffhand( "specialty_tacticalinsertion", 0 );
}
canusedeployable( var_0 )
{
if ( maps\mp\_utility::is_aliens() && isdefined( var_0 ) && var_0.owner == self && !isdefined( var_0.air_dropped ) )
return 0;
return !maps\mp\_utility::isjuggernaut();
}

View File

@ -0,0 +1,203 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
var_0 = spawnstruct();
var_0.id = "deployable_weapon_crate";
var_0.weaponinfo = "deployable_weapon_crate_marker_mp";
var_0.modelbase = "mp_weapon_crate";
var_0.modelbombsquad = "mp_weapon_crate_bombsquad";
var_0.hintstring = &"KILLSTREAKS_HINTS_DEPLOYABLE_AMMO_USE";
var_0.capturingstring = &"KILLSTREAKS_DEPLOYABLE_AMMO_TAKING";
var_0.event = "deployable_ammo_taken";
var_0.streakname = "deployable_ammo";
var_0.splashname = "used_deployable_ammo";
var_0.shadername = "compass_objpoint_deploy_ammo_friendly";
var_0.headiconoffset = 20;
var_0.lifespan = 90.0;
var_0.vogone = "ammocrate_gone";
var_0.usexp = 50;
var_0.xppopup = "destroyed_ammo";
var_0.vodestroyed = "ammocrate_destroyed";
var_0.deployedsfx = "mp_vest_deployed_ui";
var_0.onusesfx = "ammo_crate_use";
var_0.onusecallback = ::onusedeployable;
var_0.canusecallback = ::canusedeployable;
var_0.nousekillstreak = 1;
var_0.usetime = 1000;
var_0.maxhealth = 150;
var_0.damagefeedback = "deployable_bag";
var_0.deathvfx = loadfx( "vfx/gameplay/mp/killstreaks/vfx_ballistic_vest_death" );
var_0.allowmeleedamage = 1;
var_0.allowgrenadedamage = 0;
var_0.maxuses = 4;
var_0.minigunchance = 20;
var_0.minigunweapon = "iw6_minigun_mp";
var_0.ammorestockcheckfreq = 0.5;
var_0.ammorestocktime = 10.0;
var_0.triggerradius = 200;
var_0.triggerheight = 64;
var_0.ondeploycallback = ::onboxdeployed;
var_0.canuseotherboxes = 0;
level.boxsettings["deployable_ammo"] = var_0;
level.killstreakfuncs["deployable_ammo"] = ::tryusedeployable;
level.deployablegunbox_bonusinxuses = randomintrange( 1, var_0.minigunchance + 1 );
level.deployable_box["deployable_ammo"] = [];
maps\mp\gametypes\sotf::definechestweapons();
}
tryusedeployable( var_0, var_1 )
{
var_2 = maps\mp\killstreaks\_deployablebox::begindeployableviamarker( var_0, "deployable_ammo" );
if ( !isdefined( var_2 ) || !var_2 )
return 0;
if ( !maps\mp\_utility::is_aliens() )
maps\mp\_matchdata::logkillstreakevent( "deployable_ammo", self.origin );
return 1;
}
onusedeployable( var_0 )
{
level.deployablegunbox_bonusinxuses--;
if ( level.deployablegunbox_bonusinxuses == 0 )
{
var_1 = level.boxsettings[var_0.boxtype];
if ( isdefined( level.deployableboxgiveweaponfunc ) )
[[ level.deployableboxgiveweaponfunc ]]( 1 );
else
givegun( self, var_1.minigunweapon );
maps\mp\gametypes\_missions::processchallenge( "ch_guninabox" );
level.deployablegunbox_bonusinxuses = randomintrange( var_1.minigunchance, var_1.minigunchance + 1 );
}
else
giverandomgun( self );
}
onboxdeployed( var_0 )
{
thread restockammoaura( var_0 );
}
giverandomgun( var_0 )
{
var_1 = [];
foreach ( var_3 in var_0 getweaponslistprimaries() )
var_1[var_1.size] = getweaponbasename( var_3 );
var_5 = undefined;
for (;;)
{
var_5 = maps\mp\gametypes\sotf::getrandomweapon( level.weaponarray );
var_6 = var_5["name"];
if ( !common_scripts\utility::array_contains( var_1, var_6 ) )
break;
}
var_5 = maps\mp\gametypes\sotf::getrandomattachments( var_5 );
givegun( var_0, var_5 );
}
givegun( var_0, var_1 )
{
var_2 = var_0 getweaponslistprimaries();
var_3 = 0;
foreach ( var_5 in var_2 )
{
if ( !maps\mp\gametypes\_weapons::isaltmodeweapon( var_5 ) )
var_3++;
}
if ( var_3 > 1 )
{
var_7 = var_0.lastdroppableweapon;
if ( isdefined( var_7 ) && var_7 != "none" )
var_0 dropitem( var_7 );
}
var_0 maps\mp\_utility::_giveweapon( var_1 );
var_0 switchtoweapon( var_1 );
var_0 givestartammo( var_1 );
}
restockammoaura( var_0 )
{
self endon( "death" );
level endon( "game_eneded" );
var_1 = spawn( "trigger_radius", self.origin, 0, var_0.triggerradius, var_0.triggerheight );
var_1.owner = self;
thread maps\mp\gametypes\_weapons::deleteondeath( var_1 );
if ( isdefined( self.moving_platform ) )
{
var_1 enablelinkto();
var_1 linkto( self.moving_platform );
}
var_2 = var_0.triggerradius * var_0.triggerradius;
var_3 = undefined;
for (;;)
{
var_4 = var_1 getistouchingentities( level.players );
foreach ( var_3 in var_4 )
{
if ( isdefined( var_3 ) && !self.owner maps\mp\_utility::isenemy( var_3 ) && shouldaddammo( var_3 ) )
addammo( var_3, var_0.ammorestocktime );
}
wait( var_0.ammorestockcheckfreq );
}
}
shouldaddammo( var_0 )
{
return !isdefined( var_0.deployablegunnextammotime ) || gettime() >= var_0.deployablegunnextammotime;
}
addammo( var_0, var_1 )
{
var_0.deployablegunnextammotime = gettime() + var_1 * 1000;
maps\mp\gametypes\_weapons::scavengergiveammo( var_0 );
var_0 maps\mp\gametypes\_damagefeedback::hudicontype( "boxofguns" );
}
addammoovertime( var_0, var_1, var_2 )
{
self endon( "death" );
var_0 endon( "death" );
var_0 endon( "disconnect" );
level endon( "game_ended" );
for (;;)
{
addammo( var_0 );
wait( var_2 );
if ( distancesquared( var_0.origin, self.origin ) > var_1 )
break;
}
}
canusedeployable( var_0 )
{
if ( maps\mp\_utility::is_aliens() && isdefined( var_0 ) && var_0.owner == self && !isdefined( var_0.air_dropped ) )
return 0;
if ( !maps\mp\_utility::is_aliens() )
return !maps\mp\_utility::isjuggernaut();
else
return 1;
}

View File

@ -0,0 +1,64 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
var_0 = spawnstruct();
var_0.weaponinfo = "deployable_vest_marker_mp";
var_0.modelbase = "afr_mortar_ammo_01";
var_0.hintstring = &"KILLSTREAKS_HINTS_DEPLOYABLE_JUICEBOX_PICKUP";
var_0.capturingstring = &"KILLSTREAKS_DEPLOYABLE_JUICEBOX_TAKING";
var_0.event = "deployable_juicebox_taken";
var_0.streakname = "deployable_juicebox";
var_0.splashname = "used_deployable_juicebox";
var_0.shadername = "compass_objpoint_deploy_juiced_friendly";
var_0.headiconoffset = 25;
var_0.lifespan = 90.0;
var_0.usexp = 50;
var_0.xppopup = "destroyed_vest";
var_0.vodestroyed = "ballistic_vest_destroyed";
var_0.deployedsfx = "mp_vest_deployed_ui";
var_0.onusesfx = "ammo_crate_use";
var_0.onusecallback = ::onusedeployable;
var_0.canusecallback = ::canusedeployable;
var_0.usetime = 500;
var_0.maxhealth = 300;
var_0.damagefeedback = "deployable_bag";
var_0.deathweaponinfo = "deployable_ammo_mp";
var_0.deathvfx = loadfx( "vfx/gameplay/mp/killstreaks/vfx_ballistic_vest_death" );
var_0.allowmeleedamage = 1;
var_0.allowgrenadedamage = 0;
var_0.maxuses = 4;
level.boxsettings["deployable_juicebox"] = var_0;
level.killstreakfuncs["deployable_juicebox"] = ::tryusedeployablejuiced;
level.deployable_box["deployable_juicebox"] = [];
}
tryusedeployablejuiced( var_0, var_1 )
{
var_2 = maps\mp\killstreaks\_deployablebox::begindeployableviamarker( var_0, "deployable_juicebox" );
if ( !isdefined( var_2 ) || !var_2 )
return 0;
if ( !maps\mp\_utility::is_aliens() )
maps\mp\_matchdata::logkillstreakevent( "deployable_juicebox", self.origin );
return 1;
}
onusedeployable( var_0 )
{
if ( maps\mp\_utility::is_aliens() )
thread maps\mp\perks\_perkfunctions::setjuiced( level.deployablebox_juicebox_rank[var_0.upgrade_rank] );
else
thread maps\mp\perks\_perkfunctions::setjuiced( 15 );
}
canusedeployable( var_0 )
{
if ( maps\mp\_utility::is_aliens() && isdefined( var_0 ) && var_0.owner == self && !isdefined( var_0.air_dropped ) )
return 0;
return !maps\mp\_utility::isjuggernaut() && !maps\mp\perks\_perkfunctions::hasjuiced();
}

View File

@ -0,0 +1,86 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
var_0 = spawnstruct();
var_0.id = "deployable_vest";
var_0.weaponinfo = "deployable_vest_marker_mp";
var_0.modelbase = "prop_ballistic_vest_iw6";
var_0.modelbombsquad = "prop_ballistic_vest_iw6_bombsquad";
var_0.hintstring = &"KILLSTREAKS_HINTS_LIGHT_ARMOR_PICKUP";
var_0.capturingstring = &"KILLSTREAKS_BOX_GETTING_VEST";
var_0.event = "deployable_vest_taken";
var_0.streakname = "deployable_vest";
var_0.splashname = "used_deployable_vest";
var_0.shadername = "compass_objpoint_deploy_friendly";
var_0.headiconoffset = 20;
var_0.lifespan = 90.0;
var_0.usexp = 50;
var_0.xppopup = "destroyed_vest";
var_0.vodestroyed = "ballistic_vest_destroyed";
var_0.deployedsfx = "mp_vest_deployed_ui";
var_0.onusesfx = "ammo_crate_use";
var_0.onusecallback = ::onusedeployable;
var_0.canusecallback = ::canusedeployable;
var_0.usetime = 1000;
var_0.maxhealth = 300;
var_0.damagefeedback = "deployable_bag";
var_0.deathvfx = loadfx( "vfx/gameplay/mp/killstreaks/vfx_ballistic_vest_death" );
var_0.allowmeleedamage = 1;
var_0.allowgrenadedamage = 0;
var_0.maxuses = 4;
var_0.canuseotherboxes = 0;
level.boxsettings["deployable_vest"] = var_0;
level.killstreakfuncs["deployable_vest"] = ::tryusedeployablevest;
level.deployable_box["deployable_vest"] = [];
}
tryusedeployablevest( var_0, var_1 )
{
var_2 = maps\mp\killstreaks\_deployablebox::begindeployableviamarker( var_0, "deployable_vest" );
if ( !isdefined( var_2 ) || !var_2 )
return 0;
if ( !maps\mp\_utility::is_aliens() )
maps\mp\_matchdata::logkillstreakevent( "deployable_vest", self.origin );
return 1;
}
canusedeployable( var_0 )
{
if ( !maps\mp\_utility::is_aliens() )
return !maps\mp\perks\_perkfunctions::haslightarmor() && !maps\mp\_utility::isjuggernaut();
if ( isdefined( var_0 ) && var_0.owner == self && !isdefined( var_0.air_dropped ) )
return 0;
return !maps\mp\_utility::isjuggernaut();
}
onusedeployable( var_0 )
{
if ( maps\mp\_utility::is_aliens() )
{
var_1 = 0;
if ( isdefined( self.lightarmorhp ) )
var_1 = self.lightarmorhp;
var_2 = get_adjusted_armor( var_1, var_0.upgrade_rank );
maps\mp\perks\_perkfunctions::setlightarmor( var_2 );
self notify( "enable_armor" );
}
else
maps\mp\perks\_perkfunctions::setlightarmor();
}
get_adjusted_armor( var_0, var_1 )
{
if ( var_0 + level.deployablebox_vest_rank[var_1] > level.deployablebox_vest_max )
return level.deployablebox_vest_max;
return var_0 + level.deployablebox_vest_rank[var_1];
}

View File

@ -0,0 +1,95 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
designator_start( var_0, var_1, var_2 )
{
self endon( "death" );
self.marker = undefined;
if ( self getcurrentweapon() == var_1 )
{
thread designator_disableusabilityduringgrenadepullback( var_1 );
thread designator_waitforgrenadefire( var_0, var_1, var_2 );
designator_waitforweaponchange( var_1 );
return !( self getammocount( var_1 ) && self hasweapon( var_1 ) );
}
return 0;
}
designator_disableusabilityduringgrenadepullback( var_0 )
{
self endon( "death" );
self endon( "disconnect" );
var_1 = "";
while ( var_1 != var_0 )
self waittill( "grenade_pullback", var_1 );
common_scripts\utility::_disableusability();
designator_enableusabilitywhendesignatorfinishes();
}
designator_enableusabilitywhendesignatorfinishes()
{
self endon( "death" );
self endon( "disconnect" );
common_scripts\utility::waittill_any( "grenade_fire", "weapon_change" );
common_scripts\utility::_enableusability();
}
designator_waitforgrenadefire( var_0, var_1, var_2 )
{
self endon( "designator_finished" );
self endon( "spawned_player" );
self endon( "disconnect" );
var_3 = undefined;
var_4 = "";
while ( var_4 != var_1 )
self waittill( "grenade_fire", var_3, var_4 );
if ( isalive( self ) )
{
var_3.owner = self;
var_3.weaponname = var_1;
self.marker = var_3;
thread designator_ontargetacquired( var_0, var_3, var_2 );
}
else
var_3 delete();
self notify( "designator_finished" );
}
designator_waitforweaponchange( var_0 )
{
self endon( "spawned_player" );
self endon( "disconnect" );
var_1 = self getcurrentweapon();
while ( var_1 == var_0 )
self waittill( "weapon_change", var_1 );
if ( self getammocount( var_0 ) == 0 )
designator_removedesignatorandrestorepreviousweapon( var_0 );
self notify( "designator_finished" );
}
designator_removedesignatorandrestorepreviousweapon( var_0 )
{
if ( self hasweapon( var_0 ) )
self takeweapon( var_0 );
}
designator_ontargetacquired( var_0, var_1, var_2 )
{
var_1 waittill( "missile_stuck", var_3 );
if ( isdefined( var_1.owner ) )
self thread [[ var_2 ]]( var_0, var_1 );
if ( isdefined( var_1 ) )
var_1 delete();
}

View File

@ -0,0 +1,251 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.killstreakfuncs["guard_dog"] = ::tryusedog;
}
setup_callbacks()
{
level.agent_funcs["dog"] = level.agent_funcs["player"];
level.agent_funcs["dog"]["spawn"] = ::spawn_dog;
level.agent_funcs["dog"]["on_killed"] = ::on_agent_dog_killed;
level.agent_funcs["dog"]["on_damaged"] = maps\mp\agents\_agents::on_agent_generic_damaged;
level.agent_funcs["dog"]["on_damaged_finished"] = ::on_damaged_finished;
level.agent_funcs["dog"]["think"] = maps\mp\agents\dog\_dog_think::main;
}
tryusedog( var_0, var_1 )
{
return usedog();
}
usedog()
{
if ( isdefined( self.hasdog ) && self.hasdog )
{
var_0 = self getcommonplayerdatareservedint( "mp_dog_type" );
if ( var_0 == 1 )
self iprintlnbold( &"KILLSTREAKS_ALREADY_HAVE_WOLF" );
else
self iprintlnbold( &"KILLSTREAKS_ALREADY_HAVE_DOG" );
return 0;
}
if ( maps\mp\agents\_agent_utility::getnumactiveagents( "dog" ) >= 5 )
{
self iprintlnbold( &"KILLSTREAKS_TOO_MANY_DOGS" );
return 0;
}
if ( maps\mp\agents\_agent_utility::getnumownedactiveagents( self ) >= 2 )
{
self iprintlnbold( &"KILLSTREAKS_AGENT_MAX" );
return 0;
}
var_1 = getmaxagents();
if ( maps\mp\agents\_agent_utility::getnumactiveagents() >= var_1 )
{
self iprintlnbold( &"KILLSTREAKS_UNAVAILABLE" );
return 0;
}
if ( !maps\mp\_utility::isreallyalive( self ) )
return 0;
var_2 = maps\mp\agents\_agent_utility::getvalidspawnpathnodenearplayer( 1 );
if ( !isdefined( var_2 ) )
return 0;
var_3 = maps\mp\agents\_agent_common::connectnewagent( "dog", self.team );
if ( !isdefined( var_3 ) )
return 0;
self.hasdog = 1;
var_3 maps\mp\agents\_agent_utility::set_agent_team( self.team, self );
var_4 = var_2.origin;
var_5 = vectortoangles( self.origin - var_2.origin );
var_3 thread [[ var_3 maps\mp\agents\_agent_utility::agentfunc( "spawn" ) ]]( var_4, var_5, self );
var_3 maps\mp\_utility::_setnameplatematerial( "player_name_bg_green_dog", "player_name_bg_red_dog" );
if ( isdefined( self.balldrone ) && self.balldrone.balldronetype == "ball_drone_backup" )
maps\mp\gametypes\_missions::processchallenge( "ch_twiceasdeadly" );
maps\mp\_matchdata::logkillstreakevent( "guard_dog", self.origin );
return 1;
}
on_agent_dog_killed( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
{
self.isactive = 0;
self.hasdied = 0;
if ( isdefined( self.owner ) )
self.owner.hasdog = 0;
var_1.lastkilldogtime = gettime();
if ( isdefined( self.animcbs.onexit[self.aistate] ) )
self [[ self.animcbs.onexit[self.aistate] ]]();
if ( isplayer( var_1 ) && isdefined( self.owner ) && var_1 != self.owner )
{
self.owner maps\mp\_utility::leaderdialogonplayer( "dog_killed" );
maps\mp\gametypes\_damage::onkillstreakkilled( var_1, var_4, var_3, var_2, "destroyed_guard_dog" );
if ( isplayer( var_1 ) )
{
var_1 maps\mp\gametypes\_missions::processchallenge( "ch_notsobestfriend" );
if ( !self isonground() )
var_1 maps\mp\gametypes\_missions::processchallenge( "ch_hoopla" );
}
}
self setanimstate( "death" );
var_9 = self getanimentry();
var_10 = getanimlength( var_9 );
var_8 = int( var_10 * 1000 );
self.body = self cloneagent( var_8 );
self playsound( common_scripts\utility::ter_op( self.biswolf, "anml_wolf_shot_death", "anml_dog_shot_death" ) );
maps\mp\agents\_agent_utility::deactivateagent();
self notify( "killanimscript" );
}
on_damaged_finished( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
{
if ( !isdefined( self.playing_pain_sound ) )
thread play_pain_sound( 2.5 );
var_10 = var_2;
if ( isdefined( var_8 ) && var_8 == "head" && level.gametype != "horde" )
{
var_10 = int( var_10 * 0.6 );
if ( var_2 > 0 && var_10 <= 0 )
var_10 = 1;
}
if ( self.health - var_10 > 0 )
maps\mp\agents\dog\_dog_think::ondamage( var_0, var_1, var_10, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
if ( isplayer( var_1 ) )
{
if ( isdefined( self.attackstate ) && self.attackstate != "attacking" )
{
if ( distancesquared( self.origin, var_1.origin ) <= self.dogdamagedradiussq )
{
self.favoriteenemy = var_1;
self.forceattack = 1;
thread maps\mp\agents\dog\_dog_think::watchfavoriteenemydeath();
}
}
}
maps\mp\agents\_agents::agent_damage_finished( var_0, var_1, var_10, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
}
play_pain_sound( var_0 )
{
self endon( "death" );
self playsound( common_scripts\utility::ter_op( self.biswolf, "anml_wolf_shot_pain", "anml_dog_shot_pain" ) );
self.playing_pain_sound = 1;
wait( var_0 );
self.playing_pain_sound = undefined;
}
spawn_dog( var_0, var_1, var_2 )
{
var_3 = 0;
var_4 = 0;
if ( isdefined( var_2 ) )
{
if ( isdefined( var_2.squad_bot_dog_type ) )
var_3 = var_2.squad_bot_dog_type;
else
var_3 = var_2 getcommonplayerdatareservedint( "mp_dog_type" );
}
var_5 = "mp_fullbody_dog_a";
if ( var_3 == 1 )
{
if ( var_4 == 0 )
var_5 = "mp_fullbody_wolf_b";
else
var_5 = "mp_fullbody_wolf_c";
}
if ( ishairrunning() )
var_5 = var_5 + "_fur";
self setmodel( var_5 );
self.species = "dog";
self.onenteranimstate = maps\mp\agents\dog\_dog_think::onenteranimstate;
if ( isdefined( var_0 ) && isdefined( var_1 ) )
{
var_6 = var_0;
var_7 = var_1;
}
else
{
var_8 = self [[ level.getspawnpoint ]]();
var_6 = var_8.origin;
var_7 = var_8.angles;
}
maps\mp\agents\_agent_utility::activateagent();
self.spawntime = gettime();
self.lastspawntime = gettime();
self.biswolf = var_3 == 1;
maps\mp\agents\dog\_dog_think::init();
if ( var_3 == 1 )
var_9 = "wolf_animclass";
else
var_9 = "dog_animclass";
self spawnagent( var_6, var_7, var_9, 15, 40, var_2 );
level notify( "spawned_agent", self );
maps\mp\agents\_agent_common::set_agent_health( 250 );
if ( isdefined( var_2 ) )
maps\mp\agents\_agent_utility::set_agent_team( var_2.team, var_2 );
self setthreatbiasgroup( "Dogs" );
self takeallweapons();
if ( isdefined( self.owner ) )
{
self hide();
wait 1.0;
if ( !isalive( self ) )
return;
self show();
}
self thread [[ maps\mp\agents\_agent_utility::agentfunc( "think" ) ]]();
wait 0.1;
if ( ishairrunning() )
{
if ( var_3 == 1 )
var_10 = level.wolffurfx[var_4];
else
var_10 = level.furfx;
playfxontag( var_10, self, "tag_origin" );
}
}

View File

@ -0,0 +1,433 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.killstreakfuncs["drone_hive"] = ::tryusedronehive;
level.dronemissilespawnarray = getentarray( "remoteMissileSpawn", "targetname" );
foreach ( var_1 in level.dronemissilespawnarray )
var_1.targetent = getent( var_1.target, "targetname" );
}
tryusedronehive( var_0, var_1 )
{
return usedronehive( self, var_0 );
}
usedronehive( var_0, var_1 )
{
if ( isdefined( self.underwater ) && self.underwater )
return 0;
var_0 maps\mp\_utility::setusingremote( "remotemissile" );
var_0 maps\mp\_utility::freezecontrolswrapper( 1 );
var_0 common_scripts\utility::_disableweaponswitch();
level thread monitordisownkillstreaks( var_0 );
level thread monitorgameend( var_0 );
level thread monitorobjectivecamera( var_0 );
var_2 = var_0 maps\mp\killstreaks\_killstreaks::initridekillstreak( "drone_hive" );
if ( var_2 == "success" )
{
var_0 maps\mp\_utility::freezecontrolswrapper( 0 );
level thread rundronehive( var_0, var_1 );
}
else
{
var_0 notify( "end_kill_streak" );
var_0 maps\mp\_utility::clearusingremote();
var_0 common_scripts\utility::_enableweaponswitch();
}
return var_2 == "success";
}
watchhostmigrationstartedinit( var_0 )
{
var_0 endon( "killstreak_disowned" );
var_0 endon( "disconnect" );
level endon( "game_ended" );
self endon( "death" );
for (;;)
{
level waittill( "host_migration_begin" );
if ( isdefined( self ) )
{
var_0 visionsetmissilecamforplayer( game["thermal_vision"], 0 );
var_0 maps\mp\_utility::set_visionset_for_watching_players( "default", 0, undefined, 1 );
var_0 thermalvisionfofoverlayon();
continue;
}
var_0 setclientomnvar( "ui_predator_missile", 2 );
}
}
watchhostmigrationfinishedinit( var_0 )
{
var_0 endon( "killstreak_disowned" );
var_0 endon( "disconnect" );
level endon( "game_ended" );
self endon( "death" );
for (;;)
{
level waittill( "host_migration_end" );
if ( isdefined( self ) )
{
var_0 setclientomnvar( "ui_predator_missile", 1 );
var_0 setclientomnvar( "ui_predator_missiles_left", self.missilesleft );
continue;
}
var_0 setclientomnvar( "ui_predator_missile", 2 );
}
}
rundronehive( var_0, var_1 )
{
var_0 endon( "killstreak_disowned" );
level endon( "game_ended" );
var_0 notifyonplayercommand( "missileTargetSet", "+attack" );
var_0 notifyonplayercommand( "missileTargetSet", "+attack_akimbo_accessible" );
var_2 = getbestmissilespawnpoint( var_0, level.dronemissilespawnarray );
var_3 = var_2.origin;
var_4 = var_2.targetent.origin;
var_5 = vectornormalize( var_3 - var_4 );
var_3 = var_5 * 14000 + var_4;
var_6 = magicbullet( "drone_hive_projectile_mp", var_3, var_4, var_0 );
var_6 setcandamage( 1 );
var_6 disablemissileboosting();
var_6 setmissileminimapvisible( 1 );
var_6.team = var_0.team;
var_6.lifeid = var_1;
var_6.type = "remote";
var_6.owner = var_0;
var_6.entitynumber = var_6 getentitynumber();
level.rockets[var_6.entitynumber] = var_6;
level.remotemissileinprogress = 1;
level thread monitordeath( var_6, 1 );
level thread monitorboost( var_6 );
if ( isdefined( var_0.killsthislifeperweapon ) )
{
var_0.killsthislifeperweapon["drone_hive_projectile_mp"] = 0;
var_0.killsthislifeperweapon["switch_blade_child_mp"] = 0;
}
missileeyes( var_0, var_6 );
var_0 setclientomnvar( "ui_predator_missile", 1 );
var_6 thread watchhostmigrationstartedinit( var_0 );
var_6 thread watchhostmigrationfinishedinit( var_0 );
var_7 = 0;
var_6.missilesleft = 2;
var_0 setclientomnvar( "ui_predator_missiles_left", 2 );
for (;;)
{
var_8 = var_6 common_scripts\utility::waittill_any_return( "death", "missileTargetSet" );
maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
if ( var_8 == "death" )
break;
if ( !isdefined( var_6 ) )
break;
if ( var_7 < 2 )
{
level thread spawnswitchblade( var_6, var_7 );
var_7++;
var_6.missilesleft = 2 - var_7;
var_0 setclientomnvar( "ui_predator_missiles_left", var_6.missilesleft );
if ( var_7 == 2 )
var_6 enablemissileboosting();
}
}
thread returnplayer( var_0 );
}
monitorlockedtarget()
{
level endon( "game_ended" );
self endon( "death" );
var_0 = [];
var_1 = [];
for (;;)
{
var_2 = [];
var_0 = getenemytargets();
foreach ( var_4 in var_0 )
{
var_5 = self.owner worldpointinreticle_circle( var_4.origin, 65, 90 );
if ( var_5 )
{
self.owner thread maps\mp\_utility::drawline( self.origin, var_4.origin, 10, ( 0, 0, 1 ) );
var_2[var_2.size] = var_4;
}
}
if ( var_2.size )
{
var_1 = sortbydistance( var_2, self.origin );
self.lasttargetlocked = var_1[0];
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 0.25 );
}
wait 0.05;
maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
}
}
getenemytargets( var_0 )
{
var_1 = [];
foreach ( var_3 in level.participants )
{
if ( var_0 maps\mp\_utility::isenemy( var_3 ) && !var_3 maps\mp\_utility::_hasperk( "specialty_blindeye" ) )
var_1[var_1.size] = var_3;
}
var_5 = maps\mp\gametypes\_weapons::lockonlaunchers_gettargetarray();
if ( var_1.size && var_5.size )
{
var_6 = common_scripts\utility::array_combine( var_1, var_5 );
return var_6;
}
else if ( var_1.size )
return var_1;
else
return var_5;
}
spawnswitchblade( var_0, var_1 )
{
var_0.owner playlocalsound( "ammo_crate_use" );
var_2 = var_0 gettagangles( "tag_camera" );
var_3 = anglestoforward( var_2 );
var_4 = anglestoright( var_2 );
var_5 = ( 35, 35, 35 );
var_6 = ( 15000, 15000, 15000 );
if ( var_1 )
var_5 = var_5 * -1;
var_7 = bullettrace( var_0.origin, var_0.origin + var_3 * var_6, 0, var_0 );
var_6 = var_6 * var_7["fraction"];
var_8 = var_0.origin + var_4 * var_5;
var_9 = var_0.origin + var_3 * var_6;
var_10 = var_0.owner getenemytargets( var_0.owner );
var_11 = magicbullet( "switch_blade_child_mp", var_8, var_9, var_0.owner );
foreach ( var_13 in var_10 )
{
if ( distance2dsquared( var_13.origin, var_9 ) < 262144 )
{
var_11 missile_settargetent( var_13 );
break;
}
}
var_11 setcandamage( 1 );
var_11 setmissileminimapvisible( 1 );
var_11.team = var_0.team;
var_11.lifeid = var_0.lifeid;
var_11.type = var_0.type;
var_11.owner = var_0.owner;
var_11.entitynumber = var_11 getentitynumber();
level.rockets[var_11.entitynumber] = var_11;
level thread monitordeath( var_11, 0 );
}
looptriggeredeffect( var_0, var_1 )
{
var_1 endon( "death" );
level endon( "game_ended" );
self endon( "death" );
for (;;)
{
triggerfx( var_0 );
wait 0.25;
}
}
getnextmissilespawnindex( var_0 )
{
var_1 = var_0 + 1;
if ( var_1 == level.dronemissilespawnarray.size )
var_1 = 0;
return var_1;
}
monitorboost( var_0 )
{
var_0 endon( "death" );
for (;;)
{
var_0.owner waittill( "missileTargetSet" );
var_0 notify( "missileTargetSet" );
}
}
getbestmissilespawnpoint( var_0, var_1 )
{
var_2 = [];
foreach ( var_4 in level.players )
{
if ( !maps\mp\_utility::isreallyalive( var_4 ) )
continue;
if ( var_4.team == var_0.team )
continue;
if ( var_4.team == "spectator" )
continue;
var_2[var_2.size] = var_4;
}
if ( !var_2.size )
return var_1[randomint( var_1.size )];
var_6 = common_scripts\utility::array_randomize( var_1 );
var_7 = var_6[0];
foreach ( var_9 in var_6 )
{
var_9.sightedenemies = 0;
for ( var_10 = 0; var_10 < var_2.size; var_10++ )
{
var_11 = var_2[var_10];
if ( !maps\mp\_utility::isreallyalive( var_11 ) )
{
var_2[var_10] = var_2[var_2.size - 1];
var_2[var_2.size - 1] = undefined;
var_10--;
continue;
}
if ( bullettracepassed( var_11.origin + ( 0, 0, 32 ), var_9.origin, 0, var_11 ) )
{
var_9.sightedenemies = var_9.sightedenemies + 1;
return var_9;
}
wait 0.05;
maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
}
if ( var_9.sightedenemies == var_2.size )
return var_9;
if ( var_9.sightedenemies > var_7.sightedenemies )
var_7 = var_9;
}
return var_7;
}
missileeyes( var_0, var_1 )
{
var_2 = 1.0;
var_0 maps\mp\_utility::freezecontrolswrapper( 1 );
var_0 cameralinkto( var_1, "tag_origin" );
var_0 controlslinkto( var_1 );
var_0 visionsetmissilecamforplayer( "default", var_2 );
var_0 thread maps\mp\_utility::set_visionset_for_watching_players( "default", var_2, undefined, 1 );
var_0 visionsetmissilecamforplayer( game["thermal_vision"], 1.0 );
var_0 thread delayedfofoverlay();
level thread unfreezecontrols( var_0, var_2 );
}
delayedfofoverlay()
{
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 0.25 );
self thermalvisionfofoverlayon();
}
unfreezecontrols( var_0, var_1, var_2 )
{
var_0 endon( "disconnect" );
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( var_1 - 0.35 );
var_0 maps\mp\_utility::freezecontrolswrapper( 0 );
}
monitordisownkillstreaks( var_0 )
{
var_0 endon( "disconnect" );
var_0 endon( "end_kill_streak" );
var_0 waittill( "killstreak_disowned" );
level thread returnplayer( var_0 );
}
monitorgameend( var_0 )
{
var_0 endon( "disconnect" );
var_0 endon( "end_kill_streak" );
level waittill( "game_ended" );
level thread returnplayer( var_0 );
}
monitorobjectivecamera( var_0 )
{
var_0 endon( "end_kill_streak" );
var_0 endon( "disconnect" );
level waittill( "objective_cam" );
level thread returnplayer( var_0, 1 );
}
monitordeath( var_0, var_1 )
{
var_0 waittill( "death" );
maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
if ( isdefined( var_0.targeffect ) )
var_0.targeffect delete();
if ( isdefined( var_0.entitynumber ) )
level.rockets[var_0.entitynumber] = undefined;
if ( var_1 )
level.remotemissileinprogress = undefined;
}
returnplayer( var_0, var_1 )
{
if ( !isdefined( var_0 ) )
return;
var_0 setclientomnvar( "ui_predator_missile", 2 );
var_0 notify( "end_kill_streak" );
var_0 maps\mp\_utility::freezecontrolswrapper( 1 );
var_0 thermalvisionfofoverlayoff();
var_0 controlsunlink();
if ( !isdefined( var_1 ) )
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 0.95 );
var_0 cameraunlink();
var_0 setclientomnvar( "ui_predator_missile", 0 );
var_0 maps\mp\_utility::clearusingremote();
var_0 common_scripts\utility::_enableweaponswitch();
}

View File

@ -0,0 +1,427 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
}
onplayerconnect()
{
for (;;)
{
level waittill( "connected", var_0 );
var_0 thread onplayerspawned();
}
}
onplayerspawned()
{
self endon( "disconnect" );
for (;;)
{
self waittill( "spawned_player" );
if ( level.teambased && level.teamemped[self.team] || !level.teambased && isdefined( level.empplayer ) && level.empplayer != self )
self setempjammed( 1 );
}
}
emp_use( var_0, var_1 )
{
var_2 = self.pers["team"];
if ( level.multiteambased )
thread emp_jamteams( var_2 );
else if ( level.teambased )
{
var_3 = level.otherteam[var_2];
thread emp_jamteam( var_3 );
}
else
thread emp_jamplayers( self );
maps\mp\_matchdata::logkillstreakevent( "emp", self.origin );
self notify( "used_emp" );
return 1;
}
emp_jamteams( var_0 )
{
level endon( "game_ended" );
thread maps\mp\_utility::teamplayercardsplash( "used_emp", self );
level notify( "EMP_JamTeam" + var_0 );
level endon( "EMP_JamTeam" + var_0 );
foreach ( var_2 in level.players )
{
var_2 playlocalsound( "emp_activate" );
if ( var_2.team == var_0 )
continue;
if ( var_2 maps\mp\_utility::_hasperk( "specialty_localjammer" ) )
var_2 clearscrambler();
}
visionsetnaked( "coup_sunblind", 0.1 );
thread empeffects();
wait 0.1;
visionsetnaked( "coup_sunblind", 0 );
visionsetnaked( "", 3.0 );
for ( var_4 = 0; var_4 < level.teamnamelist.size; var_4++ )
{
if ( var_0 != level.teamnamelist[var_4] )
level.teamemped[level.teamnamelist[var_4]] = 1;
}
level notify( "emp_update" );
for ( var_4 = 0; var_4 < level.teamnamelist.size; var_4++ )
{
if ( var_0 != level.teamnamelist[var_4] )
level destroyactivevehicles( self, level.teamnamelist[var_4] );
}
level thread keepemptimeremaining();
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( level.emptimeout );
for ( var_4 = 0; var_4 < level.teamnamelist.size; var_4++ )
{
if ( var_0 != level.teamnamelist[var_4] )
level.teamemped[level.teamnamelist[var_4]] = 0;
}
foreach ( var_2 in level.players )
{
if ( var_2.team == var_0 )
continue;
if ( var_2 maps\mp\_utility::_hasperk( "specialty_localjammer" ) )
var_2 makescrambler();
}
level notify( "emp_update" );
}
emp_jamteam( var_0 )
{
level endon( "game_ended" );
thread maps\mp\_utility::teamplayercardsplash( "used_emp", self );
level notify( "EMP_JamTeam" + var_0 );
level endon( "EMP_JamTeam" + var_0 );
foreach ( var_2 in level.players )
{
var_2 playlocalsound( "emp_activate" );
if ( var_2.team != var_0 )
continue;
if ( var_2 maps\mp\_utility::_hasperk( "specialty_localjammer" ) )
var_2 clearscrambler();
var_2 visionsetnakedforplayer( "coup_sunblind", 0.1 );
}
thread empeffects();
wait 0.1;
visionsetnaked( "coup_sunblind", 0 );
visionsetnaked( "", 3.0 );
level.teamemped[var_0] = 1;
level notify( "emp_update" );
level destroyactivevehicles( self, var_0 );
level thread keepemptimeremaining();
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( level.emptimeout );
level.teamemped[var_0] = 0;
foreach ( var_2 in level.players )
{
if ( var_2.team != var_0 )
continue;
if ( var_2 maps\mp\_utility::_hasperk( "specialty_localjammer" ) )
var_2 makescrambler();
}
level notify( "emp_update" );
}
emp_jamplayers( var_0 )
{
level notify( "EMP_JamPlayers" );
level endon( "EMP_JamPlayers" );
foreach ( var_2 in level.players )
{
var_2 playlocalsound( "emp_activate" );
if ( var_2 == var_0 )
continue;
if ( var_2 maps\mp\_utility::_hasperk( "specialty_localjammer" ) )
var_2 clearscrambler();
}
visionsetnaked( "coup_sunblind", 0.1 );
thread empeffects();
wait 0.1;
visionsetnaked( "coup_sunblind", 0 );
visionsetnaked( "", 3.0 );
level notify( "emp_update" );
level.empplayer = var_0;
level.empplayer thread empplayerffadisconnect();
level destroyactivevehicles( var_0 );
level notify( "emp_update" );
level thread keepemptimeremaining();
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( level.emptimeout );
foreach ( var_2 in level.players )
{
if ( var_2 == var_0 )
continue;
if ( var_2 maps\mp\_utility::_hasperk( "specialty_localjammer" ) )
var_2 makescrambler();
}
level.empplayer = undefined;
level notify( "emp_update" );
level notify( "emp_ended" );
}
keepemptimeremaining()
{
level notify( "keepEMPTimeRemaining" );
level endon( "keepEMPTimeRemaining" );
level endon( "emp_ended" );
for ( level.emptimeremaining = int( level.emptimeout ); level.emptimeremaining; level.emptimeremaining-- )
wait 1.0;
}
empplayerffadisconnect()
{
level endon( "EMP_JamPlayers" );
level endon( "emp_ended" );
self waittill( "disconnect" );
level notify( "emp_update" );
}
empeffects()
{
foreach ( var_1 in level.players )
{
var_2 = anglestoforward( var_1.angles );
var_2 = ( var_2[0], var_2[1], 0 );
var_2 = vectornormalize( var_2 );
var_3 = 20000;
var_4 = spawn( "script_model", var_1.origin + ( 0, 0, 8000 ) + var_2 * var_3 );
var_4 setmodel( "tag_origin" );
var_4.angles = var_4.angles + ( 270, 0, 0 );
var_4 thread empeffect( var_1 );
}
}
empeffect( var_0 )
{
var_0 endon( "disconnect" );
wait 0.5;
playfxontagforclients( level._effect["emp_flash"], self, "tag_origin", var_0 );
}
emp_teamtracker()
{
level endon( "game_ended" );
for (;;)
{
level common_scripts\utility::waittill_either( "joined_team", "emp_update" );
foreach ( var_1 in level.players )
{
if ( var_1.team == "spectator" )
continue;
if ( !level.teamemped[var_1.team] && !var_1 maps\mp\_utility::isemped() )
{
var_1 enablejammedeffect( 0 );
continue;
}
var_1 enablejammedeffect( 1 );
}
}
}
emp_playertracker()
{
level endon( "game_ended" );
for (;;)
{
level common_scripts\utility::waittill_either( "joined_team", "emp_update" );
foreach ( var_1 in level.players )
{
if ( var_1.team == "spectator" )
continue;
if ( isdefined( level.empplayer ) && level.empplayer != var_1 )
{
var_1 enablejammedeffect( 1 );
continue;
}
if ( !var_1 maps\mp\_utility::isemped() )
var_1 enablejammedeffect( 0 );
}
}
}
destroyactivevehicles( var_0, var_1 )
{
thread destroyactivehelis( var_0, var_1 );
thread destroyactivelittlebirds( var_0, var_1 );
thread destroyactiveturrets( var_0, var_1 );
thread destroyactiverockets( var_0, var_1 );
thread destroyactiveuavs( var_0, var_1 );
thread destroyactiveimss( var_0, var_1 );
thread destroyactiveugvs( var_0, var_1 );
thread destroyactiveac130( var_0, var_1 );
thread destroyactiveballdrones( var_0, var_1 );
thread destroytargets( var_0, var_1, level.remote_uav );
thread destroytargets( var_0, var_1, level.uplinks );
}
destroytargets( var_0, var_1, var_2 )
{
var_3 = "MOD_EXPLOSIVE";
var_4 = "killstreak_emp_mp";
var_5 = 5000;
var_6 = ( 0, 0, 0 );
var_7 = ( 0, 0, 0 );
var_8 = "";
var_9 = "";
var_10 = "";
var_11 = undefined;
foreach ( var_13 in var_2 )
{
if ( level.teambased && isdefined( var_1 ) )
{
if ( isdefined( var_13.team ) && var_13.team != var_1 )
continue;
}
else if ( isdefined( var_13.owner ) && var_13.owner == var_0 )
continue;
var_13 notify( "damage", var_5, var_0, var_6, var_7, var_3, var_8, var_9, var_10, var_11, var_4 );
wait 0.05;
}
}
destroyactivehelis( var_0, var_1 )
{
destroytargets( var_0, var_1, level.helis );
}
destroyactivelittlebirds( var_0, var_1 )
{
destroytargets( var_0, var_1, level.littlebirds );
}
destroyactiveturrets( var_0, var_1 )
{
destroytargets( var_0, var_1, level.turrets );
}
destroyactiverockets( var_0, var_1 )
{
var_2 = "MOD_EXPLOSIVE";
var_3 = "killstreak_emp_mp";
var_4 = 5000;
var_5 = ( 0, 0, 0 );
var_6 = ( 0, 0, 0 );
var_7 = "";
var_8 = "";
var_9 = "";
var_10 = undefined;
foreach ( var_12 in level.rockets )
{
if ( level.teambased && isdefined( var_1 ) )
{
if ( isdefined( var_12.team ) && var_12.team != var_1 )
continue;
}
else if ( isdefined( var_12.owner ) && var_12.owner == var_0 )
continue;
playfx( level.remotemissile_fx["explode"], var_12.origin );
var_12 delete();
wait 0.05;
}
}
destroyactiveuavs( var_0, var_1 )
{
var_2 = level.uavmodels;
if ( level.teambased && isdefined( var_1 ) )
var_2 = level.uavmodels[var_1];
destroytargets( var_0, var_1, var_2 );
}
destroyactiveimss( var_0, var_1 )
{
destroytargets( var_0, var_1, level.ims );
}
destroyactiveugvs( var_0, var_1 )
{
destroytargets( var_0, var_1, level.ugvs );
}
destroyactiveac130( var_0, var_1 )
{
var_2 = "MOD_EXPLOSIVE";
var_3 = "killstreak_emp_mp";
var_4 = 5000;
var_5 = ( 0, 0, 0 );
var_6 = ( 0, 0, 0 );
var_7 = "";
var_8 = "";
var_9 = "";
var_10 = undefined;
if ( level.teambased && isdefined( var_1 ) )
{
if ( isdefined( level.ac130player ) && isdefined( level.ac130player.team ) && level.ac130player.team == var_1 )
level.ac130.planemodel notify( "damage", var_4, var_0, var_5, var_6, var_2, var_7, var_8, var_9, var_10, var_3 );
}
else if ( isdefined( level.ac130player ) )
{
if ( !isdefined( level.ac130.owner ) || isdefined( level.ac130.owner ) && level.ac130.owner != var_0 )
level.ac130.planemodel notify( "damage", var_4, var_0, var_5, var_6, var_2, var_7, var_8, var_9, var_10, var_3 );
}
}
destroyactiveballdrones( var_0, var_1 )
{
destroytargets( var_0, var_1, level.balldrones );
}
enablejammedeffect( var_0 )
{
self setempjammed( var_0 );
var_1 = 0;
if ( var_0 )
var_1 = 1;
thread maps\mp\killstreaks\_emp_common::startempjamsequence();
}

View File

@ -0,0 +1,177 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
shouldplayerbeaffectedbyemp()
{
return !maps\mp\_utility::_hasperk( "specialty_empimmune" ) && maps\mp\_utility::isemped();
}
applyglobalempeffects()
{
visionsetnaked( "coup_sunblind", 0.05 );
wait 0.05;
visionsetnaked( "coup_sunblind", 0 );
visionsetnaked( "", 0.5 );
}
applyperplayerempeffects_ondetonate()
{
self playlocalsound( "emp_activate" );
}
applyperplayerempeffects()
{
self setempjammed( 1 );
if ( maps\mp\_utility::_hasperk( "specialty_localjammer" ) )
self clearscrambler();
thread startempjamsequence();
}
removeperplayerempeffects()
{
self setempjammed( 0 );
if ( maps\mp\_utility::_hasperk( "specialty_localjammer" ) )
self makescrambler();
thread stopempjamsequence();
}
startempjamsequence()
{
level endon( "game_ended" );
self endon( "emp_stop_effect" );
self endon( "disconnect" );
self.bisplayingjameffects = 1;
thread doempartifactloop();
wait 1.0;
self setclientomnvar( "ui_hud_static", 2 );
wait 0.5;
self notify( "emp_stop_artifact" );
self setclientomnvar( "ui_hud_emp_artifact", 0 );
for (;;)
{
self setclientomnvar( "ui_hud_static", 3 );
var_0 = randomfloatrange( 0.25, 1.25 );
wait( var_0 );
self setclientomnvar( "ui_hud_static", 2 );
wait 0.5;
}
}
stopempjamsequence()
{
level endon( "game_ended" );
self notify( "emp_stop_effect" );
self endon( "disconnect" );
if ( isdefined( self.bisplayingjameffects ) )
{
self.bisplayingjameffects = undefined;
self setclientomnvar( "ui_hud_static", 0 );
for ( var_0 = 0; var_0 < 3; var_0++ )
{
self setclientomnvar( "ui_hud_emp_artifact", 1 );
wait 0.5;
}
self setclientomnvar( "ui_hud_emp_artifact", 0 );
self.player_static_value = 0;
}
}
stopempjamsequenceimmediate()
{
self notify( "emp_stop_effect" );
if ( isdefined( self.bisplayingjameffects ) || isdefined( self.player_static_value ) )
{
self.bisplayingjameffects = undefined;
self.player_static_value = 0;
self setclientomnvar( "ui_hud_static", 0 );
self setclientomnvar( "ui_hud_emp_artifact", 0 );
}
}
doempartifactloop()
{
self notify( "emp_stop_artifact" );
level endon( "game_ended" );
self endon( "emp_stop_effect" );
self endon( "emp_stop_artifact" );
self endon( "disconnect" );
self endon( "joined_spectators" );
for (;;)
{
self setclientomnvar( "ui_hud_emp_artifact", 1 );
var_0 = randomfloatrange( 0.375, 0.5 );
wait( var_0 );
}
}
doempstaticloop( var_0 )
{
self notify( "emp_stop_static" );
level endon( "game_ended" );
self endon( "emp_stop_effect" );
self endon( "emp_stop_static" );
self endon( "disconnect" );
self endon( "joined_spectators" );
var_1 = 1.0;
var_2 = 2.0;
if ( var_0 == 2 )
{
var_1 = 0.5;
var_2 = 0.75;
}
for (;;)
{
self setclientomnvar( "ui_hud_static", 2 );
var_3 = randomfloatrange( var_1, var_2 );
wait( var_3 );
}
}
staticfieldinit()
{
self.player_static_value = 0;
}
staticfieldsetstrength( var_0 )
{
if ( self.player_static_value != var_0 && isalive( self ) && !maps\mp\_utility::isemped() )
{
self.player_static_value = var_0;
switch ( var_0 )
{
case 0:
stopempjamsequence();
break;
case 1:
self.bisplayingjameffects = 1;
self notify( "emp_stop_static" );
thread doempartifactloop();
thread doempstaticloop( 1 );
break;
case 2:
self.bisplayingjameffects = 1;
self notify( "emp_stop_static" );
self notify( "emp_stop_artifact" );
thread doempstaticloop( 2 );
break;
}
}
}
staticfieldgetstrength()
{
return self.player_static_value;
}

View File

@ -0,0 +1,891 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.ospreysettings = [];
if ( level.script == "mp_character_room" )
return;
level.ospreysettings["escort_airdrop"] = spawnstruct();
level.ospreysettings["escort_airdrop"].vehicle = "osprey_mp";
level.ospreysettings["escort_airdrop"].modelbase = "vehicle_v22_osprey_body_mp";
level.ospreysettings["escort_airdrop"].modelblades = "vehicle_v22_osprey_blades_mp";
level.ospreysettings["escort_airdrop"].taghatchl = "tag_le_door_attach";
level.ospreysettings["escort_airdrop"].taghatchr = "tag_ri_door_attach";
level.ospreysettings["escort_airdrop"].tagdropcrates = "tag_turret_attach";
level.ospreysettings["escort_airdrop"].prompt = &"KILLSTREAKS_DEFEND_AIRDROP_PACKAGES";
level.ospreysettings["escort_airdrop"].name = &"KILLSTREAKS_ESCORT_AIRDROP";
level.ospreysettings["escort_airdrop"].weaponinfo = "osprey_minigun_mp";
level.ospreysettings["escort_airdrop"].helitype = "osprey";
level.ospreysettings["escort_airdrop"].droptype = "airdrop_escort";
level.ospreysettings["escort_airdrop"].maxhealth = level.heli_maxhealth * 2;
level.ospreysettings["escort_airdrop"].timeout = 60.0;
level.ospreysettings["osprey_gunner"] = spawnstruct();
level.ospreysettings["osprey_gunner"].vehicle = "osprey_player_mp";
level.ospreysettings["osprey_gunner"].modelbase = "vehicle_v22_osprey_body_mp";
level.ospreysettings["osprey_gunner"].modelblades = "vehicle_v22_osprey_blades_mp";
level.ospreysettings["osprey_gunner"].taghatchl = "tag_le_door_attach";
level.ospreysettings["osprey_gunner"].taghatchr = "tag_ri_door_attach";
level.ospreysettings["osprey_gunner"].tagdropcrates = "tag_turret_attach";
level.ospreysettings["osprey_gunner"].prompt = &"KILLSTREAKS_DEFEND_AIRDROP_PACKAGES";
level.ospreysettings["osprey_gunner"].name = &"KILLSTREAKS_OSPREY_GUNNER";
level.ospreysettings["osprey_gunner"].weaponinfo = "osprey_player_minigun_mp";
level.ospreysettings["osprey_gunner"].helitype = "osprey_gunner";
level.ospreysettings["osprey_gunner"].droptype = "airdrop_osprey_gunner";
level.ospreysettings["osprey_gunner"].maxhealth = level.heli_maxhealth * 2;
level.ospreysettings["osprey_gunner"].timeout = 75.0;
foreach ( var_1 in level.ospreysettings )
{
level.chopper_fx["explode"]["death"][var_1.modelbase] = loadfx( "fx/explosions/helicopter_explosion_osprey" );
level.chopper_fx["explode"]["air_death"][var_1.modelbase] = loadfx( "fx/explosions/helicopter_explosion_osprey_air_mp" );
level.chopper_fx["anim"]["blades_anim_up"][var_1.modelbase] = loadfx( "fx/props/osprey_blades_anim_up" );
level.chopper_fx["anim"]["blades_anim_down"][var_1.modelbase] = loadfx( "fx/props/osprey_blades_anim_down" );
level.chopper_fx["anim"]["blades_static_up"][var_1.modelbase] = loadfx( "fx/props/osprey_blades_up" );
level.chopper_fx["anim"]["blades_static_down"][var_1.modelbase] = loadfx( "fx/props/osprey_blades_default" );
level.chopper_fx["anim"]["hatch_left_static_up"][var_1.modelbase] = loadfx( "fx/props/osprey_bottom_door_left_default" );
level.chopper_fx["anim"]["hatch_left_anim_down"][var_1.modelbase] = loadfx( "fx/props/osprey_bottom_door_left_anim_open" );
level.chopper_fx["anim"]["hatch_left_static_down"][var_1.modelbase] = loadfx( "fx/props/osprey_bottom_door_left_up" );
level.chopper_fx["anim"]["hatch_left_anim_up"][var_1.modelbase] = loadfx( "fx/props/osprey_bottom_door_left_anim_close" );
level.chopper_fx["anim"]["hatch_right_static_up"][var_1.modelbase] = loadfx( "fx/props/osprey_bottom_door_right_default" );
level.chopper_fx["anim"]["hatch_right_anim_down"][var_1.modelbase] = loadfx( "fx/props/osprey_bottom_door_right_anim_open" );
level.chopper_fx["anim"]["hatch_right_static_down"][var_1.modelbase] = loadfx( "fx/props/osprey_bottom_door_right_up" );
level.chopper_fx["anim"]["hatch_right_anim_up"][var_1.modelbase] = loadfx( "fx/props/osprey_bottom_door_right_anim_close" );
}
level.air_support_locs = [];
level.killstreakfuncs["escort_airdrop"] = ::tryuseescortairdrop;
level.killstreakfuncs["osprey_gunner"] = ::tryuseospreygunner;
}
tryuseescortairdrop( var_0, var_1 )
{
var_2 = 1;
if ( isdefined( level.chopper ) )
{
self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
return 0;
}
if ( maps\mp\_utility::currentactivevehiclecount() >= maps\mp\_utility::maxvehiclesallowed() || level.fauxvehiclecount + var_2 >= maps\mp\_utility::maxvehiclesallowed() )
{
self iprintlnbold( &"KILLSTREAKS_TOO_MANY_VEHICLES" );
return 0;
}
if ( maps\mp\_utility::iskillstreakdenied() )
return 0;
maps\mp\_utility::incrementfauxvehiclecount();
var_4 = maps\mp\killstreaks\_airdrop::beginairdropviamarker( var_0, "escort_airdrop" );
if ( !isdefined( var_4 ) || !var_4 )
{
self notify( "markerDetermined" );
maps\mp\_utility::decrementfauxvehiclecount();
return 0;
}
return 1;
}
tryuseospreygunner( var_0, var_1 )
{
var_2 = 1;
if ( isdefined( level.chopper ) )
{
self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
return 0;
}
if ( maps\mp\_utility::currentactivevehiclecount() >= maps\mp\_utility::maxvehiclesallowed() || level.fauxvehiclecount + var_2 >= maps\mp\_utility::maxvehiclesallowed() )
{
self iprintlnbold( &"KILLSTREAKS_TOO_MANY_VEHICLES" );
return 0;
}
maps\mp\_utility::incrementfauxvehiclecount();
var_4 = selectdroplocation( var_0, "osprey_gunner", "compass_objpoint_osprey_friendly", "compass_objpoint_osprey_enemy", &"KILLSTREAKS_SELECT_MOBILE_MORTAR_LOCATION" );
if ( !isdefined( var_4 ) || !var_4 )
{
maps\mp\_utility::decrementfauxvehiclecount();
return 0;
}
maps\mp\_matchdata::logkillstreakevent( "osprey_gunner", self.origin );
return 1;
}
finishsupportescortusage( var_0, var_1, var_2, var_3 )
{
self notify( "used" );
var_4 = ( 0, var_2, 0 );
var_5 = 12000;
var_6 = getent( "airstrikeheight", "targetname" );
var_7 = var_6.origin[2];
var_8 = level.heli_start_nodes[randomint( level.heli_start_nodes.size )];
var_9 = var_8.origin;
var_10 = ( var_1[0], var_1[1], var_7 );
var_11 = var_1 + anglestoforward( var_4 ) * var_5;
var_12 = vectortoangles( var_10 - var_9 );
var_13 = var_1;
var_1 = ( var_1[0], var_1[1], var_7 );
var_14 = createairship( self, var_0, var_9, var_12, var_1, var_3 );
var_9 = var_8;
usesupportescortairdrop( var_0, var_14, var_9, var_10, var_11, var_7, var_13 );
}
finishospreygunnerusage( var_0, var_1, var_2, var_3 )
{
self notify( "used" );
var_4 = ( 0, var_2, 0 );
var_5 = 12000;
var_6 = getent( "airstrikeheight", "targetname" );
var_7 = var_6.origin[2];
var_8 = level.heli_start_nodes[randomint( level.heli_start_nodes.size )];
var_9 = var_8.origin;
var_10 = ( var_1[0], var_1[1], var_7 );
var_11 = var_1 + anglestoforward( var_4 ) * var_5;
var_12 = vectortoangles( var_10 - var_9 );
var_1 = ( var_1[0], var_1[1], var_7 );
var_13 = createairship( self, var_0, var_9, var_12, var_1, var_3 );
var_9 = var_8;
useospreygunner( var_0, var_13, var_9, var_10, var_11, var_7 );
}
stopselectionwatcher()
{
self waittill( "stop_location_selection", var_0 );
switch ( var_0 )
{
case "emp":
case "weapon_change":
case "death":
case "cancel_location":
case "disconnect":
self notify( "customCancelLocation" );
break;
}
}
selectdroplocation( var_0, var_1, var_2, var_3, var_4 )
{
self endon( "customCancelLocation" );
var_5 = undefined;
var_6 = level.mapsize / 6.46875;
if ( level.splitscreen )
var_6 = var_6 * 1.5;
maps\mp\_utility::_beginlocationselection( var_1, "map_artillery_selector", 0, 500 );
thread stopselectionwatcher();
self waittill( "confirm_location", var_7, var_8 );
maps\mp\_utility::stoplocationselection( 0 );
maps\mp\_utility::setusingremote( var_1 );
var_9 = maps\mp\killstreaks\_killstreaks::initridekillstreak( var_1 );
if ( var_9 != "success" )
{
if ( var_9 != "disconnect" )
maps\mp\_utility::clearusingremote();
return 0;
}
if ( isdefined( level.chopper ) )
{
maps\mp\_utility::clearusingremote();
self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
return 0;
}
else if ( maps\mp\_utility::currentactivevehiclecount() >= maps\mp\_utility::maxvehiclesallowed() || level.fauxvehiclecount >= maps\mp\_utility::maxvehiclesallowed() )
{
maps\mp\_utility::clearusingremote();
self iprintlnbold( &"KILLSTREAKS_TOO_MANY_VEHICLES" );
return 0;
}
thread finishospreygunnerusage( var_0, var_7, var_8, var_1 );
return 1;
}
showicons( var_0, var_1, var_2, var_3 )
{
var_4 = maps\mp\gametypes\_hud_util::createfontstring( "bigfixed", 0.5 );
var_4 maps\mp\gametypes\_hud_util::setpoint( "CENTER", "CENTER", 0, -150 );
var_4 settext( var_2 );
self.locationobjectives = [];
for ( var_5 = 0; var_5 < var_3; var_5++ )
{
self.locationobjectives[var_5] = maps\mp\gametypes\_gameobjects::getnextobjid();
objective_add( self.locationobjectives[var_5], "invisible", ( 0, 0, 0 ) );
objective_position( self.locationobjectives[var_5], level.air_support_locs[level.script][var_5]["origin"] );
objective_state( self.locationobjectives[var_5], "active" );
objective_player( self.locationobjectives[var_5], self getentitynumber() );
if ( level.air_support_locs[level.script][var_5]["in_use"] == 1 )
{
objective_icon( self.locationobjectives[var_5], var_1 );
continue;
}
objective_icon( self.locationobjectives[var_5], var_0 );
}
common_scripts\utility::waittill_any( "cancel_location", "picked_location", "stop_location_selection" );
var_4 maps\mp\gametypes\_hud_util::destroyelem();
for ( var_5 = 0; var_5 < var_3; var_5++ )
maps\mp\_utility::_objective_delete( self.locationobjectives[var_5] );
}
createairship( var_0, var_1, var_2, var_3, var_4, var_5 )
{
var_6 = spawnhelicopter( var_0, var_2, var_3, level.ospreysettings[var_5].vehicle, level.ospreysettings[var_5].modelbase );
if ( !isdefined( var_6 ) )
return undefined;
var_6.ospreytype = var_5;
var_6.heli_type = level.ospreysettings[var_5].modelbase;
var_6.helitype = level.ospreysettings[var_5].helitype;
var_6.attractor = missile_createattractorent( var_6, level.heli_attract_strength, level.heli_attract_range );
var_6.lifeid = var_1;
var_6.team = var_0.pers["team"];
var_6.pers["team"] = var_0.pers["team"];
var_6.owner = var_0;
var_6 setotherent( var_0 );
var_6.maxhealth = level.ospreysettings[var_5].maxhealth;
var_6.zoffset = ( 0, 0, 0 );
var_6.targeting_delay = level.heli_targeting_delay;
var_6.primarytarget = undefined;
var_6.secondarytarget = undefined;
var_6.attacker = undefined;
var_6.currentstate = "ok";
var_6.droptype = level.ospreysettings[var_5].droptype;
var_6 common_scripts\utility::make_entity_sentient_mp( var_6.team );
level.chopper = var_6;
var_6 maps\mp\killstreaks\_helicopter::addtohelilist();
var_6 thread maps\mp\killstreaks\_flares::flares_monitor( 2 );
var_6 thread maps\mp\killstreaks\_helicopter::heli_leave_on_disconnect( var_0 );
var_6 thread maps\mp\killstreaks\_helicopter::heli_leave_on_changeteams( var_0 );
var_6 thread maps\mp\killstreaks\_helicopter::heli_leave_on_gameended( var_0 );
var_7 = level.ospreysettings[var_5].timeout;
var_6 thread maps\mp\killstreaks\_helicopter::heli_leave_on_timeout( var_7 );
var_6 thread maps\mp\killstreaks\_helicopter::heli_damage_monitor( var_5, 0 );
var_6 thread maps\mp\killstreaks\_helicopter::heli_health();
var_6 thread maps\mp\killstreaks\_helicopter::heli_existance();
var_6 thread airshipfx();
var_6 thread airshipfxonconnect();
if ( var_5 == "escort_airdrop" )
{
var_8 = var_6.origin + ( anglestoforward( var_6.angles ) * -200 + anglestoright( var_6.angles ) * -200 ) + ( 0, 0, 200 );
var_6.killcament = spawn( "script_model", var_8 );
var_6.killcament setscriptmoverkillcam( "explosive" );
var_6.killcament linkto( var_6, "tag_origin" );
}
return var_6;
}
airshipfx()
{
self endon( "death" );
wait 0.05;
playfxontag( level.chopper_fx["light"]["tail"], self, "tag_light_tail" );
wait 0.05;
playfxontag( level.chopper_fx["light"]["belly"], self, "tag_light_belly" );
wait 0.05;
playfxontag( level.chopper_fx["anim"]["blades_static_down"][level.ospreysettings[self.ospreytype].modelbase], self, "TAG_BLADES_ATTACH" );
wait 0.05;
playfxontag( level.chopper_fx["anim"]["hatch_left_static_up"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchl );
wait 0.05;
playfxontag( level.chopper_fx["anim"]["hatch_right_static_up"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchr );
}
airshipfxonconnect()
{
self endon( "death" );
level endon( "game_ended" );
for (;;)
{
level waittill( "connected", var_0 );
thread airshipfxonclient( var_0 );
}
}
airshipfxonclient( var_0 )
{
self endon( "death" );
level endon( "game_ended" );
var_0 endon( "disconnect" );
wait 0.05;
playfxontagforclients( level.chopper_fx["light"]["tail"], self, "tag_light_tail", var_0 );
wait 0.05;
playfxontagforclients( level.chopper_fx["light"]["belly"], self, "tag_light_belly", var_0 );
if ( isdefined( self.propsstate ) )
{
if ( self.propsstate == "up" )
{
wait 0.05;
playfxontagforclients( level.chopper_fx["anim"]["blades_static_up"][level.ospreysettings[self.ospreytype].modelbase], self, "TAG_BLADES_ATTACH", var_0 );
}
else
{
wait 0.05;
playfxontagforclients( level.chopper_fx["anim"]["blades_static_down"][level.ospreysettings[self.ospreytype].modelbase], self, "TAG_BLADES_ATTACH", var_0 );
}
}
else
{
wait 0.05;
playfxontagforclients( level.chopper_fx["anim"]["blades_static_down"][level.ospreysettings[self.ospreytype].modelbase], self, "TAG_BLADES_ATTACH", var_0 );
}
if ( isdefined( self.hatchstate ) )
{
if ( self.hatchstate == "down" )
{
wait 0.05;
playfxontagforclients( level.chopper_fx["anim"]["hatch_left_static_down"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchl, var_0 );
wait 0.05;
playfxontagforclients( level.chopper_fx["anim"]["hatch_right_static_down"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchr, var_0 );
}
else
{
wait 0.05;
playfxontagforclients( level.chopper_fx["anim"]["hatch_left_static_up"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchl, var_0 );
wait 0.05;
playfxontagforclients( level.chopper_fx["anim"]["hatch_right_static_up"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchr, var_0 );
}
}
else
{
wait 0.05;
playfxontagforclients( level.chopper_fx["anim"]["hatch_left_static_up"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchl, var_0 );
wait 0.05;
playfxontagforclients( level.chopper_fx["anim"]["hatch_right_static_up"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchr, var_0 );
}
}
usesupportescortairdrop( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
var_1 thread airshipflydefense( self, var_2, var_3, var_4, var_5, var_6 );
}
useospreygunner( var_0, var_1, var_2, var_3, var_4, var_5 )
{
thread ridegunner( var_0, var_1 );
var_1 thread airshipflygunner( self, var_2, var_3, var_4, var_5 );
}
ridegunner( var_0, var_1 )
{
self endon( "disconnect" );
var_1 endon( "helicopter_done" );
thread maps\mp\_utility::teamplayercardsplash( "used_osprey_gunner", self );
maps\mp\_utility::_giveweapon( "heli_remote_mp" );
self switchtoweapon( "heli_remote_mp" );
if ( getdvarint( "camera_thirdPerson" ) )
maps\mp\_utility::setthirdpersondof( 0 );
var_1 vehicleturretcontrolon( self );
self playerlinkweaponviewtodelta( var_1, "tag_player", 1.0, 0, 0, 0, 0, 1 );
self setplayerangles( var_1 gettagangles( "tag_player" ) );
var_1 thread maps\mp\killstreaks\_helicopter::heli_targeting();
var_1.gunner = self;
self.heliridelifeid = var_0;
thread endrideonairshipdone( var_1 );
thread waitsetthermal( 1.0, var_1 );
thread maps\mp\_utility::reinitializethermal( var_1 );
for (;;)
{
var_1 waittill( "turret_fire" );
var_1 fireweapon();
earthquake( 0.2, 1, var_1.origin, 1000 );
}
}
waitsetthermal( var_0, var_1 )
{
self endon( "disconnect" );
var_1 endon( "death" );
var_1 endon( "helicopter_done" );
var_1 endon( "crashing" );
var_1 endon( "leaving" );
wait( var_0 );
self visionsetthermalforplayer( level.ac130.enhanced_vision, 0 );
self.lastvisionsetthermal = level.ac130.enhanced_vision;
self thermalvisionon();
self thermalvisionfofoverlayon();
}
showdefendprompt( var_0 )
{
self endon( "disconnect" );
var_0 endon( "helicopter_done" );
self.escort_prompt = maps\mp\gametypes\_hud_util::createfontstring( "bigfixed", 1.5 );
self.escort_prompt maps\mp\gametypes\_hud_util::setpoint( "CENTER", "CENTER", 0, -150 );
self.escort_prompt settext( level.ospreysettings[var_0.ospreytype].prompt );
wait 6;
if ( isdefined( self.escort_prompt ) )
self.escort_prompt maps\mp\gametypes\_hud_util::destroyelem();
}
airshippitchpropsup()
{
self endon( "crashing" );
self endon( "death" );
stopfxontag( level.chopper_fx["anim"]["blades_static_down"][level.ospreysettings[self.ospreytype].modelbase], self, "TAG_BLADES_ATTACH" );
playfxontag( level.chopper_fx["anim"]["blades_anim_up"][level.ospreysettings[self.ospreytype].modelbase], self, "TAG_BLADES_ATTACH" );
wait 1.0;
if ( isdefined( self ) )
{
playfxontag( level.chopper_fx["anim"]["blades_static_up"][level.ospreysettings[self.ospreytype].modelbase], self, "TAG_BLADES_ATTACH" );
self.propsstate = "up";
}
}
airshippitchpropsdown()
{
self endon( "crashing" );
self endon( "death" );
stopfxontag( level.chopper_fx["anim"]["blades_static_up"][level.ospreysettings[self.ospreytype].modelbase], self, "TAG_BLADES_ATTACH" );
playfxontag( level.chopper_fx["anim"]["blades_anim_down"][level.ospreysettings[self.ospreytype].modelbase], self, "TAG_BLADES_ATTACH" );
wait 1.0;
if ( isdefined( self ) )
{
playfxontag( level.chopper_fx["anim"]["blades_static_down"][level.ospreysettings[self.ospreytype].modelbase], self, "TAG_BLADES_ATTACH" );
self.propsstate = "down";
}
}
airshippitchhatchup()
{
self endon( "crashing" );
self endon( "death" );
stopfxontag( level.chopper_fx["anim"]["hatch_left_static_down"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchl );
playfxontag( level.chopper_fx["anim"]["hatch_left_anim_up"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchl );
stopfxontag( level.chopper_fx["anim"]["hatch_right_static_down"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchr );
playfxontag( level.chopper_fx["anim"]["hatch_right_anim_up"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchr );
wait 1.0;
if ( isdefined( self ) )
{
playfxontag( level.chopper_fx["anim"]["hatch_left_static_up"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchl );
playfxontag( level.chopper_fx["anim"]["hatch_right_static_up"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchr );
self.hatchstate = "up";
}
}
airshippitchhatchdown()
{
self endon( "crashing" );
self endon( "death" );
stopfxontag( level.chopper_fx["anim"]["hatch_left_static_up"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchl );
playfxontag( level.chopper_fx["anim"]["hatch_left_anim_down"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchl );
stopfxontag( level.chopper_fx["anim"]["hatch_right_static_up"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchr );
playfxontag( level.chopper_fx["anim"]["hatch_right_anim_down"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchr );
wait 1.0;
if ( isdefined( self ) )
{
playfxontag( level.chopper_fx["anim"]["hatch_left_static_down"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchl );
playfxontag( level.chopper_fx["anim"]["hatch_right_static_down"][level.ospreysettings[self.ospreytype].modelbase], self, level.ospreysettings[self.ospreytype].taghatchr );
self.hatchstate = "down";
}
self notify( "hatch_down" );
}
getbestheight( var_0 )
{
self endon( "helicopter_removed" );
self endon( "heightReturned" );
var_1 = getent( "airstrikeheight", "targetname" );
if ( isdefined( var_1 ) )
var_2 = var_1.origin[2];
else if ( isdefined( level.airstrikeheightscale ) )
var_2 = 850 * level.airstrikeheightscale;
else
var_2 = 850;
self.bestheight = var_2;
var_3 = 200;
var_4 = 0;
var_5 = 0;
for ( var_6 = 0; var_6 < 125; var_6++ )
{
wait 0.05;
var_7 = var_6 % 8;
var_8 = var_6 * 3;
switch ( var_7 )
{
case 0:
var_4 = var_8;
var_5 = var_8;
break;
case 1:
var_4 = var_8 * -1;
var_5 = var_8 * -1;
break;
case 2:
var_4 = var_8 * -1;
var_5 = var_8;
break;
case 3:
var_4 = var_8;
var_5 = var_8 * -1;
break;
case 4:
var_4 = 0;
var_5 = var_8 * -1;
break;
case 5:
var_4 = var_8 * -1;
var_5 = 0;
break;
case 6:
var_4 = var_8;
var_5 = 0;
break;
case 7:
var_4 = 0;
var_5 = var_8;
break;
default:
break;
}
var_9 = bullettrace( var_0 + ( var_4, var_5, 1000 ), var_0 + ( var_4, var_5, -10000 ), 1, self );
if ( var_9["position"][2] > var_3 )
var_3 = var_9["position"][2];
}
self.bestheight = var_3 + 300;
switch ( getdvar( "mapname" ) )
{
case "mp_morningwood":
self.bestheight = self.bestheight + 600;
break;
case "mp_overwatch":
var_10 = level.spawnpoints;
var_11 = var_10[0];
var_12 = var_10[0];
foreach ( var_14 in var_10 )
{
if ( var_14.origin[2] < var_11.origin[2] )
var_11 = var_14;
if ( var_14.origin[2] > var_12.origin[2] )
var_12 = var_14;
}
if ( var_3 < var_11.origin[2] - 100 )
self.bestheight = var_12.origin[2] + 900;
break;
}
}
airshipflydefense( var_0, var_1, var_2, var_3, var_4, var_5 )
{
self notify( "airshipFlyDefense" );
self endon( "airshipFlyDefense" );
self endon( "helicopter_removed" );
self endon( "death" );
self endon( "leaving" );
thread getbestheight( var_2 );
maps\mp\killstreaks\_helicopter::heli_fly_simple_path( var_1 );
self.pathgoal = var_2;
var_6 = self.angles;
self setyawspeed( 30, 30, 30, 0.3 );
var_7 = self.origin;
var_8 = self.angles[1];
var_9 = self.angles[0];
self.timeout = level.ospreysettings[self.ospreytype].timeout;
self setvehgoalpos( var_2, 1 );
var_10 = gettime();
self waittill( "goal" );
var_11 = ( gettime() - var_10 ) * 0.001;
self.timeout = self.timeout - var_11;
thread airshippitchpropsup();
var_12 = var_2 * ( 1, 1, 0 );
var_12 = var_12 + ( 0, 0, self.bestheight );
self vehicle_setspeed( 25, 10, 10 );
self setyawspeed( 20, 10, 10, 0.3 );
self setvehgoalpos( var_12, 1 );
var_10 = gettime();
self waittill( "goal" );
var_11 = ( gettime() - var_10 ) * 0.001;
self.timeout = self.timeout - var_11;
self sethoverparams( 65, 50, 50 );
ospreydropcrateslowimpulse( 1, level.ospreysettings[self.ospreytype].tagdropcrates, var_12 );
thread killguysnearcrates( var_5 );
if ( isdefined( var_0 ) )
var_0 common_scripts\utility::waittill_any_timeout( self.timeout, "disconnect" );
self waittill( "leaving" );
self notify( "osprey_leaving" );
thread airshippitchpropsdown();
}
wait_and_delete( var_0 )
{
self endon( "death" );
level endon( "game_ended" );
wait( var_0 );
self delete();
}
killguysnearcrates( var_0 )
{
self endon( "osprey_leaving" );
self endon( "helicopter_removed" );
self endon( "death" );
var_1 = var_0;
for (;;)
{
foreach ( var_3 in level.players )
{
wait 0.05;
if ( !isdefined( self ) )
return;
if ( !isdefined( var_3 ) )
continue;
if ( !maps\mp\_utility::isreallyalive( var_3 ) )
continue;
if ( !self.owner maps\mp\_utility::isenemy( var_3 ) )
continue;
if ( var_3 maps\mp\_utility::_hasperk( "specialty_blindeye" ) )
continue;
if ( distancesquared( var_1, var_3.origin ) > 500000 )
continue;
thread aishootplayer( var_3, var_1 );
waitforconfirmation();
}
}
}
aishootplayer( var_0, var_1 )
{
self notify( "aiShootPlayer" );
self endon( "aiShootPlayer" );
self endon( "helicopter_removed" );
self endon( "leaving" );
var_0 endon( "death" );
self setturrettargetent( var_0 );
self setlookatent( var_0 );
thread targetdeathwaiter( var_0 );
var_2 = 6;
var_3 = 2;
for (;;)
{
var_2--;
self fireweapon( "tag_flash", var_0 );
wait 0.15;
if ( var_2 <= 0 )
{
var_3--;
var_2 = 6;
if ( distancesquared( var_0.origin, var_1 ) > 500000 || var_3 <= 0 || !maps\mp\_utility::isreallyalive( var_0 ) )
{
self notify( "abandon_target" );
return;
}
wait 1;
}
}
}
targetdeathwaiter( var_0 )
{
self endon( "abandon_target" );
self endon( "leaving" );
self endon( "helicopter_removed" );
var_0 waittill( "death" );
self notify( "target_killed" );
}
waitforconfirmation()
{
self endon( "helicopter_removed" );
self endon( "leaving" );
self endon( "target_killed" );
self endon( "abandon_target" );
for (;;)
wait 0.05;
}
airshipflygunner( var_0, var_1, var_2, var_3, var_4 )
{
self notify( "airshipFlyGunner" );
self endon( "airshipFlyGunner" );
self endon( "helicopter_removed" );
self endon( "death" );
self endon( "leaving" );
thread getbestheight( var_2 );
maps\mp\killstreaks\_helicopter::heli_fly_simple_path( var_1 );
thread maps\mp\killstreaks\_helicopter::heli_leave_on_timeout( level.ospreysettings[self.ospreytype].timeout );
var_5 = self.angles;
self setyawspeed( 30, 30, 30, 0.3 );
var_6 = self.origin;
var_7 = self.angles[1];
var_8 = self.angles[0];
self.timeout = level.ospreysettings[self.ospreytype].timeout;
self setvehgoalpos( var_2, 1 );
var_9 = gettime();
self waittill( "goal" );
var_10 = ( gettime() - var_9 ) * 0.001;
self.timeout = self.timeout - var_10;
thread airshippitchpropsup();
var_11 = var_2 * ( 1, 1, 0 );
var_11 = var_11 + ( 0, 0, self.bestheight );
self vehicle_setspeed( 25, 10, 10 );
self setyawspeed( 20, 10, 10, 0.3 );
self setvehgoalpos( var_11, 1 );
var_9 = gettime();
self waittill( "goal" );
var_10 = ( gettime() - var_9 ) * 0.001;
self.timeout = self.timeout - var_10;
ospreydropcrates( 1, level.ospreysettings[self.ospreytype].tagdropcrates, var_11 );
var_12 = 1.0;
if ( isdefined( var_0 ) )
var_0 common_scripts\utility::waittill_any_timeout( var_12, "disconnect" );
self.timeout = self.timeout - var_12;
self setvehgoalpos( var_2, 1 );
var_9 = gettime();
self waittill( "goal" );
var_10 = ( gettime() - var_9 ) * 0.001;
self.timeout = self.timeout - var_10;
var_13 = getentarray( "heli_attack_area", "targetname" );
var_14 = level.heli_loop_nodes[randomint( level.heli_loop_nodes.size )];
if ( var_13.size )
thread maps\mp\killstreaks\_helicopter::heli_fly_well( var_13 );
else
thread maps\mp\killstreaks\_helicopter::heli_fly_loop_path( var_14 );
self waittill( "leaving" );
thread airshippitchpropsdown();
}
ospreydropcrateslowimpulse( var_0, var_1, var_2 )
{
thread airshippitchhatchdown();
self waittill( "hatch_down" );
level notify( "escort_airdrop_started", self );
var_3[0] = thread maps\mp\killstreaks\_airdrop::dropthecrate( undefined, self.droptype, undefined, 0, undefined, self.origin, ( randomint( 10 ), randomint( 10 ), randomint( 10 ) ), undefined, var_1 );
wait 0.05;
self notify( "drop_crate" );
wait( var_0 );
var_3[1] = thread maps\mp\killstreaks\_airdrop::dropthecrate( undefined, self.droptype, undefined, 0, undefined, self.origin, ( randomint( 100 ), randomint( 100 ), randomint( 100 ) ), var_3, var_1 );
wait 0.05;
self notify( "drop_crate" );
wait( var_0 );
var_3[2] = thread maps\mp\killstreaks\_airdrop::dropthecrate( undefined, self.droptype, undefined, 0, undefined, self.origin, ( randomint( 50 ), randomint( 50 ), randomint( 50 ) ), var_3, var_1 );
wait 0.05;
self notify( "drop_crate" );
wait( var_0 );
var_3[3] = thread maps\mp\killstreaks\_airdrop::dropthecrate( undefined, self.droptype, undefined, 0, undefined, self.origin, ( randomintrange( -100, 0 ), randomintrange( -100, 0 ), randomintrange( -100, 0 ) ), var_3, var_1 );
wait 0.05;
self notify( "drop_crate" );
wait( var_0 );
thread maps\mp\killstreaks\_airdrop::dropthecrate( undefined, self.droptype, undefined, 0, undefined, self.origin, ( randomintrange( -50, 0 ), randomintrange( -50, 0 ), randomintrange( -50, 0 ) ), var_3, var_1 );
wait 0.05;
self notify( "drop_crate" );
wait 1.0;
thread airshippitchhatchup();
}
ospreydropcrates( var_0, var_1, var_2 )
{
thread airshippitchhatchdown();
self waittill( "hatch_down" );
var_3[0] = thread maps\mp\killstreaks\_airdrop::dropthecrate( undefined, self.droptype, undefined, 0, undefined, self.origin, ( randomint( 10 ), randomint( 10 ), randomint( 10 ) ), undefined, var_1 );
wait 0.05;
self.timeout = self.timeout - 0.05;
self notify( "drop_crate" );
wait( var_0 );
self.timeout = self.timeout - var_0;
var_3[1] = thread maps\mp\killstreaks\_airdrop::dropthecrate( undefined, self.droptype, undefined, 0, undefined, self.origin, ( randomint( 100 ), randomint( 100 ), randomint( 100 ) ), var_3, var_1 );
wait 0.05;
self.timeout = self.timeout - 0.05;
self notify( "drop_crate" );
wait( var_0 );
self.timeout = self.timeout - var_0;
var_3[2] = thread maps\mp\killstreaks\_airdrop::dropthecrate( undefined, self.droptype, undefined, 0, undefined, self.origin, ( randomint( 50 ), randomint( 50 ), randomint( 50 ) ), var_3, var_1 );
wait 0.05;
self.timeout = self.timeout - 0.05;
self notify( "drop_crate" );
wait 1.0;
thread airshippitchhatchup();
}
endride( var_0 )
{
if ( isdefined( self.escort_prompt ) )
self.escort_prompt maps\mp\gametypes\_hud_util::destroyelem();
self remotecamerasoundscapeoff();
self thermalvisionoff();
self thermalvisionfofoverlayoff();
self unlink();
maps\mp\_utility::clearusingremote();
if ( getdvarint( "camera_thirdPerson" ) )
maps\mp\_utility::setthirdpersondof( 1 );
self visionsetthermalforplayer( game["thermal_vision"], 0 );
if ( isdefined( var_0 ) )
var_0 vehicleturretcontroloff( self );
self notify( "heliPlayer_removed" );
self switchtoweapon( common_scripts\utility::getlastweapon() );
self takeweapon( "heli_remote_mp" );
}
endrideonairshipdone( var_0 )
{
self endon( "disconnect" );
var_0 waittill( "helicopter_done" );
endride( var_0 );
}

View File

@ -0,0 +1,369 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
flares_monitor( var_0 )
{
self.flaresreservecount = var_0;
self.flareslive = [];
thread ks_laserguidedmissile_handleincoming();
}
flares_playfx()
{
for ( var_0 = 0; var_0 < 10; var_0++ )
{
if ( !isdefined( self ) )
return;
playfxontag( level._effect["vehicle_flares"], self, "TAG_FLARE" );
wait 0.15;
}
}
flares_deploy()
{
var_0 = spawn( "script_origin", self.origin + ( 0, 0, -256 ) );
var_0.angles = self.angles;
var_0 movegravity( ( 0, 0, -1 ), 5.0 );
self.flareslive[self.flareslive.size] = var_0;
var_0 thread flares_deleteaftertime( 5.0, 2.0, self );
playsoundatpos( var_0.origin, "veh_helo_flares_npc" );
return var_0;
}
flares_deleteaftertime( var_0, var_1, var_2 )
{
if ( isdefined( var_1 ) && isdefined( var_2 ) )
{
var_0 = var_0 - var_1;
wait( var_1 );
if ( isdefined( var_2 ) )
var_2.flareslive = common_scripts\utility::array_remove( var_2.flareslive, self );
}
wait( var_0 );
self delete();
}
flares_getnumleft( var_0 )
{
return var_0.flaresreservecount;
}
flares_areavailable( var_0 )
{
flares_cleanflareslivearray( var_0 );
return var_0.flaresreservecount > 0 || var_0.flareslive.size > 0;
}
flares_getflarereserve( var_0 )
{
var_0.flaresreservecount--;
var_0 thread flares_playfx();
var_1 = var_0 flares_deploy();
return var_1;
}
flares_cleanflareslivearray( var_0 )
{
var_0.flareslive = common_scripts\utility::array_removeundefined( var_0.flareslive );
}
flares_getflarelive( var_0 )
{
flares_cleanflareslivearray( var_0 );
var_1 = undefined;
if ( var_0.flareslive.size > 0 )
var_1 = var_0.flareslive[var_0.flareslive.size - 1];
return var_1;
}
ks_laserguidedmissile_handleincoming()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "crashing" );
self endon( "leaving" );
self endon( "helicopter_done" );
while ( flares_areavailable( self ) )
{
level waittill( "laserGuidedMissiles_incoming", var_0, var_1, var_2 );
if ( !isdefined( var_2 ) || var_2 != self )
continue;
foreach ( var_4 in var_1 )
{
if ( isvalidmissile( var_4 ) )
level thread ks_laserguidedmissile_monitorproximity( var_4, var_0, var_0.team, var_2 );
}
}
}
ks_laserguidedmissile_monitorproximity( var_0, var_1, var_2, var_3 )
{
var_3 endon( "death" );
var_0 endon( "death" );
var_0 endon( "missile_targetChanged" );
while ( flares_areavailable( var_3 ) )
{
if ( !isdefined( var_3 ) || !isvalidmissile( var_0 ) )
break;
var_4 = var_3 getpointinbounds( 0, 0, 0 );
if ( distancesquared( var_0.origin, var_4 ) < 4000000 )
{
var_5 = flares_getflarelive( var_3 );
if ( !isdefined( var_5 ) )
var_5 = flares_getflarereserve( var_3 );
var_0 missile_settargetent( var_5 );
var_0 notify( "missile_pairedWithFlare" );
break;
}
common_scripts\utility::waitframe();
}
}
flares_handleincomingsam( var_0 )
{
level endon( "game_ended" );
self endon( "death" );
self endon( "crashing" );
self endon( "leaving" );
self endon( "helicopter_done" );
for (;;)
{
level waittill( "sam_fired", var_1, var_2, var_3 );
if ( !isdefined( var_3 ) || var_3 != self )
continue;
if ( isdefined( var_0 ) )
{
level thread [[ var_0 ]]( var_1, var_1.team, var_3, var_2 );
continue;
}
level thread flares_watchsamproximity( var_1, var_1.team, var_3, var_2 );
}
}
flares_watchsamproximity( var_0, var_1, var_2, var_3 )
{
level endon( "game_ended" );
var_2 endon( "death" );
for (;;)
{
var_4 = var_2 getpointinbounds( 0, 0, 0 );
var_5 = [];
for ( var_6 = 0; var_6 < var_3.size; var_6++ )
{
if ( isdefined( var_3[var_6] ) )
var_5[var_6] = distance( var_3[var_6].origin, var_4 );
}
for ( var_6 = 0; var_6 < var_5.size; var_6++ )
{
if ( isdefined( var_5[var_6] ) )
{
if ( var_5[var_6] < 4000 && var_2.flaresreservecount > 0 )
{
var_2.flaresreservecount--;
var_2 thread flares_playfx();
var_7 = var_2 flares_deploy();
for ( var_8 = 0; var_8 < var_3.size; var_8++ )
{
if ( isdefined( var_3[var_8] ) )
{
var_3[var_8] missile_settargetent( var_7 );
var_3[var_8] notify( "missile_pairedWithFlare" );
}
}
return;
}
}
}
wait 0.05;
}
}
flares_handleincomingstinger( var_0 )
{
level endon( "game_ended" );
self endon( "death" );
self endon( "crashing" );
self endon( "leaving" );
self endon( "helicopter_done" );
for (;;)
{
level waittill( "stinger_fired", var_1, var_2, var_3 );
if ( !isdefined( var_3 ) || var_3 != self )
continue;
if ( isdefined( var_0 ) )
{
var_2 thread [[ var_0 ]]( var_1, var_1.team, var_3 );
continue;
}
var_2 thread flares_watchstingerproximity( var_1, var_1.team, var_3 );
}
}
flares_watchstingerproximity( var_0, var_1, var_2 )
{
self endon( "death" );
for (;;)
{
if ( !isdefined( var_2 ) )
break;
var_3 = var_2 getpointinbounds( 0, 0, 0 );
var_4 = distance( self.origin, var_3 );
if ( var_4 < 4000 && var_2.flaresreservecount > 0 )
{
var_2.flaresreservecount--;
var_2 thread flares_playfx();
var_5 = var_2 flares_deploy();
self missile_settargetent( var_5 );
self notify( "missile_pairedWithFlare" );
return;
}
wait 0.05;
}
}
ks_setup_manual_flares( var_0, var_1, var_2, var_3 )
{
self.flaresreservecount = var_0;
self.flareslive = [];
if ( isdefined( var_2 ) )
self.owner setclientomnvar( var_2, var_0 );
thread ks_manualflares_watchuse( var_1, var_2 );
thread ks_manualflares_handleincoming( var_3 );
}
ks_manualflares_watchuse( var_0, var_1 )
{
level endon( "game_ended" );
self endon( "death" );
self endon( "crashing" );
self endon( "leaving" );
self endon( "helicopter_done" );
if ( !isai( self.owner ) )
self.owner notifyonplayercommand( "manual_flare_popped", var_0 );
while ( flares_getnumleft( self ) )
{
self.owner waittill( "manual_flare_popped" );
var_2 = flares_getflarereserve( self );
if ( isdefined( var_2 ) && isdefined( self.owner ) && !isai( self.owner ) )
{
self.owner playlocalsound( "veh_helo_flares_plr" );
if ( isdefined( var_1 ) )
self.owner setclientomnvar( var_1, flares_getnumleft( self ) );
}
}
}
ks_manualflares_handleincoming( var_0 )
{
level endon( "game_ended" );
self endon( "death" );
self endon( "crashing" );
self endon( "leaving" );
self endon( "helicopter_done" );
while ( flares_areavailable( self ) )
{
self waittill( "targeted_by_incoming_missile", var_1 );
if ( !isdefined( var_1 ) )
continue;
self.owner playlocalsound( "missile_incoming" );
self.owner thread ks_watch_death_stop_sound( self, "missile_incoming" );
if ( isdefined( var_0 ) )
{
var_2 = vectornormalize( var_1[0].origin - self.origin );
var_3 = vectornormalize( anglestoright( self.angles ) );
var_4 = vectordot( var_2, var_3 );
var_5 = 1;
if ( var_4 > 0 )
var_5 = 2;
else if ( var_4 < 0 )
var_5 = 3;
self.owner setclientomnvar( var_0, var_5 );
}
foreach ( var_7 in var_1 )
{
if ( isvalidmissile( var_7 ) )
thread ks_manualflares_monitorproximity( var_7 );
}
}
}
ks_manualflares_monitorproximity( var_0 )
{
self endon( "death" );
var_0 endon( "death" );
for (;;)
{
if ( !isdefined( self ) || !isvalidmissile( var_0 ) )
break;
var_1 = self getpointinbounds( 0, 0, 0 );
if ( distancesquared( var_0.origin, var_1 ) < 4000000 )
{
var_2 = flares_getflarelive( self );
if ( isdefined( var_2 ) )
{
var_0 missile_settargetent( var_2 );
var_0 notify( "missile_pairedWithFlare" );
self.owner stoplocalsound( "missile_incoming" );
break;
}
}
common_scripts\utility::waitframe();
}
}
ks_watch_death_stop_sound( var_0, var_1 )
{
self endon( "disconnect" );
var_0 waittill( "death" );
self stoplocalsound( var_1 );
}

View File

@ -0,0 +1,174 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
precachelocationselector( "map_artillery_selector" );
var_0 = spawnstruct();
var_0.modelnames = [];
var_0.modelnames["allies"] = "vehicle_mig29_desert";
var_0.modelnames["axis"] = "vehicle_mig29_desert";
var_0.inboundsfx = "veh_mig29_dist_loop";
var_0.compassiconfriendly = "compass_objpoint_airstrike_friendly";
var_0.compassiconenemy = "compass_objpoint_airstrike_busy";
var_0.speed = 5000;
var_0.halfdistance = 15000;
var_0.heightrange = 500;
var_0.outboundflightanim = "airstrike_mp_roll";
var_0.onattackdelegate = ::dropbombs;
var_0.onflybycompletedelegate = ::cleanupflyby;
var_0.choosedirection = 1;
var_0.selectlocationvo = "KS_hqr_airstrike";
var_0.inboundvo = "KS_ast_inbound";
var_0.bombmodel = "projectile_cbu97_clusterbomb";
var_0.numbombs = 3;
var_0.distancebetweenbombs = 350;
var_0.effectradius = 200;
var_0.effectheight = 120;
var_0.effectvfx = loadfx( "fx/smoke/poisonous_gas_linger_medium_thick_killer_instant" );
var_0.effectmindelay = 0.25;
var_0.effectmaxdelay = 0.5;
var_0.effectlifespan = 13;
var_0.effectcheckfrequency = 1.0;
var_0.effectdamage = 10;
var_0.obitweapon = "gas_strike_mp";
var_0.killcamoffset = ( 0, 0, 60 );
level.planeconfigs["gas_airstrike"] = var_0;
level.killstreakfuncs["gas_airstrike"] = ::onuse;
}
onuse( var_0, var_1 )
{
var_2 = maps\mp\_utility::getotherteam( self.team );
if ( isdefined( level.numgasstrikeactive ) )
{
self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
return 0;
}
else
{
var_3 = maps\mp\killstreaks\_plane::selectairstrikelocation( var_0, "gas_airstrike", ::dostrike );
return isdefined( var_3 ) && var_3;
}
}
dostrike( var_0, var_1, var_2, var_3 )
{
level.numgasstrikeactive = 0;
wait 1;
var_4 = maps\mp\killstreaks\_plane::getplaneflyheight();
var_5 = anglestoforward( ( 0, var_2, 0 ) );
dooneflyby( var_3, var_0, var_1, var_5, var_4 );
self waittill( "gas_airstrike_flyby_complete" );
}
dooneflyby( var_0, var_1, var_2, var_3, var_4 )
{
var_5 = level.planeconfigs[var_0];
var_6 = maps\mp\killstreaks\_plane::getflightpath( var_2, var_3, var_5.halfdistance, 1, var_4, var_5.speed, 0, var_0 );
level thread maps\mp\killstreaks\_plane::doflyby( var_1, self, var_1, var_6["startPoint"] + ( 0, 0, randomint( var_5.heightrange ) ), var_6["endPoint"] + ( 0, 0, randomint( var_5.heightrange ) ), var_6["attackTime"], var_6["flyTime"], var_3, var_0 );
}
cleanupflyby( var_0, var_1, var_2 )
{
var_0 notify( "gas_airstrike_flyby_complete" );
}
dropbombs( var_0, var_1, var_2, var_3, var_4 )
{
self endon( "death" );
wait( var_2 );
var_5 = level.planeconfigs[var_4];
var_6 = var_5.numbombs;
var_7 = var_5.distancebetweenbombs / var_5.speed;
while ( var_6 > 0 )
{
thread droponebomb( var_3, var_4 );
var_6--;
wait( var_7 );
}
}
droponebomb( var_0, var_1 )
{
level.numgasstrikeactive++;
var_2 = self;
var_3 = level.planeconfigs[var_1];
var_4 = anglestoforward( var_2.angles );
var_5 = spawnbomb( var_3.bombmodel, var_2.origin, var_2.angles );
var_5 movegravity( var_4 * ( var_3.speed / 1.5 ), 3.0 );
var_6 = spawn( "script_model", var_5.origin );
var_6 setmodel( "tag_origin" );
var_6.origin = var_5.origin;
var_6.angles = var_5.angles;
var_5 setmodel( "tag_origin" );
wait 0.1;
var_7 = var_6.origin;
var_8 = var_6.angles;
if ( level.splitscreen )
playfxontag( level.airstrikessfx, var_6, "tag_origin" );
else
playfxontag( level.airstrikefx, var_6, "tag_origin" );
wait 1.0;
var_9 = bullettrace( var_6.origin, var_6.origin + ( 0, 0, -1000000.0 ), 0, undefined );
var_10 = var_9["position"];
var_5 onbombimpact( var_0, var_10, var_1 );
var_6 delete();
var_5 delete();
level.numgasstrikeactive--;
if ( level.numgasstrikeactive == 0 )
level.numgasstrikeactive = undefined;
}
spawnbomb( var_0, var_1, var_2 )
{
var_3 = spawn( "script_model", var_1 );
var_3.angles = var_2;
var_3 setmodel( var_0 );
return var_3;
}
onbombimpact( var_0, var_1, var_2 )
{
var_3 = level.planeconfigs[var_2];
var_4 = spawn( "trigger_radius", var_1, 0, var_3.effectradius, var_3.effectheight );
var_4.owner = var_0;
var_5 = var_3.effectradius;
var_6 = spawnfx( var_3.effectvfx, var_1 );
triggerfx( var_6 );
wait( randomfloatrange( var_3.effectmindelay, var_3.effectmaxdelay ) );
var_7 = var_3.effectlifespan;
var_8 = spawn( "script_model", var_1 + var_3.killcamoffset );
var_8 linkto( var_4 );
for ( self.killcament = var_8; var_7 > 0.0; var_7 = var_7 - var_3.effectcheckfrequency )
{
foreach ( var_10 in level.characters )
var_10 applygaseffect( var_0, var_1, var_4, self, var_3.effectdamage );
wait( var_3.effectcheckfrequency );
}
self.killcament delete();
var_4 delete();
var_6 delete();
}
applygaseffect( var_0, var_1, var_2, var_3, var_4 )
{
if ( var_0 maps\mp\_utility::isenemy( self ) && isalive( self ) && self istouching( var_2 ) )
{
var_3 radiusdamage( self.origin, 1, var_4, var_4, var_0, "MOD_RIFLE_BULLET", "gas_strike_mp" );
if ( !maps\mp\_utility::isusingremote() )
{
var_5 = maps\mp\perks\_perkfunctions::applystunresistence( 2.0 );
self shellshock( "default", var_5 );
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,402 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
precachevehicle( "attack_littlebird_mp" );
precachemodel( "vehicle_apache_mp" );
precachemodel( "vehicle_apache_mg" );
precacheturret( "apache_minigun_mp" );
precachevehicle( "apache_strafe_mp" );
level.killstreakfuncs["littlebird_flock"] = ::tryuselbflock;
level.heli_flock = [];
}
tryuselbflock( var_0, var_1 )
{
var_2 = 5;
if ( heliflockactive() || maps\mp\_utility::currentactivevehiclecount() >= maps\mp\_utility::maxvehiclesallowed() || level.fauxvehiclecount + var_2 >= maps\mp\_utility::maxvehiclesallowed() )
{
self iprintlnbold( &"KILLSTREAKS_TOO_MANY_VEHICLES" );
return 0;
}
maps\mp\_utility::incrementfauxvehiclecount();
maps\mp\_utility::incrementfauxvehiclecount();
maps\mp\_utility::incrementfauxvehiclecount();
maps\mp\_utility::incrementfauxvehiclecount();
maps\mp\_utility::incrementfauxvehiclecount();
var_3 = selectlbstrikelocation( var_0, "littlebird_flock" );
if ( !isdefined( var_3 ) || !var_3 )
{
maps\mp\_utility::decrementfauxvehiclecount();
maps\mp\_utility::decrementfauxvehiclecount();
maps\mp\_utility::decrementfauxvehiclecount();
maps\mp\_utility::decrementfauxvehiclecount();
maps\mp\_utility::decrementfauxvehiclecount();
return 0;
}
level thread maps\mp\_utility::teamplayercardsplash( "used_littlebird_flock", self, self.team );
return 1;
}
heliflockactive()
{
var_0 = 0;
for ( var_1 = 0; var_1 < level.heli_flock.size; var_1++ )
{
if ( isdefined( level.heli_flock[var_1] ) )
{
var_0 = 1;
break;
}
}
return var_0;
}
selectlbstrikelocation( var_0, var_1 )
{
self playlocalsound( game["voice"][self.team] + "KS_lbd_inposition" );
maps\mp\_utility::_beginlocationselection( var_1, "map_artillery_selector", 1, 500 );
self endon( "stop_location_selection" );
self waittill( "confirm_location", var_2, var_3 );
if ( heliflockactive() || maps\mp\_utility::currentactivevehiclecount() >= maps\mp\_utility::maxvehiclesallowed() || level.fauxvehiclecount >= maps\mp\_utility::maxvehiclesallowed() )
{
self iprintlnbold( &"KILLSTREAKS_TOO_MANY_VEHICLES" );
self notify( "cancel_location" );
return 0;
}
level.heli_flock = [];
level.heli_flock_victims = [];
thread littlebirdmadeselectionvo();
thread finishlbstrikeusage( var_0, var_2, ::callstrike, var_3 );
self setblurforplayer( 0, 0.3 );
return 1;
}
littlebirdmadeselectionvo()
{
self endon( "death" );
self endon( "disconnect" );
self playlocalsound( game["voice"][self.team] + "KS_hqr_littlebird" );
wait 3.0;
self playlocalsound( game["voice"][self.team] + "KS_lbd_inbound" );
}
finishlbstrikeusage( var_0, var_1, var_2, var_3 )
{
self notify( "used" );
wait 0.05;
thread maps\mp\_utility::stoplocationselection( 0 );
if ( isdefined( self ) )
self thread [[ var_2 ]]( var_0, var_1, var_3 );
}
callstrike( var_0, var_1, var_2 )
{
level endon( "game_ended" );
self endon( "disconnect" );
thread handleownerleft();
var_3 = getflightpath( var_1, var_2, 0 );
var_4 = getflightpath( var_1, var_2, -520 );
var_5 = getflightpath( var_1, var_2, 520 );
var_6 = getflightpath( var_1, var_2, -1040 );
var_7 = getflightpath( var_1, var_2, 1040 );
level thread dolbstrike( var_0, self, var_3, 0 );
wait 0.3;
level thread dolbstrike( var_0, self, var_4, 1 );
level thread dolbstrike( var_0, self, var_5, 2 );
wait 0.3;
level thread dolbstrike( var_0, self, var_6, 3 );
level thread dolbstrike( var_0, self, var_7, 4 );
maps\mp\_matchdata::logkillstreakevent( "littlebird_flock", var_1 );
}
getflightpath( var_0, var_1, var_2 )
{
var_0 = var_0 * ( 1, 1, 0 );
var_3 = ( 0, var_1, 0 );
var_4 = 12000;
var_5 = [];
if ( isdefined( var_2 ) && var_2 != 0 )
var_0 = var_0 + anglestoright( var_3 ) * var_2 + ( 0, 0, randomint( 300 ) );
var_6 = var_0 + anglestoforward( var_3 ) * ( -1 * var_4 );
var_7 = var_0 + anglestoforward( var_3 ) * var_4;
var_8 = maps\mp\killstreaks\_airdrop::getflyheightoffset( var_0 ) + 256;
var_5["start"] = var_6 + ( 0, 0, var_8 );
var_5["end"] = var_7 + ( 0, 0, var_8 );
return var_5;
}
dolbstrike( var_0, var_1, var_2, var_3 )
{
level endon( "game_ended" );
if ( !isdefined( var_1 ) )
return;
var_4 = vectortoangles( var_2["end"] - var_2["start"] );
var_5 = spawnattacklittlebird( var_1, var_2["start"], var_4, var_3 );
var_5.lifeid = var_0;
var_5.alreadydead = 0;
var_5 thread watchtimeout();
var_5 thread watchdeath();
var_5 thread flock_handledamage();
var_5 thread startlbfiring1();
var_5 thread monitorkills();
var_5 endon( "death" );
var_5 setmaxpitchroll( 120, 60 );
var_5 vehicle_setspeed( 48, 48 );
var_5 setvehgoalpos( var_2["end"], 0 );
var_5 waittill( "goal" );
var_5 setmaxpitchroll( 30, 40 );
var_5 vehicle_setspeed( 32, 32 );
var_5 setvehgoalpos( var_2["start"], 0 );
wait 2;
var_5 setmaxpitchroll( 100, 60 );
var_5 vehicle_setspeed( 64, 64 );
var_5 waittill( "goal" );
var_5 notify( "gone" );
var_5 maps\mp\killstreaks\_helicopter::removelittlebird();
}
spawnattacklittlebird( var_0, var_1, var_2, var_3 )
{
var_4 = spawnhelicopter( var_0, var_1, var_2, "apache_strafe_mp", "vehicle_apache_mp" );
if ( !isdefined( var_4 ) )
return;
var_4 maps\mp\killstreaks\_helicopter::addtolittlebirdlist();
var_4 thread maps\mp\killstreaks\_helicopter::removefromlittlebirdlistondeath();
var_4.health = 999999;
var_4.maxhealth = 2000;
var_4.damagetaken = 0;
var_4 setcandamage( 1 );
var_4.owner = var_0;
var_4.team = var_0.team;
var_4.killcount = 0;
var_4.streakname = "littlebird_flock";
var_4.helitype = "littlebird";
var_4.specialdamagecallback = ::callback_vehicledamage;
var_5 = spawnturret( "misc_turret", var_4.origin, "apache_minigun_mp" );
var_5 linkto( var_4, "tag_turret", ( 0, 0, 0 ), ( 0, 0, 0 ) );
var_5 setmodel( "vehicle_apache_mg" );
var_5.angles = var_4.angles;
var_5.owner = var_4.owner;
var_5.team = var_5.owner.team;
var_5 maketurretinoperable();
var_5.vehicle = var_4;
var_6 = var_4.origin + ( anglestoforward( var_4.angles ) * -200 + anglestoright( var_4.angles ) * -200 ) + ( 0, 0, 50 );
var_5.killcament = spawn( "script_model", var_6 );
var_5.killcament setscriptmoverkillcam( "explosive" );
var_5.killcament linkto( var_4, "tag_origin" );
var_4.mgturret1 = var_5;
var_4.mgturret1 setdefaultdroppitch( 0 );
var_4.mgturret1 setmode( "auto_nonai" );
var_4.mgturret1 setsentryowner( var_4.owner );
if ( level.teambased )
var_4.mgturret1 setturretteam( var_4.owner.team );
level.heli_flock[var_3] = var_4;
return var_4;
}
watchtimeout()
{
level endon( "game_ended" );
self endon( "gone" );
self endon( "death" );
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 60.0 );
self notify( "death" );
}
monitorkills()
{
level endon( "game_ended" );
self endon( "gone" );
self endon( "death" );
self endon( "stopFiring" );
for (;;)
{
self waittill( "killedPlayer", var_0 );
self.killcount++;
level.heli_flock_victims[level.heli_flock_victims.size] = var_0;
}
}
startlbfiring1()
{
self endon( "gone" );
self endon( "death" );
self endon( "stopFiring" );
for (;;)
{
self.mgturret1 waittill( "turret_on_target" );
var_0 = 1;
var_1 = self.mgturret1 getturrettarget( 0 );
foreach ( var_3 in level.heli_flock_victims )
{
if ( var_1 == var_3 )
{
self.mgturret1 cleartargetentity();
var_0 = 0;
break;
}
}
if ( var_0 )
self.mgturret1 shootturret();
}
}
handleownerleft()
{
level endon( "game_ended" );
self endon( "flock_done" );
thread notifyonflockdone();
self waittill( "killstreak_disowned" );
for ( var_0 = 0; var_0 < level.heli_flock.size; var_0++ )
{
if ( isdefined( level.heli_flock[var_0] ) )
level.heli_flock[var_0] notify( "stopFiring" );
}
for ( var_0 = 0; var_0 < level.heli_flock.size; var_0++ )
{
if ( isdefined( level.heli_flock[var_0] ) )
{
level.heli_flock[var_0] notify( "death" );
wait 0.1;
}
}
}
notifyonflockdone()
{
level endon( "game_ended" );
self endon( "disconnect" );
if ( !maps\mp\_utility::bot_is_fireteam_mode() )
{
self endon( "joined_team" );
self endon( "joined_spectators" );
}
while ( heliflockactive() )
wait 0.5;
self notify( "flock_done" );
}
flock_handledamage()
{
self endon( "death" );
level endon( "game_ended" );
for (;;)
{
self waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
if ( isdefined( self.specialdamagecallback ) )
self [[ self.specialdamagecallback ]]( undefined, var_1, var_0, var_8, var_4, var_9, var_3, var_2, undefined, undefined, var_5, var_7 );
}
}
callback_vehicledamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11 )
{
if ( isdefined( self.alreadydead ) && self.alreadydead )
return;
if ( !isdefined( var_1 ) || var_1 == self )
return;
if ( !maps\mp\gametypes\_weapons::friendlyfirecheck( self.owner, var_1 ) )
return;
if ( isdefined( var_3 ) && var_3 & level.idflags_penetration )
self.wasdamagedfrombulletpenetration = 1;
self.wasdamaged = 1;
var_12 = var_2;
if ( isplayer( var_1 ) )
{
var_1 maps\mp\gametypes\_damagefeedback::updatedamagefeedback( "helicopter" );
if ( var_4 == "MOD_RIFLE_BULLET" || var_4 == "MOD_PISTOL_BULLET" )
{
if ( var_1 maps\mp\_utility::_hasperk( "specialty_armorpiercing" ) )
var_12 = var_12 + var_2 * level.armorpiercingmod;
}
}
if ( isdefined( var_1.owner ) && isplayer( var_1.owner ) )
var_1.owner maps\mp\gametypes\_damagefeedback::updatedamagefeedback( "helicopter" );
if ( isdefined( var_5 ) )
{
switch ( var_5 )
{
case "remotemissile_projectile_mp":
case "ac130_40mm_mp":
case "ac130_105mm_mp":
case "javelin_mp":
case "remote_mortar_missile_mp":
case "stinger_mp":
self.largeprojectiledamage = 1;
var_12 = self.maxhealth + 1;
break;
case "sam_projectile_mp":
self.largeprojectiledamage = 1;
var_12 = self.maxhealth * 0.25;
break;
case "emp_grenade_mp":
self.largeprojectiledamage = 0;
var_12 = self.maxhealth + 1;
break;
}
maps\mp\killstreaks\_killstreaks::killstreakhit( var_1, var_5, self );
}
self.damagetaken = self.damagetaken + var_12;
if ( self.damagetaken >= self.maxhealth )
{
if ( isplayer( var_1 ) && ( !isdefined( self.owner ) || var_1 != self.owner ) )
{
self.alreadydead = 1;
var_1 notify( "destroyed_helicopter" );
var_1 notify( "destroyed_killstreak", var_5 );
thread maps\mp\_utility::teamplayercardsplash( "callout_destroyed_helicopter", var_1 );
var_1 thread maps\mp\gametypes\_rank::giverankxp( "kill", 300, var_5, var_4 );
var_1 thread maps\mp\gametypes\_rank::xpeventpopup( "destroyed_helicopter" );
thread maps\mp\gametypes\_missions::vehiclekilled( self.owner, self, undefined, var_1, var_2, var_4, var_5 );
}
self notify( "death" );
}
}
watchdeath()
{
self endon( "gone" );
self waittill( "death" );
thread maps\mp\killstreaks\_helicopter::lbonkilled();
}

View File

@ -0,0 +1,702 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.killstreakfuncs["littlebird_support"] = ::tryuselbsupport;
level.heliguardsettings = [];
level.heliguardsettings["littlebird_support"] = spawnstruct();
level.heliguardsettings["littlebird_support"].timeout = 60.0;
level.heliguardsettings["littlebird_support"].health = 999999;
level.heliguardsettings["littlebird_support"].maxhealth = 2000;
level.heliguardsettings["littlebird_support"].streakname = "littlebird_support";
level.heliguardsettings["littlebird_support"].vehicleinfo = "attack_littlebird_mp";
level.heliguardsettings["littlebird_support"].weaponinfo = "littlebird_guard_minigun_mp";
level.heliguardsettings["littlebird_support"].weaponmodelleft = "vehicle_little_bird_minigun_left";
level.heliguardsettings["littlebird_support"].weaponmodelright = "vehicle_little_bird_minigun_right";
level.heliguardsettings["littlebird_support"].weapontagleft = "tag_flash";
level.heliguardsettings["littlebird_support"].weapontagright = "tag_flash_2";
level.heliguardsettings["littlebird_support"].sentrymode = "auto_nonai";
level.heliguardsettings["littlebird_support"].modelbase = level.littlebird_model;
level.heliguardsettings["littlebird_support"].teamsplash = "used_littlebird_support";
lbsupport_setairstartnodes();
lbsupport_setairnodemesh();
}
tryuselbsupport( var_0, var_1 )
{
var_2 = "littlebird_support";
var_3 = 1;
if ( isdefined( level.littlebirdguard ) || maps\mp\killstreaks\_helicopter::exceededmaxlittlebirds( var_2 ) )
{
self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
return 0;
}
else if ( !level.air_node_mesh.size )
{
self iprintlnbold( &"KILLSTREAKS_UNAVAILABLE_IN_LEVEL" );
return 0;
}
else if ( maps\mp\_utility::currentactivevehiclecount() >= maps\mp\_utility::maxvehiclesallowed() || level.fauxvehiclecount + var_3 >= maps\mp\_utility::maxvehiclesallowed() )
{
self iprintlnbold( &"KILLSTREAKS_TOO_MANY_VEHICLES" );
return 0;
}
maps\mp\_utility::incrementfauxvehiclecount();
var_4 = createlbguard( var_2 );
if ( !isdefined( var_4 ) )
{
maps\mp\_utility::decrementfauxvehiclecount();
return 0;
}
thread startlbsupport( var_4 );
level thread maps\mp\_utility::teamplayercardsplash( level.heliguardsettings[var_2].teamsplash, self, self.team );
return 1;
}
createlbguard( var_0 )
{
var_1 = lbsupport_getcloseststartnode( self.origin );
if ( isdefined( var_1.angles ) )
var_2 = var_1.angles;
else
var_2 = ( 0, 0, 0 );
var_3 = maps\mp\killstreaks\_airdrop::getflyheightoffset( self.origin );
var_4 = lbsupport_getclosestnode( self.origin );
var_5 = anglestoforward( self.angles );
var_6 = var_4.origin * ( 1, 1, 0 ) + ( 0, 0, 1 ) * var_3 + var_5 * -100;
var_7 = var_1.origin;
var_8 = spawnhelicopter( self, var_7, var_2, level.heliguardsettings[var_0].vehicleinfo, level.heliguardsettings[var_0].modelbase );
if ( !isdefined( var_8 ) )
return;
var_8 maps\mp\killstreaks\_helicopter::addtolittlebirdlist();
var_8 thread maps\mp\killstreaks\_helicopter::removefromlittlebirdlistondeath();
var_8.health = level.heliguardsettings[var_0].health;
var_8.maxhealth = level.heliguardsettings[var_0].maxhealth;
var_8.damagetaken = 0;
var_8.speed = 100;
var_8.followspeed = 40;
var_8.owner = self;
var_8 setotherent( self );
var_8.team = self.team;
var_8 setmaxpitchroll( 45, 45 );
var_8 vehicle_setspeed( var_8.speed, 100, 40 );
var_8 setyawspeed( 120, 60 );
var_8 setneargoalnotifydist( 512 );
var_8.killcount = 0;
var_8.helitype = "littlebird";
var_8.heliguardtype = "littlebird_support";
var_8.targettingradius = 2000;
var_8 common_scripts\utility::make_entity_sentient_mp( var_8.team );
var_8.targetpos = var_6;
var_8.currentnode = var_4;
var_9 = spawnturret( "misc_turret", var_8.origin, level.heliguardsettings[var_0].weaponinfo );
var_9 linkto( var_8, level.heliguardsettings[var_0].weapontagleft, ( 0, 0, 0 ), ( 0, 0, 0 ) );
var_9 setmodel( level.heliguardsettings[var_0].weaponmodelleft );
var_9.angles = var_8.angles;
var_9.owner = var_8.owner;
var_9.team = self.team;
var_9 maketurretinoperable();
var_9.vehicle = var_8;
var_8.mgturretleft = var_9;
var_8.mgturretleft setdefaultdroppitch( 0 );
var_10 = var_8.origin + ( anglestoforward( var_8.angles ) * -100 + anglestoright( var_8.angles ) * -100 ) + ( 0, 0, 50 );
var_9.killcament = spawn( "script_model", var_10 );
var_9.killcament setscriptmoverkillcam( "explosive" );
var_9.killcament linkto( var_8, "tag_origin" );
var_9 = spawnturret( "misc_turret", var_8.origin, level.heliguardsettings[var_0].weaponinfo );
var_9 linkto( var_8, level.heliguardsettings[var_0].weapontagright, ( 0, 0, 0 ), ( 0, 0, 0 ) );
var_9 setmodel( level.heliguardsettings[var_0].weaponmodelright );
var_9.angles = var_8.angles;
var_9.owner = var_8.owner;
var_9.team = self.team;
var_9 maketurretinoperable();
var_9.vehicle = var_8;
var_8.mgturretright = var_9;
var_8.mgturretright setdefaultdroppitch( 0 );
var_10 = var_8.origin + ( anglestoforward( var_8.angles ) * -100 + anglestoright( var_8.angles ) * 100 ) + ( 0, 0, 50 );
var_9.killcament = spawn( "script_model", var_10 );
var_9.killcament setscriptmoverkillcam( "explosive" );
var_9.killcament linkto( var_8, "tag_origin" );
if ( level.teambased )
{
var_8.mgturretleft setturretteam( self.team );
var_8.mgturretright setturretteam( self.team );
}
var_8.mgturretleft setmode( level.heliguardsettings[var_0].sentrymode );
var_8.mgturretright setmode( level.heliguardsettings[var_0].sentrymode );
var_8.mgturretleft setsentryowner( self );
var_8.mgturretright setsentryowner( self );
var_8.mgturretleft thread lbsupport_attacktargets();
var_8.mgturretright thread lbsupport_attacktargets();
var_8.attract_strength = 10000;
var_8.attract_range = 150;
var_8.attractor = missile_createattractorent( var_8, var_8.attract_strength, var_8.attract_range );
var_8.hasdodged = 0;
var_8.empgrenaded = 0;
var_8 thread lbsupport_handledamage();
var_8 thread lbsupport_watchdeath();
var_8 thread lbsupport_watchtimeout();
var_8 thread lbsupport_watchownerloss();
var_8 thread lbsupport_watchownerdamage();
var_8 thread lbsupport_watchroundend();
var_8 thread lbsupport_lightfx();
level.littlebirdguard = var_8;
var_8.owner maps\mp\_matchdata::logkillstreakevent( level.heliguardsettings[var_8.heliguardtype].streakname, var_8.targetpos );
return var_8;
}
lbsupport_lightfx()
{
playfxontag( level.chopper_fx["light"]["left"], self, "tag_light_nose" );
wait 0.05;
playfxontag( level.chopper_fx["light"]["belly"], self, "tag_light_belly" );
wait 0.05;
playfxontag( level.chopper_fx["light"]["tail"], self, "tag_light_tail1" );
wait 0.05;
playfxontag( level.chopper_fx["light"]["tail"], self, "tag_light_tail2" );
}
startlbsupport( var_0 )
{
level endon( "game_ended" );
var_0 endon( "death" );
var_0 setlookatent( self );
var_0 setvehgoalpos( var_0.targetpos );
var_0 waittill( "near_goal" );
var_0 vehicle_setspeed( var_0.speed, 60, 30 );
var_0 waittill( "goal" );
var_0 setvehgoalpos( var_0.currentnode.origin, 1 );
var_0 waittill( "goal" );
var_0 thread lbsupport_followplayer();
var_0 thread maps\mp\killstreaks\_flares::flares_handleincomingsam( ::lbsupport_watchsamproximity );
var_0 thread maps\mp\killstreaks\_flares::flares_handleincomingstinger( ::lbsupport_watchstingerproximity );
}
lbsupport_followplayer()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "leaving" );
if ( !isdefined( self.owner ) )
{
thread lbsupport_leave();
return;
}
self.owner endon( "disconnect" );
self endon( "owner_gone" );
self vehicle_setspeed( self.followspeed, 20, 20 );
for (;;)
{
if ( isdefined( self.owner ) && isalive( self.owner ) )
{
var_0 = lbsupport_getclosestlinkednode( self.owner.origin );
if ( isdefined( var_0 ) && var_0 != self.currentnode )
{
self.currentnode = var_0;
lbsupport_movetoplayer();
continue;
}
}
wait 1;
}
}
lbsupport_movetoplayer()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "leaving" );
self.owner endon( "death" );
self.owner endon( "disconnect" );
self endon( "owner_gone" );
self notify( "lbSupport_moveToPlayer" );
self endon( "lbSupport_moveToPlayer" );
self.intransit = 1;
self setvehgoalpos( self.currentnode.origin + ( 0, 0, 100 ), 1 );
self waittill( "goal" );
self.intransit = 0;
self notify( "hit_goal" );
}
lbsupport_watchdeath()
{
level endon( "game_ended" );
self endon( "gone" );
self waittill( "death" );
thread maps\mp\killstreaks\_helicopter::lbonkilled();
}
lbsupport_watchtimeout()
{
level endon( "game_ended" );
self endon( "death" );
self.owner endon( "disconnect" );
self endon( "owner_gone" );
var_0 = level.heliguardsettings[self.heliguardtype].timeout;
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( var_0 );
thread lbsupport_leave();
}
lbsupport_watchownerloss()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "leaving" );
self.owner waittill( "killstreak_disowned" );
self notify( "owner_gone" );
thread lbsupport_leave();
}
lbsupport_watchownerdamage()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "leaving" );
self.owner endon( "disconnect" );
self endon( "owner_gone" );
for (;;)
{
self.owner waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
if ( isplayer( var_1 ) )
{
if ( var_1 != self.owner && distance2d( var_1.origin, self.origin ) <= self.targettingradius && !var_1 maps\mp\_utility::_hasperk( "specialty_blindeye" ) && !( level.hardcoremode && level.teambased && var_1.team == self.team ) )
{
self setlookatent( var_1 );
if ( isdefined( self.mgturretleft ) )
self.mgturretleft settargetentity( var_1 );
if ( isdefined( self.mgturretright ) )
self.mgturretright settargetentity( var_1 );
}
}
}
}
lbsupport_watchroundend()
{
self endon( "death" );
self endon( "leaving" );
self.owner endon( "disconnect" );
self endon( "owner_gone" );
level common_scripts\utility::waittill_any( "round_end_finished", "game_ended" );
thread lbsupport_leave();
}
lbsupport_leave()
{
self endon( "death" );
self notify( "leaving" );
level.littlebirdguard = undefined;
self clearlookatent();
var_0 = maps\mp\killstreaks\_airdrop::getflyheightoffset( self.origin );
var_1 = self.origin + ( 0, 0, var_0 );
self vehicle_setspeed( self.speed, 60 );
self setmaxpitchroll( 45, 180 );
self setvehgoalpos( var_1 );
self waittill( "goal" );
var_1 = var_1 + anglestoforward( self.angles ) * 15000;
var_2 = spawn( "script_origin", var_1 );
if ( isdefined( var_2 ) )
{
self setlookatent( var_2 );
var_2 thread wait_and_delete( 3.0 );
}
self setvehgoalpos( var_1 );
self waittill( "goal" );
self notify( "gone" );
maps\mp\killstreaks\_helicopter::removelittlebird();
}
wait_and_delete( var_0 )
{
self endon( "death" );
level endon( "game_ended" );
wait( var_0 );
self delete();
}
lbsupport_handledamage()
{
self endon( "death" );
level endon( "game_ended" );
self setcandamage( 1 );
for (;;)
{
self waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
if ( !maps\mp\gametypes\_weapons::friendlyfirecheck( self.owner, var_1 ) )
continue;
if ( !isdefined( self ) )
return;
if ( isdefined( var_8 ) && var_8 & level.idflags_penetration )
self.wasdamagedfrombulletpenetration = 1;
self.wasdamaged = 1;
var_10 = var_0;
if ( isplayer( var_1 ) )
{
if ( var_1 != self.owner && distance2d( var_1.origin, self.origin ) <= self.targettingradius && !var_1 maps\mp\_utility::_hasperk( "specialty_blindeye" ) && !( level.hardcoremode && level.teambased && var_1.team == self.team ) )
{
self setlookatent( var_1 );
if ( isdefined( self.mgturretleft ) )
self.mgturretleft settargetentity( var_1 );
if ( isdefined( self.mgturretright ) )
self.mgturretright settargetentity( var_1 );
}
var_1 maps\mp\gametypes\_damagefeedback::updatedamagefeedback( "helicopter" );
if ( var_4 == "MOD_RIFLE_BULLET" || var_4 == "MOD_PISTOL_BULLET" )
{
if ( var_1 maps\mp\_utility::_hasperk( "specialty_armorpiercing" ) )
var_10 = var_10 + var_0 * level.armorpiercingmod;
}
}
if ( isdefined( var_1.owner ) && isplayer( var_1.owner ) )
var_1.owner maps\mp\gametypes\_damagefeedback::updatedamagefeedback( "helicopter" );
if ( isdefined( var_9 ) )
{
switch ( var_9 )
{
case "remotemissile_projectile_mp":
case "ac130_40mm_mp":
case "ac130_105mm_mp":
case "javelin_mp":
case "remote_mortar_missile_mp":
case "stinger_mp":
self.largeprojectiledamage = 1;
var_10 = self.maxhealth + 1;
break;
case "sam_projectile_mp":
self.largeprojectiledamage = 1;
var_10 = self.maxhealth * 0.25;
break;
case "emp_grenade_mp":
var_10 = 0;
thread lbsupport_empgrenaded();
break;
case "osprey_player_minigun_mp":
self.largeprojectiledamage = 0;
var_10 = var_10 * 2;
break;
}
maps\mp\killstreaks\_killstreaks::killstreakhit( var_1, var_9, self );
}
self.damagetaken = self.damagetaken + var_10;
if ( self.damagetaken >= self.maxhealth )
{
if ( isplayer( var_1 ) && ( !isdefined( self.owner ) || var_1 != self.owner ) )
{
var_1 notify( "destroyed_helicopter" );
var_1 notify( "destroyed_killstreak", var_9 );
thread maps\mp\_utility::teamplayercardsplash( "callout_destroyed_little_bird", var_1 );
var_1 thread maps\mp\gametypes\_rank::giverankxp( "kill", 300, var_9, var_4 );
var_1 thread maps\mp\gametypes\_rank::xpeventpopup( "destroyed_little_bird" );
thread maps\mp\gametypes\_missions::vehiclekilled( self.owner, self, undefined, var_1, var_0, var_4, var_9 );
}
if ( isdefined( self.owner ) )
self.owner thread maps\mp\_utility::leaderdialogonplayer( "lbguard_destroyed" );
self notify( "death" );
return;
}
}
}
lbsupport_empgrenaded()
{
self notify( "lbSupport_EMPGrenaded" );
self endon( "lbSupport_EMPGrenaded" );
self endon( "death" );
self.owner endon( "disconnect" );
level endon( "game_ended" );
self.empgrenaded = 1;
if ( isdefined( self.mgturretright ) )
self.mgturretright notify( "stop_shooting" );
if ( isdefined( self.mgturretleft ) )
self.mgturretleft notify( "stop_shooting" );
if ( isdefined( level._effect["ims_sensor_explode"] ) )
{
if ( isdefined( self.mgturretright ) )
playfxontag( common_scripts\utility::getfx( "ims_sensor_explode" ), self.mgturretright, "tag_aim" );
if ( isdefined( self.mgturretleft ) )
playfxontag( common_scripts\utility::getfx( "ims_sensor_explode" ), self.mgturretleft, "tag_aim" );
}
wait 3.5;
self.empgrenaded = 0;
if ( isdefined( self.mgturretright ) )
self.mgturretright notify( "turretstatechange" );
if ( isdefined( self.mgturretleft ) )
self.mgturretleft notify( "turretstatechange" );
}
lbsupport_watchsamproximity( var_0, var_1, var_2, var_3 )
{
level endon( "game_ended" );
var_2 endon( "death" );
for ( var_4 = 0; var_4 < var_3.size; var_4++ )
{
if ( isdefined( var_3[var_4] ) && !var_2.hasdodged )
{
var_2.hasdodged = 1;
var_5 = spawn( "script_origin", var_2.origin );
var_5.angles = var_2.angles;
var_5 movegravity( anglestoright( var_3[var_4].angles ) * -1000, 0.05 );
var_5 thread maps\mp\killstreaks\_flares::flares_deleteaftertime( 5.0 );
for ( var_6 = 0; var_6 < var_3.size; var_6++ )
{
if ( isdefined( var_3[var_6] ) )
var_3[var_6] missile_settargetent( var_5 );
}
var_7 = var_2.origin + anglestoright( var_3[var_4].angles ) * 200;
var_2 vehicle_setspeed( var_2.speed, 100, 40 );
var_2 setvehgoalpos( var_7, 1 );
wait 2.0;
var_2 vehicle_setspeed( var_2.followspeed, 20, 20 );
break;
}
}
}
lbsupport_watchstingerproximity( var_0, var_1, var_2 )
{
level endon( "game_ended" );
var_2 endon( "death" );
if ( isdefined( self ) && !var_2.hasdodged )
{
var_2.hasdodged = 1;
var_3 = spawn( "script_origin", var_2.origin );
var_3.angles = var_2.angles;
var_3 movegravity( anglestoright( self.angles ) * -1000, 0.05 );
var_3 thread maps\mp\killstreaks\_flares::flares_deleteaftertime( 5.0 );
self missile_settargetent( var_3 );
var_4 = var_2.origin + anglestoright( self.angles ) * 200;
var_2 vehicle_setspeed( var_2.speed, 100, 40 );
var_2 setvehgoalpos( var_4, 1 );
wait 2.0;
var_2 vehicle_setspeed( var_2.followspeed, 20, 20 );
}
}
lbsupport_getcloseststartnode( var_0 )
{
var_1 = undefined;
var_2 = 999999;
foreach ( var_4 in level.air_start_nodes )
{
var_5 = distance( var_4.origin, var_0 );
if ( var_5 < var_2 )
{
var_1 = var_4;
var_2 = var_5;
}
}
return var_1;
}
lbsupport_getclosestnode( var_0 )
{
var_1 = undefined;
var_2 = 999999;
foreach ( var_4 in level.air_node_mesh )
{
var_5 = distance( var_4.origin, var_0 );
if ( var_5 < var_2 )
{
var_1 = var_4;
var_2 = var_5;
}
}
return var_1;
}
lbsupport_getclosestlinkednode( var_0 )
{
var_1 = undefined;
var_2 = distance2d( self.currentnode.origin, var_0 );
var_3 = var_2;
foreach ( var_5 in self.currentnode.neighbors )
{
var_6 = distance2d( var_5.origin, var_0 );
if ( var_6 < var_2 && var_6 < var_3 )
{
var_1 = var_5;
var_3 = var_6;
}
}
return var_1;
}
lbsupport_arraycontains( var_0, var_1 )
{
if ( var_0.size <= 0 )
return 0;
foreach ( var_3 in var_0 )
{
if ( var_3 == var_1 )
return 1;
}
return 0;
}
lbsupport_getlinkedstructs()
{
var_0 = [];
if ( isdefined( self.script_linkto ) )
{
var_1 = common_scripts\utility::get_links();
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
{
var_3 = common_scripts\utility::getstruct( var_1[var_2], "script_linkname" );
if ( isdefined( var_3 ) )
var_0[var_0.size] = var_3;
}
}
return var_0;
}
lbsupport_setairstartnodes()
{
level.air_start_nodes = common_scripts\utility::getstructarray( "chopper_boss_path_start", "targetname" );
foreach ( var_1 in level.air_start_nodes )
var_1.neighbors = var_1 lbsupport_getlinkedstructs();
}
lbsupport_setairnodemesh()
{
level.air_node_mesh = common_scripts\utility::getstructarray( "so_chopper_boss_path_struct", "script_noteworthy" );
foreach ( var_1 in level.air_node_mesh )
{
var_1.neighbors = var_1 lbsupport_getlinkedstructs();
foreach ( var_3 in level.air_node_mesh )
{
if ( var_1 == var_3 )
continue;
if ( !lbsupport_arraycontains( var_1.neighbors, var_3 ) && lbsupport_arraycontains( var_3 lbsupport_getlinkedstructs(), var_1 ) )
var_1.neighbors[var_1.neighbors.size] = var_3;
}
}
}
lbsupport_attacktargets()
{
self.vehicle endon( "death" );
level endon( "game_ended" );
for (;;)
{
self waittill( "turretstatechange" );
if ( self isfiringturret() && !self.vehicle.empgrenaded )
{
thread lbsupport_burstfirestart();
continue;
}
thread lbsupport_burstfirestop();
}
}
lbsupport_burstfirestart()
{
self.vehicle endon( "death" );
self.vehicle endon( "leaving" );
self endon( "stop_shooting" );
level endon( "game_ended" );
var_0 = 0.1;
var_1 = 40;
var_2 = 80;
var_3 = 1.0;
var_4 = 2.0;
for (;;)
{
var_5 = randomintrange( var_1, var_2 + 1 );
for ( var_6 = 0; var_6 < var_5; var_6++ )
{
var_7 = self getturrettarget( 0 );
if ( isdefined( var_7 ) && ( !isdefined( var_7.spawntime ) || ( gettime() - var_7.spawntime ) / 1000 > 5 ) && ( isdefined( var_7.team ) && var_7.team != "spectator" ) && maps\mp\_utility::isreallyalive( var_7 ) )
{
self.vehicle setlookatent( var_7 );
self shootturret();
}
wait( var_0 );
}
wait( randomfloatrange( var_3, var_4 ) );
}
}
lbsupport_burstfirestop()
{
self notify( "stop_shooting" );
if ( isdefined( self.vehicle.owner ) )
self.vehicle setlookatent( self.vehicle.owner );
}

View File

@ -0,0 +1,513 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.killstreakfuncs["heli_pilot"] = ::tryusehelipilot;
level.heli_pilot = [];
level.helipilotsettings = [];
level.helipilotsettings["heli_pilot"] = spawnstruct();
level.helipilotsettings["heli_pilot"].timeout = 60.0;
level.helipilotsettings["heli_pilot"].maxhealth = 2000;
level.helipilotsettings["heli_pilot"].streakname = "heli_pilot";
level.helipilotsettings["heli_pilot"].vehicleinfo = "heli_pilot_mp";
level.helipilotsettings["heli_pilot"].modelbase = level.littlebird_model;
level.helipilotsettings["heli_pilot"].teamsplash = "used_heli_pilot";
helipilot_setairstartnodes();
level.heli_pilot_mesh = getent( "heli_pilot_mesh", "targetname" );
if ( !isdefined( level.heli_pilot_mesh ) )
{
}
else
level.heli_pilot_mesh.origin = level.heli_pilot_mesh.origin + maps\mp\_utility::gethelipilotmeshoffset();
var_0 = spawnstruct();
var_0.xppopup = "destroyed_helo_pilot";
var_0.vodestroyed = undefined;
var_0.callout = "callout_destroyed_helo_pilot";
var_0.samdamagescale = 0.09;
var_0.enginevfxtag = "tag_engine_right";
level.heliconfigs["heli_pilot"] = var_0;
}
tryusehelipilot( var_0, var_1 )
{
var_2 = "heli_pilot";
var_3 = 1;
if ( isdefined( self.underwater ) && self.underwater )
return 0;
else if ( exceededmaxhelipilots( self.team ) )
{
self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
return 0;
}
else if ( maps\mp\_utility::currentactivevehiclecount() >= maps\mp\_utility::maxvehiclesallowed() || level.fauxvehiclecount + var_3 >= maps\mp\_utility::maxvehiclesallowed() )
{
self iprintlnbold( &"KILLSTREAKS_TOO_MANY_VEHICLES" );
return 0;
}
maps\mp\_utility::incrementfauxvehiclecount();
var_4 = createhelipilot( var_2 );
if ( !isdefined( var_4 ) )
{
maps\mp\_utility::decrementfauxvehiclecount();
return 0;
}
level.heli_pilot[self.team] = var_4;
var_5 = starthelipilot( var_4 );
if ( !isdefined( var_5 ) )
var_5 = 0;
return var_5;
}
exceededmaxhelipilots( var_0 )
{
if ( level.gametype == "dm" )
{
if ( isdefined( level.heli_pilot[var_0] ) || isdefined( level.heli_pilot[level.otherteam[var_0]] ) )
return 1;
else
return 0;
}
else if ( isdefined( level.heli_pilot[var_0] ) )
return 1;
else
return 0;
}
watchhostmigrationfinishedinit( var_0 )
{
var_0 endon( "killstreak_disowned" );
var_0 endon( "disconnect" );
level endon( "game_ended" );
self endon( "death" );
for (;;)
{
level waittill( "host_migration_end" );
var_0 setclientomnvar( "ui_heli_pilot", 1 );
}
}
createhelipilot( var_0 )
{
var_1 = helipilot_getcloseststartnode( self.origin );
var_2 = helipilot_getlinkedstruct( var_1 );
var_3 = vectortoangles( var_2.origin - var_1.origin );
var_4 = anglestoforward( self.angles );
var_5 = var_2.origin + var_4 * -100;
var_6 = var_1.origin;
var_7 = spawnhelicopter( self, var_6, var_3, level.helipilotsettings[var_0].vehicleinfo, level.helipilotsettings[var_0].modelbase );
if ( !isdefined( var_7 ) )
return;
var_7 makevehiclesolidcapsule( 18, -9, 18 );
var_7 maps\mp\killstreaks\_helicopter::addtolittlebirdlist();
var_7 thread maps\mp\killstreaks\_helicopter::removefromlittlebirdlistondeath();
var_7.maxhealth = level.helipilotsettings[var_0].maxhealth;
var_7.speed = 40;
var_7.owner = self;
var_7 setotherent( self );
var_7.team = self.team;
var_7.helitype = "littlebird";
var_7.helipilottype = "heli_pilot";
var_7 setmaxpitchroll( 45, 45 );
var_7 vehicle_setspeed( var_7.speed, 40, 40 );
var_7 setyawspeed( 120, 60 );
var_7 setneargoalnotifydist( 32 );
var_7 sethoverparams( 100, 100, 100 );
var_7 common_scripts\utility::make_entity_sentient_mp( var_7.team );
var_7.targetpos = var_5;
var_7.currentnode = var_2;
var_7.attract_strength = 10000;
var_7.attract_range = 150;
var_7.attractor = missile_createattractorent( var_7, var_7.attract_strength, var_7.attract_range );
var_7 thread maps\mp\killstreaks\_helicopter::heli_damage_monitor( "heli_pilot" );
var_7 thread helipilot_lightfx();
var_7 thread helipilot_watchtimeout();
var_7 thread helipilot_watchownerloss();
var_7 thread helipilot_watchroundend();
var_7 thread helipilot_watchobjectivecam();
var_7 thread helipilot_watchdeath();
var_7 thread watchhostmigrationfinishedinit( self );
var_7.owner maps\mp\_matchdata::logkillstreakevent( level.helipilotsettings[var_7.helipilottype].streakname, var_7.targetpos );
return var_7;
}
helipilot_lightfx()
{
playfxontag( level.chopper_fx["light"]["left"], self, "tag_light_nose" );
wait 0.05;
playfxontag( level.chopper_fx["light"]["belly"], self, "tag_light_belly" );
wait 0.05;
playfxontag( level.chopper_fx["light"]["tail"], self, "tag_light_tail1" );
wait 0.05;
playfxontag( level.chopper_fx["light"]["tail"], self, "tag_light_tail2" );
}
starthelipilot( var_0 )
{
level endon( "game_ended" );
var_0 endon( "death" );
maps\mp\_utility::setusingremote( var_0.helipilottype );
if ( getdvarint( "camera_thirdPerson" ) )
maps\mp\_utility::setthirdpersondof( 0 );
self.restoreangles = self.angles;
var_0 thread maps\mp\killstreaks\_flares::ks_setup_manual_flares( 2, "+smoke", "ui_heli_pilot_flare_ammo", "ui_heli_pilot_warn" );
thread watchintrocleared( var_0 );
maps\mp\_utility::freezecontrolswrapper( 1 );
var_1 = maps\mp\killstreaks\_killstreaks::initridekillstreak( var_0.helipilottype );
if ( var_1 != "success" )
{
if ( isdefined( self.disabledweapon ) && self.disabledweapon )
common_scripts\utility::_enableweapon();
var_0 notify( "death" );
return 0;
}
maps\mp\_utility::freezecontrolswrapper( 0 );
var_2 = maps\mp\_utility::gethelipilottraceoffset();
var_3 = var_0.currentnode.origin + ( maps\mp\_utility::gethelipilotmeshoffset() + var_2 );
var_4 = var_0.currentnode.origin + ( maps\mp\_utility::gethelipilotmeshoffset() - var_2 );
var_5 = bullettrace( var_3, var_4, 0, undefined, 0, 0, 1 );
if ( !isdefined( var_5["entity"] ) )
{
}
var_6 = var_5["position"] - maps\mp\_utility::gethelipilotmeshoffset() + ( 0, 0, 250 );
var_7 = spawn( "script_origin", var_6 );
self remotecontrolvehicle( var_0 );
var_0 thread heligotostartposition( var_7 );
var_0 thread helipilot_watchads();
level thread maps\mp\_utility::teamplayercardsplash( level.helipilotsettings[var_0.helipilottype].teamsplash, self );
var_0.killcament = spawn( "script_origin", self getvieworigin() );
return 1;
}
heligotostartposition( var_0 )
{
self endon( "death" );
level endon( "game_ended" );
self remotecontrolvehicletarget( var_0 );
self waittill( "goal_reached" );
self remotecontrolvehicletargetoff();
var_0 delete();
}
watchintrocleared( var_0 )
{
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "joined_spectators" );
level endon( "game_ended" );
var_0 endon( "death" );
self waittill( "intro_cleared" );
self setclientomnvar( "ui_heli_pilot", 1 );
var_1 = maps\mp\_utility::outlineenableforplayer( self, "cyan", self, 0, "killstreak" );
removeoutline( var_1, var_0 );
foreach ( var_3 in level.participants )
{
if ( !maps\mp\_utility::isreallyalive( var_3 ) || var_3.sessionstate != "playing" )
continue;
if ( maps\mp\_utility::isenemy( var_3 ) )
{
if ( !var_3 maps\mp\_utility::_hasperk( "specialty_noplayertarget" ) )
{
var_1 = maps\mp\_utility::outlineenableforplayer( var_3, "orange", self, 0, "killstreak" );
var_3 removeoutline( var_1, var_0 );
continue;
}
var_3 thread watchforperkremoval( var_0 );
}
}
var_0 thread watchplayersspawning();
thread watchearlyexit( var_0 );
}
watchforperkremoval( var_0 )
{
self notify( "watchForPerkRemoval" );
self endon( "watchForPerkRemoval" );
self endon( "death" );
self waittill( "removed_specialty_noplayertarget" );
var_1 = maps\mp\_utility::outlineenableforplayer( self, "orange", var_0.owner, 0, "killstreak" );
removeoutline( var_1, var_0 );
}
watchplayersspawning()
{
self endon( "leaving" );
self endon( "death" );
for (;;)
{
level waittill( "player_spawned", var_0 );
if ( var_0.sessionstate == "playing" && self.owner maps\mp\_utility::isenemy( var_0 ) )
var_0 thread watchforperkremoval( self );
}
}
removeoutline( var_0, var_1 )
{
thread heliremoveoutline( var_0, var_1 );
thread playerremoveoutline( var_0, var_1 );
}
heliremoveoutline( var_0, var_1 )
{
self notify( "heliRemoveOutline" );
self endon( "heliRemoveOutline" );
self endon( "outline_removed" );
self endon( "disconnect" );
level endon( "game_ended" );
var_2 = [ "leaving", "death" ];
var_1 common_scripts\utility::waittill_any_in_array_return_no_endon_death( var_2 );
if ( isdefined( self ) )
{
maps\mp\_utility::outlinedisable( var_0, self );
self notify( "outline_removed" );
}
}
playerremoveoutline( var_0, var_1 )
{
self notify( "playerRemoveOutline" );
self endon( "playerRemoveOutline" );
self endon( "outline_removed" );
self endon( "disconnect" );
level endon( "game_ended" );
var_2 = [ "death" ];
common_scripts\utility::waittill_any_in_array_return_no_endon_death( var_2 );
maps\mp\_utility::outlinedisable( var_0, self );
self notify( "outline_removed" );
}
helipilot_watchdeath()
{
level endon( "game_ended" );
self endon( "gone" );
self waittill( "death" );
if ( isdefined( self.owner ) )
self.owner helipilot_endride( self );
if ( isdefined( self.killcament ) )
self.killcament delete();
thread maps\mp\killstreaks\_helicopter::lbonkilled();
}
helipilot_watchobjectivecam()
{
level endon( "game_ended" );
self endon( "gone" );
self.owner endon( "disconnect" );
self.owner endon( "joined_team" );
self.owner endon( "joined_spectators" );
level waittill( "objective_cam" );
thread maps\mp\killstreaks\_helicopter::lbonkilled();
if ( isdefined( self.owner ) )
self.owner helipilot_endride( self );
}
helipilot_watchtimeout()
{
level endon( "game_ended" );
self endon( "death" );
self.owner endon( "disconnect" );
self.owner endon( "joined_team" );
self.owner endon( "joined_spectators" );
var_0 = level.helipilotsettings[self.helipilottype].timeout;
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( var_0 );
thread helipilot_leave();
}
helipilot_watchownerloss()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "leaving" );
self.owner common_scripts\utility::waittill_any( "disconnect", "joined_team", "joined_spectators" );
thread helipilot_leave();
}
helipilot_watchroundend()
{
self endon( "death" );
self endon( "leaving" );
self.owner endon( "disconnect" );
self.owner endon( "joined_team" );
self.owner endon( "joined_spectators" );
level common_scripts\utility::waittill_any( "round_end_finished", "game_ended" );
thread helipilot_leave();
}
helipilot_leave()
{
self endon( "death" );
self notify( "leaving" );
if ( isdefined( self.owner ) )
self.owner helipilot_endride( self );
var_0 = maps\mp\killstreaks\_airdrop::getflyheightoffset( self.origin );
var_1 = self.origin + ( 0, 0, var_0 );
self vehicle_setspeed( 140, 60 );
self setmaxpitchroll( 45, 180 );
self setvehgoalpos( var_1 );
self waittill( "goal" );
var_1 = var_1 + anglestoforward( self.angles ) * 15000;
var_2 = spawn( "script_origin", var_1 );
if ( isdefined( var_2 ) )
{
self setlookatent( var_2 );
var_2 thread wait_and_delete( 3.0 );
}
self setvehgoalpos( var_1 );
self waittill( "goal" );
self notify( "gone" );
maps\mp\killstreaks\_helicopter::removelittlebird();
}
wait_and_delete( var_0 )
{
self endon( "death" );
level endon( "game_ended" );
wait( var_0 );
self delete();
}
helipilot_endride( var_0 )
{
if ( isdefined( var_0 ) )
{
self setclientomnvar( "ui_heli_pilot", 0 );
var_0 notify( "end_remote" );
if ( maps\mp\_utility::isusingremote() )
maps\mp\_utility::clearusingremote();
if ( getdvarint( "camera_thirdPerson" ) )
maps\mp\_utility::setthirdpersondof( 1 );
self remotecontrolvehicleoff( var_0 );
self setplayerangles( self.restoreangles );
thread helipilot_freezebuffer();
}
}
helipilot_freezebuffer()
{
self endon( "disconnect" );
self endon( "death" );
level endon( "game_ended" );
maps\mp\_utility::freezecontrolswrapper( 1 );
wait 0.5;
maps\mp\_utility::freezecontrolswrapper( 0 );
}
helipilot_watchads()
{
self endon( "leaving" );
self endon( "death" );
level endon( "game_ended" );
var_0 = 0;
for (;;)
{
if ( isdefined( self.owner ) )
{
if ( self.owner adsbuttonpressed() )
{
if ( !var_0 )
{
self.owner setclientomnvar( "ui_heli_pilot", 2 );
var_0 = 1;
}
}
else if ( var_0 )
{
self.owner setclientomnvar( "ui_heli_pilot", 1 );
var_0 = 0;
}
}
wait 0.1;
}
}
helipilot_setairstartnodes()
{
level.air_start_nodes = common_scripts\utility::getstructarray( "chopper_boss_path_start", "targetname" );
}
helipilot_getlinkedstruct( var_0 )
{
if ( isdefined( var_0.script_linkto ) )
{
var_1 = var_0 common_scripts\utility::get_links();
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
{
var_3 = common_scripts\utility::getstruct( var_1[var_2], "script_linkname" );
if ( isdefined( var_3 ) )
return var_3;
}
}
return undefined;
}
helipilot_getcloseststartnode( var_0 )
{
var_1 = undefined;
var_2 = 999999;
foreach ( var_4 in level.air_start_nodes )
{
var_5 = distance( var_4.origin, var_0 );
if ( var_5 < var_2 )
{
var_1 = var_4;
var_2 = var_5;
}
}
return var_1;
}
watchearlyexit( var_0 )
{
level endon( "game_ended" );
var_0 endon( "death" );
self endon( "leaving" );
var_0 thread maps\mp\killstreaks\_killstreaks::allowridekillstreakplayerexit();
var_0 waittill( "killstreakExit" );
var_0 thread helipilot_leave();
}

View File

@ -0,0 +1,897 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
maps\mp\killstreaks\_helicopter_guard::lbsupport_setairstartnodes();
maps\mp\killstreaks\_helicopter_guard::lbsupport_setairnodemesh();
level.sniper_explode = loadfx( "fx/explosions/sniper_incendiary" );
level.killstreakfuncs["heli_sniper"] = ::tryusehelisniper;
var_0 = spawnstruct();
var_0.xppopup = "destroyed_helo_scout";
var_0.callout = "callout_destroyed_helo_scout";
var_0.samdamagescale = 0.09;
var_0.enginevfxtag = "tag_engine_right";
level.heliconfigs["heli_sniper"] = var_0;
}
tryusehelisniper( var_0, var_1 )
{
var_2 = getcloseststartnode( self.origin );
var_3 = getclosestnode( self.origin );
var_4 = vectortoangles( var_3.origin - var_2.origin );
if ( isdefined( self.underwater ) && self.underwater )
return 0;
if ( isdefined( self.isjuggernautlevelcustom ) && self.isjuggernautlevelcustom == 1 )
return 0;
else if ( !isdefined( level.air_node_mesh ) || !isdefined( var_2 ) || !isdefined( var_3 ) )
{
self iprintlnbold( &"KILLSTREAKS_UNAVAILABLE_IN_LEVEL" );
return 0;
}
var_5 = 1;
if ( exceededmaxhelisnipers() )
{
self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
return 0;
}
if ( maps\mp\_utility::currentactivevehiclecount() >= maps\mp\_utility::maxvehiclesallowed() || level.fauxvehiclecount + var_5 >= maps\mp\_utility::maxvehiclesallowed() )
{
self iprintlnbold( &"KILLSTREAKS_TOO_MANY_VEHICLES" );
return 0;
}
if ( isdefined( self.iscapturingcrate ) && self.iscapturingcrate )
return 0;
if ( isdefined( self.isreviving ) && self.isreviving )
return 0;
var_6 = createheli( self, var_2, var_3, var_4, var_1, var_0 );
if ( !isdefined( var_6 ) )
return 0;
var_7 = helipickup( var_6, var_1 );
if ( isdefined( var_7 ) && var_7 == "fail" )
return 0;
return 1;
}
exceededmaxhelisnipers()
{
return isdefined( level.lbsniper );
}
getcloseststartnode( var_0 )
{
var_1 = undefined;
var_2 = 999999;
foreach ( var_4 in level.air_start_nodes )
{
var_5 = distance( var_4.origin, var_0 );
if ( var_5 < var_2 )
{
var_1 = var_4;
var_2 = var_5;
}
}
return var_1;
}
createheli( var_0, var_1, var_2, var_3, var_4, var_5 )
{
var_6 = getent( "airstrikeheight", "targetname" );
var_7 = var_2.origin;
var_8 = anglestoforward( var_3 );
var_9 = var_1.origin;
var_10 = spawnhelicopter( var_0, var_9, var_8, "attack_littlebird_mp", level.littlebird_model );
if ( !isdefined( var_10 ) )
return;
var_11 = maps\mp\_utility::gethelipilottraceoffset();
var_12 = var_7 + ( maps\mp\_utility::gethelipilotmeshoffset() + var_11 );
var_13 = var_7 + ( maps\mp\_utility::gethelipilotmeshoffset() - var_11 );
var_14 = bullettrace( var_12, var_13, 0, 0, 0, 0, 1 );
if ( isdefined( var_14["entity"] ) && var_14["normal"][2] > 0.1 )
var_7 = var_14["position"] - maps\mp\_utility::gethelipilotmeshoffset() + ( 0, 0, 384 );
var_10 maps\mp\killstreaks\_helicopter::addtolittlebirdlist( "lbSniper" );
var_10 thread maps\mp\killstreaks\_helicopter::removefromlittlebirdlistondeath();
var_10 thread waitfordeath();
var_10.lifeid = var_5;
var_10.forward = var_8;
var_10.pathstart = var_9;
var_10.pathgoal = var_7;
var_10.pathend = var_1.origin;
var_10.flyheight = var_7[2];
var_10.maxheight = var_6.origin;
var_10.ongroundpos = var_1.origin;
var_10.pickuppos = var_10.ongroundpos + ( 0, 0, 300 );
var_10.hoverpos = var_10.ongroundpos + ( 0, 0, 600 );
var_10.forwardyaw = var_8[1];
var_10.backwardyaw = var_8[1] + 180;
if ( var_10.backwardyaw > 360 )
var_10.backwardyaw = var_10.backwardyaw - 360;
var_10.helitype = "littlebird";
var_10.heli_type = "littlebird";
var_10.locindex = var_1.orgin;
var_10.allowsafeeject = 1;
var_10.attractor = missile_createattractorent( var_10, level.heli_attract_strength, level.heli_attract_range );
var_10.isdestroyed = 0;
var_10.maxhealth = level.heli_maxhealth;
var_10 thread maps\mp\killstreaks\_flares::flares_monitor( 1 );
var_10 thread maps\mp\killstreaks\_helicopter::heli_damage_monitor( "heli_sniper", 1 );
var_10 thread helideathcleanup( var_4 );
var_10.owner = var_0;
var_10.team = var_0.team;
var_10 thread leaveonownerdisconnect();
var_10.speed = 100;
var_10.ammo = 100;
var_10.followspeed = 40;
var_10 setcandamage( 1 );
var_10 setmaxpitchroll( 45, 45 );
var_10 vehicle_setspeed( var_10.speed, 100, 40 );
var_10 setyawspeed( 120, 60 );
var_10 sethoverparams( 10, 10, 60 );
var_10 setneargoalnotifydist( 512 );
var_10.killcount = 0;
var_10.streakname = "heli_sniper";
var_10.allowboard = 0;
var_10.ownerboarded = 0;
var_10 hidepart( "tag_wings" );
return var_10;
}
getbestheight( var_0 )
{
self endon( "death" );
self endon( "crashing" );
self endon( "helicopter_removed" );
self endon( "heightReturned" );
var_1 = getent( "airstrikeheight", "targetname" );
if ( isdefined( var_1 ) )
var_2 = var_1.origin[2];
else if ( isdefined( level.airstrikeheightscale ) )
var_2 = 850 * level.airstrikeheightscale;
else
var_2 = 850;
var_3 = bullettrace( var_0, var_0 - ( 0, 0, 10000 ), 0, self, 0, 0, 0, 0 );
var_4 = var_3["position"][2];
var_5 = 0;
var_6 = 0;
for ( var_7 = 0; var_7 < 30; var_7++ )
{
wait 0.05;
var_8 = var_7 % 8;
var_9 = var_7 * 7;
switch ( var_8 )
{
case 0:
var_5 = var_9;
var_6 = var_9;
break;
case 1:
var_5 = var_9 * -1;
var_6 = var_9 * -1;
break;
case 2:
var_5 = var_9 * -1;
var_6 = var_9;
break;
case 3:
var_5 = var_9;
var_6 = var_9 * -1;
break;
case 4:
var_5 = 0;
var_6 = var_9 * -1;
break;
case 5:
var_5 = var_9 * -1;
var_6 = 0;
break;
case 6:
var_5 = var_9;
var_6 = 0;
break;
case 7:
var_5 = 0;
var_6 = var_9;
break;
default:
break;
}
var_10 = bullettrace( var_0 + ( var_5, var_6, 1000 ), var_0 - ( var_5, var_6, 10000 ), 0, self, 0, 0, 0, 0, 0 );
if ( isdefined( var_10["entity"] ) )
continue;
if ( var_10["position"][2] + 145 > var_4 )
var_4 = var_10["position"][2] + 145;
}
return var_4;
}
helipickup( var_0, var_1 )
{
level endon( "game_ended" );
var_0 endon( "death" );
var_0 endon( "crashing" );
var_0 endon( "owner_disconnected" );
var_0 endon( "killstreakExit" );
var_2 = getcloseststartnode( self.origin );
level thread maps\mp\_utility::teamplayercardsplash( "used_heli_sniper", self, self.team );
if ( isdefined( var_2.angles ) )
var_3 = var_2.angles;
else
var_3 = ( 0, 0, 0 );
common_scripts\utility::_disableusability();
var_4 = var_0.flyheight;
if ( isdefined( var_2.neighbors[0] ) )
var_5 = var_2.neighbors[0];
else
var_5 = getclosestnode( self.origin );
var_6 = anglestoforward( self.angles );
var_7 = var_5.origin * ( 1, 1, 0 ) + ( 0, 0, 1 ) * var_4 + var_6 * -100;
var_0.targetpos = var_7;
var_0.currentnode = var_5;
var_8 = moveplayertochopper( var_0 );
if ( isdefined( var_8 ) && var_8 == "fail" )
{
var_0 thread helileave();
return var_8;
}
else
{
thread onheli( var_0 );
return var_8;
}
}
onheli( var_0 )
{
level endon( "game_ended" );
var_0 endon( "death" );
var_0 endon( "crashing" );
var_0 endon( "owner_disconnected" );
var_0 endon( "killstreakExit" );
if ( isdefined( self.imslist ) )
destroycarriedims();
var_0 thread givecoolassgun();
var_0 setyawspeed( 1, 1, 1, 0.1 );
var_0 notify( "picked_up_passenger" );
common_scripts\utility::_enableusability();
var_0 vehicle_setspeed( var_0.speed, 100, 40 );
self.onhelisniper = 1;
self.helisniper = var_0;
var_0 endon( "owner_death" );
var_0 thread pushcorpseonownerdeath();
var_0 thread leaveonownerdeath();
var_0 setvehgoalpos( var_0.targetpos, 1 );
var_0 thread helicreatelookatent();
var_0 waittill( "near_goal" );
var_0 thread helimovementcontrol();
thread watchearlyexit( var_0 );
wait 45;
self notify( "heli_sniper_timeout" );
dodropff( var_0 );
}
dodropff( var_0 )
{
var_0 notify( "dropping" );
var_0 thread helireturntodropsite();
var_0 waittill( "at_dropoff" );
var_0 vehicle_setspeed( 60 );
var_0 setyawspeed( 180, 180, 180, 0.3 );
wait 1;
if ( !maps\mp\_utility::isreallyalive( self ) )
return;
thread settempnofalldamage();
self stopridingvehicle();
self allowjump( 1 );
self setstance( "stand" );
self.onhelisniper = 0;
self.helisniper = undefined;
var_0.ownerboarded = 0;
self takeweapon( "iw6_gm6helisnipe_mp_gm6scope" );
self enableweaponswitch();
maps\mp\_utility::setrecoilscale();
var_1 = common_scripts\utility::getlastweapon();
if ( !self hasweapon( var_1 ) )
var_1 = maps\mp\killstreaks\_killstreaks::getfirstprimaryweapon();
maps\mp\_utility::switch_to_last_weapon( var_1 );
wait 1;
if ( isdefined( var_0 ) )
var_0 thread helileave();
}
watchearlyexit( var_0 )
{
self endon( "heli_sniper_timeout" );
var_0 thread maps\mp\killstreaks\_killstreaks::allowridekillstreakplayerexit( "dropping" );
var_0 waittill( "killstreakExit" );
dodropff( var_0 );
}
moveplayertochopper( var_0 )
{
self endon( "disconnect" );
self visionsetnakedforplayer( "black_bw", 0.5 );
maps\mp\_utility::set_visionset_for_watching_players( "black_bw", 0.5, 1.0 );
var_1 = common_scripts\utility::waittill_any_timeout( 0.5, "death" );
maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
if ( var_1 == "death" )
{
thread maps\mp\killstreaks\_killstreaks::clearrideintro( 1.0 );
return "fail";
}
self cancelmantle();
if ( var_1 != "disconnect" )
{
thread maps\mp\killstreaks\_killstreaks::clearrideintro( 1.0, 0.75 );
if ( self.team == "spectator" )
return "fail";
}
var_0 attachplayertochopper();
if ( !isalive( self ) )
return "fail";
level.helisnipereyeson = var_0;
level notify( "update_uplink" );
}
destroycarriedims()
{
foreach ( var_1 in self.imslist )
{
if ( isdefined( var_1.carriedby ) && var_1.carriedby == self )
{
self forceusehintoff();
self.iscarrying = undefined;
self.carrieditem = undefined;
if ( isdefined( var_1.bombsquadmodel ) )
var_1.bombsquadmodel delete();
var_1 delete();
self enableweapons();
}
}
}
helicreatelookatent()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "crashing" );
self endon( "leaving" );
self.owner endon( "death" );
var_0 = self.origin + anglestoright( self.owner.angles ) * 1000;
self.lookatent = spawn( "script_origin", var_0 );
self setlookatent( self.lookatent );
self setyawspeed( 360, 120 );
for (;;)
{
wait 0.25;
var_0 = self.origin + anglestoright( self.owner.angles ) * 1000;
self.lookatent.origin = var_0;
}
}
attachplayertochopper()
{
self.owner notify( "force_cancel_sentry" );
self.owner notify( "force_cancel_ims" );
self.owner notify( "force_cancel_placement" );
self.owner notify( "cancel_carryRemoteUAV" );
self.owner setplayerangles( self gettagangles( "TAG_RIDER" ) );
self.owner ridevehicle( self, 40, 70, 10, 70, 1 );
self.owner setstance( "crouch" );
self.owner allowjump( 0 );
thread reequiplightarmor();
self.ownerboarded = 1;
self notify( "boarded" );
self.owner.chopper = self;
}
helireturntodropsite()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "crashing" );
self endon( "owner_disconnected" );
self endon( "owner_death" );
var_0 = undefined;
var_1 = undefined;
var_2 = undefined;
var_3 = 0;
foreach ( var_5 in level.air_node_mesh )
{
if ( !isdefined( var_5.script_parameters ) || !issubstr( var_5.script_parameters, "pickupNode" ) )
continue;
var_6 = distancesquared( var_5.origin, self.origin );
if ( !isdefined( var_2 ) || var_6 < var_2 )
{
var_1 = var_5;
var_2 = var_6;
if ( var_5.script_parameters == "pickupNodehigh" )
{
var_3 = 1;
continue;
}
var_3 = 0;
}
}
if ( maps\mp\_utility::getmapname() == "mp_chasm" )
{
if ( var_1.origin == ( -224, -1056, 2376 ) )
var_1.origin = ( -304, -896, 2376 );
}
if ( var_3 && !bullettracepassed( self.origin, var_1.origin, 0, self ) )
{
self setvehgoalpos( self.origin + ( 0, 0, 2300 ), 1 );
waittill_msg_or_timeout( "near_goal", "goal", 5 );
var_8 = var_1.origin;
var_8 = var_8 + ( 0, 0, 1500 );
}
else if ( var_1.origin[2] > self.origin[2] )
var_8 = var_1.origin;
else
{
var_8 = var_1.origin * ( 1, 1, 0 );
var_8 = var_8 + ( 0, 0, self.origin[2] );
}
self setvehgoalpos( var_8, 1 );
var_9 = getbestheight( var_8 );
var_10 = var_8 * ( 1, 1, 0 );
var_11 = var_10 + ( 0, 0, var_9 );
waittill_msg_or_timeout( "near_goal", "goal", 5 );
self.movedlow = 0;
self setvehgoalpos( var_11 + ( 0, 0, 200 ), 1 );
self.droppingoff = 1;
waittill_msg_or_timeout( "near_goal", "goal", 5 );
self.movedlow = 1;
self notify( "at_dropoff" );
}
waittill_msg_or_timeout( var_0, var_1, var_2 )
{
level endon( "game_ended" );
self endon( var_0 );
self endon( var_1 );
wait( var_2 );
}
helimovementcontrol()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "crashing" );
self.owner endon( "death" );
self.owner endon( "disconnect" );
self endon( "dropping" );
self vehicle_setspeed( 60, 45, 20 );
self setneargoalnotifydist( 8 );
for (;;)
{
var_0 = self.owner getnormalizedmovement();
if ( var_0[0] >= 0.15 || var_0[1] >= 0.15 || var_0[0] <= -0.15 || var_0[1] <= -0.15 )
thread manualmove( var_0 );
wait 0.05;
}
}
helifreemovementcontrol()
{
self vehicle_setspeed( 80, 60, 20 );
self setneargoalnotifydist( 8 );
for (;;)
{
var_0 = self.owner getnormalizedmovement();
if ( var_0[0] >= 0.15 || var_0[1] >= 0.15 || var_0[0] <= -0.15 || var_0[1] <= -0.15 )
thread manualmovefree( var_0 );
wait 0.05;
}
}
manualmovefree( var_0 )
{
level endon( "game_ended" );
self endon( "death" );
self endon( "crashing" );
self.owner endon( "death" );
self.owner endon( "disconnect" );
self endon( "dropping" );
self notify( "manualMove" );
self endon( "manualMove" );
var_1 = anglestoforward( self.owner.angles ) * ( 350 * var_0[0] );
var_2 = anglestoright( self.owner.angles ) * ( 250 * var_0[1] );
var_3 = var_1 + var_2;
var_4 = self.origin + var_3;
var_4 = var_4 * ( 1, 1, 0 );
var_4 = var_4 + ( 0, 0, self.maxheight[2] );
if ( distance2dsquared( ( 0, 0, 0 ), var_4 ) > 8000000 )
return;
self setvehgoalpos( var_4, 1 );
self waittill( "goal" );
}
manualmove( var_0 )
{
level endon( "game_ended" );
self endon( "death" );
self endon( "crashing" );
self.owner endon( "death" );
self.owner endon( "disconnect" );
self endon( "dropping" );
self notify( "manualMove" );
self endon( "manualMove" );
var_1 = anglestoforward( self.owner.angles ) * ( 250 * var_0[0] );
var_2 = anglestoright( self.owner.angles ) * ( 250 * var_0[1] );
var_3 = var_1 + var_2;
var_4 = 256;
var_5 = self.origin + var_3;
var_6 = maps\mp\_utility::gethelipilottraceoffset();
var_7 = var_5 + ( maps\mp\_utility::gethelipilotmeshoffset() + var_6 );
var_8 = var_5 + ( maps\mp\_utility::gethelipilotmeshoffset() - var_6 );
var_9 = bullettrace( var_7, var_8, 0, 0, 0, 0, 1 );
if ( isdefined( var_9["entity"] ) && var_9["normal"][2] > 0.1 )
{
var_5 = var_9["position"] - maps\mp\_utility::gethelipilotmeshoffset() + ( 0, 0, var_4 );
var_10 = var_5[2] - self.origin[2];
if ( var_10 > 1000 )
return;
self setvehgoalpos( var_5, 1 );
self waittill( "goal" );
}
}
helileave()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "crashing" );
self notify( "end_disconnect_check" );
self notify( "end_death_check" );
self notify( "leaving" );
if ( isdefined( self.ladder ) )
self.ladder delete();
if ( isdefined( self.trigger ) )
self.trigger delete();
if ( isdefined( self.turret ) )
self.turret delete();
if ( isdefined( self.msg ) )
self.msg maps\mp\gametypes\_hud_util::destroyelem();
if ( isdefined( self.switchmsg ) )
self.switchmsg maps\mp\gametypes\_hud_util::destroyelem();
if ( isdefined( self.movemsg ) )
self.movemsg maps\mp\gametypes\_hud_util::destroyelem();
self clearlookatent();
level.helisnipereyeson = undefined;
level notify( "update_uplink" );
self setyawspeed( 220, 220, 220, 0.3 );
self vehicle_setspeed( 120, 60 );
self setvehgoalpos( self.origin + ( 0, 0, 1200 ), 1 );
self waittill( "goal" );
var_0 = ( self.pathend - self.pathgoal ) * 5000;
self setvehgoalpos( var_0, 1 );
self vehicle_setspeed( 300, 75 );
self.leaving = 1;
common_scripts\utility::waittill_any_timeout( 5, "goal" );
if ( isdefined( level.lbsniper ) && level.lbsniper == self )
level.lbsniper = undefined;
self notify( "delete" );
self delete();
}
helideathcleanup( var_0 )
{
level endon( "game_ended" );
self endon( "leaving" );
self waittill( "death" );
maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
thread maps\mp\killstreaks\_helicopter::lbonkilled();
if ( isdefined( self.ladder ) )
self.ladder delete();
if ( isdefined( self.trigger ) )
self.trigger delete();
if ( isdefined( self.turret ) )
self.turret delete();
if ( isdefined( self.msg ) )
self.msg maps\mp\gametypes\_hud_util::destroyelem();
if ( isdefined( self.switchmsg ) )
self.switchmsg maps\mp\gametypes\_hud_util::destroyelem();
if ( isdefined( self.movemsg ) )
self.movemsg maps\mp\gametypes\_hud_util::destroyelem();
if ( isdefined( self.owner ) && isalive( self.owner ) && self.ownerboarded == 1 )
{
self.owner stopridingvehicle();
var_1 = undefined;
var_2 = undefined;
if ( isdefined( self.attackers ) )
{
var_3 = 0;
foreach ( var_6, var_5 in self.attackers )
{
if ( var_5 >= var_3 )
{
var_3 = var_5;
var_1 = var_6;
}
}
}
if ( isdefined( var_1 ) )
{
foreach ( var_8 in level.participants )
{
if ( var_8 maps\mp\_utility::getuniqueid() == var_1 )
var_2 = var_8;
}
}
var_10 = getdvarint( "scr_team_fftype" );
if ( isdefined( self.killingattacker ) && isdefined( self.killingattacker.isharrier ) )
self.killingattacker radiusdamage( self.owner.origin, 200, 2600, 2600, self.killingattacker );
else if ( isdefined( var_2 ) && var_10 != 2 )
radiusdamage( self.owner.origin, 200, 2600, 2600, var_2 );
else if ( var_10 == 2 && isdefined( var_2 ) && maps\mp\_utility::attackerishittingteam( var_2, self.owner ) )
{
radiusdamage( self.owner.origin, 200, 2600, 2600, var_2 );
radiusdamage( self.owner.origin, 200, 2600, 2600 );
}
else
radiusdamage( self.owner.origin, 200, 2600, 2600 );
self.owner.onhelisniper = 0;
self.owner.helisniper = undefined;
}
}
settempnofalldamage()
{
if ( !maps\mp\_utility::_hasperk( "specialty_falldamage" ) )
{
level endon( "game_ended" );
self endon( "death" );
self endon( "disconnect" );
maps\mp\_utility::giveperk( "specialty_falldamage", 0 );
wait 2;
maps\mp\_utility::_unsetperk( "specialty_falldamage" );
}
}
reequiplightarmor()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "crashing" );
self.owner endon( "death" );
self.owner endon( "disconnect" );
self endon( "dropping" );
var_0 = 0;
for (;;)
{
wait 0.05;
if ( !isdefined( self.owner.lightarmorhp ) && !self.owner maps\mp\_utility::isjuggernaut() )
{
self.owner maps\mp\perks\_perkfunctions::setlightarmor();
var_0++;
if ( var_0 >= 2 )
break;
}
}
}
keepcrouched()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "crashing" );
self.owner endon( "death" );
self.owner endon( "disconnect" );
self endon( "dropping" );
for (;;)
{
if ( self.owner getstance() != "crouch" )
self.owner setstance( "crouch" );
wait 0.05;
}
}
givecoolassgun()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "crashing" );
self endon( "dropping" );
self.owner endon( "disconnect" );
for (;;)
{
if ( !isalive( self.owner ) )
return "fail";
if ( self.owner getcurrentprimaryweapon() != "iw6_gm6helisnipe_mp_gm6scope" )
{
self.owner giveweapon( "iw6_gm6helisnipe_mp_gm6scope" );
self.owner switchtoweaponimmediate( "iw6_gm6helisnipe_mp_gm6scope" );
self.owner disableweaponswitch();
self.owner maps\mp\_utility::setrecoilscale( 0, 100 );
self.owner givemaxammo( "iw6_gm6helisnipe_mp_gm6scope" );
}
else
return;
wait 0.05;
}
}
restockownerammo()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "crashing" );
self.owner endon( "death" );
self.owner endon( "disconnect" );
self.owner endon( "dropping" );
for (;;)
{
self.owner waittill( "weapon_fired" );
self.owner givemaxammo( "iw6_gm6helisnipe_mp_gm6scope" );
}
}
pushcorpseonownerdeath()
{
level endon( "game_ended" );
self.owner endon( "disconnect" );
self endon( "death" );
self endon( "crashing" );
self.owner waittill( "death" );
self.owner.onhelisniper = 0;
self.owner.helisniper = undefined;
self.ownerboarded = 0;
if ( isdefined( self.origin ) )
physicsexplosionsphere( self.origin, 200, 200, 1 );
}
leaveonownerdisconnect()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "crashing" );
self endon( "end_disconnect_check" );
self.owner waittill( "disconnect" );
self notify( "owner_disconnected" );
thread helileave();
}
leaveonownerdeath()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "crashing" );
self endon( "end_death_check" );
self.owner waittill( "death" );
self notify( "owner_death" );
thread helileave();
}
getclosestnode( var_0 )
{
var_1 = undefined;
var_2 = 999999;
foreach ( var_4 in level.air_node_mesh )
{
var_5 = distance( var_4.origin, var_0 );
if ( var_5 < var_2 )
{
var_1 = var_4;
var_2 = var_5;
}
}
return var_1;
}
waitfordeath()
{
var_0 = self getentitynumber();
self waittill( "death" );
level.lbsniper = undefined;
if ( isdefined( level.helisnipereyeson ) )
{
level.helisnipereyeson = undefined;
level notify( "update_uplink" );
}
}

View File

@ -0,0 +1,125 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.killstreakfuncs["high_value_target"] = ::tryusehighvaluetarget;
level.hvts_active["axis"] = 0;
level.hvts_active["allies"] = 0;
game["dialog"]["hvt_gone"] = "hvt_gone";
}
tryusehighvaluetarget( var_0, var_1 )
{
return usehighvaluetarget( self, var_0 );
}
reached_max_xp_multiplier()
{
if ( level.teambased )
return level.hvts_active[self.team] >= 4;
else if ( isdefined( self.hvts_active ) )
return self.hvts_active >= 2;
return 0;
}
usehighvaluetarget( var_0, var_1 )
{
if ( !maps\mp\_utility::isreallyalive( var_0 ) )
return 0;
if ( var_0.team == "spectator" )
return 0;
if ( reached_max_xp_multiplier() || isdefined( var_0.hvts_active ) && var_0.hvts_active >= 2 )
{
self iprintlnbold( &"KILLSTREAKS_HVT_MAX" );
return 0;
}
var_0 thread sethighvaluetarget();
level thread maps\mp\_utility::teamplayercardsplash( "used_hvt", var_0, var_0.team );
return 1;
}
sethighvaluetarget()
{
level endon( "game_ended" );
self endon( "disconnect" );
var_0 = self.team;
increasexpboost();
thread watchhvtowner( var_0 );
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 10 );
if ( level.teambased )
maps\mp\_utility::leaderdialog( "hvt_gone", var_0 );
else
maps\mp\_utility::leaderdialogonplayer( "hvt_gone" );
if ( level.teambased )
level decreasexpboost( var_0 );
else
decreasexpboost();
}
increasexpboost()
{
var_0 = 0;
if ( level.teambased )
{
level.hvts_active[self.team]++;
var_0 = level.hvts_active[self.team];
var_1 = self.team;
}
else
{
if ( !isdefined( self.hvts_active ) )
self.hvts_active = 1;
else
self.hvts_active++;
var_0 = self.hvts_active;
var_1 = self getentitynumber();
}
var_2 = 1 + var_0 * 0.5;
level.teamxpscale[var_1] = clamp( var_2, 1, 4 );
}
decreasexpboost( var_0 )
{
var_1 = 0;
if ( level.teambased )
{
if ( level.hvts_active[var_0] > 0 )
level.hvts_active[var_0]--;
var_1 = level.hvts_active[var_0];
var_2 = var_0;
}
else
{
if ( self.hvts_active > 0 )
self.hvts_active--;
var_1 = self.hvts_active;
var_2 = self getentitynumber();
}
var_3 = 1 + var_1 * 0.5;
level.teamxpscale[var_2] = clamp( var_3, 1, 4 );
}
watchhvtowner( var_0 )
{
level endon( "game_ended" );
var_1 = common_scripts\utility::waittill_any_return( "disconnect", "joined_team", "joined_spectators" );
if ( level.teambased )
level decreasexpboost( var_0 );
else if ( isdefined( self ) && var_1 != "disconnect" )
decreasexpboost();
}

1038
maps/mp/killstreaks/_ims.gsc Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,162 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.teamemped["allies"] = 0;
level.teamemped["axis"] = 0;
level.empplayer = undefined;
level.emptimeout = 10.0;
level.emptimeremaining = int( level.emptimeout );
level.killstreakfuncs["jammer"] = ::emp_use;
level thread onplayerconnect();
}
onplayerconnect()
{
for (;;)
{
level waittill( "connected", var_0 );
var_0 thread onplayerkilled();
var_0 thread onplayerspawned();
}
}
onplayerspawned()
{
self endon( "disconnect" );
for (;;)
{
self waittill( "spawned_player" );
if ( maps\mp\killstreaks\_emp_common::shouldplayerbeaffectedbyemp() )
maps\mp\killstreaks\_emp_common::applyperplayerempeffects();
}
}
onplayerkilled()
{
self endon( "disconnect" );
for (;;)
{
self waittill( "death" );
maps\mp\killstreaks\_emp_common::stopempjamsequenceimmediate();
}
}
emp_use( var_0, var_1 )
{
var_2 = self.pers["team"];
if ( level.teambased )
{
var_3 = level.otherteam[var_2];
thread emp_jamteam( var_3 );
}
else
thread emp_jamplayers( self );
maps\mp\_matchdata::logkillstreakevent( "jammer", self.origin );
self notify( "used_emp" );
level notify( "emp_used" );
return 1;
}
emp_jamteam( var_0 )
{
level endon( "game_ended" );
wait 0.5;
thread maps\mp\_utility::teamplayercardsplash( "used_jammer", self );
level notify( "EMP_JamTeam" + var_0 );
level endon( "EMP_JamTeam" + var_0 );
level.teamemped[var_0] = 1;
foreach ( var_2 in level.players )
{
var_2 maps\mp\killstreaks\_emp_common::applyperplayerempeffects_ondetonate();
if ( var_2 maps\mp\killstreaks\_emp_common::shouldplayerbeaffectedbyemp() )
var_2 maps\mp\killstreaks\_emp_common::applyperplayerempeffects();
}
level thread maps\mp\killstreaks\_emp_common::applyglobalempeffects();
level notify( "emp_update" );
level destroygroundobjects( self, var_0 );
level thread keepemptimeremaining();
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( level.emptimeout );
level.teamemped[var_0] = 0;
foreach ( var_2 in level.players )
{
if ( var_2.team == var_0 && !var_2 maps\mp\killstreaks\_emp_common::shouldplayerbeaffectedbyemp() )
var_2 maps\mp\killstreaks\_emp_common::removeperplayerempeffects();
}
level notify( "emp_update" );
}
emp_jamplayers( var_0 )
{
level notify( "EMP_JamPlayers" );
level endon( "EMP_JamPlayers" );
wait 0.5;
if ( !isdefined( var_0 ) )
return;
level.empplayer = var_0;
foreach ( var_2 in level.players )
{
var_2 maps\mp\killstreaks\_emp_common::applyperplayerempeffects_ondetonate();
if ( var_2 maps\mp\killstreaks\_emp_common::shouldplayerbeaffectedbyemp() )
var_2 maps\mp\killstreaks\_emp_common::applyperplayerempeffects();
}
level thread maps\mp\killstreaks\_emp_common::applyglobalempeffects();
level notify( "emp_update" );
level.empplayer thread empplayerffadisconnect();
level destroygroundobjects( var_0 );
level thread keepemptimeremaining();
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( level.emptimeout );
level.empplayer = undefined;
foreach ( var_2 in level.players )
{
if ( ( !isdefined( var_0 ) || var_2 != var_0 ) && !var_2 maps\mp\killstreaks\_emp_common::shouldplayerbeaffectedbyemp() )
var_2 maps\mp\killstreaks\_emp_common::removeperplayerempeffects();
}
level notify( "emp_update" );
level notify( "emp_ended" );
}
keepemptimeremaining()
{
level notify( "keepEMPTimeRemaining" );
level endon( "keepEMPTimeRemaining" );
level endon( "emp_ended" );
for ( level.emptimeremaining = int( level.emptimeout ); level.emptimeremaining; level.emptimeremaining-- )
wait 1.0;
}
empplayerffadisconnect()
{
level endon( "EMP_JamPlayers" );
level endon( "emp_ended" );
self waittill( "disconnect" );
level notify( "emp_update" );
}
destroygroundobjects( var_0, var_1 )
{
maps\mp\killstreaks\_killstreaks::destroytargetarray( var_0, var_1, "killstreak_emp_mp", level.turrets );
maps\mp\killstreaks\_killstreaks::destroytargetarray( var_0, var_1, "killstreak_emp_mp", level.placedims );
maps\mp\killstreaks\_killstreaks::destroytargetarray( var_0, var_1, "killstreak_emp_mp", level.balldrones );
thread maps\mp\killstreaks\_killstreaks::destroytargetarray( var_0, var_1, "killstreak_emp_mp", level.uplinks );
maps\mp\killstreaks\_killstreaks::destroytargetarray( var_0, var_1, "killstreak_emp_mp", level.mines );
}

View File

@ -0,0 +1,290 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.juggsettings = [];
level.juggsettings["juggernaut"] = spawnstruct();
level.juggsettings["juggernaut"].splashusedname = "used_juggernaut";
level.juggsettings["juggernaut_recon"] = spawnstruct();
level.juggsettings["juggernaut_recon"].splashusedname = "used_juggernaut_recon";
level.juggsettings["juggernaut_maniac"] = spawnstruct();
level.juggsettings["juggernaut_maniac"].splashusedname = "used_juggernaut_maniac";
level thread watchjugghostmigrationfinishedinit();
}
givejuggernaut( var_0 )
{
self endon( "death" );
self endon( "disconnect" );
wait 0.05;
if ( isdefined( self.lightarmorhp ) )
maps\mp\perks\_perkfunctions::unsetlightarmor();
maps\mp\gametypes\_weapons::disableplantedequipmentuse();
if ( maps\mp\_utility::_hasperk( "specialty_explosivebullets" ) )
maps\mp\_utility::_unsetperk( "specialty_explosivebullets" );
self.health = self.maxhealth;
var_1 = 1;
switch ( var_0 )
{
case "juggernaut":
self.isjuggernaut = 1;
self.juggmovespeedscaler = 0.8;
maps\mp\gametypes\_class::giveloadout( self.pers["team"], var_0, 0 );
self.movespeedscaler = 0.8;
maps\mp\_utility::giveperk( "specialty_scavenger", 0 );
maps\mp\_utility::giveperk( "specialty_quickdraw", 0 );
maps\mp\_utility::giveperk( "specialty_detectexplosive", 0 );
maps\mp\_utility::giveperk( "specialty_sharp_focus", 0 );
maps\mp\_utility::giveperk( "specialty_radarjuggernaut", 0 );
break;
case "juggernaut_recon":
self.isjuggernautrecon = 1;
self.juggmovespeedscaler = 0.8;
maps\mp\gametypes\_class::giveloadout( self.pers["team"], var_0, 0 );
self.movespeedscaler = 0.8;
maps\mp\_utility::giveperk( "specialty_scavenger", 0 );
maps\mp\_utility::giveperk( "specialty_coldblooded", 0 );
maps\mp\_utility::giveperk( "specialty_noscopeoutline", 0 );
maps\mp\_utility::giveperk( "specialty_detectexplosive", 0 );
maps\mp\_utility::giveperk( "specialty_sharp_focus", 0 );
maps\mp\_utility::giveperk( "specialty_radarjuggernaut", 0 );
if ( !isagent( self ) )
{
self makeportableradar( self );
maps\mp\gametypes\_missions::processchallenge( "ch_airdrop_juggernaut_recon" );
}
break;
case "juggernaut_maniac":
self.isjuggernautmaniac = 1;
self.juggmovespeedscaler = 1.15;
maps\mp\gametypes\_class::giveloadout( self.pers["team"], var_0, 0 );
maps\mp\_utility::giveperk( "specialty_blindeye", 0 );
maps\mp\_utility::giveperk( "specialty_coldblooded", 0 );
maps\mp\_utility::giveperk( "specialty_noscopeoutline", 0 );
maps\mp\_utility::giveperk( "specialty_detectexplosive", 0 );
maps\mp\_utility::giveperk( "specialty_marathon", 0 );
maps\mp\_utility::giveperk( "specialty_falldamage", 0 );
self.movespeedscaler = 1.15;
break;
default:
var_1 = self [[ level.mapcustomjuggfunc ]]( var_0 );
break;
}
if ( perkcheck( "specialty_hardline" ) )
maps\mp\_utility::giveperk( "specialty_hardline", 0 );
maps\mp\gametypes\_weapons::updatemovespeedscale();
self disableweaponpickup();
if ( !isagent( self ) )
{
if ( var_1 )
{
self setclientomnvar( "ui_juggernaut", 1 );
thread maps\mp\_utility::teamplayercardsplash( level.juggsettings[var_0].splashusedname, self );
thread juggernautsounds();
thread watchdisablejuggernaut();
thread watchenablejuggernaut();
}
}
if ( self.streaktype == "specialist" )
thread maps\mp\killstreaks\_killstreaks::clearkillstreaks();
else
thread maps\mp\killstreaks\_killstreaks::updatekillstreaks( 1 );
thread juggremover();
if ( isdefined( self.carryflag ) )
{
wait 0.05;
self attach( self.carryflag, "J_spine4", 1 );
}
level notify( "juggernaut_equipped", self );
maps\mp\_matchdata::logkillstreakevent( var_0, self.origin );
}
perkcheck( var_0 )
{
var_1 = self.pers["loadoutPerks"];
foreach ( var_3 in var_1 )
{
if ( var_3 == var_0 )
return 1;
}
return 0;
}
juggernautsounds()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "disconnect" );
self endon( "jugg_removed" );
for (;;)
{
wait 3.0;
maps\mp\_utility::playplayerandnpcsounds( self, "juggernaut_breathing_player", "juggernaut_breathing_sound" );
}
}
watchjugghostmigrationfinishedinit()
{
level endon( "game_ended" );
for (;;)
{
level waittill( "host_migration_end" );
foreach ( var_1 in level.players )
{
if ( isai( var_1 ) )
continue;
else
{
if ( var_1 maps\mp\_utility::isjuggernaut() && !( isdefined( var_1.isjuggernautlevelcustom ) && var_1.isjuggernautlevelcustom ) )
{
var_1 setclientomnvar( "ui_juggernaut", 1 );
continue;
}
var_1 setclientomnvar( "ui_juggernaut", 0 );
}
}
}
}
juggremover()
{
level endon( "game_ended" );
self endon( "disconnect" );
self endon( "jugg_removed" );
thread juggremoveongameended();
common_scripts\utility::waittill_any( "death", "joined_team", "joined_spectators", "lost_juggernaut" );
self enableweaponpickup();
self.isjuggernaut = 0;
self.isjuggernautdef = 0;
self.isjuggernautgl = 0;
self.isjuggernautrecon = 0;
self.isjuggernautmaniac = 0;
self.isjuggernautlevelcustom = 0;
if ( isplayer( self ) )
self setclientomnvar( "ui_juggernaut", 0 );
self unsetperk( "specialty_radarjuggernaut", 1 );
self notify( "jugg_removed" );
}
juggremoveongameended()
{
self endon( "disconnect" );
self endon( "jugg_removed" );
level waittill( "game_ended" );
if ( isplayer( self ) )
self setclientomnvar( "ui_juggernaut", 0 );
}
setjugg()
{
if ( isdefined( self.headmodel ) )
{
self detach( self.headmodel, "" );
self.headmodel = undefined;
}
self setmodel( "mp_fullbody_juggernaut_heavy_black" );
self setviewmodel( "viewhands_juggernaut_ally" );
self setclothtype( "vestheavy" );
}
setjuggmaniac()
{
if ( isdefined( self.headmodel ) )
{
self detach( self.headmodel, "" );
self.headmodel = undefined;
}
self setmodel( "mp_body_juggernaut_light_black" );
self setviewmodel( "viewhands_juggernaut_ally" );
self attach( "head_juggernaut_light_black", "", 1 );
self.headmodel = "head_juggernaut_light_black";
self setclothtype( "nylon" );
}
disablejuggernaut()
{
if ( maps\mp\_utility::isjuggernaut() )
{
self.juggernaut_disabled = 1;
self setclientomnvar( "ui_juggernaut", 0 );
}
}
enablejuggernaut()
{
if ( maps\mp\_utility::isjuggernaut() )
{
self.juggernaut_disabled = undefined;
self setclientomnvar( "ui_juggernaut", 1 );
}
}
watchdisablejuggernaut()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "jugg_removed" );
level endon( "game_ended" );
for (;;)
{
if ( !isdefined( self.juggernaut_disabled ) && maps\mp\_utility::isusingremote() )
{
self waittill( "black_out_done" );
disablejuggernaut();
}
wait 0.05;
}
}
watchenablejuggernaut()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "jugg_removed" );
level endon( "game_ended" );
for (;;)
{
if ( isdefined( self.juggernaut_disabled ) && !maps\mp\_utility::isusingremote() )
enablejuggernaut();
wait 0.05;
}
}
initlevelcustomjuggernaut( var_0, var_1, var_2, var_3 )
{
level.mapcustomjuggfunc = var_0;
level.mapcustomjuggsetclass = var_1;
level.mapcustomjuggkilledsplash = var_3;
game["allies_model"]["JUGGERNAUT_CUSTOM"] = var_2;
game["axis_model"]["JUGGERNAUT_CUSTOM"] = var_2;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,91 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
maps\mp\killstreaks\_killstreaks::initkillstreakdata();
level.killstreakfuncs = [];
level.killstreaksetupfuncs = [];
level.killstreakweapons = [];
thread maps\mp\killstreaks\_uav::init();
thread maps\mp\killstreaks\_plane::init();
thread maps\mp\killstreaks\_airdrop::init();
thread maps\mp\killstreaks\_helicopter::init();
thread maps\mp\killstreaks\_nuke::init();
thread maps\mp\killstreaks\_a10::init();
thread maps\mp\killstreaks\_portableaoegenerator::init();
thread maps\mp\killstreaks\_ims::init();
thread maps\mp\killstreaks\_perkstreaks::init();
thread maps\mp\killstreaks\_juggernaut::init();
thread maps\mp\killstreaks\_ball_drone::init();
thread maps\mp\killstreaks\_autosentry::init();
thread maps\mp\killstreaks\_remotemissile::init();
thread maps\mp\killstreaks\_deployablebox::init();
thread maps\mp\killstreaks\_deployablebox_vest::init();
thread maps\mp\killstreaks\_deployablebox_gun::init();
thread maps\mp\killstreaks\_helisniper::init();
thread maps\mp\killstreaks\_helicopter_pilot::init();
thread maps\mp\killstreaks\_vanguard::init();
thread maps\mp\killstreaks\_uplink::init();
thread maps\mp\killstreaks\_dronehive::init();
thread maps\mp\killstreaks\_jammer::init();
thread maps\mp\killstreaks\_air_superiority::init();
thread maps\mp\killstreaks\_odin::init();
thread maps\mp\killstreaks\_highvaluetarget::init();
thread maps\mp\killstreaks\_aalauncher::init();
level.killstreakweildweapons = [];
level.killstreakweildweapons["sentry_minigun_mp"] = "sentry";
level.killstreakweildweapons["hind_bomb_mp"] = "helicopter";
level.killstreakweildweapons["hind_missile_mp"] = "helicopter";
level.killstreakweildweapons["cobra_20mm_mp"] = "helicopter";
level.killstreakweildweapons["nuke_mp"] = "nuke";
level.killstreakweildweapons["manned_littlebird_sniper_mp"] = "heli_sniper";
level.killstreakweildweapons["iw6_minigunjugg_mp"] = "airdrop_juggernaut";
level.killstreakweildweapons["iw6_p226jugg_mp"] = "airdrop_juggernaut";
level.killstreakweildweapons["mortar_shelljugg_mp"] = "airdrop_juggernaut";
level.killstreakweildweapons["iw6_riotshieldjugg_mp"] = "airdrop_juggernaut_recon";
level.killstreakweildweapons["iw6_magnumjugg_mp"] = "airdrop_juggernaut_recon";
level.killstreakweildweapons["smoke_grenadejugg_mp"] = "airdrop_juggernaut_recon";
level.killstreakweildweapons["iw6_knifeonlyjugg_mp"] = "airdrop_juggernaut_maniac";
level.killstreakweildweapons["throwingknifejugg_mp"] = "airdrop_juggernaut_maniac";
level.killstreakweildweapons["deployable_vest_marker_mp"] = "deployable_vest";
level.killstreakweildweapons["deployable_weapon_crate_marker_mp"] = "deployable_ammo";
level.killstreakweildweapons["heli_pilot_turret_mp"] = "heli_pilot";
level.killstreakweildweapons["guard_dog_mp"] = "guard_dog";
level.killstreakweildweapons["ims_projectile_mp"] = "ims";
level.killstreakweildweapons["ball_drone_gun_mp"] = "ball_drone_backup";
level.killstreakweildweapons["drone_hive_projectile_mp"] = "drone_hive";
level.killstreakweildweapons["switch_blade_child_mp"] = "drone_hive";
level.killstreakweildweapons["iw6_maaws_mp"] = "aa_launcher";
level.killstreakweildweapons["iw6_maawschild_mp"] = "aa_launcher";
level.killstreakweildweapons["iw6_maawshoming_mp"] = "aa_launcher";
level.killstreakweildweapons["killstreak_uplink_mp"] = "uplink";
level.killstreakweildweapons["odin_projectile_large_rod_mp"] = "odin_assault";
level.killstreakweildweapons["odin_projectile_small_rod_mp"] = "odin_assault";
level.killstreakweildweapons["iw6_gm6helisnipe_mp"] = "heli_sniper";
level.killstreakweildweapons["iw6_gm6helisnipe_mp_gm6scope"] = "heli_sniper";
level.killstreakweildweapons["aamissile_projectile_mp"] = "air_superiority";
level.killstreakweildweapons["airdrop_marker_mp"] = "airdrop_assault";
level.killstreakweildweapons["remote_tank_projectile_mp"] = "vanguard";
level.killstreakweildweapons["killstreak_vanguard_mp"] = "vanguard";
level.killstreakweildweapons["agent_mp"] = "agent";
level.killstreakweildweapons["agent_support_mp"] = "recon_agent";
level.killstreakweildweapons["iw6_axe_mp"] = "juggernaut_swamp_slasher";
level.killstreakweildweapons["venomxgun_mp"] = "venom_x_gun";
level.killstreakweildweapons["venomxproj_mp"] = "venom_x_projectile";
level.killstreakweildweapons["iw6_predatorcannon_mp"] = "juggernaut_predator";
level.killstreakweildweapons["iw6_predatorsuicide_mp"] = "juggernaut_predator";
level.killstreakweildweapons["volcano_rock_mp"] = "volcano";
level.killstreakweildweapons["ac130_105mm_mp"] = "ac130";
level.killstreakweildweapons["ac130_40mm_mp"] = "ac130";
level.killstreakweildweapons["ac130_25mm_mp"] = "ac130";
level.killstreakweildweapons["iw6_mariachimagnum_mp_akimbo"] = "juggernaut_death_mariachi";
level.killstreakweildweapons["harrier_20mm_mp"] = "harrier_airstrike";
level.killstreakweildweapons["artillery_mp"] = "harrier_airstrike";
if ( isdefined( level.mapcustomkillstreakfunc ) )
[[ level.mapcustomkillstreakfunc ]]();
level.killstreakrounddelay = maps\mp\_utility::getintproperty( "scr_game_killstreakdelay", 8 );
level thread maps\mp\killstreaks\_killstreaks::onplayerconnect();
}

View File

@ -0,0 +1,769 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.killstreakfuncs["lasedStrike"] = ::tryuselasedstrike;
level.numberofsoflamammo = 2;
level.lasedstrikeglow = loadfx( "fx/misc/laser_glow" );
level.lasedstrikeexplode = loadfx( "fx/explosions/uav_advanced_death" );
var_0 = getentarray( "remoteMissileSpawn", "targetname" );
foreach ( var_2 in var_0 )
{
if ( isdefined( var_2.target ) )
var_2.targetent = getent( var_2.target, "targetname" );
}
level.lasedstrikeents = var_0;
thread onplayerconnect();
}
onplayerconnect()
{
for (;;)
{
level waittill( "connected", var_0 );
var_0 thread onplayerspawned();
var_0.soflamammoused = 0;
var_0.hassoflam = 0;
}
}
onplayerspawned()
{
self endon( "disconnect" );
for (;;)
self waittill( "spawned_player" );
}
tryuselasedstrike( var_0, var_1 )
{
return uselasedstrike();
}
uselasedstrike()
{
var_0 = watchsoflamusage();
if ( isdefined( var_0 ) && var_0 )
{
self.hassoflam = 0;
return 1;
}
else
return 0;
}
givemarker()
{
maps\mp\killstreaks\_killstreaks::givekillstreakweapon( "iw5_soflam_mp" );
self.hassoflam = 1;
thread watchsoflamusage();
}
watchsoflamusage()
{
self notify( "watchSoflamUsage" );
self endon( "watchSoflamUsage" );
level endon( "game_ended" );
self endon( "disconnect" );
self endon( "death" );
while ( maps\mp\_utility::ischangingweapon() )
wait 0.05;
for (;;)
{
if ( self attackbuttonpressed() && self getcurrentweapon() == "iw5_soflam_mp" && self adsbuttonpressed() )
{
self weaponlocktargettooclose( 0 );
self weaponlockfree();
var_0 = gettargetpoint();
if ( !isdefined( var_0 ) )
{
wait 0.05;
continue;
}
if ( !isdefined( var_0[0] ) )
{
wait 0.05;
continue;
}
var_1 = var_0[0];
var_2 = attacklasedtarget( var_1 );
if ( var_2 )
self.soflamammoused++;
if ( self.soflamammoused >= level.numberofsoflamammo )
return 1;
}
if ( maps\mp\_utility::ischangingweapon() )
return 0;
wait 0.05;
}
}
playlocksound()
{
if ( isdefined( self.playinglocksound ) && self.playinglocksound )
return;
self playlocalsound( "javelin_clu_lock" );
self.playinglocksound = 1;
wait 0.75;
self stoplocalsound( "javelin_clu_lock" );
self.playinglocksound = 0;
}
playlockerrorsound()
{
if ( isdefined( self.playinglocksound ) && self.playinglocksound )
return;
self playlocalsound( "javelin_clu_aquiring_lock" );
self.playinglocksound = 1;
wait 0.75;
self stoplocalsound( "javelin_clu_aquiring_lock" );
self.playinglocksound = 0;
}
attacklasedtarget( var_0 )
{
var_1 = undefined;
var_2 = undefined;
var_3 = 6000;
var_4 = ( 0, 0, var_3 );
var_5 = 3000;
var_6 = anglestoforward( self.angles );
var_7 = self.origin;
var_8 = var_7 + var_4 + var_6 * var_5 * -1;
var_9 = 0;
var_10 = bullettrace( var_0 + ( 0, 0, var_3 ), var_0, 0 );
if ( var_10["fraction"] > 0.99 )
{
var_9 = 1;
var_8 = var_0 + ( 0, 0, var_3 );
}
if ( !var_9 )
{
var_10 = bullettrace( var_0 + ( 300, 0, var_3 ), var_0, 0 );
if ( var_10["fraction"] > 0.99 )
{
var_9 = 1;
var_8 = var_0 + ( 300, 0, var_3 );
}
}
if ( !var_9 )
{
var_10 = bullettrace( var_0 + ( 0, 300, var_3 ), var_0, 0 );
if ( var_10["fraction"] > 0.99 )
{
var_9 = 1;
var_8 = var_0 + ( 0, 300, var_3 );
}
}
if ( !var_9 )
{
var_10 = bullettrace( var_0 + ( 0, -300, var_3 ), var_0, 0 );
if ( var_10["fraction"] > 0.99 )
{
var_9 = 1;
var_8 = var_0 + ( 0, -300, var_3 );
}
}
if ( !var_9 )
{
var_10 = bullettrace( var_0 + ( 300, 300, var_3 ), var_0, 0 );
if ( var_10["fraction"] > 0.99 )
{
var_9 = 1;
var_8 = var_0 + ( 300, 300, var_3 );
}
}
if ( !var_9 )
{
var_10 = bullettrace( var_0 + ( -300, 0, var_3 ), var_0, 0 );
if ( var_10["fraction"] > 0.99 )
{
var_9 = 1;
var_8 = var_0 + ( -300, 0, var_3 );
}
}
if ( !var_9 )
{
var_10 = bullettrace( var_0 + ( -300, -300, var_3 ), var_0, 0 );
if ( var_10["fraction"] > 0.99 )
{
var_9 = 1;
var_8 = var_0 + ( -300, -300, var_3 );
}
}
if ( !var_9 )
{
var_10 = bullettrace( var_0 + ( 300, -300, var_3 ), var_0, 0 );
if ( var_10["fraction"] > 0.99 )
{
var_9 = 1;
var_8 = var_0 + ( 300, -300, var_3 );
}
}
if ( !var_9 )
{
for ( var_11 = 0; var_11 < 5; var_11++ )
{
var_3 = var_3 / 2;
var_4 = ( 0, 0, var_3 );
var_8 = self.origin + var_4 + var_6 * var_5 * -1;
var_12 = bullettrace( var_0, var_8, 0 );
if ( var_12["fraction"] > 0.99 )
{
var_9 = 1;
break;
}
wait 0.05;
}
}
if ( !var_9 )
{
for ( var_11 = 0; var_11 < 5; var_11++ )
{
var_3 = var_3 * 2.5;
var_4 = ( 0, 0, var_3 );
var_8 = self.origin + var_4 + var_6 * var_5 * -1;
var_12 = bullettrace( var_0, var_8, 0 );
if ( var_12["fraction"] > 0.99 )
{
var_9 = 1;
break;
}
wait 0.05;
}
}
if ( !var_9 )
{
thread canthittarget();
return 0;
}
var_1 = spawnfx( level.lasedstrikeglow, var_0 );
thread playlocksound();
self weaponlockfinalize( var_0, ( 0, 0, 0 ), 0 );
var_13 = magicbullet( "lasedStrike_missile_mp", var_8, var_0, self );
var_13 missile_settargetent( var_1 );
thread looptriggeredeffect( var_1, var_13 );
var_13 waittill( "death" );
if ( isdefined( var_1 ) )
var_1 delete();
self weaponlockfree();
return 1;
}
looptriggeredeffect( var_0, var_1 )
{
var_1 endon( "death" );
level endon( "game_ended" );
for (;;)
{
triggerfx( var_0 );
wait 0.05;
}
}
lasedmissiledistance( var_0 )
{
level endon( "game_ended" );
var_0 endon( "death" );
var_0 endon( "remote_done" );
self endon( "death" );
for (;;)
{
var_1 = distance( self.origin, var_0.targetent.origin );
var_0.owner setclientdvar( "ui_reaper_targetDistance", int( var_1 / 12 ) );
wait 0.05;
}
}
canthittarget()
{
thread playlockerrorsound();
self weaponlocktargettooclose( 1 );
}
checkbesttargetvector( var_0, var_1 )
{
foreach ( var_3 in level.lasedstrikeents )
{
var_4 = bullettrace( var_3.origin, var_1, 0, var_0 );
if ( var_4["fraction"] >= 0.98 )
return var_3;
wait 0.05;
}
return;
}
gettargetpoint()
{
var_0 = self geteye();
var_1 = self getplayerangles();
var_2 = anglestoforward( var_1 );
var_3 = var_0 + var_2 * 15000;
var_4 = bullettrace( var_0, var_3, 0, undefined );
if ( var_4["surfacetype"] == "none" )
return undefined;
if ( var_4["surfacetype"] == "default" )
return undefined;
var_5 = var_4["entity"];
if ( isdefined( var_5 ) )
{
if ( var_5 == level.ac130.planemodel )
return undefined;
}
var_6 = [];
var_6[0] = var_4["position"];
var_6[1] = var_4["normal"];
return var_6;
}
spawnremote( var_0 )
{
var_1 = spawnplane( var_0, "script_model", level.uavrig gettagorigin( "tag_origin" ), "compass_objpoint_reaper_friendly", "compass_objpoint_reaper_enemy" );
if ( !isdefined( var_1 ) )
return undefined;
var_1 setmodel( "vehicle_predator_b" );
var_1.team = var_0.team;
var_1.owner = var_0;
var_1.numflares = 2;
var_1 setcandamage( 1 );
var_1 thread damagetracker();
var_1.helitype = "remote_mortar";
var_1.uavtype = "remote_mortar";
var_1 maps\mp\killstreaks\_uav::adduavmodel();
var_2 = 6300;
var_3 = randomint( 360 );
var_4 = 6100;
var_5 = cos( var_3 ) * var_4;
var_6 = sin( var_3 ) * var_4;
var_7 = vectornormalize( ( var_5, var_6, var_2 ) );
var_7 = var_7 * 6100;
var_1 linkto( level.uavrig, "tag_origin", var_7, ( 0, var_3 - 90, 10 ) );
var_1 thread handledeath( var_0 );
var_1 thread handleownerchangeteam( var_0 );
var_1 thread handleownerdisconnect( var_0 );
var_1 thread handletimeout();
var_1 thread handleincomingstinger();
var_1 thread handleincomingsam();
return var_1;
}
handledeath( var_0 )
{
level endon( "game_ended" );
var_0 endon( "disconnect" );
self endon( "remote_removed" );
self endon( "remote_done" );
self waittill( "death" );
level thread removeremote( self, 1 );
}
handleownerchangeteam( var_0 )
{
level endon( "game_ended" );
self endon( "remote_done" );
self endon( "death" );
var_0 endon( "disconnect" );
var_0 endon( "removed_reaper_ammo" );
var_0 common_scripts\utility::waittill_any( "joined_team", "joined_spectators" );
thread remoteleave();
}
handleownerdisconnect( var_0 )
{
level endon( "game_ended" );
self endon( "remote_done" );
self endon( "death" );
var_0 endon( "removed_reaper_ammo" );
var_0 waittill( "disconnect" );
thread remoteleave();
}
shotcounter()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "remote_done" );
var_0 = 0;
for (;;)
{
self waittill( "lasedTargetShotFired" );
var_0++;
if ( var_0 >= 5 )
break;
}
thread remoteleave();
}
handletimeout()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "remote_done" );
wait 120;
thread remoteleave();
}
removeremote( var_0, var_1 )
{
self notify( "remote_removed" );
if ( isdefined( var_0.targetent ) )
var_0.targetent delete();
level.lasedstrikeactive = 0;
level.lasedstrikecrateactive = 0;
if ( isdefined( var_0 ) )
{
var_0 delete();
var_0 maps\mp\killstreaks\_uav::removeuavmodel();
}
if ( !isdefined( var_1 ) || var_1 == 1 )
level.remote_mortar = undefined;
}
remoteleave()
{
level.remote_mortar = undefined;
level endon( "game_ended" );
self endon( "death" );
self notify( "remote_done" );
var_0 = self.origin + anglestoforward( self.angles ) * 20000;
self moveto( var_0, 30 );
playfxontag( level._effect["ac130_engineeffect"], self, "tag_origin" );
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 3 );
self moveto( var_0, 4, 4, 0.0 );
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 4 );
level thread removeremote( self, 0 );
}
remoteexplode()
{
self notify( "death" );
self hide();
var_0 = anglestoright( self.angles ) * 200;
playfx( level.lasedstrikeexplode, self.origin, var_0 );
level.lasedstrikeactive = 0;
level.lasedstrikecrateactive = 0;
}
damagetracker()
{
level endon( "game_ended" );
self.owner endon( "disconnect" );
self.health = 999999;
self.maxhealth = 1500;
self.damagetaken = 0;
for (;;)
{
self waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
if ( !maps\mp\gametypes\_weapons::friendlyfirecheck( self.owner, var_1 ) )
continue;
if ( !isdefined( self ) )
return;
if ( isdefined( var_8 ) && var_8 & level.idflags_penetration )
self.wasdamagedfrombulletpenetration = 1;
self.wasdamaged = 1;
var_10 = var_0;
if ( isplayer( var_1 ) )
{
var_1 maps\mp\gametypes\_damagefeedback::updatedamagefeedback( "" );
if ( var_4 == "MOD_RIFLE_BULLET" || var_4 == "MOD_PISTOL_BULLET" )
{
if ( var_1 maps\mp\_utility::_hasperk( "specialty_armorpiercing" ) )
var_10 = var_10 + var_0 * level.armorpiercingmod;
}
}
if ( isdefined( var_9 ) )
{
switch ( var_9 )
{
case "javelin_mp":
case "stinger_mp":
self.largeprojectiledamage = 1;
var_10 = self.maxhealth + 1;
break;
case "sam_projectile_mp":
self.largeprojectiledamage = 1;
break;
}
maps\mp\killstreaks\_killstreaks::killstreakhit( var_1, var_9, self );
}
self.damagetaken = self.damagetaken + var_10;
if ( isdefined( self.owner ) )
self.owner playlocalsound( "reaper_damaged" );
if ( self.damagetaken >= self.maxhealth )
{
if ( isplayer( var_1 ) && ( !isdefined( self.owner ) || var_1 != self.owner ) )
{
var_1 notify( "destroyed_killstreak", var_9 );
thread maps\mp\_utility::teamplayercardsplash( "callout_destroyed_remote_mortar", var_1 );
var_1 thread maps\mp\gametypes\_rank::giverankxp( "kill", 50, var_9, var_4 );
var_1 thread maps\mp\gametypes\_rank::xpeventpopup( "destroyed_remote_mortar" );
thread maps\mp\gametypes\_missions::vehiclekilled( self.owner, self, undefined, var_1, var_0, var_4, var_9 );
}
if ( isdefined( self.owner ) )
self.owner stoplocalsound( "missile_incoming" );
thread remoteexplode();
level.remote_mortar = undefined;
return;
}
}
}
handleincomingstinger()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "remote_done" );
for (;;)
{
level waittill( "stinger_fired", var_0, var_1, var_2 );
if ( !isdefined( var_2 ) || var_2 != self )
continue;
var_1 thread stingerproximitydetonate( var_2, var_0 );
}
}
stingerproximitydetonate( var_0, var_1 )
{
self endon( "death" );
var_0 endon( "death" );
if ( isdefined( var_0.owner ) )
var_0.owner playlocalsound( "missile_incoming" );
self missile_settargetent( var_0 );
var_2 = distance( self.origin, var_0 getpointinbounds( 0, 0, 0 ) );
var_3 = var_0 getpointinbounds( 0, 0, 0 );
for (;;)
{
if ( !isdefined( var_0 ) )
var_4 = var_3;
else
var_4 = var_0 getpointinbounds( 0, 0, 0 );
var_3 = var_4;
var_5 = distance( self.origin, var_4 );
if ( var_5 < 3000 && var_0.numflares > 0 )
{
var_0.numflares--;
var_0 thread maps\mp\killstreaks\_flares::flares_playfx();
var_6 = var_0 maps\mp\killstreaks\_flares::flares_deploy();
self missile_settargetent( var_6 );
var_0 = var_6;
if ( isdefined( var_0.owner ) )
var_0.owner stoplocalsound( "missile_incoming" );
return;
}
if ( var_5 < var_2 )
var_2 = var_5;
if ( var_5 > var_2 )
{
if ( var_5 > 1536 )
return;
if ( isdefined( var_0.owner ) )
{
var_0.owner stoplocalsound( "missile_incoming" );
if ( level.teambased )
{
if ( var_0.team != var_1.team )
radiusdamage( self.origin, 1000, 1000, 1000, var_1, "MOD_EXPLOSIVE", "stinger_mp" );
}
else
radiusdamage( self.origin, 1000, 1000, 1000, var_1, "MOD_EXPLOSIVE", "stinger_mp" );
}
self hide();
wait 0.05;
self delete();
}
wait 0.05;
}
}
handleincomingsam()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "remote_done" );
for (;;)
{
level waittill( "sam_fired", var_0, var_1, var_2 );
if ( !isdefined( var_2 ) || var_2 != self )
continue;
level thread samproximitydetonate( var_2, var_0, var_1 );
}
}
samproximitydetonate( var_0, var_1, var_2 )
{
var_0 endon( "death" );
if ( isdefined( var_0.owner ) )
var_0.owner playlocalsound( "missile_incoming" );
var_3 = 150;
var_4 = 1000;
var_5 = [];
for ( var_6 = 0; var_6 < var_2.size; var_6++ )
{
if ( isdefined( var_2[var_6] ) )
{
var_5[var_6] = distance( var_2[var_6].origin, var_0 getpointinbounds( 0, 0, 0 ) );
continue;
}
var_5[var_6] = undefined;
}
for (;;)
{
var_7 = var_0 getpointinbounds( 0, 0, 0 );
var_8 = [];
for ( var_6 = 0; var_6 < var_2.size; var_6++ )
{
if ( isdefined( var_2[var_6] ) )
var_8[var_6] = distance( var_2[var_6].origin, var_7 );
}
for ( var_6 = 0; var_6 < var_8.size; var_6++ )
{
if ( isdefined( var_8[var_6] ) )
{
if ( var_8[var_6] < 3000 && var_0.numflares > 0 )
{
var_0.numflares--;
var_0 thread maps\mp\killstreaks\_flares::flares_playfx();
var_9 = var_0 maps\mp\killstreaks\_flares::flares_deploy();
for ( var_10 = 0; var_10 < var_2.size; var_10++ )
{
if ( isdefined( var_2[var_10] ) )
var_2[var_10] missile_settargetent( var_9 );
}
if ( isdefined( var_0.owner ) )
var_0.owner stoplocalsound( "missile_incoming" );
return;
}
if ( var_8[var_6] < var_5[var_6] )
var_5[var_6] = var_8[var_6];
if ( var_8[var_6] > var_5[var_6] )
{
if ( var_8[var_6] > 1536 )
continue;
if ( isdefined( var_0.owner ) )
{
var_0.owner stoplocalsound( "missile_incoming" );
if ( level.teambased )
{
if ( var_0.team != var_1.team )
radiusdamage( var_2[var_6].origin, var_4, var_3, var_3, var_1, "MOD_EXPLOSIVE", "sam_projectile_mp" );
}
else
radiusdamage( var_2[var_6].origin, var_4, var_3, var_3, var_1, "MOD_EXPLOSIVE", "sam_projectile_mp" );
}
var_2[var_6] hide();
wait 0.05;
var_2[var_6] delete();
}
}
}
wait 0.05;
}
}

View File

@ -0,0 +1,588 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.tankfire = loadfx( "fx/props/barrelexp" );
level.tankexplode = loadfx( "fx/explosions/large_vehicle_explosion" );
level.tankflash = loadfx( "fx/muzzleflashes/ac130_105mm" );
level.tankdust1 = loadfx( "fx/smoke/ground_smoke_launch_a" );
level.tankdust2 = loadfx( "fx/smoke/ground_smoke_launch_a" );
level.ground_support_locs = [];
level.ground_support_locs["mp_alpha"][0]["origin"] = ( -2748.91, 2921.33, 125.394 );
level.ground_support_locs["mp_alpha"][0]["angles"] = ( 0, 16, 0 );
level.ground_support_locs["mp_alpha"][1]["origin"] = ( 707.795, -499.191, -7.875 );
level.ground_support_locs["mp_alpha"][1]["angles"] = ( 0, 90, 0 );
level.ground_support_locs["mp_alpha"][2]["origin"] = ( 81.8557, 2343.87, -7.875 );
level.ground_support_locs["mp_alpha"][2]["angles"] = ( 0, -90.1, 0 );
level.ground_support_locs["mp_bravo"][0]["origin"] = ( -761.529, 1221.7, 1212.13 );
level.ground_support_locs["mp_bravo"][0]["angles"] = ( 0, -92.373, 0 );
level.ground_support_locs["mp_bravo"][1]["origin"] = ( 1474.99, 971.865, 1140.13 );
level.ground_support_locs["mp_bravo"][1]["angles"] = ( 0, -178.401, 0 );
level.ground_support_locs["mp_bravo"][2]["origin"] = ( -1366.57, -370.995, 975.807 );
level.ground_support_locs["mp_bravo"][2]["angles"] = ( 0, 0.807495, 0 );
level.ground_support_locs["mp_dome"][0]["origin"] = ( 960.279, -482.564, -388.872 );
level.ground_support_locs["mp_dome"][0]["angles"] = ( 0, 100.536, 0 );
level.ground_support_locs["mp_dome"][1]["origin"] = ( -921.941, 166.449, -418.131 );
level.ground_support_locs["mp_dome"][1]["angles"] = ( 0, 25.4524, 0 );
level.ground_support_locs["mp_dome"][2]["origin"] = ( 43.3564, 2102.85, -290.875 );
level.ground_support_locs["mp_dome"][2]["angles"] = ( 0, -95.0347, 0 );
level.ground_support_locs["mp_plaza2"][0]["origin"] = ( -1579.34, -2349.41, 556.125 );
level.ground_support_locs["mp_plaza2"][0]["angles"] = ( 0, 5.32288, 0 );
level.ground_support_locs["mp_plaza2"][1]["origin"] = ( -135.286, 1622.04, 607.13 );
level.ground_support_locs["mp_plaza2"][1]["angles"] = ( 0, 173.639, 0 );
level.ground_support_locs["mp_plaza2"][2]["origin"] = ( -1544.55, 1966.84, 632.024 );
level.ground_support_locs["mp_plaza2"][2]["angles"] = ( 0, 0.796509, 0 );
level.ground_support_locs["mp_radar"][0]["origin"] = ( 896.685, 2692.74, 1208.13 );
level.ground_support_locs["mp_radar"][0]["angles"] = ( 0, -178.313, 0 );
level.ground_support_locs["mp_radar"][1]["origin"] = ( -2455.87, 1564.41, 1308.9 );
level.ground_support_locs["mp_radar"][1]["angles"] = ( 0, 1.93471, 0 );
level.ground_support_locs["mp_radar"][2]["origin"] = ( 1609, -1098.99, 1162.13 );
level.ground_support_locs["mp_radar"][2]["angles"] = ( 0, 170.421, 0 );
level.ground_support_locs["mp_interchange"][0]["origin"] = ( -2067.08, 1218.17, -82.0487 );
level.ground_support_locs["mp_interchange"][0]["angles"] = ( 0, -26.2946, 0 );
level.ground_support_locs["mp_interchange"][1]["origin"] = ( -1198.2, -1782.62, 103.665 );
level.ground_support_locs["mp_interchange"][1]["angles"] = ( 0, 23.3544, 0 );
level.ground_support_locs["mp_interchange"][2]["origin"] = ( 2391.95, 899.034, 87.7839 );
level.ground_support_locs["mp_interchange"][2]["angles"] = ( 0, -136.134, 0 );
level.ground_support_locs["mp_lambeth"][0]["origin"] = ( 1641.37, -1318.01, -260.173 );
level.ground_support_locs["mp_lambeth"][0]["angles"] = ( 0, 133.329, 0 );
level.ground_support_locs["mp_lambeth"][1]["origin"] = ( -1346.56, -880.226, -191.875 );
level.ground_support_locs["mp_lambeth"][1]["angles"] = ( 0, 0.432892, 0 );
level.ground_support_locs["mp_lambeth"][2]["origin"] = ( 1403.95, 3083.4, -287.354 );
level.ground_support_locs["mp_lambeth"][2]["angles"] = ( 0, -106.321, 0 );
level.ground_support_locs["mp_paris"][0]["origin"] = ( -2427.42, 619.217, 188.826 );
level.ground_support_locs["mp_paris"][0]["angles"] = ( 0, -2.90588, 0 );
level.ground_support_locs["mp_paris"][1]["origin"] = ( 2066.95, 796.542, -88.322 );
level.ground_support_locs["mp_paris"][1]["angles"] = ( 0, 177.292, 0 );
level.ground_support_locs["mp_paris"][2]["origin"] = ( 506.406, -2165.36, -64.1201 );
level.ground_support_locs["mp_paris"][2]["angles"] = ( 0, 89.5715, 0 );
level.ground_support_locs["mp_hardhat"][0]["origin"] = ( 2033.65, -1428.62, 299.86 );
level.ground_support_locs["mp_hardhat"][0]["angles"] = ( 0, 177.979, 0 );
level.ground_support_locs["mp_hardhat"][1]["origin"] = ( -1044.73, 82.9179, 181.022 );
level.ground_support_locs["mp_hardhat"][1]["angles"] = ( 0, -2.68066, 0 );
level.ground_support_locs["mp_hardhat"][2]["origin"] = ( 1248.95, 1322.56, 304.125 );
level.ground_support_locs["mp_hardhat"][2]["angles"] = ( 0, -93.4772, 0 );
level.ground_support_locs["mp_carbon"][0]["origin"] = ( -47.1408, -2841.26, 3940.01 );
level.ground_support_locs["mp_carbon"][0]["angles"] = ( 0, -101.667, 0 );
level.ground_support_locs["mp_carbon"][1]["origin"] = ( -1686.2, -4727.09, 3756.16 );
level.ground_support_locs["mp_carbon"][1]["angles"] = ( 0, 87.6436, 0 );
level.ground_support_locs["mp_carbon"][2]["origin"] = ( -3761.18, -3716.69, 3568.91 );
level.ground_support_locs["mp_carbon"][2]["angles"] = ( 0, -4.20761, 0 );
level.ground_support_locs["mp_seatown"][0]["origin"] = ( 1339.87, 763.592, 175.114 );
level.ground_support_locs["mp_seatown"][0]["angles"] = ( 0, 178.551, 0 );
level.ground_support_locs["mp_seatown"][1]["origin"] = ( 1317.92, -725.589, 232.125 );
level.ground_support_locs["mp_seatown"][1]["angles"] = ( 0, 177.738, 0 );
level.ground_support_locs["mp_seatown"][2]["origin"] = ( -961.699, -1581.56, 144.125 );
level.ground_support_locs["mp_seatown"][2]["angles"] = ( 0, 90.0176, 0 );
level.ground_support_locs["mp_bootleg"][0]["origin"] = ( -988.964, 1833.74, -99.9509 );
level.ground_support_locs["mp_bootleg"][0]["angles"] = ( 0, -78.8909, 0 );
level.ground_support_locs["mp_bootleg"][1]["origin"] = ( 1105.84, -1116.13, -72.3048 );
level.ground_support_locs["mp_bootleg"][1]["angles"] = ( 0, 176.558, 0 );
level.ground_support_locs["mp_bootleg"][2]["origin"] = ( -2027.31, 84.2235, -51.875 );
level.ground_support_locs["mp_bootleg"][2]["angles"] = ( 0, -5.12868, 0 );
level.ground_support_locs["mp_meteora"][0]["origin"] = ( -590.972, 1667.65, -99.6187 );
level.ground_support_locs["mp_meteora"][0]["angles"] = ( 0, -89.7745, 0 );
level.ground_support_locs["mp_meteora"][1]["origin"] = ( -1371.02, -1095.66, 4.125 );
level.ground_support_locs["mp_meteora"][1]["angles"] = ( 0, 179.879, 0 );
level.ground_support_locs["mp_meteora"][2]["origin"] = ( 938.851, -1376.99, -60.0877 );
level.ground_support_locs["mp_meteora"][2]["angles"] = ( 0, 110.545, 0 );
level.killstreakfuncs["mobile_mortar"] = ::tryusemobilemortar;
}
tryusemobilemortar( var_0, var_1 )
{
if ( !isdefined( level.ground_support_locs[level.script] ) )
{
self iprintlnbold( &"KILLSTREAKS_UNAVAILABLE_IN_LEVEL" );
return 0;
}
if ( isdefined( self.laststand ) && !maps\mp\_utility::_hasperk( "specialty_finalstand" ) )
{
self iprintlnbold( &"KILLSTREAKS_UNAVAILABLE_IN_LASTSTAND" );
return 0;
}
else if ( isdefined( level.mobilemortar ) )
{
self iprintlnbold( &"KILLSTREAKS_GROUND_APPROACHES_TOO_CROWDED" );
return 0;
}
else if ( maps\mp\_utility::isusingremote() )
return 0;
var_2 = selectentrancelocation();
if ( !isdefined( var_2 ) )
return 0;
else
thread maps\mp\_utility::stoplocationselection( 0 );
var_3 = createmobilemortar( self, var_2 );
if ( !isdefined( var_3 ) )
return 0;
var_3 thread movetoposition( "entrance" );
return 1;
}
selectentrancelocation()
{
var_0 = undefined;
for (;;)
{
thread showicons();
maps\mp\_utility::_beginlocationselection( "mobile_mortar", "map_artillery_selector", 0, 500 );
self endon( "stop_location_selection" );
self waittill( "confirm_location", var_1 );
for ( var_2 = 0; var_2 < 3; var_2++ )
{
var_3 = level.ground_support_locs[level.script][var_2]["origin"] * ( 1, 1, 0 );
var_4 = distancesquared( var_1, var_3 );
if ( var_4 < 60000 )
{
var_0 = var_2;
break;
}
}
if ( isdefined( var_0 ) )
{
for ( var_2 = 0; var_2 < 3; var_2++ )
{
if ( var_2 == var_0 )
{
objective_icon( self.locationobjectives[var_2], "compass_objpoint_mortar_target" );
continue;
}
objective_state( self.locationobjectives[var_2], "invisible" );
}
}
else
{
for ( var_2 = 0; var_2 < 3; var_2++ )
objective_icon( self.locationobjectives[var_2], "compass_objpoint_tank_enemy" );
}
wait 0.5;
self notify( "picked_location" );
wait 0.05;
if ( isdefined( var_0 ) )
break;
}
return var_0;
}
showicons()
{
var_0 = maps\mp\gametypes\_hud_util::createfontstring( "bigfixed", 0.5 );
var_0 maps\mp\gametypes\_hud_util::setpoint( "CENTER", "CENTER", 0, -150 );
var_0 settext( &"KILLSTREAKS_SELECT_MOBILE_MORTAR_LOCATION" );
self.locationobjectives = [];
for ( var_1 = 0; var_1 < 3; var_1++ )
{
self.locationobjectives[var_1] = maps\mp\gametypes\_gameobjects::getnextobjid();
objective_add( self.locationobjectives[var_1], "invisible", ( 0, 0, 0 ) );
objective_position( self.locationobjectives[var_1], level.ground_support_locs[level.script][var_1]["origin"] );
objective_state( self.locationobjectives[var_1], "active" );
objective_team( self.locationobjectives[var_1], self.team );
objective_icon( self.locationobjectives[var_1], "compass_objpoint_tank_friendly" );
}
common_scripts\utility::waittill_any( "cancel_location", "picked_location", "stop_location_selection" );
var_0 maps\mp\gametypes\_hud_util::destroyelem();
for ( var_1 = 0; var_1 < 3; var_1++ )
maps\mp\_utility::_objective_delete( self.locationobjectives[var_1] );
}
createmobilemortar( var_0, var_1 )
{
var_2 = maps\mp\killstreaks\_airdrop::getflyheightoffset( level.ground_support_locs[level.script][var_1]["origin"] );
var_3 = bullettrace( level.ground_support_locs[level.script][var_1]["origin"] + ( 0, 0, var_2 ), level.ground_support_locs[level.script][var_1]["origin"] - ( 0, 0, var_2 ), 0 );
var_4 = var_3["position"] + anglestoforward( level.ground_support_locs[level.script][var_1]["angles"] ) * -1000;
var_5 = spawn( "script_model", var_4 );
if ( !isdefined( var_5 ) )
return undefined;
var_5.angles = level.ground_support_locs[level.script][var_1]["angles"];
var_5 setmodel( "vehicle_bradley" );
var_5 setcandamage( 1 );
var_5.maxhealth = level.heli_maxhealth * 2;
var_5.health = var_5.maxhealth;
var_5.owner = var_0;
var_5.playersattacked = [];
var_5.lasttarget = var_5.origin;
if ( level.teambased )
var_5.team = var_0.team;
var_5.lowx = level.spawnpoints[0].origin[0];
var_5.highx = level.spawnpoints[0].origin[0];
var_5.lowy = level.spawnpoints[0].origin[1];
var_5.highy = level.spawnpoints[0].origin[1];
var_6 = 200;
if ( level.spawnpoints.size > 1 )
{
for ( var_7 = 1; var_7 < level.spawnpoints.size; var_7++ )
{
if ( level.spawnpoints[var_7].origin[0] < var_5.lowx )
var_5.lowx = level.spawnpoints[var_7].origin[0];
else if ( level.spawnpoints[var_7].origin[0] > var_5.highx )
var_5.highx = level.spawnpoints[var_7].origin[0];
if ( level.spawnpoints[var_7].origin[1] < var_5.lowy )
{
var_5.lowy = level.spawnpoints[var_7].origin[1];
continue;
}
if ( level.spawnpoints[var_7].origin[1] > var_5.highy )
var_5.highy = level.spawnpoints[var_7].origin[1];
}
}
else
var_6 = -2000;
var_5.lowx = var_5.lowx + var_6;
var_5.highx = var_5.highx - var_6;
var_5.lowy = var_5.lowy + var_6;
var_5.highy = var_5.highy - var_6;
if ( level.teambased )
{
var_8 = maps\mp\gametypes\_gameobjects::getnextobjid();
objective_add( var_8, "invisible", ( 0, 0, 0 ) );
objective_position( var_8, var_3["position"] );
objective_state( var_8, "active" );
objective_team( var_8, var_5.team );
objective_icon( var_8, "compass_objpoint_tank_friendly" );
var_5.objidfriendly = var_8;
var_8 = maps\mp\gametypes\_gameobjects::getnextobjid();
objective_add( var_8, "invisible", ( 0, 0, 0 ) );
objective_position( var_8, var_3["position"] );
objective_state( var_8, "active" );
objective_team( var_8, level.otherteam[var_5.team] );
objective_icon( var_8, "compass_objpoint_tank_enemy" );
var_5.objidenemy = var_8;
}
var_5 thread watchtimeout();
var_5 thread maps\mp\killstreaks\_helicopter::heli_damage_monitor();
var_5 thread watchdeath();
var_5 thread watchproximity();
level.mobilemortar = var_5;
return var_5;
}
movetoposition( var_0 )
{
level endon( "game_ended" );
self endon( "death" );
if ( var_0 == "entrance" )
var_1 = self.origin + anglestoforward( self.angles ) * 1000;
else
{
self notify( "leaving" );
var_1 = self.origin + anglestoforward( self.angles ) * -1000;
}
var_2 = 3.0;
self moveto( var_1, var_2, var_2 * 0.6, var_2 * 0.4 );
wait( var_2 );
if ( var_0 == "entrance" )
thread mortarattack();
else
{
stopfxontag( level.tankdust1, self.fxent, "tag_origin" );
stopfxontag( level.tankdust2, self.fxent, "tag_origin" );
self.fxent delete();
maps\mp\_utility::_objective_delete( self.objidfriendly );
maps\mp\_utility::_objective_delete( self.objidenemy );
level.mobilemortar = undefined;
self delete();
}
}
findtarget()
{
var_0 = undefined;
foreach ( var_2 in level.players )
{
if ( var_2 == self.owner )
continue;
if ( var_2 maps\mp\_utility::_hasperk( "specialty_blindeye" ) )
continue;
if ( level.teambased && var_2.team == self.owner.team )
continue;
if ( distancesquared( self.origin, var_2.origin ) < 1000000 )
continue;
for ( var_3 = 0; var_3 < self.playersattacked.size; var_3++ )
{
if ( var_2 == self.playersattacked[var_3] )
continue;
}
if ( distancesquared( var_2.origin, self.lasttarget ) < 500000 )
continue;
if ( level.teambased )
{
var_4 = 0;
for ( var_3 = 0; var_3 < level.players.size; var_3++ )
{
if ( level.players[var_3].team != var_2.team && distancesquared( var_2.origin, level.players[var_3].origin ) < 250000 )
{
var_4 = 1;
break;
}
}
if ( var_4 == 1 )
continue;
}
wait 0.05;
var_5 = bullettrace( var_2.origin + ( 0, 0, var_2 maps\mp\killstreaks\_airdrop::getflyheightoffset( var_2.origin ) ), var_2.origin + ( 0, 0, 100 ), 0 );
if ( var_5["surfacetype"] != "none" )
continue;
var_0 = var_2.origin;
self.lasttarget = var_2.origin;
self.playersattacked[self.playersattacked.size] = var_2;
break;
}
return var_0;
}
findrandomtarget()
{
var_0 = undefined;
for ( var_1 = 0; var_1 < 20; var_1++ )
{
var_2 = ( randomfloatrange( self.lowx, self.highx ), randomfloatrange( self.lowy, self.highy ), 0 );
if ( distancesquared( self.origin * ( 1, 1, 0 ), var_2 ) < 1000000 )
continue;
if ( distancesquared( self.owner.origin * ( 1, 1, 0 ), var_2 ) < 250000 )
continue;
if ( distancesquared( self.origin * ( 1, 1, 0 ), self.lasttarget ) < 500000 )
continue;
var_3 = 0;
if ( level.teambased )
{
foreach ( var_5 in level.players )
{
if ( var_5.team == self.owner.team && distancesquared( var_5.origin * ( 1, 1, 0 ), var_2 ) < 250000 )
{
var_3 = 1;
break;
}
}
}
if ( var_3 == 0 )
{
var_0 = var_2;
self.lasttarget = var_2;
break;
}
}
if ( !isdefined( var_0 ) )
var_0 = ( randomfloatrange( self.lowx, self.highx ), randomfloatrange( self.lowy, self.highy ), 0 );
return var_0;
}
mortarattack()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "leaving" );
var_0 = 0;
self.fxent = spawn( "script_model", self.origin );
self.fxent setmodel( "tag_origin" );
self.fxent.angles = self.angles;
self.fxent addpitch( -90 );
for (;;)
{
var_1 = findtarget();
if ( !isdefined( var_1 ) )
var_1 = findrandomtarget();
var_2 = self.origin[2] + 3500;
var_3 = bullettrace( var_1 + ( 0, 0, var_2 ), var_1 - ( 0, 0, var_2 ), 0 );
var_4 = var_1 + ( 0, 0, var_2 );
var_5 = var_1 + ( 0, 0, var_3["position"][2] );
self playsound( "bmp_fire" );
playfx( level.tankflash, self.origin + anglestoforward( self.angles ) * 50 );
if ( var_0 < 3 )
{
playfxontag( level.tankdust1, self.fxent, "tag_origin" );
playfxontag( level.tankdust2, self.fxent, "tag_origin" );
var_0++;
}
thread mortarrecoil();
level thread firemortar( self, var_4, var_5 );
self waittill( "mortar_fire_done" );
wait 2.5;
}
}
firemortar( var_0, var_1, var_2 )
{
level endon( "game_ended" );
var_3 = var_0.owner;
var_4 = magicbullet( "javelin_mp", var_0.origin + ( 0, 0, 150 ), var_1, var_3 );
var_5 = maps\mp\gametypes\_gameobjects::getnextobjid();
objective_add( var_5, "invisible", ( 0, 0, 0 ) );
objective_position( var_5, var_2 );
objective_state( var_5, "active" );
objective_team( var_5, var_0.team );
objective_icon( var_5, "compass_objpoint_mortar_target" );
var_4.objidfriendly = var_5;
var_6 = maps\mp\gametypes\_gameobjects::getnextobjid();
objective_add( var_6, "invisible", ( 0, 0, 0 ) );
objective_position( var_6, var_2 );
objective_state( var_6, "active" );
objective_team( var_6, level.otherteam[var_0.team] );
objective_icon( var_6, "compass_objpoint_mortar_target" );
var_4.objidenemy = var_6;
var_7 = 0;
for (;;)
{
if ( !isdefined( var_4 ) || var_7 > 115 || distancesquared( var_4.origin, var_1 ) < 500 )
break;
else
wait 0.05;
var_7++;
}
if ( isdefined( var_4 ) )
var_4 delete();
if ( isdefined( var_3 ) )
var_8 = magicbullet( "javelin_mp", var_1 + ( 0, 0, 200 ), var_2, var_3 );
else
var_8 = magicbullet( "javelin_mp", var_1 + ( 0, 0, 200 ), var_2 );
var_8.objidfriendly = var_5;
var_8.objidenemy = var_6;
var_8 thread watchprojectileonminimap( var_0 );
}
watchprojectileonminimap( var_0 )
{
level endon( "game_ended" );
self waittill( "death" );
maps\mp\_utility::_objective_delete( self.objidfriendly );
maps\mp\_utility::_objective_delete( self.objidenemy );
if ( isdefined( var_0 ) )
var_0 notify( "mortar_fire_done" );
}
mortarrecoil()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "leaving" );
var_0 = self.origin + anglestoforward( self.angles ) * -20;
var_1 = self.origin;
var_2 = self.angles;
self moveto( var_0, 0.1 );
self rotatepitch( -3, 0.1 );
wait 0.1;
self moveto( var_1, 0.15 );
self rotateto( var_2, 0.15 );
wait 0.15;
}
watchtimeout()
{
level endon( "game_ended" );
self endon( "death" );
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 90.0 );
self setcandamage( 0 );
thread movetoposition( "exit" );
}
watchproximity()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "leaving" );
for (;;)
{
radiusdamage( self.origin, 200, 20, 20 );
wait 1;
}
}
watchdeath()
{
level endon( "game_ended" );
self endon( "leaving" );
self waittill( "death" );
playfx( level.tankfire, self.origin );
playfx( level.tankexplode, self.origin );
var_0 = spawn( "script_model", self.origin );
var_0 setmodel( "vehicle_bradley_destroyed" );
var_0.angles = self.angles;
stopfxontag( level.tankdust1, self.fxent, "tag_origin" );
stopfxontag( level.tankdust2, self.fxent, "tag_origin" );
maps\mp\_utility::_objective_delete( self.objidfriendly );
maps\mp\_utility::_objective_delete( self.objidenemy );
self.fxent delete();
self delete();
wait 3.5;
var_0 delete();
level.mobilemortar = undefined;
}
watchdamage()
{
level endon( "game_ended" );
self endon( "death" );
for (;;)
{
self waittill( "damage", var_0, var_1, var_2, var_3, var_4 );
if ( self.health < 0 )
break;
}
}

View File

@ -0,0 +1,384 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
createmortar( var_0 )
{
level.mortarconfig = var_0;
var_0 thread update_mortars();
level.air_raid_active = 0;
level.mapcustomcratefunc = ::mortarcustomcratefunc;
level.mapcustomkillstreakfunc = ::mortarcustomkillstreakfunc;
level.mapcustombotkillstreakfunc = ::mortarcustombotkillstreakfunc;
}
mortarcustomcratefunc()
{
if ( !isdefined( game["player_holding_level_killstrek"] ) )
game["player_holding_level_killstrek"] = 0;
if ( !maps\mp\_utility::allowlevelkillstreaks() || game["player_holding_level_killstrek"] )
return;
maps\mp\killstreaks\_airdrop::addcratetype( "airdrop_assault", level.mortarconfig.id, level.mortarconfig.crateweight, maps\mp\killstreaks\_airdrop::killstreakcratethink, maps\mp\killstreaks\_airdrop::get_friendly_crate_model(), maps\mp\killstreaks\_airdrop::get_enemy_crate_model(), level.mortarconfig.cratehint );
level thread watch_for_mortars_crate();
}
watch_for_mortars_crate()
{
for (;;)
{
level waittill( "createAirDropCrate", var_0 );
if ( isdefined( var_0 ) && isdefined( var_0.cratetype ) && var_0.cratetype == level.mortarconfig.id )
{
maps\mp\killstreaks\_airdrop::changecrateweight( "airdrop_assault", level.mortarconfig.id, 0 );
var_1 = wait_for_capture( var_0 );
if ( !var_1 )
{
maps\mp\killstreaks\_airdrop::changecrateweight( "airdrop_assault", level.mortarconfig.id, level.mortarconfig.crateweight );
continue;
}
game["player_holding_level_killstrek"] = 1;
break;
}
}
}
wait_for_capture( var_0 )
{
var_1 = watch_for_air_drop_death( var_0 );
return !isdefined( var_1 );
}
watch_for_air_drop_death( var_0 )
{
var_0 endon( "captured" );
var_0 waittill( "death" );
waittillframeend;
return 1;
}
mortarcustomkillstreakfunc()
{
level.killstreakfuncs[level.mortarconfig.id] = ::tryusemortars;
level.killstreakweildweapons[level.mortarconfig.weaponname] = level.mortarconfig.id;
}
mortarcustombotkillstreakfunc()
{
maps\mp\bots\_bots_ks::bot_register_killstreak_func( level.mortarconfig.id, maps\mp\bots\_bots_ks::bot_killstreak_simple_use );
}
tryusemortars( var_0, var_1 )
{
if ( level.air_raid_active )
{
self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
return 0;
}
game["player_holding_level_killstrek"] = 0;
level notify( "mortar_killstreak_used", self );
if ( isdefined( level.mortarconfig.splashname ) )
thread maps\mp\_utility::teamplayercardsplash( level.mortarconfig.splashname, self );
return 1;
}
mortars_activate_at_end_of_match()
{
level endon( "mortar_killstreak_used" );
level waittill( "spawning_intermission" );
level.ending_flourish = 1;
mortar_fire( 0.1, 0.3, 2.5, 2.5, 6, level.players[0] );
}
update_mortars()
{
level endon( "stop_dynamic_events" );
common_scripts\utility::waitframe();
if ( isdefined( self.sourcestructs ) )
self.mortar_sources = common_scripts\utility::getstructarray( self.sourcestructs, "targetname" );
else if ( isdefined( self.sourceents ) )
self.mortar_sources = getentarray( self.sourceents, "targetname" );
foreach ( var_1 in self.mortar_sources )
{
if ( !isdefined( var_1.radius ) )
var_1.radius = 300;
}
self.mortar_targets = common_scripts\utility::getstructarray( self.targetstructs, "targetname" );
foreach ( var_4 in self.mortar_targets )
{
if ( !isdefined( var_4.radius ) )
var_4.radius = 100;
}
for (;;)
{
level.air_raid_active = 0;
level.air_raid_team_called = "none";
thread mortars_activate_at_end_of_match();
level waittill( "mortar_killstreak_used", var_6 );
level.air_raid_active = 1;
level.air_raid_team_called = var_6.team;
thread warning_audio();
wait( self.launchdelay );
mortar_fire( self.launchdelaymin, self.launchdelaymax, self.launchairtimemin, self.launchairtimemax, self.strikeduration, var_6 );
level notify( "mortar_killstreak_end" );
}
}
warning_audio()
{
if ( !isdefined( self.warningsfxentname ) || !isdefined( self.warningsfx ) )
return;
if ( !isdefined( self.warning_sfx_ent ) )
self.warning_sfx_ent = getent( self.warningsfxentname, "targetname" );
if ( isdefined( self.warning_sfx_ent ) )
{
self.warning_sfx_ent playsound( self.warningsfx );
wait( self.warningsfxduration );
self.warning_sfx_ent stopsounds();
}
}
mortar_fire( var_0, var_1, var_2, var_3, var_4, var_5 )
{
var_6 = gettime() + var_4 * 1000;
var_7 = random_mortars_get_source_structs( level.air_raid_team_called );
if ( var_7.size <= 0 )
return;
level notify( "mortar_killstreak_start" );
var_8 = 0;
while ( var_6 > gettime() )
{
var_9 = self.projectileperloop;
var_10 = 0;
foreach ( var_12 in level.players )
{
if ( !maps\mp\_utility::isreallyalive( var_12 ) )
continue;
if ( level.teambased )
{
if ( var_12.team == level.air_raid_team_called )
continue;
}
else if ( isdefined( var_5 ) && var_12 == var_5 )
continue;
if ( var_12.spawntime + 8000 > gettime() )
continue;
var_13 = var_12 getvelocity();
var_14 = var_2;
if ( var_3 > var_2 )
var_14 = randomfloatrange( var_2, var_3 );
var_15 = var_12.origin + var_13 * var_14;
var_16 = getnodesinradiussorted( var_15, 100, 0, 60 );
foreach ( var_18 in var_16 )
{
if ( nodeexposedtosky( var_18 ) )
{
var_19 = common_scripts\utility::random( var_7 );
if ( random_mortars_fire( var_19.origin, var_18.origin, var_14, var_5, 1, 1, var_19 ) )
{
wait( randomfloatrange( var_0, var_1 ) );
var_10++;
break;
}
}
}
}
if ( self.mortar_targets.size > 0 )
{
for ( var_7 = common_scripts\utility::array_randomize( var_7 ); var_10 < var_9; var_10++ )
{
var_19 = var_7[var_8];
var_8++;
if ( var_8 >= var_7.size )
var_8 = 0;
var_22 = common_scripts\utility::random( self.mortar_targets );
var_14 = var_2;
if ( var_3 > var_2 )
var_14 = randomfloatrange( var_2, var_3 );
var_23 = random_point_in_circle( var_19.origin, var_19.radius );
var_24 = random_point_in_circle( var_22.origin, var_22.radius );
thread random_mortars_fire( var_23, var_24, var_14, var_5, 0, 1, var_19 );
wait( randomfloatrange( var_0, var_1 ) );
}
}
else
break;
if ( isdefined( self.delaybetweenvolleys ) )
{
level notify( "mortar_volleyFinished" );
wait( self.delaybetweenvolleys );
}
}
}
random_point_in_circle( var_0, var_1 )
{
if ( var_1 > 0 )
{
var_2 = anglestoforward( ( 0, randomfloatrange( 0, 360 ), 0 ) );
var_3 = randomfloatrange( 0, var_1 );
var_0 = var_0 + var_2 * var_3;
}
return var_0;
}
random_mortars_fire( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
if ( isdefined( self.launchsfx ) )
playsoundatpos( var_0, self.launchsfx );
else if ( isdefined( self.launchsfxarray ) && self.launchsfxarray.size > 0 && isdefined( self.launchsfxstartid ) )
{
if ( self.launchsfxstartid >= self.launchsfxarray.size )
self.launchsfxstartid = 0;
playsoundatpos( var_0, self.launchsfxarray[self.launchsfxstartid] );
self.launchsfxstartid++;
}
var_7 = ( 0, 0, -800 );
var_8 = trajectorycalculateinitialvelocity( var_0, var_1, var_7, var_2 );
if ( isdefined( self.launchvfx ) )
{
if ( isdefined( var_6 ) && var_6.classname != "struct" )
playfxontag( common_scripts\utility::getfx( self.launchvfx ), var_6, "tag_origin" );
else
playfx( common_scripts\utility::getfx( self.launchvfx ), var_0, var_8 );
}
if ( isdefined( var_4 ) && var_4 )
{
var_9 = trajectorycomputedeltaheightattime( var_8[2], -1 * var_7[2], var_2 / 2 );
var_10 = ( var_1 - var_0 ) / 2 + var_0 + ( 0, 0, var_9 );
if ( bullettracepassed( var_10, var_1, 0, undefined ) )
{
thread random_mortars_fire_run( var_0, var_1, var_2, var_3, var_8, var_5 );
return 1;
}
else
return 0;
}
random_mortars_fire_run( var_0, var_1, var_2, var_3, var_8, var_5 );
}
random_mortars_fire_run( var_0, var_1, var_2, var_3, var_4, var_5 )
{
var_6 = 350;
var_7 = createprojectileentity( var_0, self.model );
var_7.in_use = 1;
common_scripts\utility::waitframe();
if ( isdefined( self.trailvfx ) )
playfxontag( common_scripts\utility::getfx( self.trailvfx ), var_7, "tag_fx" );
var_7.angles = vectortoangles( var_4 ) * ( -1, 1, 1 );
if ( isdefined( self.incomingsfx ) )
thread playsoundatposintime( self.incomingsfx, var_1, var_2 - 2.0 );
var_7 movegravity( var_4, var_2 - 0.05 );
if ( isdefined( self.rotateprojectiles ) && self.rotateprojectiles )
var_7 rotatevelocity( common_scripts\utility::randomvectorrange( self.minrotatation, self.maxrotation ), var_2, 2, 0 );
var_7 waittill( "movedone" );
if ( level.createfx_enabled && !isdefined( level.players ) )
level.players = [];
if ( isdefined( var_3 ) )
var_7 radiusdamage( var_1, 250, 750, 500, var_3, "MOD_EXPLOSIVE", self.weaponname );
else
var_7 radiusdamage( var_1, 140, 5, 5, undefined, "MOD_EXPLOSIVE", self.weaponname );
playrumbleonposition( "artillery_rumble", var_1 );
var_8 = var_6 * var_6;
foreach ( var_10 in level.players )
{
if ( var_10 maps\mp\_utility::isusingremote() )
continue;
if ( distancesquared( var_1, var_10.origin ) > var_8 )
continue;
if ( var_10 damageconetrace( var_1 ) )
var_10 thread maps\mp\gametypes\_shellshock::dirteffect( var_1 );
}
if ( var_5 )
{
if ( isdefined( self.impactvfx ) )
playfx( common_scripts\utility::getfx( self.impactvfx ), var_1 );
if ( isdefined( self.impactsfx ) )
playsoundatpos( var_1, self.impactsfx );
}
var_7 delete();
}
playsoundatposintime( var_0, var_1, var_2 )
{
wait( var_2 );
playsoundatpos( var_1, var_0 );
}
createprojectileentity( var_0, var_1 )
{
var_2 = spawn( "script_model", var_0 );
var_2 setmodel( var_1 );
return var_2;
}
random_mortars_get_source_structs( var_0 )
{
var_1 = [];
if ( level.teambased )
{
foreach ( var_3 in self.mortar_sources )
{
if ( isdefined( var_3.script_team ) && var_3.script_team == var_0 )
var_1[var_1.size] = var_3;
}
}
if ( var_1.size == 0 )
var_1 = self.mortar_sources;
return var_1;
}

View File

@ -0,0 +1,74 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.killstreakfuncs["mrsiartillery"] = ::tryusestrike;
var_0 = spawnstruct();
var_0.weaponname = "airdrop_marker_mp";
var_0.projectilename = "mrsiartillery_projectile_mp";
var_0.numstrikes = 6;
var_0.initialdelay = 1.0;
var_0.minfiredelay = 0.375;
var_0.maxfiredelay = 0.5;
var_0.strikeradius = 150;
if ( !isdefined( level.killstreakconfigdata ) )
level.killstreakconfigdata = [];
level.killstreakconfigdata["mrsiartillery"] = var_0;
}
tryusestrike( var_0, var_1 )
{
var_2 = level.killstreakconfigdata["mrsiartillery"];
var_3 = maps\mp\killstreaks\_designator_grenade::designator_start( "mrsiartillery", var_2.weaponname, ::ontargetacquired );
if ( !isdefined( var_3 ) || !var_3 )
return 0;
else
return 1;
}
ontargetacquired( var_0, var_1 )
{
var_2 = level.killstreakconfigdata[var_0];
var_3 = var_1.owner;
var_4 = var_1.origin;
var_1 detonate();
dostrike( var_3, var_0, var_3.origin, var_4 );
}
dostrike( var_0, var_1, var_2, var_3 )
{
var_4 = level.killstreakconfigdata[var_1];
var_5 = var_3 - var_2;
var_6 = ( var_5[0], var_5[1], 0 );
var_5 = vectornormalize( var_5 );
var_7 = var_3;
var_8 = maps\mp\killstreaks\_killstreaks::findunobstructedfiringpoint( var_0, var_3 + ( 0, 0, 10 ), 10000 );
if ( isdefined( var_8 ) )
{
iprintln( "Firing Motar!" );
wait( var_4.initialdelay );
wait( randomfloatrange( var_4.minfiredelay, var_4.maxfiredelay ) );
var_9 = magicbullet( var_4.projectilename, var_8, var_7, var_0 );
for ( var_10 = 1; var_10 < var_4.numstrikes; var_10++ )
{
wait( randomfloatrange( var_4.minfiredelay, var_4.maxfiredelay ) );
var_11 = pickrandomtargetpoint( var_7, var_4.strikeradius );
var_9 = magicbullet( var_4.projectilename, var_8, var_11, var_0 );
}
}
else
iprintln( "Mortar LOS blocked!" );
}
pickrandomtargetpoint( var_0, var_1 )
{
var_2 = randomfloatrange( -1 * var_1, var_1 );
var_3 = randomfloatrange( -1 * var_1, var_1 );
return var_0 + ( var_2, var_3, 0 );
}

View File

@ -0,0 +1,469 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.nukevisionset = "aftermath_post";
level._effect["nuke_player"] = loadfx( "fx/explosions/player_death_nuke" );
level._effect["nuke_flash"] = loadfx( "fx/explosions/player_death_nuke_flash" );
level._effect["nuke_aftermath"] = loadfx( "fx/dust/nuke_aftermath_mp" );
level.killstreakfuncs["nuke"] = ::tryusenuke;
setdvarifuninitialized( "scr_nukeTimer", 10 );
setdvarifuninitialized( "scr_nukeCancelMode", 0 );
level.nuketimer = getdvarint( "scr_nukeTimer" );
level.cancelmode = getdvarint( "scr_nukeCancelMode" );
if ( level.multiteambased )
{
for ( var_0 = 0; var_0 < level.teamnamelist.size; var_0++ )
level.teamnukeemped[level.teamnamelist[var_0]] = 0;
}
else
{
level.teamnukeemped["allies"] = 0;
level.teamnukeemped["axis"] = 0;
}
level.nukeemptimeout = 60.0;
level.nukeemptimeremaining = int( level.nukeemptimeout );
level.nukeinfo = spawnstruct();
level.nukeinfo.xpscalar = 2;
level.nukedetonated = undefined;
level thread onplayerconnect();
}
tryusenuke( var_0, var_1, var_2 )
{
if ( isdefined( level.nukeincoming ) )
{
self iprintlnbold( &"KILLSTREAKS_NUKE_ALREADY_INBOUND" );
return 0;
}
if ( maps\mp\_utility::isusingremote() && ( !isdefined( level.gtnw ) || !level.gtnw ) )
return 0;
if ( !isdefined( var_2 ) )
var_2 = 1;
thread donuke( var_2 );
self notify( "used_nuke" );
maps\mp\_matchdata::logkillstreakevent( "nuke", self.origin );
return 1;
}
delaythread_nuke( var_0, var_1 )
{
level endon( "nuke_cancelled" );
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( var_0 );
thread [[ var_1 ]]();
}
donuke( var_0 )
{
level endon( "nuke_cancelled" );
level.nukeinfo.player = self;
level.nukeinfo.team = self.pers["team"];
level.nukeincoming = 1;
level.prevuibombtimer = int( getomnvar( "ui_bomb_timer" ) );
setomnvar( "ui_bomb_timer", 4 );
if ( level.teambased )
thread maps\mp\_utility::teamplayercardsplash( "used_nuke", self, self.team );
else if ( !level.hardcoremode )
self iprintlnbold( &"KILLSTREAKS_FRIENDLY_TACTICAL_NUKE" );
if ( !isdefined( level.donuke_fx ) || ![[ level.donuke_fx ]]() )
{
if ( !isdefined( level.nuke_soundobject ) )
{
level.nuke_soundobject = spawn( "script_origin", ( 0, 0, 1 ) );
level.nuke_soundobject hide();
}
level thread delaythread_nuke( level.nuketimer - 3.3, ::nukesoundincoming );
level thread delaythread_nuke( level.nuketimer, ::nukesoundexplosion );
level thread delaythread_nuke( level.nuketimer, ::nukeslowmo );
level thread delaythread_nuke( level.nuketimer, ::nukeeffects );
level thread delaythread_nuke( level.nuketimer + 0.25, ::nukevision );
level thread delaythread_nuke( level.nuketimer + 1.5, ::nukedeath );
level thread delaythread_nuke( level.nuketimer + 1.5, ::nukeearthquake );
level thread nukeaftermatheffect();
if ( level.cancelmode && var_0 )
level thread cancelnukeondeath( self );
}
level thread update_ui_timers();
if ( !isdefined( level.nuke_clockobject ) )
{
level.nuke_clockobject = spawn( "script_origin", ( 0, 0, 0 ) );
level.nuke_clockobject hide();
}
for ( var_1 = level.nuketimer; var_1 > 0; var_1-- )
{
level.nuke_clockobject playsound( "ui_mp_kem_timer" );
wait 1.0;
}
}
donukesimple()
{
level.nukeinfo.player = self;
level.nukeinfo.team = self.pers["team"];
level.nukeincoming = 1;
level thread delaythread_nuke( level.nuketimer - 3.3, ::nukesoundincoming );
level thread delaythread_nuke( level.nuketimer, ::nukesoundexplosion );
level thread delaythread_nuke( level.nuketimer, ::nukeslowmo );
level thread delaythread_nuke( level.nuketimer, ::nukeeffects );
level thread delaythread_nuke( level.nuketimer + 0.25, ::nukevision );
level thread delaythread_nuke( level.nuketimer + 1.5, ::nukedeathsimple );
level thread delaythread_nuke( level.nuketimer + 1.5, ::nukeearthquake );
if ( !isdefined( level.nuke_soundobject ) )
{
level.nuke_soundobject = spawn( "script_origin", ( 0, 0, 1 ) );
level.nuke_soundobject hide();
}
}
nukedeathsimple()
{
level notify( "nuke_death" );
}
cancelnukeondeath( var_0 )
{
var_0 common_scripts\utility::waittill_any( "death", "disconnect" );
if ( isdefined( var_0 ) && level.cancelmode == 2 )
var_0 thread maps\mp\killstreaks\_emp::emp_use( 0, 0 );
nukecleartimer();
level.nukeincoming = undefined;
level notify( "nuke_cancelled" );
}
nukesoundincoming()
{
level endon( "nuke_cancelled" );
if ( isdefined( level.nuke_soundobject ) )
level.nuke_soundobject playsound( "nuke_incoming" );
}
nukesoundexplosion()
{
level endon( "nuke_cancelled" );
if ( isdefined( level.nuke_soundobject ) )
{
level.nuke_soundobject playsound( "nuke_explosion" );
level.nuke_soundobject playsound( "nuke_wave" );
}
}
nukecleartimer()
{
var_0 = 0;
if ( isdefined( level.prevuibombtimer ) )
var_0 = level.prevuibombtimer;
setomnvar( "ui_bomb_timer", var_0 );
}
nukeeffects()
{
level endon( "nuke_cancelled" );
nukecleartimer();
level.nukedetonated = 1;
foreach ( var_1 in level.players )
level thread nukeeffect( var_1 );
}
nukeeffect( var_0 )
{
level endon( "nuke_cancelled" );
var_0 endon( "disconnect" );
common_scripts\utility::waitframe();
var_1 = undefined;
var_2 = undefined;
if ( !isdefined( level.nukeloc ) )
{
var_3 = ( 0, var_0.angles[1], 0 );
var_2 = anglestoforward( var_3 );
var_4 = 5000;
var_1 = var_0.origin + var_2 * var_4;
}
else
var_1 = level.nukeloc;
var_5 = undefined;
var_6 = ( 0, 0, 1 );
if ( !isdefined( level.nukeangles ) )
var_5 = anglestoright( ( 0, var_0.angles[1] + 180, 0 ) );
else
{
var_5 = anglestoforward( level.nukeangles );
var_6 = anglestoup( level.nukeangles );
}
var_7 = spawnfxforclient( level._effect["nuke_flash"], var_1, var_0, var_6, var_5 );
triggerfx( var_7 );
var_0 thread cleanupnukeeffect( var_7, 30 );
}
cleanupnukeeffect( var_0, var_1 )
{
maps\mp\_utility::waitfortimeornotify( var_1, "disconnect" );
var_0 delete();
}
nukeaftermatheffect()
{
level endon( "nuke_cancelled" );
level waittill( "spawning_intermission" );
var_0 = getentarray( "mp_global_intermission", "classname" );
var_0 = var_0[0];
var_1 = anglestoup( var_0.angles );
var_2 = anglestoright( var_0.angles );
playfx( level._effect["nuke_aftermath"], var_0.origin, var_1, var_2 );
}
nukeslowmo()
{
level endon( "nuke_cancelled" );
setslowmotion( 1.0, 0.25, 0.5 );
level waittill( "nuke_death" );
setslowmotion( 0.25, 1, 2.0 );
}
nukevision()
{
level endon( "nuke_cancelled" );
level.nukevisioninprogress = 1;
visionsetpostapply( "mpnuke", 3 );
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 2 );
visionsetpostapply( "nuke_global_flash", 0.1 );
setexpfog( 0, 956, 0.72, 0.61, 0.39, 0.968, 0.85, 1, 0.298, 0.273, 0.266, 0.25, ( 0, 0, -1 ), 84, 118, 2.75, 0.984, 124, 100 );
setdvar( "r_materialBloomHQScriptMasterEnable", 0 );
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 0.5 );
level notify( "nuke_aftermath_post_started" );
visionsetpostapply( "aftermath_post", 0.5 );
level waittill( "nuke_death" );
level thread updatenukevisiononhostmigration();
level setnukeaftermathvision( 5 );
}
nukedeath()
{
level endon( "nuke_cancelled" );
level endon( "game_ended" );
level notify( "nuke_death" );
maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
foreach ( var_1 in level.characters )
{
if ( nukecankill( var_1 ) )
{
if ( isplayer( var_1 ) )
{
var_1.nuked = 1;
if ( maps\mp\_utility::isreallyalive( var_1 ) )
var_1 thread maps\mp\gametypes\_damage::finishplayerdamagewrapper( level.nukeinfo.player, level.nukeinfo.player, 999999, 0, "MOD_EXPLOSIVE", "nuke_mp", var_1.origin, ( 0, 0, 1 ), "none", 0, 0 );
continue;
}
var_1 maps\mp\agents\_agents::agent_damage_finished( level.nukeinfo.player, level.nukeinfo.player, 999999, 0, "MOD_EXPLOSIVE", "nuke_mp", var_1.origin, ( 0, 0, 1 ), "none", 0 );
}
}
level thread nuke_empjam();
level.nukeincoming = undefined;
}
nukecankill( var_0 )
{
if ( !isdefined( level.nukeinfo ) )
return 0;
if ( level.teambased )
{
if ( isdefined( level.nukeinfo.team ) && var_0.team == level.nukeinfo.team )
return 0;
}
else
{
var_1 = isdefined( level.nukeinfo.player ) && var_0 == level.nukeinfo.player;
var_2 = isdefined( level.nukeinfo.player ) && isdefined( var_0.owner ) && var_0.owner == level.nukeinfo.player;
if ( var_1 || var_2 )
return 0;
}
return 1;
}
nukeearthquake()
{
level endon( "nuke_cancelled" );
level waittill( "nuke_death" );
}
nuke_empjam()
{
level endon( "game_ended" );
if ( level.teambased )
level nukeempjamteam( maps\mp\_utility::getotherteam( level.nukeinfo.team ) );
else
{
level.teamnukeemped[level.nukeinfo.team] = 1;
level.teamnukeemped[maps\mp\_utility::getotherteam( level.nukeinfo.team )] = 1;
nukeempjamplayers( level.nukeinfo.player );
}
}
nukeempjamteam( var_0 )
{
level endon( "game_ended" );
level notify( "nuke_EMPJam" );
level endon( "nuke_EMPJam" );
level.teamnukeemped[var_0] = 1;
foreach ( var_2 in level.players )
{
if ( var_2 maps\mp\killstreaks\_emp_common::shouldplayerbeaffectedbyemp() )
var_2 maps\mp\killstreaks\_emp_common::applyperplayerempeffects();
}
level notify( "nuke_emp_update" );
level maps\mp\killstreaks\_jammer::destroygroundobjects( level.nukeinfo.player, var_0 );
level maps\mp\killstreaks\_air_superiority::destroyactivevehicles( level.nukeinfo.player, var_0 );
level thread keepnukeemptimeremaining();
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( level.nukeemptimeout );
level.teamnukeemped[var_0] = 0;
foreach ( var_2 in level.players )
{
if ( var_2.team == var_0 && !var_2 maps\mp\killstreaks\_emp_common::shouldplayerbeaffectedbyemp() )
{
var_2 maps\mp\killstreaks\_emp_common::removeperplayerempeffects();
var_2.nuked = undefined;
}
}
level notify( "nuke_emp_update" );
level notify( "nuke_emp_ended" );
}
nukeempjamplayers( var_0 )
{
level notify( "nuke_EMPJam" );
level endon( "nuke_EMPJam" );
if ( !isdefined( var_0 ) )
return;
foreach ( var_2 in level.players )
{
if ( var_2 maps\mp\killstreaks\_emp_common::shouldplayerbeaffectedbyemp() )
var_2 maps\mp\killstreaks\_emp_common::applyperplayerempeffects();
}
level notify( "nuke_emp_update" );
level maps\mp\killstreaks\_jammer::destroygroundobjects( level.nukeinfo.player );
level maps\mp\killstreaks\_air_superiority::destroyactivevehicles( level.nukeinfo.player );
level thread keepnukeemptimeremaining();
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( level.nukeemptimeout );
level.nukeinfo.player = undefined;
foreach ( var_2 in level.players )
{
if ( ( !isdefined( var_0 ) || var_2 != var_0 ) && !var_2 maps\mp\killstreaks\_emp_common::shouldplayerbeaffectedbyemp() )
var_2 maps\mp\killstreaks\_emp_common::removeperplayerempeffects();
}
level notify( "nuke_emp_update" );
level notify( "nuke_emp_ended" );
}
keepnukeemptimeremaining()
{
level notify( "keepNukeEMPTimeRemaining" );
level endon( "keepNukeEMPTimeRemaining" );
level endon( "nuke_emp_ended" );
for ( level.nukeemptimeremaining = int( level.nukeemptimeout ); level.nukeemptimeremaining; level.nukeemptimeremaining-- )
wait 1.0;
}
onplayerconnect()
{
for (;;)
{
level waittill( "connected", var_0 );
var_0 thread onplayerspawned();
}
}
onplayerspawned()
{
self endon( "disconnect" );
for (;;)
{
self waittill( "spawned_player" );
if ( isdefined( level.nukedetonated ) )
thread setvisionforplayer();
}
}
setvisionforplayer()
{
wait 0.1;
self visionsetpostapplyforplayer( level.nukevisionset, 0 );
}
update_ui_timers()
{
level endon( "game_ended" );
level endon( "disconnect" );
level endon( "nuke_cancelled" );
level endon( "nuke_death" );
var_0 = level.nuketimer * 1000 + gettime();
setomnvar( "ui_nuke_end_milliseconds", var_0 );
level waittill( "host_migration_begin" );
var_1 = maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
if ( var_1 > 0 )
setomnvar( "ui_nuke_end_milliseconds", var_0 + var_1 );
}
updatenukevisiononhostmigration()
{
level endon( "game_ended" );
for (;;)
{
level waittill( "host_migration_end" );
level setnukeaftermathvision( 0 );
}
}
setnukeaftermathvision( var_0 )
{
if ( isdefined( level.nukedeathvisionfunc ) )
level thread [[ level.nukedeathvisionfunc ]]();
else
visionsetpostapply( level.nukevisionset, var_0 );
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,136 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.killstreakfuncs["specialty_fastsprintrecovery_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_fastreload_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_lightweight_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_marathon_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_stalker_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_reducedsway_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_quickswap_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_pitcher_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_bulletaccuracy_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_quickdraw_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_sprintreload_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_silentkill_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_blindeye_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_gpsjammer_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_quieter_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_incog_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_paint_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_scavenger_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_detectexplosive_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_selectivehearing_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_comexp_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_falldamage_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_regenfaster_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_sharp_focus_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_stun_resistance_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["_specialty_blastshield_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_gunsmith_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_extraammo_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_extra_equipment_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_extra_deadly_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_extra_attachment_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_explosivedamage_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_gambler_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_hardline_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_twoprimaries_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_boom_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["specialty_deadeye_ks"] = ::tryuseperkstreak;
level.killstreakfuncs["all_perks_bonus"] = ::tryuseallperks;
level.killstreakfuncs["speed_boost"] = ::tryusespeedboost;
level.killstreakfuncs["refill_grenades"] = ::tryuserefillgrenades;
level.killstreakfuncs["refill_ammo"] = ::tryuserefillammo;
level.killstreakfuncs["regen_faster"] = ::tryuseregenfaster;
}
tryusespeedboost( var_0, var_1 )
{
dokillstreakfunctions( "specialty_juiced", "speed_boost" );
return 1;
}
tryuserefillgrenades( var_0, var_1 )
{
dokillstreakfunctions( "specialty_refill_grenades", "refill_grenades" );
return 1;
}
tryuserefillammo( var_0, var_1 )
{
dokillstreakfunctions( "specialty_refill_ammo", "refill_ammo" );
return 1;
}
tryuseregenfaster( var_0, var_1 )
{
dokillstreakfunctions( "specialty_regenfaster", "regen_faster" );
return 1;
}
tryuseallperks( var_0, var_1 )
{
return 1;
}
tryuseperkstreak( var_0, var_1 )
{
var_2 = maps\mp\_utility::strip_suffix( var_1, "_ks" );
doperkfunctions( var_2 );
return 1;
}
doperkfunctions( var_0 )
{
maps\mp\_utility::giveperk( var_0, 0 );
thread watchdeath( var_0 );
thread checkforperkupgrade( var_0 );
if ( var_0 == "specialty_hardline" )
maps\mp\killstreaks\_killstreaks::setstreakcounttonext();
maps\mp\_matchdata::logkillstreakevent( var_0 + "_ks", self.origin );
}
dokillstreakfunctions( var_0, var_1 )
{
maps\mp\_utility::giveperk( var_0, 0 );
if ( isdefined( var_1 ) )
maps\mp\_matchdata::logkillstreakevent( var_1, self.origin );
}
watchdeath( var_0 )
{
self endon( "disconnect" );
self waittill( "death" );
maps\mp\_utility::_unsetperk( var_0 );
}
checkforperkupgrade( var_0 )
{
var_1 = maps\mp\gametypes\_class::getperkupgrade( var_0 );
if ( var_1 != "specialty_null" )
{
maps\mp\_utility::giveperk( var_1, 0 );
thread watchdeath( var_1 );
}
}
isperkstreakon( var_0 )
{
for ( var_1 = 1; var_1 < 4; var_1++ )
{
if ( isdefined( self.pers["killstreaks"][var_1].streakname ) && self.pers["killstreaks"][var_1].streakname == var_0 )
{
if ( self.pers["killstreaks"][var_1].available )
return 1;
}
}
return 0;
}

View File

@ -0,0 +1,524 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
if ( !isdefined( level.placeableconfigs ) )
level.placeableconfigs = [];
}
giveplaceable( var_0 )
{
var_1 = createplaceable( var_0 );
removeperks();
self.carrieditem = var_1;
var_2 = onbegincarrying( var_0, var_1, 1 );
self.carrieditem = undefined;
restoreperks();
return isdefined( var_1 );
}
createplaceable( var_0 )
{
if ( isdefined( self.iscarrying ) && self.iscarrying )
return;
var_1 = level.placeableconfigs[var_0];
var_2 = spawn( "script_model", self.origin );
var_2 setmodel( var_1.modelbase );
var_2.angles = self.angles;
var_2.owner = self;
var_2.team = self.team;
var_2.config = var_1;
var_2.firstplacement = 1;
if ( isdefined( var_1.oncreatedelegate ) )
var_2 [[ var_1.oncreatedelegate ]]( var_0 );
var_2 deactivate( var_0 );
var_2 thread timeout( var_0 );
var_2 thread handleuse( var_0 );
var_2 thread onkillstreakdisowned( var_0 );
var_2 thread ongameended( var_0 );
var_2 thread createbombsquadmodel( var_0 );
return var_2;
}
handleuse( var_0 )
{
self endon( "death" );
level endon( "game_ended" );
for (;;)
{
self waittill( "trigger", var_1 );
if ( !maps\mp\_utility::isreallyalive( var_1 ) )
continue;
if ( isdefined( self getlinkedparent() ) )
self unlink();
var_1 onbegincarrying( var_0, self, 0 );
}
}
onbegincarrying( var_0, var_1, var_2 )
{
self endon( "death" );
self endon( "disconnect" );
var_1 thread oncarried( var_0, self );
common_scripts\utility::_disableweapon();
if ( !isai( self ) )
{
self notifyonplayercommand( "placePlaceable", "+attack" );
self notifyonplayercommand( "placePlaceable", "+attack_akimbo_accessible" );
self notifyonplayercommand( "cancelPlaceable", "+actionslot 4" );
if ( !level.console )
{
self notifyonplayercommand( "cancelPlaceable", "+actionslot 5" );
self notifyonplayercommand( "cancelPlaceable", "+actionslot 6" );
self notifyonplayercommand( "cancelPlaceable", "+actionslot 7" );
}
}
for (;;)
{
var_3 = common_scripts\utility::waittill_any_return( "placePlaceable", "cancelPlaceable", "force_cancel_placement" );
if ( !isdefined( var_1 ) )
{
common_scripts\utility::_enableweapon();
return 1;
}
else if ( var_3 == "cancelPlaceable" && var_2 || var_3 == "force_cancel_placement" )
{
var_1 oncancel( var_0, var_3 == "force_cancel_placement" && !isdefined( var_1.firstplacement ) );
return 0;
}
else if ( var_1.canbeplaced )
{
var_1 thread onplaced( var_0 );
common_scripts\utility::_enableweapon();
return 1;
}
}
}
oncancel( var_0, var_1 )
{
if ( isdefined( self.carriedby ) )
{
var_2 = self.carriedby;
var_2 forceusehintoff();
var_2.iscarrying = undefined;
var_2.carrieditem = undefined;
var_2 common_scripts\utility::_enableweapon();
}
if ( isdefined( self.bombsquadmodel ) )
self.bombsquadmodel delete();
if ( isdefined( self.carriedobj ) )
self.carriedobj delete();
var_3 = level.placeableconfigs[var_0];
if ( isdefined( var_3.oncanceldelegate ) )
self [[ var_3.oncanceldelegate ]]( var_0 );
if ( isdefined( var_1 ) && var_1 )
maps\mp\gametypes\_weapons::equipmentdeletevfx();
self delete();
}
onplaced( var_0 )
{
var_1 = level.placeableconfigs[var_0];
self.origin = self.placementorigin;
self.angles = self.carriedobj.angles;
self playsound( var_1.placedsfx );
showplacedmodel( var_0 );
if ( isdefined( var_1.onplaceddelegate ) )
self [[ var_1.onplaceddelegate ]]( var_0 );
self setcursorhint( "HINT_NOICON" );
self sethintstring( var_1.hintstring );
var_2 = self.owner;
var_2 forceusehintoff();
var_2.iscarrying = undefined;
self.carriedby = undefined;
self.isplaced = 1;
self.firstplacement = undefined;
if ( isdefined( var_1.headiconheight ) )
{
if ( level.teambased )
maps\mp\_entityheadicons::setteamheadicon( self.team, ( 0, 0, var_1.headiconheight ) );
else
maps\mp\_entityheadicons::setplayerheadicon( var_2, ( 0, 0, var_1.headiconheight ) );
}
thread handledamage( var_0 );
thread handledeath( var_0 );
self makeusable();
common_scripts\utility::make_entity_sentient_mp( self.owner.team );
if ( issentient( self ) )
self setthreatbiasgroup( "DogsDontAttack" );
foreach ( var_4 in level.players )
{
if ( var_4 == var_2 )
{
self enableplayeruse( var_4 );
continue;
}
self disableplayeruse( var_4 );
}
if ( isdefined( self.shouldsplash ) )
{
level thread maps\mp\_utility::teamplayercardsplash( var_1.splashname, var_2 );
self.shouldsplash = 0;
}
var_6 = spawnstruct();
var_6.linkparent = self.moving_platform;
var_6.playdeathfx = 1;
var_6.endonstring = "carried";
if ( isdefined( var_1.onmovingplatformcollision ) )
var_6.deathoverridecallback = var_1.onmovingplatformcollision;
thread maps\mp\_movers::handle_moving_platforms( var_6 );
thread watchplayerconnected();
self notify( "placed" );
self.carriedobj delete();
self.carriedobj = undefined;
}
oncarried( var_0, var_1 )
{
var_2 = level.placeableconfigs[var_0];
self.carriedobj = var_1 createcarriedobject( var_0 );
self.isplaced = undefined;
self.carriedby = var_1;
var_1.iscarrying = 1;
deactivate( var_0 );
hideplacedmodel( var_0 );
if ( isdefined( var_2.oncarrieddelegate ) )
self [[ var_2.oncarrieddelegate ]]( var_0 );
thread updateplacement( var_0, var_1 );
thread oncarrierdeath( var_0, var_1 );
self notify( "carried" );
}
updateplacement( var_0, var_1 )
{
var_1 endon( "death" );
var_1 endon( "disconnect" );
level endon( "game_ended" );
self endon( "placed" );
self endon( "death" );
self.canbeplaced = 1;
var_2 = -1;
var_3 = level.placeableconfigs[var_0];
var_4 = ( 0, 0, 0 );
if ( isdefined( var_3.placementoffsetz ) )
var_4 = ( 0, 0, var_3.placementoffsetz );
var_5 = self.carriedobj;
for (;;)
{
var_6 = var_1 canplayerplacesentry( 1, var_3.placementradius );
self.placementorigin = var_6["origin"];
var_5.origin = self.placementorigin + var_4;
var_5.angles = var_6["angles"];
self.canbeplaced = var_1 isonground() && var_6["result"] && abs( self.placementorigin[2] - var_1.origin[2] ) < var_3.placementheighttolerance;
if ( isdefined( var_6["entity"] ) )
self.moving_platform = var_6["entity"];
else
self.moving_platform = undefined;
if ( self.canbeplaced != var_2 )
{
if ( self.canbeplaced )
{
var_5 setmodel( var_3.modelplacement );
var_1 forceusehinton( var_3.placestring );
}
else
{
var_5 setmodel( var_3.modelplacementfailed );
var_1 forceusehinton( var_3.cannotplacestring );
}
}
var_2 = self.canbeplaced;
wait 0.05;
}
}
deactivate( var_0 )
{
self makeunusable();
hideheadicons();
self freeentitysentient();
var_1 = level.placeableconfigs[var_0];
if ( isdefined( var_1.ondeactivedelegate ) )
self [[ var_1.ondeactivedelegate ]]( var_0 );
}
hideheadicons()
{
if ( level.teambased )
maps\mp\_entityheadicons::setteamheadicon( "none", ( 0, 0, 0 ) );
else if ( isdefined( self.owner ) )
maps\mp\_entityheadicons::setplayerheadicon( undefined, ( 0, 0, 0 ) );
}
handledamage( var_0 )
{
self endon( "carried" );
var_1 = level.placeableconfigs[var_0];
maps\mp\gametypes\_damage::monitordamage( var_1.maxhealth, var_1.damagefeedback, ::handledeathdamage, ::modifydamage, 1 );
}
modifydamage( var_0, var_1, var_2, var_3 )
{
var_4 = var_3;
var_5 = self.config;
if ( isdefined( var_5.allowmeleedamage ) && var_5.allowmeleedamage )
var_4 = maps\mp\gametypes\_damage::handlemeleedamage( var_1, var_2, var_4 );
if ( isdefined( var_5.allowempdamage ) && var_5.allowempdamage )
var_4 = maps\mp\gametypes\_damage::handleempdamage( 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 );
if ( isdefined( var_5.modifydamage ) )
var_4 = self [[ var_5.modifydamage ]]( var_1, var_2, var_4 );
return var_4;
}
handledeathdamage( var_0, var_1, var_2, var_3 )
{
var_4 = self.config;
var_5 = maps\mp\gametypes\_damage::onkillstreakkilled( var_0, var_1, var_2, var_3, var_4.xppopup, var_4.destroyedvo );
if ( var_5 && isdefined( var_4.ondestroyeddelegate ) )
self [[ var_4.ondestroyeddelegate ]]( self.streakname, var_0, self.owner, var_2 );
}
handledeath( var_0 )
{
self endon( "carried" );
self waittill( "death" );
var_1 = level.placeableconfigs[var_0];
if ( isdefined( self ) )
{
deactivate( var_0 );
if ( isdefined( var_1.modeldestroyed ) )
self setmodel( var_1.modeldestroyed );
if ( isdefined( var_1.ondeathdelegate ) )
self [[ var_1.ondeathdelegate ]]( var_0 );
self delete();
}
}
oncarrierdeath( var_0, var_1 )
{
self endon( "placed" );
self endon( "death" );
var_1 endon( "disconnect" );
var_1 waittill( "death" );
if ( self.canbeplaced )
thread onplaced( var_0 );
else
oncancel( var_0 );
}
onkillstreakdisowned( var_0 )
{
self endon( "death" );
level endon( "game_ended" );
self.owner waittill( "killstreak_disowned" );
cleanup( var_0 );
}
ongameended( var_0 )
{
self endon( "death" );
level waittill( "game_ended" );
cleanup( var_0 );
}
cleanup( var_0 )
{
if ( isdefined( self.isplaced ) )
self notify( "death" );
else
oncancel( var_0 );
}
watchplayerconnected()
{
self endon( "death" );
for (;;)
{
level waittill( "connected", var_0 );
thread onplayerconnected( var_0 );
}
}
onplayerconnected( var_0 )
{
self endon( "death" );
var_0 endon( "disconnect" );
var_0 waittill( "spawned_player" );
self disableplayeruse( var_0 );
}
timeout( var_0 )
{
self endon( "death" );
level endon( "game_ended" );
var_1 = level.placeableconfigs[var_0];
var_2 = var_1.lifespan;
while ( var_2 > 0.0 )
{
wait 1.0;
maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
if ( !isdefined( self.carriedby ) )
var_2 = var_2 - 1.0;
}
if ( isdefined( self.owner ) && isdefined( var_1.gonevo ) )
self.owner thread maps\mp\_utility::leaderdialogonplayer( var_1.gonevo );
self notify( "death" );
}
removeweapons()
{
if ( self hasweapon( "iw6_riotshield_mp" ) )
{
self.restoreweapon = "iw6_riotshield_mp";
self takeweapon( "iw6_riotshield_mp" );
}
}
removeperks()
{
if ( maps\mp\_utility::_hasperk( "specialty_explosivebullets" ) )
{
self.restoreperk = "specialty_explosivebullets";
maps\mp\_utility::_unsetperk( "specialty_explosivebullets" );
}
}
restoreweapons()
{
if ( isdefined( self.restoreweapon ) )
{
maps\mp\_utility::_giveweapon( self.restoreweapon );
self.restoreweapon = undefined;
}
}
restoreperks()
{
if ( isdefined( self.restoreperk ) )
{
maps\mp\_utility::giveperk( self.restoreperk, 0 );
self.restoreperk = undefined;
}
}
createbombsquadmodel( var_0 )
{
var_1 = level.placeableconfigs[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;
}
}
}
showplacedmodel( var_0 )
{
self show();
if ( isdefined( self.bombsquadmodel ) )
{
self.bombsquadmodel show();
level notify( "update_bombsquad" );
}
}
hideplacedmodel( var_0 )
{
self hide();
if ( isdefined( self.bombsquadmodel ) )
self.bombsquadmodel hide();
}
createcarriedobject( var_0 )
{
if ( isdefined( self.iscarrying ) && self.iscarrying )
return;
var_1 = spawnturret( "misc_turret", self.origin + ( 0, 0, 25 ), "sentry_minigun_mp" );
var_1.angles = self.angles;
var_1.owner = self;
var_2 = level.placeableconfigs[var_0];
var_1 setmodel( var_2.modelbase );
var_1 maketurretinoperable();
var_1 setturretmodechangewait( 1 );
var_1 setmode( "sentry_offline" );
var_1 makeunusable();
var_1 setsentryowner( self );
var_1 setsentrycarrier( self );
var_1 setcandamage( 0 );
var_1 setcontents( 0 );
return var_1;
}

View File

@ -0,0 +1,119 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
var_0 = spawnstruct();
var_0.streakname = "placeable_barrier";
var_0.weaponinfo = "ims_projectile_mp";
var_0.modelbase = "placeable_barrier";
var_0.modeldestroyed = "placeable_barrier_destroyed";
var_0.modelplacement = "placeable_barrier_obj";
var_0.modelplacementfailed = "placeable_barrier_obj_red";
var_0.hintstring = &"KILLSTREAKS_HINTS_PLACEABLE_COVER_PICKUP";
var_0.placestring = &"KILLSTREAKS_HINTS_PLACEABLE_COVER_PLACE";
var_0.cannotplacestring = &"KILLSTREAKS_HINTS_PLACEABLE_COVER_CANNOT_PLACE";
var_0.headiconheight = 75;
var_0.splashname = "used_placeable_barrier";
var_0.lifespan = 60.0;
var_0.maxhealth = 500;
var_0.allowmeleedamage = 0;
var_0.damagefeedback = "ims";
var_0.xppopup = "destroyed_ims";
var_0.destroyedvo = "ims_destroyed";
var_0.onplaceddelegate = ::onplaced;
var_0.oncarrieddelegate = ::oncarried;
var_0.placedsfx = "ims_plant";
var_0.ondamageddelegate = ::ondamaged;
var_0.ondeathdelegate = ::ondeath;
var_0.deathvfx = loadfx( "vfx/gameplay/mp/killstreaks/vfx_ballistic_vest_death" );
var_0.colradius = 72;
var_0.colheight = 36;
level.placeableconfigs["placeable_barrier"] = var_0;
setupbrushmodel();
level.killstreakfuncs["placeable_barrier"] = ::tryuseplaceable;
}
tryuseplaceable( var_0, var_1 )
{
var_2 = maps\mp\killstreaks\_placeable::giveplaceable( "placeable_barrier" );
if ( var_2 )
maps\mp\_matchdata::logkillstreakevent( "placeable_barrier", self.origin );
self.iscarrying = undefined;
return var_2;
}
createobject( var_0 )
{
}
onplaced( var_0 )
{
var_1 = level.placeableconfigs[var_0];
self setmodel( var_1.modelbase );
var_2 = common_scripts\utility::spawn_tag_origin();
var_2 show();
var_2.origin = self.origin;
if ( !isdefined( level.barriercollision ) )
setupbrushmodel();
var_2 clonebrushmodeltoscriptmodel( level.barriercollision );
var_3 = maps\mp\_utility::getotherteam( self.owner.team );
badplace_cylinder( var_0 + self getentitynumber(), -1, self.origin, var_1.colradius, var_1.colheight, var_3 );
self.collision = var_2;
}
oncarried( var_0 )
{
disablecollision( var_0 );
}
ondamaged( var_0, var_1, var_2, var_3 )
{
return var_3;
}
ondestroyed( var_0, var_1, var_2, var_3 )
{
}
ondeath( var_0 )
{
disablecollision( var_0 );
var_1 = level.placeableconfigs[var_0];
if ( isdefined( var_1.deathsfx ) )
self playsound( var_1.deathsfx );
playfx( var_1.deathvfx, self.origin );
wait 0.5;
}
disablecollision( var_0 )
{
if ( isdefined( self.collision ) )
{
badplace_delete( var_0 + self getentitynumber() );
self.collision delete();
self.collision = undefined;
}
}
setupbrushmodel()
{
var_0 = getent( "barrier_collision", "targetname" );
if ( isdefined( var_0 ) )
{
level.barriercollision = getent( var_0.target, "targetname" );
var_0 delete();
}
if ( !isdefined( level.barriercollision ) )
level.barriercollision = level.airdropcratecollision;
}

View File

@ -0,0 +1,331 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
if ( !isdefined( level.planes ) )
level.planes = [];
if ( !isdefined( level.planeconfigs ) )
level.planeconfigs = [];
level.fighter_deathfx = loadfx( "vfx/gameplay/explosions/vehicle/hind_mp/vfx_x_mphnd_primary" );
level.fx_airstrike_afterburner = loadfx( "vfx/gameplay/mp/killstreaks/vfx_air_superiority_afterburner" );
level.fx_airstrike_contrail = loadfx( "vfx/gameplay/mp/killstreaks/vfx_aircraft_contrail" );
level.fx_airstrike_wingtip_light_green = loadfx( "vfx/gameplay/mp/killstreaks/vfx_acraft_light_wingtip_green" );
level.fx_airstrike_wingtip_light_red = loadfx( "vfx/gameplay/mp/killstreaks/vfx_acraft_light_wingtip_red" );
}
getflightpath( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7 )
{
var_8 = var_0 + var_1 * ( -1 * var_2 );
var_9 = var_0 + var_1 * var_2;
if ( var_3 )
{
var_8 = var_8 * ( 1, 1, 0 );
var_9 = var_9 * ( 1, 1, 0 );
}
var_8 = var_8 + ( 0, 0, var_4 );
var_9 = var_9 + ( 0, 0, var_4 );
var_10 = length( var_8 - var_9 );
var_11 = var_10 / var_5;
var_10 = abs( 0.5 * var_10 + var_6 );
var_12 = var_10 / var_5;
var_13["startPoint"] = var_8;
var_13["endPoint"] = var_9;
var_13["attackTime"] = var_12;
var_13["flyTime"] = var_11;
return var_13;
}
doflyby( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
{
var_9 = planespawn( var_0, var_1, var_3, var_7, var_8 );
var_9 endon( "death" );
var_10 = 150;
var_11 = var_4 + ( ( randomfloat( 2 ) - 1 ) * var_10, ( randomfloat( 2 ) - 1 ) * var_10, 0 );
var_9 planemove( var_11, var_6, var_5, var_8 );
var_9 planecleanup();
}
planespawn( var_0, var_1, var_2, var_3, var_4 )
{
if ( !isdefined( var_1 ) )
return;
var_5 = 100;
var_6 = var_2 + ( ( randomfloat( 2 ) - 1 ) * var_5, ( randomfloat( 2 ) - 1 ) * var_5, 0 );
var_7 = level.planeconfigs[var_4];
var_8 = undefined;
var_8 = spawn( "script_model", var_6 );
var_8.team = var_1.team;
var_8.origin = var_6;
var_8.angles = vectortoangles( var_3 );
var_8.lifeid = var_0;
var_8.streakname = var_4;
var_8.owner = var_1;
var_8 setmodel( var_7.modelnames[var_1.team] );
if ( isdefined( var_7.compassiconfriendly ) )
var_8 setobjectiveicons( var_7.compassiconfriendly, var_7.compassiconenemy );
var_8 thread handledamage();
var_8 thread handledeath();
starttrackingplane( var_8 );
if ( !isdefined( var_7.nolightfx ) )
var_8 thread playplanefx();
var_8 playloopsound( var_7.inboundsfx );
var_8 createkillcam( var_4 );
return var_8;
}
planemove( var_0, var_1, var_2, var_3 )
{
var_4 = level.planeconfigs[var_3];
self moveto( var_0, var_1, 0, 0 );
if ( isdefined( var_4.onattackdelegate ) )
self thread [[ var_4.onattackdelegate ]]( var_0, var_1, var_2, self.owner, var_3 );
if ( isdefined( var_4.sonicboomsfx ) )
thread playsonicboom( var_4.sonicboomsfx, 0.5 * var_1 );
wait( 0.65 * var_1 );
if ( isdefined( var_4.outboundsfx ) )
{
self stoploopsound();
self playloopsound( var_4.outboundsfx );
}
if ( isdefined( var_4.outboundflightanim ) )
self scriptmodelplayanimdeltamotion( var_4.outboundflightanim );
wait( 0.35 * var_1 );
}
planecleanup()
{
var_0 = level.planeconfigs[self.streakname];
if ( isdefined( var_0.onflybycompletedelegate ) )
thread [[ var_0.onflybycompletedelegate ]]( self.owner, self, self.streakname );
if ( isdefined( self.friendlyteamid ) )
{
maps\mp\_utility::_objective_delete( self.friendlyteamid );
maps\mp\_utility::_objective_delete( self.enemyteamid );
}
if ( isdefined( self.killcament ) )
self.killcament delete();
stoptrackingplane( self );
self notify( "delete" );
self delete();
}
handleemp( var_0 )
{
self endon( "death" );
for (;;)
{
if ( var_0 maps\mp\_utility::isemped() )
{
self notify( "death" );
return;
}
level waittill( "emp_update" );
}
}
handledeath()
{
level endon( "game_ended" );
self endon( "delete" );
self waittill( "death" );
var_0 = anglestoforward( self.angles ) * 200;
playfx( level.fighter_deathfx, self.origin, var_0 );
thread planecleanup();
}
handledamage()
{
self endon( "end_remote" );
maps\mp\gametypes\_damage::monitordamage( 800, "helicopter", ::handledeathdamage, ::modifydamage, 1 );
}
modifydamage( var_0, var_1, var_2, var_3 )
{
var_4 = var_3;
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;
}
handledeathdamage( var_0, var_1, var_2, var_3 )
{
var_4 = level.planeconfigs[self.streakname];
maps\mp\gametypes\_damage::onkillstreakkilled( var_0, var_1, var_2, var_3, var_4.xppopup, var_4.destroyedvo, var_4.callout );
maps\mp\gametypes\_missions::checkaachallenges( var_0, self, var_1 );
}
playplanefx()
{
self endon( "death" );
wait 0.5;
playfxontag( level.fx_airstrike_afterburner, self, "tag_engine_right" );
wait 0.5;
playfxontag( level.fx_airstrike_afterburner, self, "tag_engine_left" );
wait 0.5;
playfxontag( level.fx_airstrike_contrail, self, "tag_right_wingtip" );
wait 0.5;
playfxontag( level.fx_airstrike_contrail, self, "tag_left_wingtip" );
wait 0.5;
playfxontag( level.fx_airstrike_wingtip_light_red, self, "tag_right_wingtip" );
wait 0.5;
playfxontag( level.fx_airstrike_wingtip_light_green, self, "tag_left_wingtip" );
}
getplaneflyheight()
{
var_0 = getent( "airstrikeheight", "targetname" );
if ( isdefined( var_0 ) )
return var_0.origin[2];
else
{
var_1 = 950;
if ( isdefined( level.airstrikeheightscale ) )
var_1 = var_1 * level.airstrikeheightscale;
return var_1;
}
}
getplaneflightplan( var_0 )
{
var_1 = spawnstruct();
var_1.height = getplaneflyheight();
var_2 = getent( "airstrikeheight", "targetname" );
if ( isdefined( var_2 ) && isdefined( var_2.script_noteworthy ) && var_2.script_noteworthy == "fixedposition" )
{
var_1.targetpos = var_2.origin;
var_1.flightdir = anglestoforward( var_2.angles );
if ( randomint( 2 ) == 0 )
var_1.flightdir = var_1.flightdir * -1;
}
else
{
var_3 = anglestoforward( self.angles );
var_4 = anglestoright( self.angles );
var_1.targetpos = self.origin + var_0 * var_3;
var_1.flightdir = -1 * var_4;
}
return var_1;
}
getexplodedistance( var_0 )
{
var_1 = 850;
var_2 = 1500;
var_3 = var_1 / var_0;
var_4 = var_3 * var_2;
return var_4;
}
starttrackingplane( var_0 )
{
var_1 = var_0 getentitynumber();
level.planes[var_1] = var_0;
}
stoptrackingplane( var_0 )
{
var_1 = var_0 getentitynumber();
level.planes[var_1] = undefined;
}
selectairstrikelocation( var_0, var_1, var_2 )
{
var_3 = level.mapsize / 6.46875;
if ( level.splitscreen )
var_3 = var_3 * 1.5;
var_4 = level.planeconfigs[var_1];
if ( isdefined( var_4.selectlocationvo ) )
self playlocalsound( game["voice"][self.team] + var_4.selectlocationvo );
maps\mp\_utility::_beginlocationselection( var_1, "map_artillery_selector", var_4.choosedirection, var_3 );
self endon( "stop_location_selection" );
self waittill( "confirm_location", var_5, var_6 );
if ( !var_4.choosedirection )
var_6 = randomint( 360 );
self setblurforplayer( 0, 0.3 );
if ( isdefined( var_4.inboundvo ) )
self playlocalsound( game["voice"][self.team] + var_4.inboundvo );
self thread [[ var_2 ]]( var_0, var_5, var_6, var_1 );
return 1;
}
setobjectiveicons( var_0, var_1 )
{
var_2 = maps\mp\gametypes\_gameobjects::getnextobjid();
objective_add( var_2, "active", ( 0, 0, 0 ), var_0 );
objective_onentitywithrotation( var_2, self );
self.friendlyteamid = var_2;
var_3 = maps\mp\gametypes\_gameobjects::getnextobjid();
objective_add( var_3, "active", ( 0, 0, 0 ), var_1 );
objective_onentitywithrotation( var_3, self );
self.enemyteamid = var_3;
if ( level.teambased )
{
objective_team( var_2, self.team );
objective_team( var_3, maps\mp\_utility::getotherteam( self.team ) );
}
else
{
var_4 = self.owner getentitynumber();
objective_playerteam( var_2, var_4 );
objective_playerenemyteam( var_3, var_4 );
}
}
playsonicboom( var_0, var_1 )
{
self endon( "death" );
wait( var_1 );
self playsoundonmovingent( var_0 );
}
createkillcam( var_0 )
{
var_1 = level.planeconfigs[var_0];
if ( isdefined( var_1.killcamoffset ) )
{
var_2 = anglestoforward( self.angles );
var_3 = spawn( "script_model", self.origin + ( 0, 0, 100 ) - var_2 * 200 );
var_3.starttime = gettime();
var_3 setscriptmoverkillcam( "airstrike" );
var_3 linkto( self, "tag_origin", var_1.killcamoffset, ( 0, 0, 0 ) );
self.killcament = var_3;
}
}

View File

@ -0,0 +1,310 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
if ( !isdefined( level.portableaoegeneratorsettings ) )
{
level.portableaoegeneratorsettings = [];
level.generators = [];
}
}
setweapon( var_0 )
{
var_1 = level.portableaoegeneratorsettings[var_0];
self setoffhandsecondaryclass( "flash" );
maps\mp\_utility::_giveweapon( var_1.weaponname, 0 );
self givestartammo( var_1.weaponname );
if ( !isdefined( self.deployedgenerators ) )
self.deployedgenerators = [];
thread monitorgeneratoruse( var_0 );
}
unsetweapon( var_0 )
{
self notify( "end_monitorUse_" + var_0 );
}
deletegenerator( var_0, var_1 )
{
if ( !isdefined( var_0 ) )
return;
foreach ( var_3 in level.players )
{
if ( isdefined( var_3 ) && isdefined( var_3.ingeneratoraoe ) )
var_3.ingeneratoraoe[var_1] = undefined;
}
registergenerator( var_0, var_1, undefined );
var_0 notify( "death" );
var_0 delete();
}
registergenerator( var_0, var_1, var_2 )
{
if ( isdefined( var_2 ) && var_2 )
self.deployedgenerators[var_1] = var_0;
else
{
self.deployedgenerators[var_1] = undefined;
var_2 = undefined;
}
var_3 = level.generators[var_1];
if ( !isdefined( var_3 ) )
{
level.generators[var_1] = [];
var_3 = level.generators[var_1];
}
var_4 = getid( var_0 );
var_3[var_4] = var_2;
}
monitorgeneratoruse( var_0 )
{
self notify( "end_monitorUse_" + var_0 );
self endon( "end_monitorUse_" + var_0 );
self endon( "disconnect" );
level endon( "game_ended" );
var_1 = level.portableaoegeneratorsettings[var_0];
for (;;)
{
self waittill( "grenade_fire", var_2, var_3 );
if ( var_3 == var_1.weaponname || var_3 == var_0 )
{
if ( !isalive( self ) )
{
var_2 delete();
return;
}
if ( checkgeneratorplacement( var_2, var_1.placementztolerance ) )
{
var_4 = self.deployedgenerators[var_0];
if ( isdefined( var_4 ) )
deletegenerator( var_4, var_0 );
var_5 = spawnnewgenerator( var_0, var_2.origin );
var_6 = var_2 getlinkedparent();
if ( isdefined( var_6 ) )
var_5 linkto( var_6 );
if ( isdefined( var_2 ) )
var_2 delete();
continue;
}
self setweaponammostock( var_1.weaponname, self getweaponammostock( "trophy_mp" ) + 1 );
}
}
}
checkgeneratorplacement( var_0, var_1 )
{
var_0 hide();
var_0 waittill( "missile_stuck", var_2 );
if ( var_1 * var_1 < distancesquared( var_0.origin, self.origin ) )
{
var_3 = bullettrace( self.origin, self.origin - ( 0, 0, var_1 ), 0, self );
if ( var_3["fraction"] == 1 )
{
var_0 delete();
return 0;
}
var_0.origin = var_3["position"];
}
var_0 show();
return 1;
}
spawnnewgenerator( var_0, var_1 )
{
var_2 = level.portableaoegeneratorsettings[var_0];
var_3 = spawn( "script_model", var_1 );
var_3.health = var_2.health;
var_3.team = self.team;
var_3.owner = self;
var_3 setcandamage( 1 );
var_3 setmodel( var_2.placedmodel );
if ( level.teambased )
var_3 maps\mp\_entityheadicons::setteamheadicon( self.team, ( 0, 0, var_2.headiconheight ) );
else
var_3 maps\mp\_entityheadicons::setplayerheadicon( self, ( 0, 0, var_2.headiconheight ) );
var_3 thread watchowner( self, var_0 );
var_3 thread watchdamage( self, var_0 );
var_3 thread watchuse( self, var_0 );
var_3 thread maps\mp\_utility::notusableforjoiningplayers( self );
if ( isdefined( var_2.ondeploycallback ) )
var_3 [[ var_2.ondeploycallback ]]( self, var_0 );
var_3 thread maps\mp\gametypes\_weapons::createbombsquadmodel( var_2.bombsquadmodel, "tag_origin", self );
registergenerator( var_3, var_0, 1 );
self.changingweapon = undefined;
wait 0.05;
if ( isdefined( var_3 ) && var_3 maps\mp\_utility::touchingbadtrigger() )
var_3 notify( "death" );
return var_3;
}
watchowner( var_0, var_1 )
{
self endon( "death" );
level endon( "game_ended" );
if ( maps\mp\_utility::bot_is_fireteam_mode() )
var_0 waittill( "killstreak_disowned" );
else
var_0 common_scripts\utility::waittill_either( "killstreak_disowned", "death" );
var_0 thread deletegenerator( self, var_1 );
}
watchdamage( var_0, var_1 )
{
self.generatortype = var_1;
var_2 = level.portableaoegeneratorsettings[var_1];
maps\mp\gametypes\_damage::monitordamage( var_2.health, var_2.damagefeedback, ::handledeathdamage, ::modifydamage, 0 );
}
modifydamage( var_0, var_1, var_2, var_3 )
{
var_4 = var_3;
var_4 = maps\mp\gametypes\_damage::handlemeleedamage( var_1, var_2, var_4 );
var_4 = maps\mp\gametypes\_damage::handleempdamage( 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;
}
handledeathdamage( var_0, var_1, var_2 )
{
var_3 = self.owner;
var_4 = level.portableaoegeneratorsettings[self.generatortype];
if ( isdefined( var_3 ) && var_0 != var_3 )
var_0 notify( "destroyed_equipment" );
if ( isdefined( var_4.ondestroycallback ) )
var_3 [[ var_4.ondestroycallback ]]( self, self.generatortype );
var_3 thread deletegenerator( self, self.generatortype );
}
watchuse( var_0, var_1 )
{
self endon( "death" );
level endon( "game_ended" );
var_0 endon( "disconnect" );
var_2 = level.portableaoegeneratorsettings[var_1];
self setcursorhint( "HINT_NOICON" );
self sethintstring( var_2.usehintstring );
maps\mp\_utility::setselfusable( var_0 );
for (;;)
{
self waittill( "trigger", var_3 );
var_3 playlocalsound( var_2.usesound );
if ( var_3 getammocount( var_2.weaponname ) == 0 && !var_3 maps\mp\_utility::isjuggernaut() )
var_3 setweapon( var_1 );
var_3 thread deletegenerator( self, var_1 );
}
}
generatoraoetracker()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "faux_spawn" );
level endon( "game_ended" );
var_0 = randomfloat( 0.5 );
wait( var_0 );
self.ingeneratoraoe = [];
for (;;)
{
wait 0.05;
if ( level.generators.size > 0 || self.ingeneratoraoe.size > 0 )
{
foreach ( var_2 in level.portableaoegeneratorsettings )
checkallgeneratorsofthistype( var_2.generatortype );
}
}
}
checkallgeneratorsofthistype( var_0 )
{
var_1 = level.generators[var_0];
if ( isdefined( var_1 ) )
{
var_2 = level.portableaoegeneratorsettings[var_0];
var_3 = var_2.aoeradius * var_2.aoeradius;
var_4 = undefined;
foreach ( var_6 in var_1 )
{
if ( isdefined( var_6 ) && maps\mp\_utility::isreallyalive( var_6 ) )
{
if ( level.teambased && matchestargetteam( var_6.team, self.team, var_2.targettype ) || !level.teambased && matchesowner( var_6.owner, self, var_2.targettype ) )
{
var_7 = distancesquared( var_6.origin, self.origin );
if ( var_7 < var_3 )
{
var_4 = var_6;
break;
}
}
}
}
var_9 = isdefined( var_4 );
var_10 = isdefined( self.ingeneratoraoe[var_0] );
if ( var_9 && !var_10 )
self [[ var_2.onentercallback ]]();
else if ( !var_9 && var_10 )
self [[ var_2.onexitcallback ]]();
self.ingeneratoraoe[var_0] = var_4;
}
}
matchestargetteam( var_0, var_1, var_2 )
{
return var_2 == "all" || var_2 == "friendly" && var_0 == var_1 || var_2 == "enemy" && var_0 != var_1;
}
matchesowner( var_0, var_1, var_2 )
{
return var_2 == "all" || var_2 == "friendly" && var_0 == var_1 || var_2 == "enemy" && var_0 != var_1;
}
getid( var_0 )
{
return var_0.owner.guid + var_0.birthtime;
}

View File

@ -0,0 +1,251 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.missileremotelaunchvert = 14000;
level.missileremotelaunchhorz = 7000;
level.missileremotelaunchtargetdist = 1500;
level.rockets = [];
level.killstreakfuncs["predator_missile"] = ::tryusepredatormissile;
level.remotemissile_fx["explode"] = loadfx( "fx/explosions/aerial_explosion" );
}
tryusepredatormissile( var_0, var_1 )
{
maps\mp\_utility::setusingremote( "remotemissile" );
var_2 = maps\mp\killstreaks\_killstreaks::initridekillstreak();
if ( var_2 != "success" )
{
if ( var_2 != "disconnect" )
maps\mp\_utility::clearusingremote();
return 0;
}
self setclientomnvar( "ui_predator_missile", 1 );
level thread _fire( var_0, self );
return 1;
}
getbestspawnpoint( var_0 )
{
var_1 = [];
foreach ( var_3 in var_0 )
{
var_3.validplayers = [];
var_3.spawnscore = 0;
}
foreach ( var_6 in level.players )
{
if ( !maps\mp\_utility::isreallyalive( var_6 ) )
continue;
if ( var_6.team == self.team )
continue;
if ( var_6.team == "spectator" )
continue;
var_7 = 999999999;
var_8 = undefined;
foreach ( var_3 in var_0 )
{
var_3.validplayers[var_3.validplayers.size] = var_6;
var_10 = distance2d( var_3.targetent.origin, var_6.origin );
if ( var_10 <= var_7 )
{
var_7 = var_10;
var_8 = var_3;
}
}
var_8.spawnscore = var_8.spawnscore + 2;
}
var_13 = var_0[0];
foreach ( var_3 in var_0 )
{
foreach ( var_6 in var_3.validplayers )
{
var_3.spawnscore = var_3.spawnscore + 1;
if ( bullettracepassed( var_6.origin + ( 0, 0, 32 ), var_3.origin, 0, var_6 ) )
var_3.spawnscore = var_3.spawnscore + 3;
if ( var_3.spawnscore > var_13.spawnscore )
{
var_13 = var_3;
continue;
}
if ( var_3.spawnscore == var_13.spawnscore )
{
if ( common_scripts\utility::cointoss() )
var_13 = var_3;
}
}
}
return var_13;
}
_fire( var_0, var_1 )
{
var_2 = getentarray( "remoteMissileSpawn", "targetname" );
foreach ( var_4 in var_2 )
{
if ( isdefined( var_4.target ) )
var_4.targetent = getent( var_4.target, "targetname" );
}
if ( var_2.size > 0 )
var_6 = var_1 getbestspawnpoint( var_2 );
else
var_6 = undefined;
if ( isdefined( var_6 ) )
{
var_7 = var_6.origin;
var_8 = var_6.targetent.origin;
var_9 = vectornormalize( var_7 - var_8 );
var_7 = var_9 * 14000 + var_8;
var_10 = magicbullet( "remotemissile_projectile_mp", var_7, var_8, var_1 );
}
else
{
var_11 = ( 0, 0, level.missileremotelaunchvert );
var_12 = level.missileremotelaunchhorz;
var_13 = level.missileremotelaunchtargetdist;
var_14 = anglestoforward( var_1.angles );
var_7 = var_1.origin + var_11 + var_14 * var_12 * -1;
var_8 = var_1.origin + var_14 * var_13;
var_10 = magicbullet( "remotemissile_projectile_mp", var_7, var_8, var_1 );
}
if ( !isdefined( var_10 ) )
{
var_1 maps\mp\_utility::clearusingremote();
return;
}
var_10.team = var_1.team;
var_10 thread handledamage();
var_10.lifeid = var_0;
var_10.type = "remote";
level.remotemissileinprogress = 1;
missileeyes( var_1, var_10 );
}
handledamage()
{
self endon( "death" );
self endon( "deleted" );
self setcandamage( 1 );
for (;;)
self waittill( "damage" );
}
missileeyes( var_0, var_1 )
{
var_0 endon( "joined_team" );
var_0 endon( "joined_spectators" );
var_1 thread rocket_cleanupondeath();
var_0 thread player_cleanupongameended( var_1 );
var_0 thread player_cleanuponteamchange( var_1 );
var_0 visionsetmissilecamforplayer( "black_bw", 0 );
var_0 endon( "disconnect" );
if ( isdefined( var_1 ) )
{
var_0 visionsetmissilecamforplayer( game["thermal_vision"], 1.0 );
var_0 thermalvisionon();
var_0 thread delayedfofoverlay();
var_0 cameralinkto( var_1, "tag_origin" );
var_0 controlslinkto( var_1 );
if ( getdvarint( "camera_thirdPerson" ) )
var_0 maps\mp\_utility::setthirdpersondof( 0 );
var_1 waittill( "death" );
var_0 thermalvisionoff();
if ( isdefined( var_1 ) )
var_0 maps\mp\_matchdata::logkillstreakevent( "predator_missile", var_1.origin );
var_0 controlsunlink();
var_0 maps\mp\_utility::freezecontrolswrapper( 1 );
if ( !level.gameended || isdefined( var_0.finalkill ) )
var_0 setclientomnvar( "ui_predator_missile", 2 );
wait 0.5;
var_0 thermalvisionfofoverlayoff();
var_0 cameraunlink();
if ( getdvarint( "camera_thirdPerson" ) )
var_0 maps\mp\_utility::setthirdpersondof( 1 );
}
var_0 setclientomnvar( "ui_predator_missile", 0 );
var_0 maps\mp\_utility::clearusingremote();
}
delayedfofoverlay()
{
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
wait 0.15;
self thermalvisionfofoverlayon();
}
player_cleanuponteamchange( var_0 )
{
var_0 endon( "death" );
self endon( "disconnect" );
common_scripts\utility::waittill_any( "joined_team", "joined_spectators" );
if ( self.team != "spectator" )
{
self thermalvisionfofoverlayoff();
self controlsunlink();
self cameraunlink();
if ( getdvarint( "camera_thirdPerson" ) )
maps\mp\_utility::setthirdpersondof( 1 );
}
maps\mp\_utility::clearusingremote();
level.remotemissileinprogress = undefined;
}
rocket_cleanupondeath()
{
var_0 = self getentitynumber();
level.rockets[var_0] = self;
self waittill( "death" );
level.rockets[var_0] = undefined;
level.remotemissileinprogress = undefined;
}
player_cleanupongameended( var_0 )
{
var_0 endon( "death" );
self endon( "death" );
level waittill( "game_ended" );
self thermalvisionfofoverlayoff();
self controlsunlink();
self cameraunlink();
if ( getdvarint( "camera_thirdPerson" ) )
maps\mp\_utility::setthirdpersondof( 1 );
}

View File

@ -0,0 +1,687 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.remote_mortar_fx["laserTarget"] = loadfx( "fx/misc/laser_glow" );
level.remote_mortar_fx["missileExplode"] = loadfx( "fx/explosions/bouncing_betty_explosion" );
level.remote_mortar_fx["deathExplode"] = loadfx( "fx/explosions/uav_advanced_death" );
level.killstreakfuncs["remote_mortar"] = ::tryuseremotemortar;
level.remote_mortar = undefined;
}
tryuseremotemortar( var_0, var_1 )
{
if ( isdefined( level.remote_mortar ) )
{
self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
return 0;
}
maps\mp\_utility::setusingremote( "remote_mortar" );
var_2 = maps\mp\killstreaks\_killstreaks::initridekillstreak( "remote_mortar" );
if ( var_2 != "success" )
{
if ( var_2 != "disconnect" )
maps\mp\_utility::clearusingremote();
return 0;
}
else if ( isdefined( level.remote_mortar ) )
{
self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
maps\mp\_utility::clearusingremote();
return 0;
}
maps\mp\_matchdata::logkillstreakevent( "remote_mortar", self.origin );
return startremotemortar( var_0 );
}
startremotemortar( var_0 )
{
var_1 = spawnremote( var_0, self );
if ( !isdefined( var_1 ) )
return 0;
level.remote_mortar = var_1;
remoteride( var_1 );
thread maps\mp\_utility::teamplayercardsplash( "used_remote_mortar", self );
return 1;
}
spawnremote( var_0, var_1 )
{
var_2 = spawnplane( var_1, "script_model", level.uavrig gettagorigin( "tag_origin" ), "compass_objpoint_reaper_friendly", "compass_objpoint_reaper_enemy" );
if ( !isdefined( var_2 ) )
return undefined;
var_2 setmodel( "vehicle_predator_b" );
var_2.lifeid = var_0;
var_2.team = var_1.team;
var_2.owner = var_1;
var_2.numflares = 1;
var_2 setcandamage( 1 );
var_2 thread damagetracker();
var_2.helitype = "remote_mortar";
var_2.uavtype = "remote_mortar";
var_2 maps\mp\killstreaks\_uav::adduavmodel();
var_3 = 6300;
var_4 = randomint( 360 );
var_5 = 6100;
var_6 = cos( var_4 ) * var_5;
var_7 = sin( var_4 ) * var_5;
var_8 = vectornormalize( ( var_6, var_7, var_3 ) );
var_8 = var_8 * 6100;
var_2 linkto( level.uavrig, "tag_origin", var_8, ( 0, var_4 - 90, 10 ) );
var_1 setclientdvar( "ui_reaper_targetDistance", -1 );
var_1 setclientdvar( "ui_reaper_ammoCount", 14 );
var_2 thread handledeath( var_1 );
var_2 thread handletimeout( var_1 );
var_2 thread handleownerchangeteam( var_1 );
var_2 thread handleownerdisconnect( var_1 );
var_2 thread handleincomingstinger();
var_2 thread handleincomingsam();
return var_2;
}
lookcenter( var_0 )
{
self endon( "disconnect" );
level endon( "game_ended" );
var_0 endon( "death" );
wait 0.05;
var_1 = vectortoangles( level.uavrig.origin - var_0 gettagorigin( "tag_player" ) );
self setplayerangles( var_1 );
}
remoteride( var_0 )
{
maps\mp\_utility::_giveweapon( "mortar_remote_mp" );
self switchtoweapon( "mortar_remote_mp" );
thread waitsetthermal( 1.0, var_0 );
thread maps\mp\_utility::reinitializethermal( var_0 );
if ( getdvarint( "camera_thirdPerson" ) )
maps\mp\_utility::setthirdpersondof( 0 );
self playerlinkweaponviewtodelta( var_0, "tag_player", 1.0, 40, 40, 25, 40 );
thread lookcenter( var_0 );
common_scripts\utility::_disableweaponswitch();
thread remotetargeting( var_0 );
thread remotefiring( var_0 );
thread remotezoom( var_0 );
}
waitsetthermal( var_0, var_1 )
{
self endon( "disconnect" );
var_1 endon( "death" );
wait( var_0 );
self visionsetthermalforplayer( level.ac130.enhanced_vision, 0 );
self.lastvisionsetthermal = level.ac130.enhanced_vision;
self thermalvisionfofoverlayon();
}
remotetargeting( var_0 )
{
level endon( "game_ended" );
self endon( "disconnect" );
var_0 endon( "remote_done" );
var_0 endon( "death" );
var_0.targetent = spawnfx( level.remote_mortar_fx["laserTarget"], ( 0, 0, 0 ) );
for (;;)
{
var_1 = self geteye();
var_2 = anglestoforward( self getplayerangles() );
var_3 = var_1 + var_2 * 15000;
var_4 = bullettrace( var_1, var_3, 0, var_0.targetent );
if ( isdefined( var_4["position"] ) )
{
var_0.targetent.origin = var_4["position"];
triggerfx( var_0.targetent );
}
wait 0.05;
}
}
remotefiring( var_0 )
{
level endon( "game_ended" );
self endon( "disconnect" );
var_0 endon( "remote_done" );
var_0 endon( "death" );
var_1 = gettime();
var_2 = var_1 - 2200;
var_3 = 14;
self.firingreaper = 0;
for (;;)
{
var_1 = gettime();
if ( self attackbuttonpressed() && var_1 - var_2 > 3000 )
{
var_3--;
self setclientdvar( "ui_reaper_ammoCount", var_3 );
var_2 = var_1;
self.firingreaper = 1;
self playlocalsound( "reaper_fire" );
self playrumbleonentity( "damage_heavy" );
var_4 = self geteye();
var_5 = anglestoforward( self getplayerangles() );
var_6 = anglestoright( self getplayerangles() );
var_7 = var_4 + var_5 * 100 + var_6 * -100;
var_8 = magicbullet( "remote_mortar_missile_mp", var_7, var_0.targetent.origin, self );
var_8.type = "remote_mortar";
earthquake( 0.3, 0.5, var_4, 256 );
var_8 missile_settargetent( var_0.targetent );
var_8 missile_setflightmodedirect();
var_8 thread remotemissiledistance( var_0 );
var_8 thread remotemissilelife( var_0 );
var_8 waittill( "death" );
self setclientdvar( "ui_reaper_targetDistance", -1 );
self.firingreaper = 0;
if ( var_3 == 0 )
break;
}
else
wait 0.05;
}
self notify( "removed_reaper_ammo" );
remoteendride( var_0 );
var_0 thread remoteleave();
}
handletogglezoom( var_0 )
{
level endon( "game_ended" );
self endon( "disconnect" );
var_0 endon( "remote_done" );
var_0 endon( "death" );
self notifyonplayercommand( "remote_mortar_toggleZoom1", "+ads_akimbo_accessible" );
if ( !level.console )
self notifyonplayercommand( "remote_mortar_toggleZoom1", "+toggleads_throw" );
for (;;)
{
var_1 = common_scripts\utility::waittill_any_return( "remote_mortar_toggleZoom1" );
if ( !isdefined( self.remote_mortar_togglezoom ) )
self.remote_mortar_togglezoom = 0;
self.remote_mortar_togglezoom = 1 - self.remote_mortar_togglezoom;
}
}
remotezoom( var_0 )
{
level endon( "game_ended" );
self endon( "disconnect" );
var_0 endon( "remote_done" );
var_0 endon( "death" );
self.remote_mortar_togglezoom = undefined;
thread handletogglezoom( var_0 );
var_0.zoomed = 0;
var_1 = 0;
for (;;)
{
if ( self adsbuttonpressed() )
{
wait 0.05;
if ( isdefined( self.remote_mortar_togglezoom ) )
var_1 = 1;
break;
}
wait 0.05;
}
for (;;)
{
if ( !var_1 && self adsbuttonpressed() || var_1 && self.remote_mortar_togglezoom )
{
if ( var_0.zoomed == 0 )
{
maps\mp\_utility::_giveweapon( "mortar_remote_zoom_mp" );
self switchtoweapon( "mortar_remote_zoom_mp" );
var_0.zoomed = 1;
}
}
else if ( !var_1 && !self adsbuttonpressed() || var_1 && !self.remote_mortar_togglezoom )
{
if ( var_0.zoomed == 1 )
{
maps\mp\_utility::_giveweapon( "mortar_remote_mp" );
self switchtoweapon( "mortar_remote_mp" );
var_0.zoomed = 0;
}
}
wait 0.05;
}
}
remotemissiledistance( var_0 )
{
level endon( "game_ended" );
var_0 endon( "death" );
var_0 endon( "remote_done" );
self endon( "death" );
for (;;)
{
var_1 = distance( self.origin, var_0.targetent.origin );
var_0.owner setclientdvar( "ui_reaper_targetDistance", int( var_1 / 12 ) );
wait 0.05;
}
}
remotemissilelife( var_0 )
{
self endon( "death" );
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 6 );
playfx( level.remote_mortar_fx["missileExplode"], self.origin );
self delete();
}
remoteendride( var_0 )
{
if ( !maps\mp\_utility::isusingremote() )
return;
if ( isdefined( var_0 ) )
var_0 notify( "helicopter_done" );
self thermalvisionoff();
self thermalvisionfofoverlayoff();
self visionsetthermalforplayer( game["thermal_vision"], 0 );
maps\mp\_utility::restorebasevisionset( 0 );
self unlink();
maps\mp\_utility::clearusingremote();
if ( getdvarint( "camera_thirdPerson" ) )
maps\mp\_utility::setthirdpersondof( 1 );
self switchtoweapon( common_scripts\utility::getlastweapon() );
var_1 = maps\mp\_utility::getkillstreakweapon( "remote_mortar" );
self takeweapon( var_1 );
self takeweapon( "mortar_remote_zoom_mp" );
self takeweapon( "mortar_remote_mp" );
common_scripts\utility::_enableweaponswitch();
}
handletimeout( var_0 )
{
level endon( "game_ended" );
var_0 endon( "disconnect" );
var_0 endon( "removed_reaper_ammo" );
self endon( "death" );
var_1 = 40.0;
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( var_1 );
while ( var_0.firingreaper )
wait 0.05;
if ( isdefined( var_0 ) )
var_0 remoteendride( self );
thread remoteleave();
}
handledeath( var_0 )
{
level endon( "game_ended" );
var_0 endon( "disconnect" );
self endon( "remote_removed" );
self endon( "remote_done" );
self waittill( "death" );
if ( isdefined( var_0 ) )
var_0 remoteendride( self );
level thread removeremote( self, 1 );
}
handleownerchangeteam( var_0 )
{
level endon( "game_ended" );
self endon( "remote_done" );
self endon( "death" );
var_0 endon( "disconnect" );
var_0 endon( "removed_reaper_ammo" );
var_0 common_scripts\utility::waittill_any( "joined_team", "joined_spectators" );
if ( isdefined( var_0 ) )
var_0 remoteendride( self );
thread remoteleave();
}
handleownerdisconnect( var_0 )
{
level endon( "game_ended" );
self endon( "remote_done" );
self endon( "death" );
var_0 endon( "removed_reaper_ammo" );
var_0 waittill( "disconnect" );
thread remoteleave();
}
removeremote( var_0, var_1 )
{
self notify( "remote_removed" );
if ( isdefined( var_0.targetent ) )
var_0.targetent delete();
if ( isdefined( var_0 ) )
{
var_0 delete();
var_0 maps\mp\killstreaks\_uav::removeuavmodel();
}
if ( !isdefined( var_1 ) || var_1 == 1 )
level.remote_mortar = undefined;
}
remoteleave()
{
level.remote_mortar = undefined;
level endon( "game_ended" );
self endon( "death" );
self notify( "remote_done" );
self unlink();
var_0 = self.origin + anglestoforward( self.angles ) * 20000;
self moveto( var_0, 30 );
playfxontag( level._effect["ac130_engineeffect"], self, "tag_origin" );
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 3 );
self moveto( var_0, 4, 4, 0.0 );
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 4 );
level thread removeremote( self, 0 );
}
remoteexplode()
{
self notify( "death" );
self hide();
var_0 = anglestoright( self.angles ) * 200;
playfx( level.remote_mortar_fx["deathExplode"], self.origin, var_0 );
}
damagetracker()
{
level endon( "game_ended" );
self.owner endon( "disconnect" );
self.health = 999999;
self.maxhealth = 1500;
self.damagetaken = 0;
for (;;)
{
self waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
if ( !maps\mp\gametypes\_weapons::friendlyfirecheck( self.owner, var_1 ) )
continue;
if ( !isdefined( self ) )
return;
if ( isdefined( var_8 ) && var_8 & level.idflags_penetration )
self.wasdamagedfrombulletpenetration = 1;
self.wasdamaged = 1;
var_10 = var_0;
if ( isplayer( var_1 ) )
{
var_1 maps\mp\gametypes\_damagefeedback::updatedamagefeedback( "" );
if ( var_4 == "MOD_RIFLE_BULLET" || var_4 == "MOD_PISTOL_BULLET" )
{
if ( var_1 maps\mp\_utility::_hasperk( "specialty_armorpiercing" ) )
var_10 = var_10 + var_0 * level.armorpiercingmod;
}
}
if ( isdefined( var_9 ) )
{
switch ( var_9 )
{
case "javelin_mp":
case "stinger_mp":
self.largeprojectiledamage = 1;
var_10 = self.maxhealth + 1;
break;
case "sam_projectile_mp":
self.largeprojectiledamage = 1;
break;
}
maps\mp\killstreaks\_killstreaks::killstreakhit( var_1, var_9, self );
}
self.damagetaken = self.damagetaken + var_10;
if ( isdefined( self.owner ) )
self.owner playlocalsound( "reaper_damaged" );
if ( self.damagetaken >= self.maxhealth )
{
if ( isplayer( var_1 ) && ( !isdefined( self.owner ) || var_1 != self.owner ) )
{
var_1 notify( "destroyed_killstreak", var_9 );
thread maps\mp\_utility::teamplayercardsplash( "callout_destroyed_remote_mortar", var_1 );
var_1 thread maps\mp\gametypes\_rank::giverankxp( "kill", 50, var_9, var_4 );
var_1 thread maps\mp\gametypes\_rank::xpeventpopup( "destroyed_remote_mortar" );
thread maps\mp\gametypes\_missions::vehiclekilled( self.owner, self, undefined, var_1, var_0, var_4, var_9 );
}
if ( isdefined( self.owner ) )
self.owner stoplocalsound( "missile_incoming" );
thread remoteexplode();
level.remote_mortar = undefined;
return;
}
}
}
handleincomingstinger()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "remote_done" );
for (;;)
{
level waittill( "stinger_fired", var_0, var_1, var_2 );
if ( !isdefined( var_2 ) || var_2 != self )
continue;
var_1 thread stingerproximitydetonate( var_2, var_0 );
}
}
stingerproximitydetonate( var_0, var_1 )
{
self endon( "death" );
var_0 endon( "death" );
if ( isdefined( var_0.owner ) )
var_0.owner playlocalsound( "missile_incoming" );
self missile_settargetent( var_0 );
var_2 = distance( self.origin, var_0 getpointinbounds( 0, 0, 0 ) );
var_3 = var_0 getpointinbounds( 0, 0, 0 );
for (;;)
{
if ( !isdefined( var_0 ) )
var_4 = var_3;
else
var_4 = var_0 getpointinbounds( 0, 0, 0 );
var_3 = var_4;
var_5 = distance( self.origin, var_4 );
if ( var_5 < 3000 && var_0.numflares > 0 )
{
var_0.numflares--;
var_0 thread maps\mp\killstreaks\_flares::flares_playfx();
var_6 = var_0 maps\mp\killstreaks\_flares::flares_deploy();
self missile_settargetent( var_6 );
var_0 = var_6;
if ( isdefined( var_0.owner ) )
var_0.owner stoplocalsound( "missile_incoming" );
return;
}
if ( var_5 < var_2 )
var_2 = var_5;
if ( var_5 > var_2 )
{
if ( var_5 > 1536 )
return;
if ( isdefined( var_0.owner ) )
{
var_0.owner stoplocalsound( "missile_incoming" );
if ( level.teambased )
{
if ( var_0.team != var_1.team )
radiusdamage( self.origin, 1000, 1000, 1000, var_1, "MOD_EXPLOSIVE", "stinger_mp" );
}
else
radiusdamage( self.origin, 1000, 1000, 1000, var_1, "MOD_EXPLOSIVE", "stinger_mp" );
}
self hide();
wait 0.05;
self delete();
}
wait 0.05;
}
}
handleincomingsam()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "remote_done" );
for (;;)
{
level waittill( "sam_fired", var_0, var_1, var_2 );
if ( !isdefined( var_2 ) || var_2 != self )
continue;
level thread samproximitydetonate( var_2, var_0, var_1 );
}
}
samproximitydetonate( var_0, var_1, var_2 )
{
var_0 endon( "death" );
if ( isdefined( var_0.owner ) )
var_0.owner playlocalsound( "missile_incoming" );
var_3 = 150;
var_4 = 1000;
var_5 = [];
for ( var_6 = 0; var_6 < var_2.size; var_6++ )
{
if ( isdefined( var_2[var_6] ) )
{
var_5[var_6] = distance( var_2[var_6].origin, var_0 getpointinbounds( 0, 0, 0 ) );
continue;
}
var_5[var_6] = undefined;
}
for (;;)
{
var_7 = var_0 getpointinbounds( 0, 0, 0 );
var_8 = [];
for ( var_6 = 0; var_6 < var_2.size; var_6++ )
{
if ( isdefined( var_2[var_6] ) )
var_8[var_6] = distance( var_2[var_6].origin, var_7 );
}
for ( var_6 = 0; var_6 < var_8.size; var_6++ )
{
if ( isdefined( var_8[var_6] ) )
{
if ( var_8[var_6] < 3000 && var_0.numflares > 0 )
{
var_0.numflares--;
var_0 thread maps\mp\killstreaks\_flares::flares_playfx();
var_9 = var_0 maps\mp\killstreaks\_flares::flares_deploy();
for ( var_10 = 0; var_10 < var_2.size; var_10++ )
{
if ( isdefined( var_2[var_10] ) )
var_2[var_10] missile_settargetent( var_9 );
}
if ( isdefined( var_0.owner ) )
var_0.owner stoplocalsound( "missile_incoming" );
return;
}
if ( var_8[var_6] < var_5[var_6] )
var_5[var_6] = var_8[var_6];
if ( var_8[var_6] > var_5[var_6] )
{
if ( var_8[var_6] > 1536 )
continue;
if ( isdefined( var_0.owner ) )
{
var_0.owner stoplocalsound( "missile_incoming" );
if ( level.teambased )
{
if ( var_0.team != var_1.team )
radiusdamage( var_2[var_6].origin, var_4, var_3, var_3, var_1, "MOD_EXPLOSIVE", "sam_projectile_mp" );
}
else
radiusdamage( var_2[var_6].origin, var_4, var_3, var_3, var_1, "MOD_EXPLOSIVE", "sam_projectile_mp" );
}
var_2[var_6] hide();
wait 0.05;
var_2[var_6] delete();
}
}
}
wait 0.05;
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,58 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.killstreakfuncs["team_ammo_refill"] = ::tryuseteamammorefill;
}
tryuseteamammorefill( var_0 )
{
var_1 = giveteamammorefill();
if ( var_1 )
maps\mp\_matchdata::logkillstreakevent( "team_ammo_refill", self.origin );
return var_1;
}
giveteamammorefill()
{
if ( level.teambased )
{
foreach ( var_1 in level.players )
{
if ( var_1.team == self.team )
var_1 refillammo( 1 );
}
}
else
refillammo( 1 );
level thread maps\mp\_utility::teamplayercardsplash( "used_team_ammo_refill", self );
return 1;
}
refillammo( var_0 )
{
var_1 = self getweaponslistall();
if ( var_0 )
{
if ( maps\mp\_utility::_hasperk( "specialty_tacticalinsertion" ) && self getammocount( "flare_mp" ) < 1 )
maps\mp\_utility::giveperkoffhand( "specialty_tacticalinsertion", 0 );
}
foreach ( var_3 in var_1 )
{
if ( issubstr( var_3, "grenade" ) || getsubstr( var_3, 0, 2 ) == "gl" )
{
if ( !var_0 || self getammocount( var_3 ) >= 1 )
continue;
}
self givemaxammo( var_3 );
}
self playlocalsound( "ammo_crate_use" );
}

View File

@ -0,0 +1,834 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.radarviewtime = 23;
level.uavblocktime = 23;
level.killstreakfuncs["uav_3dping"] = ::tryuse3dping;
level.uavsettings = [];
level.uavsettings["uav_3dping"] = spawnstruct();
level.uavsettings["uav_3dping"].timeout = 63;
level.uavsettings["uav_3dping"].streakname = "uav_3dping";
level.uavsettings["uav_3dping"].highlightfadetime = 1.5;
level.uavsettings["uav_3dping"].pingtime = 10.0;
level.uavsettings["uav_3dping"].fxid_ping = loadfx( "vfx/gameplay/mp/killstreaks/vfx_3d_world_ping" );
level.uavsettings["uav_3dping"].sound_ping_plr = "oracle_radar_pulse_plr";
level.uavsettings["uav_3dping"].sound_ping_npc = "oracle_radar_pulse_npc";
level.uavsettings["uav_3dping"].votimeout = "oracle_gone";
level.uavsettings["uav_3dping"].teamsplash = "used_uav_3dping";
var_0 = getentarray( "minimap_corner", "targetname" );
if ( var_0.size )
var_1 = maps\mp\gametypes\_spawnlogic::findboxcenter( var_0[0].origin, var_0[1].origin );
else
var_1 = ( 0, 0, 0 );
level.uavrig = spawn( "script_model", var_1 );
level.uavrig.angles = ( 0, 115, 0 );
level.uavrig hide();
level.uavrig.targetname = "uavrig_script_model";
level.uavrig thread rotateuavrig();
if ( level.multiteambased )
{
for ( var_2 = 0; var_2 < level.teamnamelist.size; var_2++ )
{
level.radarmode[level.teamnamelist[var_2]] = "normal_radar";
level.activeuavs[level.teamnamelist[var_2]] = 0;
level.activecounteruavs[level.teamnamelist[var_2]] = 0;
level.uavmodels[level.teamnamelist[var_2]] = [];
}
}
else if ( level.teambased )
{
level.radarmode["allies"] = "normal_radar";
level.radarmode["axis"] = "normal_radar";
level.activeuavs["allies"] = 0;
level.activeuavs["axis"] = 0;
level.activecounteruavs["allies"] = 0;
level.activecounteruavs["axis"] = 0;
level.uavmodels["allies"] = [];
level.uavmodels["axis"] = [];
}
else
{
level.radarmode = [];
level.activeuavs = [];
level.activecounteruavs = [];
level.uavmodels = [];
level thread onplayerconnect();
}
level thread uavtracker();
}
onplayerconnect()
{
for (;;)
{
level waittill( "connected", var_0 );
level.activeuavs[var_0.guid] = 0;
level.activeuavs[var_0.guid + "_radarStrength"] = 0;
level.activecounteruavs[var_0.guid] = 0;
level.radarmode[var_0.guid] = "normal_radar";
}
}
rotateuavrig( var_0, var_1 )
{
if ( isdefined( var_1 ) )
self endon( var_1 );
if ( !isdefined( var_0 ) )
var_0 = 60;
for (;;)
{
self rotateyaw( -360, var_0 );
wait( var_0 );
}
}
tryuseuav( var_0, var_1 )
{
return useuav( var_1 );
}
tryuse3dping( var_0, var_1 )
{
var_2 = "uav_3dping";
thread watch3dping( var_2 );
thread watch3dpingtimeout( var_2 );
level thread maps\mp\_utility::teamplayercardsplash( level.uavsettings[var_2].teamsplash, self );
return 1;
}
useuav( var_0 )
{
maps\mp\_matchdata::logkillstreakevent( var_0, self.origin );
var_1 = self.pers["team"];
var_2 = level.uavsettings[var_0].timeout;
level thread launchuav( self, var_2, var_0 );
switch ( var_0 )
{
case "counter_uav":
self notify( "used_counter_uav" );
break;
case "directional_uav":
self.radarshowenemydirection = 1;
if ( level.teambased )
{
foreach ( var_4 in level.players )
{
if ( var_4.pers["team"] == var_1 )
var_4.radarshowenemydirection = 1;
}
}
level thread maps\mp\_utility::teamplayercardsplash( level.uavsettings[var_0].teamsplash, self, var_1 );
self notify( "used_directional_uav" );
break;
default:
self notify( "used_uav" );
break;
}
return 1;
}
launchuav( var_0, var_1, var_2 )
{
var_3 = var_0.team;
var_4 = spawn( "script_model", level.uavrig gettagorigin( "tag_origin" ) );
var_4 setmodel( level.uavsettings[var_2].modelbase );
var_4.team = var_3;
var_4.owner = var_0;
var_4.timetoadd = 0;
var_4.uavtype = var_2;
var_4.health = level.uavsettings[var_2].health;
var_4.maxhealth = level.uavsettings[var_2].maxhealth;
if ( var_2 == "directional_uav" )
var_4 thread spawnfxdelay( level.uavsettings[var_2].fxid_contrail, level.uavsettings[var_2].fx_contrail_tag );
var_4 adduavmodel();
var_4 thread damagetracker();
var_4 thread handleincomingstinger();
var_4 thread removeuavmodelondeath();
var_5 = randomintrange( 3000, 5000 );
if ( isdefined( level.spawnpoints ) )
var_6 = level.spawnpoints;
else
var_6 = level.startspawnpoints;
var_7 = var_6[0];
foreach ( var_9 in var_6 )
{
if ( var_9.origin[2] < var_7.origin[2] )
var_7 = var_9;
}
var_11 = var_7.origin[2];
var_12 = level.uavrig.origin[2];
if ( var_11 < 0 )
{
var_12 = var_12 + var_11 * -1;
var_11 = 0;
}
var_13 = var_12 - var_11;
if ( var_13 + var_5 > 8100.0 )
var_5 = var_5 - ( var_13 + var_5 - 8100.0 );
var_14 = randomint( 360 );
var_15 = randomint( 2000 ) + 5000;
var_16 = cos( var_14 ) * var_15;
var_17 = sin( var_14 ) * var_15;
var_18 = vectornormalize( ( var_16, var_17, var_5 ) );
var_18 = var_18 * randomintrange( 6000, 7000 );
var_4 linkto( level.uavrig, "tag_origin", var_18, ( 0, var_14 - 90, 0 ) );
var_4 thread updateuavmodelvisibility();
var_4 [[ level.uavsettings[var_2].addfunc ]]();
if ( isdefined( level.activeuavs[var_3] ) )
{
foreach ( var_20 in level.uavmodels[var_3] )
{
if ( var_20 == var_4 )
continue;
var_20.timetoadd = var_20.timetoadd + 5;
}
}
level notify( "uav_update" );
var_4 maps\mp\gametypes\_hostmigration::waittill_notify_or_timeout_hostmigration_pause( "death", var_1 );
if ( var_4.damagetaken < var_4.maxhealth )
{
var_4 unlink();
var_22 = var_4.origin + anglestoforward( var_4.angles ) * 20000;
var_4 moveto( var_22, 60 );
if ( isdefined( level.uavsettings[var_2].fxid_leave ) && isdefined( level.uavsettings[var_2].fx_leave_tag ) )
playfxontag( level.uavsettings[var_2].fxid_leave, var_4, level.uavsettings[var_2].fx_leave_tag );
var_4 maps\mp\gametypes\_hostmigration::waittill_notify_or_timeout_hostmigration_pause( "death", 3 );
if ( var_4.damagetaken < var_4.maxhealth )
{
var_4 notify( "leaving" );
var_4.isleaving = 1;
var_4 moveto( var_22, 4, 4, 0.0 );
}
var_4 maps\mp\gametypes\_hostmigration::waittill_notify_or_timeout_hostmigration_pause( "death", 4 + var_4.timetoadd );
}
var_4 [[ level.uavsettings[var_2].removefunc ]]();
var_4 delete();
var_4 removeuavmodel();
if ( var_2 == "directional_uav" )
{
var_0.radarshowenemydirection = 0;
if ( level.teambased )
{
foreach ( var_24 in level.players )
{
if ( var_24.pers["team"] == var_3 )
var_24.radarshowenemydirection = 0;
}
}
}
level notify( "uav_update" );
}
updateuavmodelvisibility()
{
self endon( "death" );
for (;;)
{
level common_scripts\utility::waittill_either( "joined_team", "uav_update" );
self hide();
foreach ( var_1 in level.players )
{
if ( level.teambased )
{
if ( var_1.team != self.team )
self showtoplayer( var_1 );
continue;
}
if ( isdefined( self.owner ) && var_1 == self.owner )
continue;
self showtoplayer( var_1 );
}
}
}
damagetracker()
{
level endon( "game_ended" );
self setcandamage( 1 );
self.damagetaken = 0;
for (;;)
{
self waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
if ( !isplayer( var_1 ) )
{
if ( !isdefined( self ) )
return;
}
else
{
if ( isdefined( var_8 ) && var_8 & level.idflags_penetration )
self.wasdamagedfrombulletpenetration = 1;
self.wasdamaged = 1;
var_10 = var_0;
if ( isplayer( var_1 ) )
{
var_1 maps\mp\gametypes\_damagefeedback::updatedamagefeedback( "" );
if ( var_4 == "MOD_RIFLE_BULLET" || var_4 == "MOD_PISTOL_BULLET" )
{
if ( var_1 maps\mp\_utility::_hasperk( "specialty_armorpiercing" ) )
var_10 = var_10 + var_0 * level.armorpiercingmod;
}
}
if ( isdefined( var_9 ) )
{
switch ( var_9 )
{
case "javelin_mp":
case "stinger_mp":
self.largeprojectiledamage = 1;
var_10 = self.maxhealth + 1;
break;
case "sam_projectile_mp":
self.largeprojectiledamage = 1;
var_11 = 0.25;
if ( self.uavtype == "directional_uav" )
var_11 = 0.15;
var_10 = self.maxhealth * var_11;
break;
}
maps\mp\killstreaks\_killstreaks::killstreakhit( var_1, var_9, self );
}
self.damagetaken = self.damagetaken + var_10;
if ( self.damagetaken >= self.maxhealth )
{
if ( isplayer( var_1 ) && ( !isdefined( self.owner ) || var_1 != self.owner ) )
{
thread maps\mp\_utility::teamplayercardsplash( level.uavsettings[self.uavtype].calloutdestroyed, var_1 );
thread maps\mp\gametypes\_missions::vehiclekilled( self.owner, self, undefined, var_1, var_0, var_4, var_9 );
var_1 thread maps\mp\gametypes\_rank::giverankxp( "kill", 50, var_9, var_4 );
var_1 notify( "destroyed_killstreak" );
if ( isdefined( self.uavremotemarkedby ) && self.uavremotemarkedby != var_1 )
self.uavremotemarkedby thread maps\mp\killstreaks\_remoteuav::remoteuav_processtaggedassist();
}
self hide();
var_12 = anglestoright( self.angles ) * 200;
playfx( level.uavsettings[self.uavtype].fxid_explode, self.origin, var_12 );
self notify( "death" );
return;
}
}
}
}
uavtracker()
{
level endon( "game_ended" );
for (;;)
{
level waittill( "uav_update" );
if ( level.multiteambased )
{
for ( var_0 = 0; var_0 < level.teamnamelist.size; var_0++ )
updateteamuavstatus( level.teamnamelist[var_0] );
continue;
}
if ( level.teambased )
{
updateteamuavstatus( "allies" );
updateteamuavstatus( "axis" );
continue;
}
updateplayersuavstatus();
}
}
_getradarstrength( var_0 )
{
var_1 = 0;
var_2 = 0;
foreach ( var_4 in level.uavmodels[var_0] )
{
if ( var_4.uavtype == "counter_uav" )
continue;
if ( var_4.uavtype == "remote_mortar" )
continue;
var_1++;
}
if ( level.multiteambased )
{
foreach ( var_7 in level.teamnamelist )
{
foreach ( var_4 in level.uavmodels[var_7] )
{
if ( var_7 == var_0 )
continue;
if ( var_4.uavtype != "counter_uav" )
continue;
var_2++;
}
}
}
else
{
foreach ( var_4 in level.uavmodels[level.otherteam[var_0]] )
{
if ( var_4.uavtype != "counter_uav" )
continue;
var_2++;
}
}
if ( var_2 > 0 )
var_13 = -3;
else
var_13 = var_1;
var_14 = getuavstrengthmin();
var_15 = getuavstrengthmax();
if ( var_13 <= var_14 )
var_13 = var_14;
else if ( var_13 >= var_15 )
var_13 = var_15;
return var_13;
}
updateteamuavstatus( var_0 )
{
var_1 = _getradarstrength( var_0 );
setteamradarstrength( var_0, var_1 );
if ( var_1 >= getuavstrengthlevelneutral() )
unblockteamradar( var_0 );
else
blockteamradar( var_0 );
if ( var_1 <= getuavstrengthlevelneutral() )
{
setteamradarwrapper( var_0, 0 );
updateteamuavtype( var_0 );
return;
}
if ( var_1 >= getuavstrengthlevelshowenemyfastsweep() )
level.radarmode[var_0] = "fast_radar";
else
level.radarmode[var_0] = "normal_radar";
updateteamuavtype( var_0 );
setteamradarwrapper( var_0, 1 );
}
updateplayersuavstatus()
{
var_0 = getuavstrengthmin();
var_1 = getuavstrengthmax();
var_2 = getuavstrengthlevelshowenemydirectional();
foreach ( var_4 in level.players )
{
var_5 = level.activeuavs[var_4.guid + "_radarStrength"];
foreach ( var_7 in level.players )
{
if ( var_7 == var_4 )
continue;
var_8 = level.activecounteruavs[var_7.guid];
if ( var_8 > 0 )
{
var_5 = -3;
break;
}
}
if ( var_5 <= var_0 )
var_5 = var_0;
else if ( var_5 >= var_1 )
var_5 = var_1;
var_4.radarstrength = var_5;
if ( var_5 >= getuavstrengthlevelneutral() )
var_4.isradarblocked = 0;
else
var_4.isradarblocked = 1;
if ( var_5 <= getuavstrengthlevelneutral() )
{
var_4.hasradar = 0;
var_4.radarshowenemydirection = 0;
continue;
}
if ( var_5 >= getuavstrengthlevelshowenemyfastsweep() )
var_4.radarmode = "fast_radar";
else
var_4.radarmode = "normal_radar";
var_4.radarshowenemydirection = var_5 >= var_2;
var_4.hasradar = 1;
}
}
blockplayeruav()
{
self endon( "disconnect" );
self notify( "blockPlayerUAV" );
self endon( "blockPlayerUAV" );
self.isradarblocked = 1;
wait( level.uavblocktime );
self.isradarblocked = 0;
}
updateteamuavtype( var_0 )
{
var_1 = _getradarstrength( var_0 ) >= getuavstrengthlevelshowenemydirectional();
foreach ( var_3 in level.players )
{
if ( var_3.team == "spectator" )
continue;
var_3.radarmode = level.radarmode[var_3.team];
if ( var_3.team == var_0 )
var_3.radarshowenemydirection = var_1;
}
}
useplayeruav( var_0, var_1 )
{
level endon( "game_ended" );
self endon( "disconnect" );
self notify( "usePlayerUAV" );
self endon( "usePlayerUAV" );
if ( var_0 )
self.radarmode = "fast_radar";
else
self.radarmode = "normal_radar";
self.hasradar = 1;
wait( var_1 );
self.hasradar = 0;
}
setteamradarwrapper( var_0, var_1 )
{
setteamradar( var_0, var_1 );
level notify( "radar_status_change", var_0 );
}
handleincomingstinger()
{
level endon( "game_ended" );
self endon( "death" );
for (;;)
{
level waittill( "stinger_fired", var_0, var_1, var_2 );
if ( !isdefined( var_2 ) || var_2 != self )
continue;
var_1 thread stingerproximitydetonate( var_2, var_0 );
}
}
stingerproximitydetonate( var_0, var_1 )
{
self endon( "death" );
var_2 = distance( self.origin, var_0 getpointinbounds( 0, 0, 0 ) );
var_3 = var_0 getpointinbounds( 0, 0, 0 );
for (;;)
{
if ( !isdefined( var_0 ) )
var_4 = var_3;
else
var_4 = var_0 getpointinbounds( 0, 0, 0 );
var_3 = var_4;
var_5 = distance( self.origin, var_4 );
if ( var_5 < var_2 )
var_2 = var_5;
if ( var_5 > var_2 )
{
if ( var_5 > 1536 )
return;
radiusdamage( self.origin, 1536, 600, 600, var_1, "MOD_EXPLOSIVE", "stinger_mp" );
playfx( level.stingerfxid, self.origin );
self hide();
self notify( "deleted" );
wait 0.05;
self delete();
var_1 notify( "killstreak_destroyed" );
}
wait 0.05;
}
}
adduavmodel()
{
if ( level.teambased )
level.uavmodels[self.team][level.uavmodels[self.team].size] = self;
else
level.uavmodels[self.owner.guid + "_" + gettime()] = self;
}
removeuavmodelondeath()
{
self waittill( "death" );
if ( isdefined( self.uavrig ) )
self.uavrig delete();
if ( isdefined( self ) )
self delete();
removeuavmodel();
}
removeuavmodel()
{
var_0 = [];
if ( level.teambased )
{
var_1 = self.team;
foreach ( var_3 in level.uavmodels[var_1] )
{
if ( !isdefined( var_3 ) )
continue;
var_0[var_0.size] = var_3;
}
level.uavmodels[var_1] = var_0;
}
else
{
foreach ( var_3 in level.uavmodels )
{
if ( !isdefined( var_3 ) )
continue;
var_0[var_0.size] = var_3;
}
level.uavmodels = var_0;
}
}
addactiveuav()
{
if ( level.teambased )
level.activeuavs[self.team]++;
else
{
level.activeuavs[self.owner.guid]++;
level.activeuavs[self.owner.guid + "_radarStrength"]++;
}
}
addactivecounteruav()
{
if ( level.teambased )
level.activecounteruavs[self.team]++;
else
level.activecounteruavs[self.owner.guid]++;
}
removeactiveuav()
{
if ( level.teambased )
level.activeuavs[self.team]--;
else if ( isdefined( self.owner ) )
{
level.activeuavs[self.owner.guid]--;
level.activeuavs[self.owner.guid + "_radarStrength"]--;
}
}
removeactivecounteruav()
{
if ( level.teambased )
level.activecounteruavs[self.team]--;
else if ( isdefined( self.owner ) )
level.activecounteruavs[self.owner.guid]--;
}
spawnfxdelay( var_0, var_1 )
{
self endon( "death" );
level endon( "game_ended" );
wait 0.5;
playfxontag( var_0, self, var_1 );
}
watch3dping( var_0, var_1 )
{
if ( isdefined( var_1 ) )
var_1 endon( "death" );
self endon( "leave" );
self endon( "killstreak_disowned" );
level endon( "game_ended" );
var_2 = level.uavsettings[var_0];
var_3 = var_2.pingtime;
if ( level.teambased )
level.activeuavs[self.team]++;
else
level.activeuavs[self.guid]++;
for (;;)
{
playfx( var_2.fxid_ping, self.origin );
self playlocalsound( var_2.sound_ping_plr );
playsoundatpos( self.origin + ( 0, 0, 5 ), var_2.sound_ping_npc );
foreach ( var_5 in level.participants )
{
if ( !maps\mp\_utility::isreallyalive( var_5 ) )
continue;
if ( !maps\mp\_utility::isenemy( var_5 ) )
continue;
if ( var_5 maps\mp\_utility::_hasperk( "specialty_noplayertarget" ) )
continue;
var_5 maps\mp\gametypes\_damagefeedback::hudicontype( "oracle" );
foreach ( var_7 in level.participants )
{
if ( !maps\mp\_utility::isreallyalive( var_7 ) )
continue;
if ( maps\mp\_utility::isenemy( var_7 ) )
continue;
if ( isai( var_7 ) )
{
var_7 common_scripts\utility::ai_3d_sighting_model( var_5 );
continue;
}
var_8 = maps\mp\_utility::outlineenableforplayer( var_5, "orange", var_7, 0, "killstreak" );
var_9 = var_2.highlightfadetime;
var_7 thread watchhighlightfadetime( var_8, var_5, var_9, var_1 );
}
}
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( var_3 );
}
}
watch3dpingtimeout( var_0 )
{
self endon( "killstreak_disowned" );
level endon( "game_ended" );
var_1 = level.uavsettings[var_0];
var_2 = var_1.timeout;
var_3 = self.guid;
if ( level.teambased )
var_3 = self.team;
thread watch_3dping_killstreakdisowned( var_3 );
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( var_2 );
maps\mp\_utility::leaderdialogonplayer( var_1.votimeout );
self notify( "leave" );
cleanup3dping( var_3 );
}
watch_3dping_killstreakdisowned( var_0 )
{
self endon( "leave" );
self waittill( "killstreak_disowned" );
cleanup3dping( var_0 );
}
cleanup3dping( var_0 )
{
level.activeuavs[var_0]--;
if ( level.activeuavs[var_0] < 0 )
level.activeuavs[var_0] = 0;
}
watchhighlightfadetime( var_0, var_1, var_2, var_3 )
{
if ( isdefined( var_3 ) )
var_3 endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
common_scripts\utility::waittill_any_timeout_no_endon_death( var_2, "leave" );
if ( isdefined( var_1 ) )
maps\mp\_utility::outlinedisable( var_0, var_1 );
}

View File

@ -0,0 +1,420 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.uplinks = [];
level.killstreakfuncs["uplink"] = ::tryuseuplink;
level.killstreakfuncs["uplink_support"] = ::tryuseuplink;
level.comexpfuncs = [];
level.comexpfuncs["giveComExpBenefits"] = ::givecomexpbenefits;
level.comexpfuncs["removeComExpBenefits"] = ::removecomexpbenefits;
level.comexpfuncs["getRadarStrengthForTeam"] = ::getradarstrengthforteam;
level.comexpfuncs["getRadarStrengthForPlayer"] = ::getradarstrengthforplayer;
unblockteamradar( "axis" );
unblockteamradar( "allies" );
level thread uplinktracker();
level thread uplinkupdateeyeson();
var_0 = spawnstruct();
var_0.streakname = "uplink";
var_0.weaponinfo = "ims_projectile_mp";
var_0.modelbase = "mp_satcom";
var_0.modelplacement = "mp_satcom_obj";
var_0.modelplacementfailed = "mp_satcom_obj_red";
var_0.modelbombsquad = "mp_satcom_bombsquad";
var_0.hintstring = &"KILLSTREAKS_HINTS_UPLINK_PICKUP";
var_0.placestring = &"KILLSTREAKS_HINTS_UPLINK_PLACE";
var_0.cannotplacestring = &"KILLSTREAKS_HINTS_UPLINK_CANNOT_PLACE";
var_0.headiconheight = 42;
var_0.splashname = "used_uplink";
var_0.lifespan = 30;
var_0.maxhealth = 500;
var_0.allowmeleedamage = 1;
var_0.allowempdamage = 1;
var_0.damagefeedback = "trophy";
var_0.xppopup = "destroyed_uplink";
var_0.destroyedvo = "satcom_destroyed";
var_0.placementheighttolerance = 30.0;
var_0.placementradius = 16.0;
var_0.placementoffsetz = 16;
var_0.onplaceddelegate = ::onplaced;
var_0.oncarrieddelegate = ::oncarried;
var_0.placedsfx = "mp_killstreak_satcom_deploy";
var_0.activesfx = "mp_killstreak_satcom_loop";
var_0.onmovingplatformcollision = ::uplink_override_moving_platform_death;
var_0.ondeathdelegate = ::ondeath;
var_0.ondestroyeddelegate = ::ondestroyed;
var_0.deathvfx = loadfx( "vfx/gameplay/mp/killstreaks/vfx_ballistic_vest_death" );
level.placeableconfigs["uplink"] = var_0;
level.placeableconfigs["uplink_support"] = var_0;
}
uplinktracker()
{
level endon( "game_ended" );
for (;;)
{
level waittill( "update_uplink" );
level childthread updatealluplinkthreads();
}
}
updatealluplinkthreads()
{
self notify( "updateAllUplinkThreads" );
self endon( "updateAllUplinkThreads" );
level childthread comexpnotifywatcher();
if ( level.teambased )
{
level childthread updateteamuplink( "axis" );
level childthread updateteamuplink( "allies" );
}
else
level childthread updateplayeruplink();
level childthread updatecomexpuplink();
}
comexpnotifywatcher()
{
var_0 = [];
if ( !level.teambased )
level waittill( "radar_status_change_players" );
else
{
while ( var_0.size < 2 )
{
level waittill( "radar_status_change", var_1 );
var_0[var_0.size] = var_1;
}
}
level notify( "start_com_exp" );
}
updateteamuplink( var_0 )
{
var_1 = getradarstrengthforteam( var_0 );
var_2 = var_1 == 1;
var_3 = var_1 >= 2;
var_4 = var_1 >= 3;
var_5 = var_1 >= 4;
if ( var_3 )
unblockteamradar( var_0 );
if ( var_4 )
level.radarmode[var_0] = "fast_radar";
else
level.radarmode[var_0] = "normal_radar";
foreach ( var_7 in level.participants )
{
if ( !isdefined( var_7 ) )
continue;
if ( var_7.team != var_0 )
continue;
var_7.shouldbeeyeson = var_2;
var_7 seteyesonuplinkenabled( var_2 );
var_7.radarmode = level.radarmode[var_7.team];
var_7.radarshowenemydirection = var_5;
var_7 updatesatcomactiveomnvar( var_0 );
wait 0.05;
}
setteamradar( var_0, var_3 );
level notify( "radar_status_change", var_0 );
}
updateplayeruplink()
{
foreach ( var_1 in level.participants )
{
if ( !isdefined( var_1 ) )
continue;
var_2 = getradarstrengthforplayer( var_1 );
setplayerradareffect( var_1, var_2 );
var_1 updatesatcomactiveomnvar();
wait 0.05;
}
level notify( "radar_status_change_players" );
}
updatecomexpuplink()
{
level waittill( "start_com_exp" );
foreach ( var_1 in level.participants )
{
if ( !isdefined( var_1 ) )
continue;
var_1 givecomexpbenefits();
wait 0.05;
}
}
givecomexpbenefits()
{
if ( maps\mp\_utility::_hasperk( "specialty_comexp" ) )
{
var_0 = getradarstrengthforcomexp( self );
setplayerradareffect( self, var_0 );
updatesatcomactiveomnvar();
}
}
updatesatcomactiveomnvar( var_0 )
{
var_1 = 0;
if ( isdefined( var_0 ) )
var_1 = getradarstrengthforteam( var_0 );
else
var_1 = getradarstrengthforplayer( self );
if ( maps\mp\_utility::_hasperk( "specialty_comexp" ) )
var_1 = getradarstrengthforcomexp( self );
if ( var_1 > 0 )
self setclientomnvar( "ui_satcom_active", 1 );
else
self setclientomnvar( "ui_satcom_active", 0 );
}
removecomexpbenefits()
{
self.shouldbeeyeson = 0;
self seteyesonuplinkenabled( 0 );
self.radarshowenemydirection = 0;
self.radarmode = "normal_radar";
self.hasradar = 0;
self.isradarblocked = 0;
}
setplayerradareffect( var_0, var_1 )
{
var_2 = var_1 == 1;
var_3 = var_1 >= 2;
var_4 = var_1 >= 3;
var_5 = var_1 >= 4;
var_0.shouldbeeyeson = var_2;
var_0 seteyesonuplinkenabled( var_2 );
var_0.radarshowenemydirection = var_5;
var_0.radarmode = "normal_radar";
var_0.hasradar = var_3;
var_0.isradarblocked = 0;
if ( var_4 )
var_0.radarmode = "fast_radar";
}
tryuseuplink( var_0, var_1 )
{
var_2 = maps\mp\killstreaks\_placeable::giveplaceable( var_1 );
if ( var_2 )
maps\mp\_matchdata::logkillstreakevent( "uplink", self.origin );
self.iscarrying = undefined;
return var_2;
}
oncarried( var_0 )
{
var_1 = self getentitynumber();
if ( isdefined( level.uplinks[var_1] ) )
stopuplink();
}
onplaced( var_0 )
{
var_1 = level.placeableconfigs[var_0];
self.owner notify( "uplink_deployed" );
self setmodel( var_1.modelbase );
self.immediatedeath = 0;
self setotherent( self.owner );
common_scripts\utility::make_entity_sentient_mp( self.owner.team, 1 );
self.config = var_1;
startuplink( 1 );
thread watchempdamage();
}
startuplink( var_0 )
{
adduplinktolevellist( self );
thread playuplinkanimations( var_0 );
self playloopsound( self.config.activesfx );
}
stopuplink()
{
maps\mp\gametypes\_weapons::stopblinkinglight();
self scriptmodelclearanim();
if ( isdefined( self.bombsquadmodel ) )
self.bombsquadmodel scriptmodelclearanim();
removeuplinkfromlevellist( self );
self stoploopsound();
}
#using_animtree("animated_props");
playuplinkanimations( var_0 )
{
self endon( "emp_damage" );
self endon( "death" );
self endon( "carried" );
if ( var_0 )
{
var_1 = getnotetracktimes( %satcom_killstreak, "stop anim" );
var_2 = getanimlength( %satcom_killstreak );
self scriptmodelplayanim( "Satcom_killStreak" );
if ( isdefined( self.bombsquadmodel ) )
self.bombsquadmodel scriptmodelplayanim( "Satcom_killStreak" );
wait( var_1[0] * var_2 );
}
self scriptmodelplayanim( "Satcom_killStreak_idle" );
if ( isdefined( self.bombsquadmodel ) )
self.bombsquadmodel scriptmodelplayanim( "Satcom_killStreak_idle" );
thread maps\mp\gametypes\_weapons::doblinkinglight( "tag_fx" );
}
ondestroyed( var_0, var_1, var_2, var_3 )
{
var_1 notify( "destroyed_equipment" );
}
ondeath( var_0, var_1, var_2, var_3 )
{
maps\mp\gametypes\_weapons::stopblinkinglight();
maps\mp\gametypes\_weapons::equipmentdeathvfx();
removeuplinkfromlevellist( self );
self scriptmodelclearanim();
if ( !self.immediatedeath )
wait 3.0;
maps\mp\gametypes\_weapons::equipmentdeletevfx();
}
adduplinktolevellist( var_0 )
{
var_1 = var_0 getentitynumber();
level.uplinks[var_1] = var_0;
level notify( "update_uplink" );
}
removeuplinkfromlevellist( var_0 )
{
var_1 = var_0 getentitynumber();
level.uplinks[var_1] = undefined;
level notify( "update_uplink" );
}
getradarstrengthforteam( var_0 )
{
var_1 = 0;
foreach ( var_3 in level.uplinks )
{
if ( isdefined( var_3 ) && var_3.team == var_0 )
var_1++;
}
if ( var_1 == 0 && isdefined( level.helisnipereyeson ) && level.helisnipereyeson.team == var_0 )
var_1++;
return clamp( var_1, 0, 4 );
}
getradarstrengthforplayer( var_0 )
{
var_1 = 0;
foreach ( var_3 in level.uplinks )
{
if ( isdefined( var_3 ) )
{
if ( isdefined( var_3.owner ) )
{
if ( var_3.owner.guid == var_0.guid )
var_1++;
continue;
}
var_4 = var_3 getentitynumber();
level.uplinks[var_4] = undefined;
}
}
if ( !level.teambased && var_1 > 0 )
var_1++;
return clamp( var_1, 0, 4 );
}
getradarstrengthforcomexp( var_0 )
{
var_1 = 0;
foreach ( var_3 in level.uplinks )
{
if ( isdefined( var_3 ) )
var_1++;
}
if ( !level.teambased && var_1 > 0 )
var_1++;
return clamp( var_1, 0, 4 );
}
uplink_override_moving_platform_death( var_0 )
{
self.immediatedeath = 1;
self notify( "death" );
}
watchempdamage()
{
self endon( "death" );
level endon( "game_ended" );
for (;;)
{
self waittill( "emp_damage", var_0, var_1 );
maps\mp\gametypes\_weapons::equipmentempstunvfx();
stopuplink();
wait( var_1 );
startuplink( 0 );
}
}
uplinkupdateeyeson()
{
level endon( "game_ended" );
for (;;)
{
level waittill( "player_spawned", var_0 );
var_1 = isdefined( var_0.shouldbeeyeson ) && var_0.shouldbeeyeson;
var_0 seteyesonuplinkenabled( var_1 );
}
}

View File

@ -0,0 +1,944 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
setupfx();
setuphelirange();
level.remote_uav = [];
level.killstreakfuncs["vanguard"] = ::tryusevanguard;
level.vanguard_lastdialogtime = 0;
level.vanguardfiremisslefunc = ::vanguard_firemissile;
level.lasedstrikeglow = loadfx( "fx/misc/laser_glow" );
}
setupfx()
{
level.vanguard_fx["hit"] = loadfx( "fx/impacts/large_metal_painted_hit" );
level.vanguard_fx["smoke"] = loadfx( "fx/smoke/remote_heli_damage_smoke_runner" );
level.vanguard_fx["explode"] = loadfx( "vfx/gameplay/explosions/vehicle/vang/vfx_exp_vanguard" );
level.vanguard_fx["target_marker_circle"] = loadfx( "vfx/gameplay/mp/core/vfx_marker_gryphon_orange" );
}
setuphelirange()
{
level.vanguardrangetriggers = getentarray( "remote_heli_range", "targetname" );
level.vanguardmaxheightent = getent( "airstrikeheight", "targetname" );
if ( isdefined( level.vanguardmaxheightent ) )
{
level.vanguardmaxheight = level.vanguardmaxheightent.origin[2];
level.vanguradmaxdistancesq = 163840000;
}
level.is_mp_descent = 0;
if ( maps\mp\_utility::getmapname() == "mp_descent" || maps\mp\_utility::getmapname() == "mp_descent_new" )
{
level.vanguardmaxheight = level.vanguardrangetriggers[0].origin[2] + 360;
level.is_mp_descent = 1;
}
}
tryusevanguard( var_0, var_1 )
{
return usevanguard( var_0, var_1 );
}
usevanguard( var_0, var_1 )
{
if ( maps\mp\_utility::isusingremote() || self isusingturret() )
return 0;
if ( isdefined( self.underwater ) && self.underwater )
return 0;
if ( exceededmaxvanguards( self.team ) || level.littlebirds.size >= 4 )
{
self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
return 0;
}
else if ( maps\mp\_utility::currentactivevehiclecount() >= maps\mp\_utility::maxvehiclesallowed() || level.fauxvehiclecount + 1 >= maps\mp\_utility::maxvehiclesallowed() )
{
self iprintlnbold( &"KILLSTREAKS_TOO_MANY_VEHICLES" );
return 0;
}
else if ( isdefined( self.drones_disabled ) )
{
self iprintlnbold( &"KILLSTREAKS_UNAVAILABLE" );
return 0;
}
maps\mp\_utility::incrementfauxvehiclecount();
var_2 = givecarryvanguard( var_0, var_1 );
if ( !isdefined( var_2 ) )
{
maps\mp\_utility::decrementfauxvehiclecount();
return 0;
}
if ( !maps\mp\_utility::is_aliens() )
maps\mp\_matchdata::logkillstreakevent( var_1, self.origin );
return startvanguard( var_2, var_1, var_0 );
}
exceededmaxvanguards( var_0 )
{
if ( level.teambased )
return isdefined( level.remote_uav[var_0] );
else
return isdefined( level.remote_uav[var_0] ) || isdefined( level.remote_uav[level.otherteam[var_0]] );
}
findvalidvanguardspawnpoint( var_0, var_1 )
{
var_2 = anglestoforward( self.angles );
var_3 = anglestoright( self.angles );
var_4 = self geteye();
var_5 = var_4 + ( 0, 0, var_1 );
var_6 = var_5 + var_0 * var_2;
if ( checkvanguardspawnpoint( var_4, var_6 ) )
return var_6;
var_6 = var_5 - var_0 * var_2;
if ( checkvanguardspawnpoint( var_4, var_6 ) )
return var_6;
var_6 = var_6 + var_0 * var_3;
if ( checkvanguardspawnpoint( var_4, var_6 ) )
return var_6;
var_6 = var_5 - var_0 * var_3;
if ( checkvanguardspawnpoint( var_4, var_6 ) )
return var_6;
var_6 = var_5;
if ( checkvanguardspawnpoint( var_4, var_6 ) )
return var_6;
common_scripts\utility::waitframe();
var_6 = var_5 + 0.707 * var_0 * ( var_2 + var_3 );
if ( checkvanguardspawnpoint( var_4, var_6 ) )
return var_6;
var_6 = var_5 + 0.707 * var_0 * ( var_2 - var_3 );
if ( checkvanguardspawnpoint( var_4, var_6 ) )
return var_6;
var_6 = var_5 + 0.707 * var_0 * ( var_3 - var_2 );
if ( checkvanguardspawnpoint( var_4, var_6 ) )
return var_6;
var_6 = var_5 + 0.707 * var_0 * ( -1 * var_2 - var_3 );
if ( checkvanguardspawnpoint( var_4, var_6 ) )
return var_6;
return undefined;
}
checkvanguardspawnpoint( var_0, var_1 )
{
var_2 = 0;
if ( capsuletracepassed( var_1, 20, 40.01, undefined, 1, 1 ) )
var_2 = bullettracepassed( var_0, var_1, 0, undefined );
return var_2;
}
givecarryvanguard( var_0, var_1, var_2 )
{
var_3 = maps\mp\gametypes\_spawnscoring::finddronepathnode( self, 90, 20, 192 );
if ( !isdefined( var_3 ) )
{
var_3 = maps\mp\gametypes\_spawnscoring::finddronepathnode( self, 0, 20, 192 );
if ( !isdefined( var_3 ) )
{
var_3 = findvalidvanguardspawnpoint( 80, 35 );
if ( !isdefined( var_3 ) )
var_3 = findvalidvanguardspawnpoint( 80, 0 );
}
}
if ( isdefined( var_3 ) )
{
var_4 = self.angles;
var_5 = createvanguard( var_0, self, var_1, var_3, var_4, var_2 );
if ( !isdefined( var_5 ) )
self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
return var_5;
}
else
{
self iprintlnbold( &"KILLSTREAKS_VANGUARD_NO_SPAWN_POINT" );
return undefined;
}
}
startvanguard( var_0, var_1, var_2 )
{
maps\mp\_utility::setusingremote( var_1 );
maps\mp\_utility::freezecontrolswrapper( 1 );
self.restoreangles = self.angles;
if ( getdvarint( "camera_thirdPerson" ) )
maps\mp\_utility::setthirdpersondof( 0 );
thread watchintrocleared( var_0 );
var_3 = maps\mp\killstreaks\_killstreaks::initridekillstreak( "vanguard" );
if ( var_3 != "success" )
{
var_0 notify( "death" );
return 0;
}
else if ( !isdefined( var_0 ) )
return 0;
maps\mp\_utility::freezecontrolswrapper( 0 );
var_0.playerlinked = 1;
self cameralinkto( var_0, "tag_origin" );
self remotecontrolvehicle( var_0 );
var_0.ammocount = 100;
self.remote_uav_ridelifeid = var_2;
self.remoteuav = var_0;
thread maps\mp\_utility::teamplayercardsplash( "used_vanguard", self );
return 1;
}
vanguard_moving_platform_death( var_0 )
{
if ( !isdefined( var_0.lasttouchedplatform.destroydroneoncollision ) || var_0.lasttouchedplatform.destroydroneoncollision || !isdefined( self.spawngraceperiod ) || gettime() > self.spawngraceperiod )
thread handledeathdamage( undefined, undefined, undefined, undefined );
else
{
wait 1.0;
thread maps\mp\_movers::handle_moving_platform_touch( var_0 );
}
}
createvanguard( var_0, var_1, var_2, var_3, var_4, var_5 )
{
var_6 = spawnhelicopter( var_1, var_3, var_4, "remote_uav_mp", "vehicle_drone_vanguard" );
if ( !isdefined( var_6 ) )
return undefined;
var_6 maps\mp\killstreaks\_helicopter::addtolittlebirdlist();
var_6 thread maps\mp\killstreaks\_helicopter::removefromlittlebirdlistondeath();
var_6 makevehiclesolidcapsule( 20, -5, 10 );
var_6.attackarrow = spawn( "script_model", ( 0, 0, 0 ) );
var_6.attackarrow setmodel( "tag_origin" );
var_6.attackarrow.angles = ( -90, 0, 0 );
var_6.attackarrow.offset = 4;
var_7 = spawnturret( "misc_turret", var_6.origin, "ball_drone_gun_mp", 0 );
var_7 linkto( var_6, "tag_turret_attach", ( 0, 0, 0 ), ( 0, 0, 0 ) );
var_7 setmodel( "vehicle_drone_vanguard_gun" );
var_7 maketurretinoperable();
var_6.turret = var_7;
var_7 makeunusable();
var_6.lifeid = var_0;
var_6.team = var_1.team;
var_6.pers["team"] = var_1.team;
var_6.owner = var_1;
var_6 common_scripts\utility::make_entity_sentient_mp( var_1.team );
if ( issentient( var_6 ) )
var_6 setthreatbiasgroup( "DogsDontAttack" );
var_6.health = 999999;
var_6.maxhealth = 750;
var_6.damagetaken = 0;
var_6.smoking = 0;
var_6.inheliproximity = 0;
var_6.helitype = "remote_uav";
var_7.owner = var_1;
var_7 setentityowner( var_6 );
var_7 thread maps\mp\gametypes\_weapons::doblinkinglight( "tag_fx1" );
var_7.parent = var_6;
var_7.health = 999999;
var_7.maxhealth = 250;
var_7.damagetaken = 0;
level thread vanguard_monitorkillstreakdisowned( var_6 );
level thread vanguard_monitortimeout( var_6, var_5 );
level thread vanguard_monitordeath( var_6 );
level thread vanguard_monitorobjectivecam( var_6 );
var_6 thread vanguard_watch_distance();
var_6 thread vanguard_watchheliproximity();
var_6 thread vanguard_handledamage();
var_6.turret thread vanguard_turret_handledamage();
var_6 thread watchempdamage();
var_8 = spawn( "script_model", var_6.origin );
var_8 setscriptmoverkillcam( "explosive" );
var_8 linkto( var_6, "tag_player", ( -10, 0, 20 ), ( 0, 0, 0 ) );
var_6.killcament = var_8;
var_6.spawngraceperiod = gettime() + 2000;
var_9 = spawnstruct();
var_9.validateaccuratetouching = 1;
var_9.deathoverridecallback = ::vanguard_moving_platform_death;
var_6 thread maps\mp\_movers::handle_moving_platforms( var_9 );
level.remote_uav[var_6.team] = var_6;
return var_6;
}
watchhostmigrationfinishedinit( var_0 )
{
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "joined_spectators" );
level endon( "game_ended" );
var_0 endon( "death" );
for (;;)
{
level waittill( "host_migration_end" );
initvanguardhud();
var_0 thread vanguard_reticlestart();
}
}
watchintrocleared( var_0 )
{
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "joined_spectators" );
level endon( "game_ended" );
var_0 endon( "death" );
self waittill( "intro_cleared" );
initvanguardhud();
var_0 enableaimassist();
thread vanguard_think( var_0 );
thread vanguard_monitorfire( var_0 );
thread vanguard_monitormanualplayerexit( var_0 );
thread vanguard_turrettarget( var_0 );
var_0 thread vanguard_reticlestart();
if ( !level.hardcoremode )
var_0 thread vanguard_reticlewaitforjoinedteam();
thread watchhostmigrationfinishedinit( var_0 );
maps\mp\_utility::freezecontrolswrapper( 0 );
}
initvanguardhud()
{
self thermalvisionfofoverlayon();
self thermalvisionon();
self setclientomnvar( "ui_vanguard", 1 );
}
vanguard_monitormanualplayerexit( var_0 )
{
level endon( "game_ended" );
self endon( "disconnect" );
var_0 endon( "death" );
var_0 endon( "end_remote" );
var_0 thread maps\mp\killstreaks\_killstreaks::allowridekillstreakplayerexit();
var_0 waittill( "killstreakExit" );
if ( isdefined( var_0.owner ) )
var_0.owner maps\mp\_utility::leaderdialogonplayer( "gryphon_gone" );
var_0 notify( "death" );
}
vanguard_turrettarget( var_0 )
{
level endon( "game_ended" );
self endon( "disconnect" );
var_0 endon( "death" );
var_0 endon( "end_remote" );
while ( !isdefined( var_0.attackarrow ) )
wait 0.05;
var_0 setotherent( var_0.attackarrow );
var_0 setturrettargetent( var_0.attackarrow );
}
vanguard_think( var_0 )
{
level endon( "game_ended" );
self endon( "disconnect" );
var_0 endon( "death" );
var_0 endon( "end_remote" );
for (;;)
{
if ( var_0 maps\mp\_utility::touchingbadtrigger( "gryphon" ) )
var_0 notify( "damage", 1019, self, self.angles, self.origin, "MOD_EXPLOSIVE", undefined, undefined, undefined, undefined, "c4_mp" );
self.lockedlocation = var_0.attackarrow.origin;
common_scripts\utility::waitframe();
}
}
vanguard_reticlestart()
{
playfxontagforclients( level.vanguard_fx["target_marker_circle"], self.attackarrow, "tag_origin", self.owner );
thread vanguard_showreticletoenemies();
}
vanguard_reticlewaitforjoinedteam()
{
self endon( "death" );
self endon( "end_remote" );
for (;;)
{
level waittill( "joined_team", var_0 );
stopfxontag( level.vanguard_fx["target_marker_circle"], self.attackarrow, "tag_origin" );
common_scripts\utility::waitframe();
vanguard_reticlestart();
}
}
vanguard_showreticletoenemies()
{
self endon( "death" );
self endon( "end_remote" );
if ( !level.hardcoremode )
{
foreach ( var_1 in level.players )
{
if ( self.owner maps\mp\_utility::isenemy( var_1 ) )
{
common_scripts\utility::waitframe();
playfxontagforclients( level.vanguard_fx["target_marker_circle"], self.attackarrow, "tag_origin", var_1 );
}
}
}
}
vanguard_selecttarget( var_0 )
{
var_1 = gettargetpoint( var_0.owner, var_0 );
if ( isdefined( var_1 ) )
{
var_0.attackarrow.origin = var_1[0] + ( 0, 0, 4 );
return var_1[0];
}
return undefined;
}
gettargetpoint( var_0, var_1 )
{
var_2 = var_1.turret gettagorigin( "tag_flash" );
var_3 = var_0 getplayerangles();
var_4 = anglestoforward( var_3 );
var_5 = var_2 + var_4 * 15000;
var_6 = bullettrace( var_2, var_5, 0, var_1 );
if ( var_6["surfacetype"] == "none" )
return undefined;
if ( var_6["surfacetype"] == "default" )
return undefined;
var_7 = var_6["entity"];
var_8 = [];
var_8[0] = var_6["position"];
var_8[1] = var_6["normal"];
return var_8;
}
vanguard_monitorfire( var_0 )
{
self endon( "disconnect" );
level endon( "game_ended" );
var_0 endon( "death" );
var_0 endon( "end_remote" );
self notifyonplayercommand( "vanguard_fire", "+attack" );
self notifyonplayercommand( "vanguard_fire", "+attack_akimbo_accessible" );
var_0.firereadytime = gettime();
for (;;)
{
self waittill( "vanguard_fire" );
maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
if ( isdefined( level.hostmigrationtimer ) )
continue;
if ( isdefined( self.lockedlocation ) && gettime() >= var_0.firereadytime )
self thread [[ level.vanguardfiremisslefunc ]]( var_0, self.lockedlocation );
}
}
vanguard_rumble( var_0, var_1, var_2 )
{
self endon( "disconnect" );
level endon( "game_ended" );
var_0 endon( "death" );
var_0 endon( "end_remote" );
var_0 notify( "end_rumble" );
var_0 endon( "end_rumble" );
for ( var_3 = 0; var_3 < var_2; var_3++ )
{
self playrumbleonentity( var_1 );
common_scripts\utility::waitframe();
}
}
looptriggeredeffect( var_0, var_1 )
{
var_1 endon( "death" );
level endon( "game_ended" );
self endon( "death" );
for (;;)
{
triggerfx( var_0 );
wait 0.25;
}
}
vanguard_firemissile( var_0, var_1 )
{
level endon( "game_ended" );
if ( var_0.ammocount <= 0 )
return;
var_2 = var_0.turret gettagorigin( "tag_fire" );
var_2 = var_2 + ( 0, 0, -25 );
if ( distancesquared( var_2, var_1 ) < 10000 )
{
var_0 playsoundtoplayer( "weap_vanguard_fire_deny", self );
return;
}
var_0.ammocount--;
self playlocalsound( "weap_gryphon_fire_plr" );
maps\mp\_utility::playsoundinspace( "weap_gryphon_fire_npc", var_0.origin );
thread vanguard_rumble( var_0, "shotgun_fire", 1 );
earthquake( 0.3, 0.25, var_0.origin, 60 );
var_3 = magicbullet( "remote_tank_projectile_mp", var_2, var_1, self );
var_3.vehicle_fired_from = var_0;
var_4 = 1500;
var_0.firereadytime = gettime() + var_4;
thread updateweaponui( var_0, var_4 * 0.001 );
var_3 maps\mp\gametypes\_hostmigration::waittill_notify_or_timeout_hostmigration_pause( "death", 4 );
earthquake( 0.3, 0.75, var_1, 128 );
if ( isdefined( var_0 ) )
{
earthquake( 0.25, 0.75, var_0.origin, 60 );
thread vanguard_rumble( var_0, "damage_heavy", 3 );
if ( var_0.ammocount == 0 )
{
wait 0.75;
var_0 notify( "death" );
}
}
}
updateweaponui( var_0, var_1 )
{
level endon( "game_ended" );
self endon( "disconnect" );
var_0 endon( "death" );
var_0 endon( "end_remote" );
self setclientomnvar( "ui_vanguard_ammo", -1 );
wait( var_1 );
self setclientomnvar( "ui_vanguard_ammo", var_0.ammocount );
}
getstartposition( var_0, var_1 )
{
var_2 = ( 3000, 3000, 3000 );
var_3 = vectornormalize( var_0.origin - ( var_1 + ( 0, 0, -400 ) ) );
var_4 = rotatevector( var_3, ( 0, 25, 0 ) );
var_5 = var_1 + var_4 * var_2;
if ( isvalidstartpoint( var_5, var_1 ) )
return var_5;
var_4 = rotatevector( var_3, ( 0, -25, 0 ) );
var_5 = var_1 + var_4 * var_2;
if ( isvalidstartpoint( var_5, var_1 ) )
return var_5;
var_5 = var_1 + var_3 * var_2;
if ( isvalidstartpoint( var_5, var_1 ) )
return var_5;
return var_1 + ( 0, 0, 3000 );
}
isvalidstartpoint( var_0, var_1 )
{
var_2 = bullettrace( var_0, var_1, 0 );
if ( var_2["fraction"] > 0.99 )
return 1;
return 0;
}
vanguard_watch_distance()
{
self endon( "death" );
var_0 = self.origin;
self.rangecountdownactive = 0;
for (;;)
{
if ( !isdefined( self ) )
return;
if ( !isdefined( self.owner ) )
return;
if ( !vanguard_in_range() )
{
while ( !vanguard_in_range() )
{
if ( !isdefined( self ) )
return;
if ( !isdefined( self.owner ) )
return;
if ( !self.rangecountdownactive )
{
self.rangecountdownactive = 1;
thread vanguard_rangecountdown();
}
if ( isdefined( self.heliinproximity ) )
var_1 = distance( self.origin, self.heliinproximity.origin );
else if ( isdefined( level.disablevanguardsinair ) )
var_1 = 467.5;
else
var_1 = distance( self.origin, var_0 );
var_2 = getsignalstrengthalpha( var_1 );
self.owner setclientomnvar( "ui_vanguard", var_2 );
wait 0.1;
}
self notify( "in_range" );
self.rangecountdownactive = 0;
self.owner setclientomnvar( "ui_vanguard", 1 );
}
var_3 = int( angleclamp( self.angles[1] ) );
self.owner setclientomnvar( "ui_vanguard_heading", var_3 );
var_4 = self.origin[2] * 0.0254;
var_4 = int( clamp( var_4, -250, 250 ) );
self.owner setclientomnvar( "ui_vanguard_altitude", var_4 );
var_5 = distance2d( self.origin, self.attackarrow.origin ) * 0.0254;
var_5 = int( clamp( var_5, 0, 256 ) );
self.owner setclientomnvar( "ui_vanguard_range", var_5 );
var_0 = self.origin;
wait 0.1;
}
}
getsignalstrengthalpha( var_0 )
{
var_0 = clamp( var_0, 50, 550 );
return 2 + int( 8 * ( var_0 - 50 ) / 500 );
}
vanguard_in_range()
{
if ( isdefined( self.inheliproximity ) && self.inheliproximity )
return 0;
if ( isdefined( level.disablevanguardsinair ) )
return 0;
if ( isdefined( level.vanguardrangetriggers[0] ) )
{
foreach ( var_1 in level.vanguardrangetriggers )
{
if ( self istouching( var_1 ) )
return 0;
}
if ( level.is_mp_descent )
return self.origin[2] < level.vanguardmaxheight;
else
return 1;
}
else if ( distance2dsquared( self.origin, level.mapcenter ) < level.vanguradmaxdistancesq && self.origin[2] < level.vanguardmaxheight )
return 1;
return 0;
}
vanguard_rangecountdown()
{
self endon( "death" );
self endon( "in_range" );
if ( isdefined( self.heliinproximity ) )
var_0 = 3;
else
var_0 = 6;
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( var_0 );
self notify( "death", "range_death" );
}
vanguard_monitorkillstreakdisowned( var_0 )
{
var_0 endon( "death" );
var_0.owner common_scripts\utility::waittill_any( "killstreak_disowned" );
var_0 notify( "death" );
}
vanguard_monitortimeout( var_0, var_1 )
{
var_0 endon( "death" );
var_2 = 60;
if ( !maps\mp\_utility::is_aliens() )
{
}
else
var_2 = var_1;
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( var_2 );
if ( isdefined( var_0.owner ) )
var_0.owner maps\mp\_utility::leaderdialogonplayer( "gryphon_gone" );
var_0 notify( "death" );
}
vanguard_monitordeath( var_0 )
{
level endon( "game_ended" );
level endon( "objective_cam" );
var_1 = var_0.turret;
var_0 waittill( "death" );
var_0 maps\mp\gametypes\_weapons::stopblinkinglight();
stopfxontag( level.vanguard_fx["target_marker_circle"], var_0.attackarrow, "tag_origin" );
playfx( level.vanguard_fx["explode"], var_0.origin );
var_0 playsound( "ball_drone_explode" );
var_1 delete();
if ( isdefined( var_0.targeteffect ) )
var_0.targeteffect delete();
vanguard_endride( var_0.owner, var_0 );
}
vanguard_monitorobjectivecam( var_0 )
{
var_0 endon( "death" );
level common_scripts\utility::waittill_any( "objective_cam", "game_ended" );
playfx( level.vanguard_fx["explode"], var_0.origin );
var_0 playsound( "ball_drone_explode" );
vanguard_endride( var_0.owner, var_0 );
}
vanguard_endride( var_0, var_1 )
{
var_1 notify( "end_remote" );
var_1.playerlinked = 0;
var_1 setotherent( undefined );
vanguard_removeplayer( var_0, var_1 );
stopfxontag( level.vanguard_fx["smoke"], var_1, "tag_origin" );
level.remote_uav[var_1.team] = undefined;
maps\mp\_utility::decrementfauxvehiclecount();
if ( isdefined( var_1.killcament ) )
var_1.killcament delete();
var_1.attackarrow delete();
var_1 delete();
}
restorevisionset()
{
self visionsetnakedforplayer( "", 1 );
maps\mp\_utility::set_visionset_for_watching_players( "", 1 );
}
vanguard_removeplayer( var_0, var_1 )
{
if ( !isdefined( var_0 ) )
return;
var_0 maps\mp\_utility::clearusingremote();
var_0 restorevisionset();
var_0 setclientomnvar( "ui_vanguard", 0 );
if ( getdvarint( "camera_thirdPerson" ) )
var_0 maps\mp\_utility::setthirdpersondof( 1 );
var_0 cameraunlink( var_1 );
var_0 remotecontrolvehicleoff( var_1 );
var_0 thermalvisionoff();
var_0 thermalvisionfofoverlayoff();
var_0 setplayerangles( var_0.restoreangles );
var_0.remoteuav = undefined;
if ( var_0.team == "spectator" )
return;
level thread vanguard_freezecontrolsbuffer( var_0 );
}
vanguard_freezecontrolsbuffer( var_0 )
{
var_0 endon( "disconnect" );
var_0 endon( "death" );
level endon( "game_ended" );
var_0 maps\mp\_utility::freezecontrolswrapper( 1 );
wait 0.5;
var_0 maps\mp\_utility::freezecontrolswrapper( 0 );
}
vanguard_watchheliproximity()
{
level endon( "game_ended" );
self endon( "death" );
self endon( "end_remote" );
for (;;)
{
var_0 = 0;
foreach ( var_2 in level.helis )
{
if ( distance( var_2.origin, self.origin ) < 300 )
{
var_0 = 1;
self.heliinproximity = var_2;
}
}
foreach ( var_5 in level.littlebirds )
{
if ( var_5 != self && ( !isdefined( var_5.helitype ) || var_5.helitype != "remote_uav" ) && distance( var_5.origin, self.origin ) < 300 )
{
var_0 = 1;
self.heliinproximity = var_5;
}
}
if ( !self.inheliproximity && var_0 )
self.inheliproximity = 1;
else if ( self.inheliproximity && !var_0 )
{
self.inheliproximity = 0;
self.heliinproximity = undefined;
}
wait 0.05;
}
}
vanguard_handledamage()
{
self endon( "death" );
level endon( "game_ended" );
self setcandamage( 1 );
for (;;)
{
self waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
maps\mp\gametypes\_damage::monitordamageoneshot( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, "remote_uav", ::handledeathdamage, ::modifydamage, 1 );
}
}
vanguard_turret_handledamage()
{
self endon( "death" );
level endon( "game_ended" );
self maketurretsolid();
self setcandamage( 1 );
for (;;)
{
self waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
if ( isdefined( self.parent ) )
self.parent maps\mp\gametypes\_damage::monitordamageoneshot( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, "remote_uav", ::handledeathdamage, ::modifydamage, 1 );
}
}
modifydamage( var_0, var_1, var_2, var_3 )
{
var_4 = var_3;
var_4 = maps\mp\gametypes\_damage::handleempdamage( 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 );
if ( var_2 == "MOD_MELEE" )
var_4 = self.maxhealth * 0.34;
playfxontagforclients( level.vanguard_fx["hit"], self, "tag_origin", self.owner );
if ( self.smoking == 0 && self.damagetaken >= self.maxhealth / 2 )
{
self.smoking = 1;
playfxontag( level.vanguard_fx["smoke"], self, "tag_origin" );
}
return var_4;
}
handledeathdamage( var_0, var_1, var_2, var_3 )
{
if ( isdefined( self.owner ) )
self.owner maps\mp\_utility::leaderdialogonplayer( "gryphon_destroyed" );
maps\mp\gametypes\_damage::onkillstreakkilled( var_0, var_1, var_2, var_3, "destroyed_vanguard", undefined, "callout_destroyed_vanguard" );
if ( isdefined( var_0 ) )
{
var_0 maps\mp\gametypes\_missions::processchallenge( "ch_gryphondown" );
maps\mp\gametypes\_missions::checkaachallenges( var_0, self, var_1 );
}
}
watchempdamage()
{
self endon( "death" );
level endon( "game_ended" );
for (;;)
{
self waittill( "emp_damage", var_0, var_1 );
stopfxontag( level.vanguard_fx["target_marker_circle"], self.attackarrow, "tag_origin" );
common_scripts\utility::waitframe();
thread vanguard_showreticletoenemies();
playfxontag( common_scripts\utility::getfx( "emp_stun" ), self, "tag_origin" );
wait( var_1 );
stopfxontag( level.vanguard_fx["target_marker_circle"], self.attackarrow, "tag_origin" );
common_scripts\utility::waitframe();
thread vanguard_reticlestart();
}
}

View File

@ -0,0 +1,464 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.killstreakfuncs["mine_level_killstreak"] = ::tryusewolfpack;
level.killstreakweildweapons["killstreak_wolfpack_mp"] = "mine_level_killstreak";
}
setup_callbacks()
{
level.agent_funcs["wolf"] = level.agent_funcs["dog"];
level.agent_funcs["wolf"]["spawn"] = ::spawn_dog;
level.agent_funcs["wolf"]["on_killed"] = ::on_agent_dog_killed;
level.agent_funcs["wolf"]["on_damaged"] = maps\mp\agents\_agents::on_agent_generic_damaged;
level.agent_funcs["wolf"]["on_damaged_finished"] = maps\mp\killstreaks\_dog_killstreak::on_damaged_finished;
level.agent_funcs["wolf"]["think"] = ::think_init;
}
tryusewolfpack( var_0, var_1 )
{
setup_callbacks();
return usedog();
}
usedog()
{
if ( maps\mp\agents\_agent_utility::getnumownedactiveagents( self ) >= 2 )
{
self iprintlnbold( &"KILLSTREAKS_AGENT_MAX" );
return 0;
}
var_0 = getmaxagents();
if ( maps\mp\agents\_agent_utility::getnumactiveagents() >= var_0 )
{
self iprintlnbold( &"KILLSTREAKS_UNAVAILABLE" );
return 0;
}
if ( !maps\mp\_utility::isreallyalive( self ) )
return 0;
var_1 = spawnwolf( 1 );
if ( var_1 )
{
self playsound( "mp_mine_wolf_spawn" );
thread maps\mp\_utility::teamplayercardsplash( "used_mine_level_killstreak", self );
thread spawnwolfpack();
}
return var_1;
}
spawnwolf( var_0 )
{
var_1 = maps\mp\agents\_agent_common::connectnewagent( "wolf", self.team );
if ( !isdefined( var_1 ) )
return 0;
var_1 maps\mp\agents\_agent_utility::set_agent_team( self.team, self );
var_2 = "wolf_spawn_0" + var_0;
var_3 = common_scripts\utility::getstruct( var_2, "targetname" );
var_4 = var_3.origin;
var_5 = self.angles;
var_1.wolfid = var_0;
var_1.pathnodearray = common_scripts\utility::getstructarray( "wolf_path_0" + var_0, "script_noteworthy" );
var_1 thread [[ var_1 maps\mp\agents\_agent_utility::agentfunc( "spawn" ) ]]( var_4, var_5, self );
var_1 maps\mp\_utility::_setnameplatematerial( "player_name_bg_green_dog", "player_name_bg_red_dog" );
return 1;
}
spawnwolfpack()
{
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
for ( var_0 = 2; var_0 <= 3; var_0++ )
{
wait 0.75;
spawnwolf( var_0 );
}
var_1 = 3;
for (;;)
{
level waittill( "wolf_killed", var_2 );
if ( var_1 > 0 )
{
wait 0.75;
spawnwolf( var_2 );
var_1--;
continue;
}
break;
}
}
on_agent_dog_killed( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
{
self.isactive = 0;
self.hasdied = 0;
var_1.lastkilldogtime = gettime();
if ( isdefined( self.animcbs.onexit[self.aistate] ) )
self [[ self.animcbs.onexit[self.aistate] ]]();
if ( isplayer( var_1 ) && isdefined( self.owner ) && var_1 != self.owner )
maps\mp\gametypes\_damage::onkillstreakkilled( var_1, var_4, var_3, var_2, "destroyed_ks_wolf" );
self setanimstate( "death" );
var_9 = self getanimentry();
var_10 = getanimlength( var_9 );
var_8 = int( var_10 * 1000 );
self.body = self cloneagent( var_8 );
self playsound( "anml_wolf_shot_death" );
level notify( "wolf_killed", self.wolfid );
maps\mp\agents\_agent_utility::deactivateagent();
self notify( "killanimscript" );
}
spawn_dog( var_0, var_1, var_2 )
{
var_3 = 1;
var_4 = "mp_fullbody_wolf_c";
var_5 = 1;
if ( self.wolfid == 1 )
{
var_4 = "mp_fullbody_wolf_b";
var_5 = 0;
}
if ( ishairrunning() )
var_4 = var_4 + "_fur";
self setmodel( var_4 );
self.species = "dog";
self.onenteranimstate = maps\mp\agents\dog\_dog_think::onenteranimstate;
if ( isdefined( var_0 ) && isdefined( var_1 ) )
{
var_6 = var_0;
var_7 = var_1;
}
else
{
var_8 = self [[ level.getspawnpoint ]]();
var_6 = var_8.origin;
var_7 = var_8.angles;
}
maps\mp\agents\_agent_utility::activateagent();
self.spawntime = gettime();
self.lastspawntime = gettime();
self.biswolf = 1;
var_9 = "wolf_animclass";
maps\mp\agents\dog\_dog_think::init();
self.watchattackstatefunc = ::watchattackstate;
self spawnagent( var_6, var_7, var_9, 15, 40, var_2 );
level notify( "spawned_agent", self );
maps\mp\agents\_agent_common::set_agent_health( 200 );
if ( isdefined( var_2 ) )
maps\mp\agents\_agent_utility::set_agent_team( var_2.team, var_2 );
self setthreatbiasgroup( "Dogs" );
self takeallweapons();
if ( isdefined( self.owner ) )
{
self hide();
wait 1.0;
if ( !isalive( self ) )
return;
self show();
}
self thread [[ maps\mp\agents\_agent_utility::agentfunc( "think" ) ]]();
wait 0.1;
if ( ishairrunning() )
{
var_10 = level.wolffurfx[var_5];
playfxontag( var_10, self, "tag_origin" );
}
}
think_init()
{
maps\mp\agents\dog\_dog_think::setupdogstate();
self.wolfgoalpos = get_closest( self.origin, self.pathnodearray );
thread think();
thread maps\mp\agents\dog\_dog_think::watchownerdeath();
thread maps\mp\agents\dog\_dog_think::watchownerteamchange();
thread maps\mp\agents\dog\_dog_think::waitforbadpath();
thread maps\mp\agents\dog\_dog_think::waitforpathset();
}
think()
{
self endon( "death" );
level endon( "game_ended" );
if ( isdefined( self.owner ) )
{
self endon( "owner_disconnect" );
thread maps\mp\agents\dog\_dog_think::destroyonownerdisconnect( self.owner );
}
self thread [[ self.watchattackstatefunc ]]();
thread maps\mp\agents\dog\_dog_think::monitorflash();
for (;;)
{
if ( self.aistate != "melee" && !self.statelocked && maps\mp\agents\dog\_dog_think::readytomeleetarget() && !maps\mp\agents\dog\_dog_think::didpastmeleefail() )
self scragentbeginmelee( self.curmeleetarget );
switch ( self.aistate )
{
case "idle":
updatemove();
break;
case "move":
updatemove();
break;
case "melee":
maps\mp\agents\dog\_dog_think::updatemelee();
break;
}
wait 0.05;
}
}
updatemove()
{
updatemovestate();
}
updatemovestate()
{
if ( self.blockgoalpos )
return;
self.prevmovestate = self.movestate;
var_0 = undefined;
var_1 = 0;
var_2 = 0;
var_3 = 500;
if ( self.bhasbadpath && gettime() - self.lastbadpathtime < var_3 )
{
self.movestate = "follow";
var_1 = 1;
}
else
self.movestate = maps\mp\agents\dog\_dog_think::getmovestate();
if ( self.movestate == "pursuit" )
{
var_0 = maps\mp\agents\dog\_dog_think::getattackpoint( self.enemy );
var_4 = 0;
if ( isdefined( self.lastbadpathtime ) && gettime() - self.lastbadpathtime < 3000 )
{
if ( distance2dsquared( var_0, self.lastbadpathgoal ) < 16 )
var_4 = 1;
else if ( isdefined( self.lastbadpathmovestate ) && self.lastbadpathmovestate == "pursuit" && distance2dsquared( self.lastbadpathultimategoal, self.enemy.origin ) < 16 )
var_4 = 1;
}
if ( !maps\mp\_utility::isreallyalive( self.enemy ) || var_4 || maps\mp\agents\dog\_dog_think::wanttoattacktargetbutcant( 1 ) || maps\mp\agents\dog\_dog_think::didpastpursuitfail( self.enemy ) )
{
self.movestate = "follow";
var_2 = 1;
}
}
maps\mp\agents\dog\_dog_think::setpastpursuitfailed( var_2 );
if ( self.movestate == "follow" )
{
self.curmeleetarget = undefined;
self.movemode = maps\mp\agents\dog\_dog_think::getfollowmovemode( self.movemode );
self.barrivalsenabled = 1;
var_5 = self getpathgoalpos();
if ( !isdefined( var_5 ) )
var_5 = self.origin;
if ( gettime() - self.timeoflastdamage < 5000 )
var_1 = 1;
var_6 = distance2dsquared( self.origin, self.wolfgoalpos.origin );
if ( var_6 < 800 )
picknewlocation();
self scragentsetgoalpos( self.wolfgoalpos.origin );
if ( var_1 == 1 )
{
self scragentsetgoalpos( self.origin );
return;
}
}
else if ( self.movestate == "pursuit" )
{
self.curmeleetarget = self.enemy;
self.movemode = "sprint";
self.barrivalsenabled = 0;
self scragentsetgoalpos( var_0 );
}
}
picknewlocation()
{
self.wolfgoalpos = common_scripts\utility::getstruct( self.wolfgoalpos.target, "targetname" );
}
get_closest( var_0, var_1, var_2 )
{
var_3 = var_1[0];
var_4 = distance( var_0, var_3.origin );
for ( var_5 = 0; var_5 < var_1.size; var_5++ )
{
var_6 = distance( var_0, var_1[var_5].origin );
if ( var_6 >= var_4 )
continue;
var_4 = var_6;
var_3 = var_1[var_5];
}
if ( !isdefined( var_2 ) || var_4 <= var_2 )
return var_3;
return undefined;
}
watchattackstate()
{
self endon( "death" );
level endon( "game_ended" );
for (;;)
{
if ( self.aistate == "melee" )
{
if ( self.attackstate != "melee" )
{
self.attackstate = "melee";
setsoundstate( undefined );
}
}
else if ( self.movestate == "pursuit" )
{
if ( self.attackstate != "attacking" )
{
self.attackstate = "attacking";
setsoundstate( "bark", "attacking" );
}
}
else if ( self.attackstate != "warning" )
{
if ( maps\mp\agents\dog\_dog_think::wantstogrowlattarget() )
{
self.attackstate = "warning";
setsoundstate( "growl", "warning" );
}
else
{
self.attackstate = self.aistate;
setsoundstate( "pant" );
}
}
else if ( !maps\mp\agents\dog\_dog_think::wantstogrowlattarget() )
{
self.attackstate = self.aistate;
setsoundstate( "pant" );
}
wait 0.05;
}
}
setsoundstate( var_0, var_1 )
{
if ( !isdefined( var_0 ) )
{
self notify( "end_dog_sound" );
self.soundstate = undefined;
return;
}
if ( !isdefined( self.soundstate ) || self.soundstate != var_0 )
{
self notify( "end_dog_sound" );
self.soundstate = var_0;
if ( var_0 == "bark" )
thread playbark( var_1 );
else if ( var_0 == "growl" )
thread playgrowl( var_1 );
else if ( var_0 == "pant" )
thread maps\mp\agents\dog\_dog_think::playpanting();
else
{
}
}
}
playbark( var_0 )
{
self endon( "death" );
level endon( "game_ended" );
self endon( "end_dog_sound" );
if ( !isdefined( self.barking_sound ) )
{
self playsoundonmovingent( "mine_wolf_bark" );
self.barking_sound = 1;
watchbarking();
}
}
watchbarking()
{
self endon( "death" );
level endon( "game_ended" );
self endon( "end_dog_sound" );
wait( randomintrange( 4, 6 ) );
self.barking_sound = undefined;
}
playgrowl( var_0 )
{
self endon( "death" );
level endon( "game_ended" );
self endon( "end_dog_sound" );
if ( isdefined( self.lastgrowlplayedtime ) && gettime() - self.lastgrowlplayedtime < 3000 )
wait 3;
for (;;)
{
self.lastgrowlplayedtime = gettime();
self playsoundonmovingent( "mine_wolf_growl" );
wait( randomintrange( 3, 6 ) );
}
}