init
This commit is contained in:
732
maps/mp/killstreaks/_a10.gsc
Normal file
732
maps/mp/killstreaks/_a10.gsc
Normal 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();
|
||||
}
|
136
maps/mp/killstreaks/_aalauncher.gsc
Normal file
136
maps/mp/killstreaks/_aalauncher.gsc
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
202
maps/mp/killstreaks/_aamissile.gsc
Normal file
202
maps/mp/killstreaks/_aamissile.gsc
Normal 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 );
|
||||
}
|
251
maps/mp/killstreaks/_aastrike.gsc
Normal file
251
maps/mp/killstreaks/_aastrike.gsc
Normal 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" );
|
||||
}
|
1677
maps/mp/killstreaks/_ac130.gsc
Normal file
1677
maps/mp/killstreaks/_ac130.gsc
Normal file
File diff suppressed because it is too large
Load Diff
145
maps/mp/killstreaks/_agent_killstreak.gsc
Normal file
145
maps/mp/killstreaks/_agent_killstreak.gsc
Normal 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();
|
||||
}
|
216
maps/mp/killstreaks/_air_superiority.gsc
Normal file
216
maps/mp/killstreaks/_air_superiority.gsc
Normal 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 );
|
||||
}
|
2139
maps/mp/killstreaks/_airdrop.gsc
Normal file
2139
maps/mp/killstreaks/_airdrop.gsc
Normal file
File diff suppressed because it is too large
Load Diff
997
maps/mp/killstreaks/_airstrike.gsc
Normal file
997
maps/mp/killstreaks/_airstrike.gsc
Normal 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;
|
||||
}
|
||||
}
|
1707
maps/mp/killstreaks/_autosentry.gsc
Normal file
1707
maps/mp/killstreaks/_autosentry.gsc
Normal file
File diff suppressed because it is too large
Load Diff
116
maps/mp/killstreaks/_autoshotgun.gsc
Normal file
116
maps/mp/killstreaks/_autoshotgun.gsc
Normal 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;
|
||||
}
|
||||
}
|
1004
maps/mp/killstreaks/_ball_drone.gsc
Normal file
1004
maps/mp/killstreaks/_ball_drone.gsc
Normal file
File diff suppressed because it is too large
Load Diff
691
maps/mp/killstreaks/_deployablebox.gsc
Normal file
691
maps/mp/killstreaks/_deployablebox.gsc
Normal 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 );
|
||||
}
|
153
maps/mp/killstreaks/_deployablebox_ammo.gsc
Normal file
153
maps/mp/killstreaks/_deployablebox_ammo.gsc
Normal 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;
|
||||
}
|
79
maps/mp/killstreaks/_deployablebox_grenades.gsc
Normal file
79
maps/mp/killstreaks/_deployablebox_grenades.gsc
Normal 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();
|
||||
}
|
203
maps/mp/killstreaks/_deployablebox_gun.gsc
Normal file
203
maps/mp/killstreaks/_deployablebox_gun.gsc
Normal 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;
|
||||
}
|
64
maps/mp/killstreaks/_deployablebox_juicebox.gsc
Normal file
64
maps/mp/killstreaks/_deployablebox_juicebox.gsc
Normal 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();
|
||||
}
|
86
maps/mp/killstreaks/_deployablebox_vest.gsc
Normal file
86
maps/mp/killstreaks/_deployablebox_vest.gsc
Normal 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];
|
||||
}
|
95
maps/mp/killstreaks/_designator_grenade.gsc
Normal file
95
maps/mp/killstreaks/_designator_grenade.gsc
Normal 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();
|
||||
}
|
251
maps/mp/killstreaks/_dog_killstreak.gsc
Normal file
251
maps/mp/killstreaks/_dog_killstreak.gsc
Normal 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" );
|
||||
}
|
||||
}
|
433
maps/mp/killstreaks/_dronehive.gsc
Normal file
433
maps/mp/killstreaks/_dronehive.gsc
Normal 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();
|
||||
}
|
427
maps/mp/killstreaks/_emp.gsc
Normal file
427
maps/mp/killstreaks/_emp.gsc
Normal 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();
|
||||
}
|
177
maps/mp/killstreaks/_emp_common.gsc
Normal file
177
maps/mp/killstreaks/_emp_common.gsc
Normal 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;
|
||||
}
|
891
maps/mp/killstreaks/_escortairdrop.gsc
Normal file
891
maps/mp/killstreaks/_escortairdrop.gsc
Normal 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 );
|
||||
}
|
369
maps/mp/killstreaks/_flares.gsc
Normal file
369
maps/mp/killstreaks/_flares.gsc
Normal 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 );
|
||||
}
|
174
maps/mp/killstreaks/_gas_airstrike.gsc
Normal file
174
maps/mp/killstreaks/_gas_airstrike.gsc
Normal 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 );
|
||||
}
|
||||
}
|
||||
}
|
1092
maps/mp/killstreaks/_harrier.gsc
Normal file
1092
maps/mp/killstreaks/_harrier.gsc
Normal file
File diff suppressed because it is too large
Load Diff
1718
maps/mp/killstreaks/_helicopter.gsc
Normal file
1718
maps/mp/killstreaks/_helicopter.gsc
Normal file
File diff suppressed because it is too large
Load Diff
402
maps/mp/killstreaks/_helicopter_flock.gsc
Normal file
402
maps/mp/killstreaks/_helicopter_flock.gsc
Normal 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();
|
||||
}
|
702
maps/mp/killstreaks/_helicopter_guard.gsc
Normal file
702
maps/mp/killstreaks/_helicopter_guard.gsc
Normal 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 );
|
||||
}
|
513
maps/mp/killstreaks/_helicopter_pilot.gsc
Normal file
513
maps/mp/killstreaks/_helicopter_pilot.gsc
Normal 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();
|
||||
}
|
897
maps/mp/killstreaks/_helisniper.gsc
Normal file
897
maps/mp/killstreaks/_helisniper.gsc
Normal 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" );
|
||||
}
|
||||
}
|
125
maps/mp/killstreaks/_highvaluetarget.gsc
Normal file
125
maps/mp/killstreaks/_highvaluetarget.gsc
Normal 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
1038
maps/mp/killstreaks/_ims.gsc
Normal file
File diff suppressed because it is too large
Load Diff
162
maps/mp/killstreaks/_jammer.gsc
Normal file
162
maps/mp/killstreaks/_jammer.gsc
Normal 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 );
|
||||
}
|
290
maps/mp/killstreaks/_juggernaut.gsc
Normal file
290
maps/mp/killstreaks/_juggernaut.gsc
Normal 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;
|
||||
}
|
1248
maps/mp/killstreaks/_juggernaut_predator.gsc
Normal file
1248
maps/mp/killstreaks/_juggernaut_predator.gsc
Normal file
File diff suppressed because it is too large
Load Diff
2362
maps/mp/killstreaks/_killstreaks.gsc
Normal file
2362
maps/mp/killstreaks/_killstreaks.gsc
Normal file
File diff suppressed because it is too large
Load Diff
91
maps/mp/killstreaks/_killstreaks_init.gsc
Normal file
91
maps/mp/killstreaks/_killstreaks_init.gsc
Normal 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();
|
||||
}
|
769
maps/mp/killstreaks/_lasedstrike.gsc
Normal file
769
maps/mp/killstreaks/_lasedstrike.gsc
Normal 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;
|
||||
}
|
||||
}
|
588
maps/mp/killstreaks/_mobilemortar.gsc
Normal file
588
maps/mp/killstreaks/_mobilemortar.gsc
Normal 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;
|
||||
}
|
||||
}
|
384
maps/mp/killstreaks/_mortarstrike.gsc
Normal file
384
maps/mp/killstreaks/_mortarstrike.gsc
Normal 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;
|
||||
}
|
74
maps/mp/killstreaks/_mrsiartillery.gsc
Normal file
74
maps/mp/killstreaks/_mrsiartillery.gsc
Normal 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 );
|
||||
}
|
469
maps/mp/killstreaks/_nuke.gsc
Normal file
469
maps/mp/killstreaks/_nuke.gsc
Normal 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 );
|
||||
}
|
1184
maps/mp/killstreaks/_odin.gsc
Normal file
1184
maps/mp/killstreaks/_odin.gsc
Normal file
File diff suppressed because it is too large
Load Diff
136
maps/mp/killstreaks/_perkstreaks.gsc
Normal file
136
maps/mp/killstreaks/_perkstreaks.gsc
Normal 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;
|
||||
}
|
524
maps/mp/killstreaks/_placeable.gsc
Normal file
524
maps/mp/killstreaks/_placeable.gsc
Normal 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;
|
||||
}
|
119
maps/mp/killstreaks/_placeable_barrier.gsc
Normal file
119
maps/mp/killstreaks/_placeable_barrier.gsc
Normal 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;
|
||||
}
|
331
maps/mp/killstreaks/_plane.gsc
Normal file
331
maps/mp/killstreaks/_plane.gsc
Normal 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;
|
||||
}
|
||||
}
|
310
maps/mp/killstreaks/_portableaoegenerator.gsc
Normal file
310
maps/mp/killstreaks/_portableaoegenerator.gsc
Normal 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;
|
||||
}
|
251
maps/mp/killstreaks/_remotemissile.gsc
Normal file
251
maps/mp/killstreaks/_remotemissile.gsc
Normal 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 );
|
||||
}
|
687
maps/mp/killstreaks/_remotemortar.gsc
Normal file
687
maps/mp/killstreaks/_remotemortar.gsc
Normal 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;
|
||||
}
|
||||
}
|
1052
maps/mp/killstreaks/_remotetank.gsc
Normal file
1052
maps/mp/killstreaks/_remotetank.gsc
Normal file
File diff suppressed because it is too large
Load Diff
1045
maps/mp/killstreaks/_remoteturret.gsc
Normal file
1045
maps/mp/killstreaks/_remoteturret.gsc
Normal file
File diff suppressed because it is too large
Load Diff
1476
maps/mp/killstreaks/_remoteuav.gsc
Normal file
1476
maps/mp/killstreaks/_remoteuav.gsc
Normal file
File diff suppressed because it is too large
Load Diff
1856
maps/mp/killstreaks/_tank.gsc
Normal file
1856
maps/mp/killstreaks/_tank.gsc
Normal file
File diff suppressed because it is too large
Load Diff
58
maps/mp/killstreaks/_teamammorefill.gsc
Normal file
58
maps/mp/killstreaks/_teamammorefill.gsc
Normal 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" );
|
||||
}
|
834
maps/mp/killstreaks/_uav.gsc
Normal file
834
maps/mp/killstreaks/_uav.gsc
Normal 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 );
|
||||
}
|
420
maps/mp/killstreaks/_uplink.gsc
Normal file
420
maps/mp/killstreaks/_uplink.gsc
Normal 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 );
|
||||
}
|
||||
}
|
944
maps/mp/killstreaks/_vanguard.gsc
Normal file
944
maps/mp/killstreaks/_vanguard.gsc
Normal 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();
|
||||
}
|
||||
}
|
464
maps/mp/killstreaks/mp_wolfpack_killstreak.gsc
Normal file
464
maps/mp/killstreaks/mp_wolfpack_killstreak.gsc
Normal 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 ) );
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user