1093 lines
28 KiB
Plaintext
1093 lines
28 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
beginharrier( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = getent( "airstrikeheight", "targetname" );
|
|
|
|
if ( isdefined( var_3 ) )
|
|
var_4 = var_3.origin[2];
|
|
else if ( isdefined( level.airstrikeheightscale ) )
|
|
var_4 = 850 * level.airstrikeheightscale;
|
|
else
|
|
var_4 = 850;
|
|
|
|
var_2 = var_2 * ( 1, 1, 0 );
|
|
var_5 = var_2 + ( 0, 0, var_4 );
|
|
var_6 = spawndefensiveharrier( var_0, self, var_1, var_5 );
|
|
var_6.pathgoal = var_5;
|
|
return var_6;
|
|
}
|
|
|
|
getcorrectheight( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = 1200;
|
|
var_4 = tracegroundpoint( var_0, var_1 );
|
|
var_5 = var_4 + var_3;
|
|
|
|
if ( isdefined( level.airstrikeheightscale ) && var_5 < 850 * level.airstrikeheightscale )
|
|
var_5 = 950 * level.airstrikeheightscale;
|
|
|
|
var_5 = var_5 + randomint( var_2 );
|
|
return var_5;
|
|
}
|
|
|
|
spawndefensiveharrier( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_4 = vectortoangles( var_3 - var_2 );
|
|
var_5 = spawnhelicopter( var_1, var_2, var_4, "harrier_mp", "vehicle_av8b_harrier_jet_mp" );
|
|
|
|
if ( !isdefined( var_5 ) )
|
|
return;
|
|
|
|
var_5 addtohelilist();
|
|
var_5 thread removefromhelilistondeath();
|
|
var_5 thread handledestroydamage();
|
|
var_5.speed = 250;
|
|
var_5.accel = 175;
|
|
var_5.health = 2500;
|
|
var_5.maxhealth = var_5.health;
|
|
var_5.team = var_1.team;
|
|
var_5.owner = var_1;
|
|
var_5 setcandamage( 1 );
|
|
var_5.owner = var_1;
|
|
var_5 thread harrierdestroyed();
|
|
var_5 setmaxpitchroll( 0, 90 );
|
|
var_5 vehicle_setspeed( var_5.speed, var_5.accel );
|
|
var_5 thread playharrierfx();
|
|
var_5 setdamagestage( 3 );
|
|
var_5.missiles = 6;
|
|
var_5.pers["team"] = var_5.team;
|
|
var_5 sethoverparams( 50, 100, 50 );
|
|
var_5 setturningability( 0.05 );
|
|
var_5 setyawspeed( 45, 25, 25, 0.5 );
|
|
var_5.defendloc = var_3;
|
|
var_5.lifeid = var_0;
|
|
var_5.allowmonitoreddamage = 1;
|
|
var_5.isharrier = 1;
|
|
var_5.damagecallback = ::callback_vehicledamage;
|
|
level.harriers = common_scripts\utility::array_removeundefined( level.harriers );
|
|
level.harriers[level.harriers.size] = var_5;
|
|
level.harrier_incoming = undefined;
|
|
return var_5;
|
|
}
|
|
|
|
defendlocation( var_0 )
|
|
{
|
|
var_0 endon( "death" );
|
|
var_0 thread harriertimer();
|
|
var_0 setvehgoalpos( var_0.pathgoal, 1 );
|
|
var_0 thread closetogoalcheck( var_0.pathgoal );
|
|
var_0 waittill( "goal" );
|
|
var_0 stopharrierwingfx();
|
|
var_0 engageground();
|
|
var_0 thread monitorowner();
|
|
}
|
|
|
|
closetogoalcheck( var_0 )
|
|
{
|
|
self endon( "goal" );
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
if ( distance2d( self.origin, var_0 ) < 768 )
|
|
{
|
|
self setmaxpitchroll( 45, 25 );
|
|
break;
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
engageground()
|
|
{
|
|
self notify( "engageGround" );
|
|
self endon( "engageGround" );
|
|
self endon( "death" );
|
|
thread harriergettargets();
|
|
thread randomharriermovement();
|
|
var_0 = self.defendloc;
|
|
self vehicle_setspeed( 15, 5 );
|
|
self setvehgoalpos( var_0, 1 );
|
|
self waittill( "goal" );
|
|
}
|
|
|
|
harrierleave()
|
|
{
|
|
self endon( "death" );
|
|
self setmaxpitchroll( 0, 0 );
|
|
self notify( "leaving" );
|
|
breaktarget( 1 );
|
|
self notify( "stopRand" );
|
|
|
|
for (;;)
|
|
{
|
|
self vehicle_setspeed( 35, 25 );
|
|
var_0 = self.origin + anglestoforward( ( 0, randomint( 360 ), 0 ) ) * 500;
|
|
var_0 = var_0 + ( 0, 0, 900 );
|
|
var_1 = bullettrace( self.origin, self.origin + ( 0, 0, 900 ), 0, self );
|
|
|
|
if ( var_1["surfacetype"] == "none" )
|
|
break;
|
|
|
|
wait 0.1;
|
|
}
|
|
|
|
self setvehgoalpos( var_0, 1 );
|
|
thread startharrierwingfx();
|
|
self waittill( "goal" );
|
|
self playsoundonmovingent( "harrier_fly_away" );
|
|
var_2 = getpathend();
|
|
self vehicle_setspeed( 250, 75 );
|
|
self setvehgoalpos( var_2, 1 );
|
|
self waittill( "goal" );
|
|
level.harriers[level.harriers.size - 1] = undefined;
|
|
self notify( "harrier_gone" );
|
|
thread harrierdelete();
|
|
}
|
|
|
|
harrierdelete()
|
|
{
|
|
self delete();
|
|
}
|
|
|
|
harriertimer()
|
|
{
|
|
self endon( "death" );
|
|
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( 90 );
|
|
harrierleave();
|
|
}
|
|
|
|
randomharriermovement()
|
|
{
|
|
self notify( "randomHarrierMovement" );
|
|
self endon( "randomHarrierMovement" );
|
|
self endon( "stopRand" );
|
|
self endon( "death" );
|
|
self endon( "acquiringTarget" );
|
|
self endon( "leaving" );
|
|
var_0 = self.defendloc;
|
|
|
|
for (;;)
|
|
{
|
|
var_1 = getnewpoint( self.origin );
|
|
self setvehgoalpos( var_1, 1 );
|
|
self waittill( "goal" );
|
|
wait( randomintrange( 1, 2 ) );
|
|
self notify( "randMove" );
|
|
}
|
|
}
|
|
|
|
getnewpoint( var_0, var_1 )
|
|
{
|
|
self endon( "stopRand" );
|
|
self endon( "death" );
|
|
self endon( "acquiringTarget" );
|
|
self endon( "leaving" );
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
{
|
|
var_2 = [];
|
|
|
|
foreach ( var_4 in level.players )
|
|
{
|
|
if ( var_4 == self )
|
|
continue;
|
|
|
|
if ( !level.teambased || var_4.team != self.team )
|
|
var_2[var_2.size] = var_4.origin;
|
|
}
|
|
|
|
if ( var_2.size > 0 )
|
|
{
|
|
var_6 = averagepoint( var_2 );
|
|
var_7 = var_6[0];
|
|
var_8 = var_6[1];
|
|
}
|
|
else
|
|
{
|
|
var_9 = level.mapcenter;
|
|
var_10 = level.mapsize / 4;
|
|
var_7 = randomfloatrange( var_9[0] - var_10, var_9[0] + var_10 );
|
|
var_8 = randomfloatrange( var_9[1] - var_10, var_9[1] + var_10 );
|
|
}
|
|
|
|
var_11 = getcorrectheight( var_7, var_8, 20 );
|
|
}
|
|
else if ( common_scripts\utility::cointoss() )
|
|
{
|
|
var_12 = self.origin - self.besttarget.origin;
|
|
var_7 = var_12[0];
|
|
var_8 = var_12[1] * -1;
|
|
var_11 = getcorrectheight( var_7, var_8, 20 );
|
|
var_13 = ( var_8, var_7, var_11 );
|
|
|
|
if ( distance2d( self.origin, var_13 ) > 1200 )
|
|
{
|
|
var_8 = var_8 * 0.5;
|
|
var_7 = var_7 * 0.5;
|
|
var_13 = ( var_8, var_7, var_11 );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( distance2d( self.origin, self.besttarget.origin ) < 200 )
|
|
return;
|
|
|
|
var_14 = self.angles[1];
|
|
var_15 = ( 0, var_14, 0 );
|
|
var_16 = self.origin + anglestoforward( var_15 ) * randomintrange( 200, 400 );
|
|
var_11 = getcorrectheight( var_16[0], var_16[1], 20 );
|
|
var_7 = var_16[0];
|
|
var_8 = var_16[1];
|
|
}
|
|
|
|
for (;;)
|
|
{
|
|
var_17 = tracenewpoint( var_7, var_8, var_11 );
|
|
|
|
if ( var_17 != 0 )
|
|
return var_17;
|
|
|
|
var_7 = randomfloatrange( var_0[0] - 1200, var_0[0] + 1200 );
|
|
var_8 = randomfloatrange( var_0[1] - 1200, var_0[1] + 1200 );
|
|
var_11 = getcorrectheight( var_7, var_8, 20 );
|
|
}
|
|
}
|
|
|
|
tracenewpoint( var_0, var_1, var_2 )
|
|
{
|
|
self endon( "stopRand" );
|
|
self endon( "death" );
|
|
self endon( "acquiringTarget" );
|
|
self endon( "leaving" );
|
|
self endon( "randMove" );
|
|
|
|
for ( var_3 = 1; var_3 <= 10; var_3++ )
|
|
{
|
|
switch ( var_3 )
|
|
{
|
|
case 1:
|
|
var_4 = bullettrace( self.origin, ( var_0, var_1, var_2 ), 0, self );
|
|
break;
|
|
case 2:
|
|
var_4 = bullettrace( self gettagorigin( "tag_left_wingtip" ), ( var_0, var_1, var_2 ), 0, self );
|
|
break;
|
|
case 3:
|
|
var_4 = bullettrace( self gettagorigin( "tag_right_wingtip" ), ( var_0, var_1, var_2 ), 0, self );
|
|
break;
|
|
case 4:
|
|
var_4 = bullettrace( self gettagorigin( "tag_engine_left2" ), ( var_0, var_1, var_2 ), 0, self );
|
|
break;
|
|
case 5:
|
|
var_4 = bullettrace( self gettagorigin( "tag_engine_right2" ), ( var_0, var_1, var_2 ), 0, self );
|
|
break;
|
|
case 6:
|
|
var_4 = bullettrace( self gettagorigin( "tag_right_alamo_missile" ), ( var_0, var_1, var_2 ), 0, self );
|
|
break;
|
|
case 7:
|
|
var_4 = bullettrace( self gettagorigin( "tag_left_alamo_missile" ), ( var_0, var_1, var_2 ), 0, self );
|
|
break;
|
|
case 8:
|
|
var_4 = bullettrace( self gettagorigin( "tag_right_archer_missile" ), ( var_0, var_1, var_2 ), 0, self );
|
|
break;
|
|
case 9:
|
|
var_4 = bullettrace( self gettagorigin( "tag_left_archer_missile" ), ( var_0, var_1, var_2 ), 0, self );
|
|
break;
|
|
case 10:
|
|
var_4 = bullettrace( self gettagorigin( "tag_light_tail" ), ( var_0, var_1, var_2 ), 0, self );
|
|
break;
|
|
default:
|
|
var_4 = bullettrace( self.origin, ( var_0, var_1, var_2 ), 0, self );
|
|
}
|
|
|
|
if ( var_4["surfacetype"] != "none" )
|
|
return 0;
|
|
|
|
wait 0.05;
|
|
}
|
|
|
|
var_5 = ( var_0, var_1, var_2 );
|
|
return var_5;
|
|
}
|
|
|
|
tracegroundpoint( var_0, var_1 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "acquiringTarget" );
|
|
self endon( "leaving" );
|
|
var_2 = -9999999;
|
|
var_3 = 9999999;
|
|
var_4 = -9999999;
|
|
var_5 = self.origin[2];
|
|
var_6 = undefined;
|
|
var_7 = undefined;
|
|
|
|
for ( var_8 = 1; var_8 <= 5; var_8++ )
|
|
{
|
|
switch ( var_8 )
|
|
{
|
|
case 1:
|
|
var_9 = bullettrace( ( var_0, var_1, var_5 ), ( var_0, var_1, var_4 ), 0, self );
|
|
break;
|
|
case 2:
|
|
var_9 = bullettrace( ( var_0 + 20, var_1 + 20, var_5 ), ( var_0 + 20, var_1 + 20, var_4 ), 0, self );
|
|
break;
|
|
case 3:
|
|
var_9 = bullettrace( ( var_0 - 20, var_1 - 20, var_5 ), ( var_0 - 20, var_1 - 20, var_4 ), 0, self );
|
|
break;
|
|
case 4:
|
|
var_9 = bullettrace( ( var_0 + 20, var_1 - 20, var_5 ), ( var_0 + 20, var_1 - 20, var_4 ), 0, self );
|
|
break;
|
|
case 5:
|
|
var_9 = bullettrace( ( var_0 - 20, var_1 + 20, var_5 ), ( var_0 - 20, var_1 + 20, var_4 ), 0, self );
|
|
break;
|
|
default:
|
|
var_9 = bullettrace( self.origin, ( var_0, var_1, var_4 ), 0, self );
|
|
}
|
|
|
|
if ( var_9["position"][2] > var_2 )
|
|
{
|
|
var_2 = var_9["position"][2];
|
|
var_6 = var_9;
|
|
}
|
|
else if ( var_9["position"][2] < var_3 )
|
|
{
|
|
var_3 = var_9["position"][2];
|
|
var_7 = var_9;
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
|
|
return var_2;
|
|
}
|
|
|
|
playharrierfx()
|
|
{
|
|
self endon( "death" );
|
|
wait 0.2;
|
|
playfxontag( level.fx_airstrike_contrail, self, "tag_right_wingtip" );
|
|
playfxontag( level.fx_airstrike_contrail, self, "tag_left_wingtip" );
|
|
wait 0.2;
|
|
playfxontag( level.harrier_afterburnerfx, self, "tag_engine_right" );
|
|
playfxontag( level.harrier_afterburnerfx, self, "tag_engine_left" );
|
|
wait 0.2;
|
|
playfxontag( level.harrier_afterburnerfx, self, "tag_engine_right2" );
|
|
playfxontag( level.harrier_afterburnerfx, self, "tag_engine_left2" );
|
|
wait 0.2;
|
|
playfxontag( level.chopper_fx["light"]["left"], self, "tag_light_L_wing" );
|
|
wait 0.2;
|
|
playfxontag( level.chopper_fx["light"]["right"], self, "tag_light_R_wing" );
|
|
wait 0.2;
|
|
playfxontag( level.chopper_fx["light"]["belly"], self, "tag_light_belly" );
|
|
wait 0.2;
|
|
playfxontag( level.chopper_fx["light"]["tail"], self, "tag_light_tail" );
|
|
}
|
|
|
|
stopharrierwingfx()
|
|
{
|
|
stopfxontag( level.fx_airstrike_contrail, self, "tag_right_wingtip" );
|
|
stopfxontag( level.fx_airstrike_contrail, self, "tag_left_wingtip" );
|
|
}
|
|
|
|
startharrierwingfx()
|
|
{
|
|
wait 3.0;
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
playfxontag( level.fx_airstrike_contrail, self, "tag_right_wingtip" );
|
|
playfxontag( level.fx_airstrike_contrail, self, "tag_left_wingtip" );
|
|
}
|
|
|
|
getpathstart( var_0 )
|
|
{
|
|
var_1 = 100;
|
|
var_2 = 15000;
|
|
var_3 = 850;
|
|
var_4 = randomfloat( 360 );
|
|
var_5 = ( 0, var_4, 0 );
|
|
var_6 = var_0 + anglestoforward( var_5 ) * ( -1 * var_2 );
|
|
var_6 = var_6 + ( ( randomfloat( 2 ) - 1 ) * var_1, ( randomfloat( 2 ) - 1 ) * var_1, 0 );
|
|
return var_6;
|
|
}
|
|
|
|
getpathend()
|
|
{
|
|
var_0 = 150;
|
|
var_1 = 15000;
|
|
var_2 = 850;
|
|
var_3 = self.angles[1];
|
|
var_4 = ( 0, var_3, 0 );
|
|
var_5 = self.origin + anglestoforward( var_4 ) * var_1;
|
|
return var_5;
|
|
}
|
|
|
|
fireontarget( var_0, var_1 )
|
|
{
|
|
self endon( "leaving" );
|
|
self endon( "stopfiring" );
|
|
self endon( "explode" );
|
|
self endon( "death" );
|
|
self.besttarget endon( "death" );
|
|
self.besttarget endon( "disconnect" );
|
|
var_2 = gettime();
|
|
var_3 = gettime();
|
|
var_4 = 0;
|
|
self setvehweapon( "harrier_20mm_mp" );
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = 50;
|
|
|
|
for (;;)
|
|
{
|
|
if ( isreadytofire( var_0 ) )
|
|
break;
|
|
else
|
|
wait 0.25;
|
|
}
|
|
|
|
self setturrettargetent( self.besttarget, ( 0, 0, 50 ) );
|
|
var_5 = 25;
|
|
|
|
for (;;)
|
|
{
|
|
if ( var_5 == 25 )
|
|
self playloopsound( "weap_hind_20mm_fire_npc" );
|
|
|
|
var_5--;
|
|
self fireweapon( "tag_flash", self.besttarget, ( 0, 0, 0 ), 0.05 );
|
|
wait 0.1;
|
|
|
|
if ( var_5 <= 0 )
|
|
{
|
|
self stoploopsound();
|
|
wait 1;
|
|
var_5 = 25;
|
|
}
|
|
}
|
|
}
|
|
|
|
isreadytofire( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "leaving" );
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
var_0 = 10;
|
|
|
|
var_1 = anglestoforward( self.angles );
|
|
var_2 = self.besttarget.origin - self.origin;
|
|
var_1 = var_1 * ( 1, 1, 0 );
|
|
var_2 = var_2 * ( 1, 1, 0 );
|
|
var_2 = vectornormalize( var_2 );
|
|
var_1 = vectornormalize( var_1 );
|
|
var_3 = vectordot( var_2, var_1 );
|
|
var_4 = cos( var_0 );
|
|
|
|
if ( var_3 >= var_4 )
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
acquiregroundtarget( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "leaving" );
|
|
|
|
if ( var_0.size == 1 )
|
|
self.besttarget = var_0[0];
|
|
else
|
|
self.besttarget = getbesttarget( var_0 );
|
|
|
|
backtodefendlocation( 0 );
|
|
self notify( "acquiringTarget" );
|
|
self setturrettargetent( self.besttarget );
|
|
self setlookatent( self.besttarget );
|
|
var_1 = getnewpoint( self.origin, 1 );
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = self.origin;
|
|
|
|
self setvehgoalpos( var_1, 1 );
|
|
thread watchtargetdeath();
|
|
thread watchtargetlos();
|
|
self setvehweapon( "harrier_20mm_mp" );
|
|
thread fireontarget();
|
|
}
|
|
|
|
backtodefendlocation( var_0 )
|
|
{
|
|
self setvehgoalpos( self.defendloc, 1 );
|
|
|
|
if ( isdefined( var_0 ) && var_0 )
|
|
self waittill( "goal" );
|
|
}
|
|
|
|
wouldcollide( var_0 )
|
|
{
|
|
var_1 = bullettrace( self.origin, var_0, 1, self );
|
|
|
|
if ( var_1["position"] == var_0 )
|
|
return 0;
|
|
else
|
|
return 1;
|
|
}
|
|
|
|
watchtargetdeath()
|
|
{
|
|
self notify( "watchTargetDeath" );
|
|
self endon( "watchTargetDeath" );
|
|
self endon( "newTarget" );
|
|
self endon( "death" );
|
|
self endon( "leaving" );
|
|
self.besttarget waittill( "death" );
|
|
thread breaktarget();
|
|
}
|
|
|
|
watchtargetlos( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self.besttarget endon( "death" );
|
|
self.besttarget endon( "disconnect" );
|
|
self endon( "leaving" );
|
|
self endon( "newTarget" );
|
|
var_1 = undefined;
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
var_0 = 1000;
|
|
|
|
for (;;)
|
|
{
|
|
if ( !istarget( self.besttarget ) )
|
|
{
|
|
thread breaktarget();
|
|
return;
|
|
}
|
|
|
|
if ( !isdefined( self.besttarget ) )
|
|
{
|
|
thread breaktarget();
|
|
return;
|
|
}
|
|
|
|
if ( self.besttarget sightconetrace( self.origin, self ) < 1 )
|
|
{
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = gettime();
|
|
|
|
if ( gettime() - var_1 > var_0 )
|
|
{
|
|
thread breaktarget();
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
var_1 = undefined;
|
|
|
|
wait 0.25;
|
|
}
|
|
}
|
|
|
|
breaktarget( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self clearlookatent();
|
|
self stoploopsound();
|
|
self notify( "stopfiring" );
|
|
|
|
if ( isdefined( var_0 ) && var_0 )
|
|
return;
|
|
|
|
thread randomharriermovement();
|
|
self notify( "newTarget" );
|
|
thread harriergettargets();
|
|
}
|
|
|
|
harriergettargets()
|
|
{
|
|
self notify( "harrierGetTargets" );
|
|
self endon( "harrierGetTargets" );
|
|
self endon( "death" );
|
|
self endon( "leaving" );
|
|
var_0 = [];
|
|
|
|
for (;;)
|
|
{
|
|
var_0 = [];
|
|
var_1 = level.players;
|
|
|
|
if ( isdefined( level.chopper ) && level.chopper.team != self.team && isalive( level.chopper ) )
|
|
{
|
|
if ( !isdefined( level.chopper.nontarget ) || isdefined( level.chopper.nontarget ) && !level.chopper.nontarget )
|
|
{
|
|
thread engagevehicle( level.chopper );
|
|
return;
|
|
}
|
|
else
|
|
backtodefendlocation( 1 );
|
|
}
|
|
|
|
if ( isdefined( level.littlebirds ) )
|
|
{
|
|
foreach ( var_3 in level.littlebirds )
|
|
{
|
|
if ( isdefined( var_3 ) && var_3.team != self.team && ( isdefined( var_3.helipilottype ) && var_3.helipilottype == "heli_pilot" ) )
|
|
{
|
|
thread engagevehicle( var_3 );
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
for ( var_5 = 0; var_5 < var_1.size; var_5++ )
|
|
{
|
|
var_6 = var_1[var_5];
|
|
|
|
if ( istarget( var_6 ) )
|
|
{
|
|
if ( isdefined( var_1[var_5] ) )
|
|
var_0[var_0.size] = var_1[var_5];
|
|
}
|
|
else
|
|
continue;
|
|
|
|
wait 0.05;
|
|
}
|
|
|
|
if ( var_0.size > 0 )
|
|
{
|
|
acquiregroundtarget( var_0 );
|
|
return;
|
|
}
|
|
|
|
wait 1;
|
|
}
|
|
}
|
|
|
|
istarget( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
|
|
if ( !isalive( var_0 ) || var_0.sessionstate != "playing" )
|
|
return 0;
|
|
|
|
if ( isdefined( self.owner ) && var_0 == self.owner )
|
|
return 0;
|
|
|
|
if ( distance( var_0.origin, self.origin ) > 8192 )
|
|
return 0;
|
|
|
|
if ( distance2d( var_0.origin, self.origin ) < 150 )
|
|
return 0;
|
|
|
|
if ( !isdefined( var_0.pers["team"] ) )
|
|
return 0;
|
|
|
|
if ( level.teambased && var_0.pers["team"] == self.team )
|
|
return 0;
|
|
|
|
if ( var_0.pers["team"] == "spectator" )
|
|
return 0;
|
|
|
|
if ( isdefined( var_0.spawntime ) && ( gettime() - var_0.spawntime ) / 1000 <= 5 )
|
|
return 0;
|
|
|
|
if ( var_0 maps\mp\_utility::_hasperk( "specialty_blindeye" ) )
|
|
return 0;
|
|
|
|
var_1 = self.origin + ( 0, 0, -160 );
|
|
var_2 = anglestoforward( self.angles );
|
|
var_3 = var_1 + 144 * var_2;
|
|
var_4 = var_0 sightconetrace( self.origin, self );
|
|
|
|
if ( var_4 < 1 )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
getbesttarget( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
var_1 = self gettagorigin( "tag_flash" );
|
|
var_2 = self.origin;
|
|
var_3 = anglestoforward( self.angles );
|
|
var_4 = undefined;
|
|
var_5 = undefined;
|
|
var_6 = 0;
|
|
|
|
foreach ( var_8 in var_0 )
|
|
{
|
|
var_9 = abs( vectortoangles( var_8.origin - self.origin )[1] );
|
|
var_10 = abs( self gettagangles( "tag_flash" )[1] );
|
|
var_9 = abs( var_9 - var_10 );
|
|
var_11 = var_8 getweaponslistitems();
|
|
|
|
foreach ( var_13 in var_11 )
|
|
{
|
|
if ( issubstr( var_13, "at4" ) || issubstr( var_13, "stinger" ) || issubstr( var_13, "jav" ) )
|
|
var_9 = var_9 - 40;
|
|
}
|
|
|
|
if ( distance( self.origin, var_8.origin ) > 2000 )
|
|
var_9 = var_9 + 40;
|
|
|
|
if ( !isdefined( var_4 ) )
|
|
{
|
|
var_4 = var_9;
|
|
var_5 = var_8;
|
|
continue;
|
|
}
|
|
|
|
if ( var_4 > var_9 )
|
|
{
|
|
var_4 = var_9;
|
|
var_5 = var_8;
|
|
}
|
|
}
|
|
|
|
return var_5;
|
|
}
|
|
|
|
firemissile( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "leaving" );
|
|
|
|
if ( self.missiles <= 0 )
|
|
return;
|
|
|
|
var_1 = checkforfriendlies( var_0, 256 );
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
return;
|
|
|
|
if ( distance2d( self.origin, var_0.origin ) < 512 )
|
|
return;
|
|
|
|
if ( isdefined( var_1 ) && var_1 )
|
|
return;
|
|
|
|
self.missiles--;
|
|
self setvehweapon( "aamissile_projectile_mp" );
|
|
|
|
if ( isdefined( var_0.targetent ) )
|
|
var_2 = self fireweapon( "tag_flash", var_0.targetent, ( 0, 0, -250 ) );
|
|
else
|
|
var_2 = self fireweapon( "tag_flash", var_0, ( 0, 0, -250 ) );
|
|
|
|
var_2 missile_setflightmodedirect();
|
|
var_2 missile_settargetent( var_0 );
|
|
}
|
|
|
|
checkforfriendlies( var_0, var_1 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "leaving" );
|
|
var_2 = [];
|
|
var_3 = level.players;
|
|
var_4 = var_0.origin;
|
|
|
|
for ( var_5 = 0; var_5 < var_3.size; var_5++ )
|
|
{
|
|
var_6 = var_3[var_5];
|
|
|
|
if ( var_6.team != self.team )
|
|
continue;
|
|
|
|
var_7 = var_6.origin;
|
|
|
|
if ( distance2d( var_7, var_4 ) < 512 )
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
handledestroydamage()
|
|
{
|
|
self waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
|
|
|
if ( var_9 == "aamissile_projectile_mp" && var_4 == "MOD_EXPLOSIVE" && var_0 >= self.health )
|
|
callback_vehicledamage( var_1, var_1, 9001, 0, var_4, var_9, var_3, var_2, var_3, 0, 0, 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 ( ( var_1 == self || isdefined( var_1.pers ) && var_1.pers["team"] == self.team && !level.friendlyfire && level.teambased ) && var_1 != self.owner )
|
|
return;
|
|
|
|
if ( self.health <= 0 )
|
|
return;
|
|
|
|
var_2 = maps\mp\gametypes\_damage::handleapdamage( var_5, var_4, var_2, var_1 );
|
|
|
|
switch ( var_5 )
|
|
{
|
|
case "remotemissile_projectile_mp":
|
|
case "ac130_40mm_mp":
|
|
case "ac130_105mm_mp":
|
|
case "javelin_mp":
|
|
case "stinger_mp":
|
|
case "odin_projectile_large_rod_mp":
|
|
self.largeprojectiledamage = 1;
|
|
var_2 = self.maxhealth + 1;
|
|
break;
|
|
case "rpg_mp":
|
|
case "at4_mp":
|
|
self.largeprojectiledamage = 1;
|
|
var_2 = self.maxhealth - 900;
|
|
break;
|
|
case "odin_projectile_small_rod_mp":
|
|
case "remote_tank_projectile_mp":
|
|
var_2 = int( self.maxhealth * 0.34 );
|
|
self.largeprojectiledamage = 1;
|
|
break;
|
|
case "switch_blade_child_mp":
|
|
case "drone_hive_projectile_mp":
|
|
case "iw6_panzerfaust3_mp":
|
|
var_2 = int( self.maxhealth * 0.25 );
|
|
self.largeprojectiledamage = 1;
|
|
break;
|
|
case "iw6_maaws_mp":
|
|
var_2 = int( self.maxhealth * 0.24 );
|
|
self.largeprojectiledamage = 1;
|
|
break;
|
|
default:
|
|
if ( var_5 != "none" )
|
|
var_2 = int( var_2 / 2 );
|
|
|
|
self.largeprojectiledamage = 0;
|
|
break;
|
|
}
|
|
|
|
maps\mp\killstreaks\_killstreaks::killstreakhit( var_1, var_5, self );
|
|
var_1 maps\mp\gametypes\_damagefeedback::updatedamagefeedback( "" );
|
|
|
|
if ( isplayer( var_1 ) && var_1 maps\mp\_utility::_hasperk( "specialty_armorpiercing" ) )
|
|
{
|
|
var_12 = int( var_2 * level.armorpiercingmod );
|
|
var_2 = var_2 + var_12;
|
|
}
|
|
|
|
if ( self.health <= var_2 )
|
|
{
|
|
if ( isplayer( var_1 ) && ( !isdefined( self.owner ) || var_1 != self.owner ) )
|
|
{
|
|
thread maps\mp\_utility::teamplayercardsplash( "callout_destroyed_harrier", var_1 );
|
|
var_13 = maps\mp\gametypes\_rank::getscoreinfovalue( "destroyed_harrier" );
|
|
var_1 thread maps\mp\gametypes\_rank::xpeventpopup( "destroyed_harrier" );
|
|
var_1 thread maps\mp\gametypes\_rank::giverankxp( "kill", var_13, var_5, var_4 );
|
|
thread maps\mp\gametypes\_missions::vehiclekilled( self.owner, self, undefined, var_1, var_2, var_4, var_5 );
|
|
var_1 notify( "destroyed_killstreak" );
|
|
}
|
|
|
|
if ( var_5 == "heli_pilot_turret_mp" )
|
|
var_1 maps\mp\gametypes\_missions::processchallenge( "ch_enemy_down" );
|
|
|
|
maps\mp\gametypes\_missions::checkaachallenges( var_1, self, var_5 );
|
|
self notify( "death" );
|
|
}
|
|
|
|
if ( self.health - var_2 <= 900 && ( !isdefined( self.smoking ) || !self.smoking ) )
|
|
{
|
|
thread playdamageefx();
|
|
self.smoking = 1;
|
|
}
|
|
|
|
self vehicle_finishdamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11 );
|
|
}
|
|
|
|
playdamageefx()
|
|
{
|
|
self endon( "death" );
|
|
stopfxontag( level.harrier_afterburnerfx, self, "tag_engine_left" );
|
|
playfxontag( level.harrier_smoke, self, "tag_engine_left" );
|
|
stopfxontag( level.harrier_afterburnerfx, self, "tag_engine_right" );
|
|
playfxontag( level.harrier_smoke, self, "tag_engine_right" );
|
|
wait 0.15;
|
|
stopfxontag( level.harrier_afterburnerfx, self, "tag_engine_left2" );
|
|
playfxontag( level.harrier_smoke, self, "tag_engine_left2" );
|
|
stopfxontag( level.harrier_afterburnerfx, self, "tag_engine_right2" );
|
|
playfxontag( level.harrier_smoke, self, "tag_engine_right2" );
|
|
playfxontag( level.chopper_fx["damage"]["heavy_smoke"], self, "tag_engine_left" );
|
|
}
|
|
|
|
harrierdestroyed()
|
|
{
|
|
self endon( "harrier_gone" );
|
|
self waittill( "death" );
|
|
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
if ( !isdefined( self.largeprojectiledamage ) )
|
|
{
|
|
self vehicle_setspeed( 25, 5 );
|
|
thread harrierspin( randomintrange( 180, 220 ) );
|
|
wait( randomfloatrange( 0.5, 1.5 ) );
|
|
}
|
|
|
|
harrierexplode();
|
|
}
|
|
|
|
harrierexplode()
|
|
{
|
|
self playsound( "harrier_jet_crash" );
|
|
level.harriers[level.harriers.size - 1] = undefined;
|
|
var_0 = self gettagangles( "tag_deathfx" );
|
|
playfx( level.harrier_deathfx, self gettagorigin( "tag_deathfx" ), anglestoforward( var_0 ), anglestoup( var_0 ) );
|
|
self notify( "explode" );
|
|
wait 0.05;
|
|
thread harrierdelete();
|
|
}
|
|
|
|
harrierspin( var_0 )
|
|
{
|
|
self endon( "explode" );
|
|
playfxontag( level.chopper_fx["explode"]["medium"], self, "tag_origin" );
|
|
self setyawspeed( var_0, var_0, var_0 );
|
|
|
|
while ( isdefined( self ) )
|
|
{
|
|
self settargetyaw( self.angles[1] + var_0 * 0.9 );
|
|
wait 1;
|
|
}
|
|
}
|
|
|
|
engagevehicle( var_0 )
|
|
{
|
|
var_0 endon( "death" );
|
|
var_0 endon( "leaving" );
|
|
var_0 endon( "crashing" );
|
|
self endon( "death" );
|
|
acquirevehicletarget( var_0 );
|
|
thread fireonvehicletarget();
|
|
}
|
|
|
|
fireonvehicletarget()
|
|
{
|
|
self endon( "leaving" );
|
|
self endon( "stopfiring" );
|
|
self endon( "explode" );
|
|
self.besttarget endon( "crashing" );
|
|
self.besttarget endon( "leaving" );
|
|
self.besttarget endon( "death" );
|
|
var_0 = gettime();
|
|
|
|
if ( isdefined( self.besttarget ) && self.besttarget.classname == "script_vehicle" )
|
|
{
|
|
self setturrettargetent( self.besttarget );
|
|
|
|
for (;;)
|
|
{
|
|
var_1 = distance2d( self.origin, self.besttarget.origin );
|
|
|
|
if ( gettime() - var_0 > 2500 && var_1 > 1000 )
|
|
{
|
|
firemissile( self.besttarget );
|
|
var_0 = gettime();
|
|
}
|
|
|
|
wait 0.1;
|
|
}
|
|
}
|
|
}
|
|
|
|
acquirevehicletarget( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "leaving" );
|
|
self notify( "newTarget" );
|
|
self.besttarget = var_0;
|
|
self notify( "acquiringVehTarget" );
|
|
self setlookatent( self.besttarget );
|
|
thread watchvehtargetdeath();
|
|
thread watchvehtargetcrash();
|
|
self setturrettargetent( self.besttarget );
|
|
}
|
|
|
|
watchvehtargetcrash()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "leaving" );
|
|
self.besttarget endon( "death" );
|
|
self.besttarget endon( "drop_crate" );
|
|
self.besttarget waittill( "crashing" );
|
|
breakvehtarget();
|
|
}
|
|
|
|
watchvehtargetdeath()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "leaving" );
|
|
self.besttarget endon( "crashing" );
|
|
self.besttarget endon( "drop_crate" );
|
|
self.besttarget waittill( "death" );
|
|
breakvehtarget();
|
|
}
|
|
|
|
breakvehtarget()
|
|
{
|
|
self clearlookatent();
|
|
|
|
if ( isdefined( self.besttarget ) && !isdefined( self.besttarget.nontarget ) )
|
|
self.besttarget.nontarget = 1;
|
|
|
|
self notify( "stopfiring" );
|
|
self notify( "newTarget" );
|
|
thread stopharrierwingfx();
|
|
thread engageground();
|
|
}
|
|
|
|
evasivemanuverone()
|
|
{
|
|
self setmaxpitchroll( 15, 80 );
|
|
self vehicle_setspeed( 50, 100 );
|
|
self setyawspeed( 90, 30, 30, 0.5 );
|
|
var_0 = self.origin;
|
|
var_1 = self.angles[1];
|
|
|
|
if ( common_scripts\utility::cointoss() )
|
|
var_2 = ( 0, var_1 + 90, 0 );
|
|
else
|
|
var_2 = ( 0, var_1 - 90, 0 );
|
|
|
|
var_3 = self.origin + anglestoforward( var_2 ) * 500;
|
|
self setvehgoalpos( var_3, 1 );
|
|
self waittill( "goal" );
|
|
}
|
|
|
|
addtohelilist()
|
|
{
|
|
level.helis[self getentitynumber()] = self;
|
|
}
|
|
|
|
removefromhelilistondeath()
|
|
{
|
|
var_0 = self getentitynumber();
|
|
self waittill( "death" );
|
|
level.helis[var_0] = undefined;
|
|
}
|
|
|
|
monitorowner()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "leaving" );
|
|
|
|
if ( !isdefined( self.owner ) || self.owner.team != self.team )
|
|
{
|
|
thread harrierleave();
|
|
return;
|
|
}
|
|
|
|
self.owner common_scripts\utility::waittill_any( "joined_team", "disconnect" );
|
|
thread harrierleave();
|
|
}
|