328 lines
7.5 KiB
Plaintext
328 lines
7.5 KiB
Plaintext
#include maps\mp\_utility;
|
|
#include common_scripts\utility;
|
|
|
|
/*******************************************************************
|
|
// _aastrike.gsc
|
|
//
|
|
// Holds all the aastrike specific functions
|
|
//
|
|
// Jordan Hirsh Jan. 25th 2011
|
|
********************************************************************/
|
|
|
|
|
|
init()
|
|
{
|
|
precacheItem( "aamissile_projectile_mp" );
|
|
precacheModel( "vehicle_av8b_harrier_jet_mp" );
|
|
|
|
|
|
level.teamAirDenied["axis"] = false;
|
|
level.teamAirDenied["allies"] = false;
|
|
|
|
level.rockets = [];
|
|
level.killstreakFuncs["aastrike"] = ::tryUseAAStrike;
|
|
}
|
|
|
|
|
|
tryUseAAStrike( lifeId, streakName )
|
|
{
|
|
/#
|
|
heightEnt = GetEnt( "airstrikeheight", "targetname" );
|
|
assertEx( isDefined( heightEnt ), "NO HEIGHT ENT IN LEVEL: Don't know what this means, ask Ned or Jordan" );
|
|
|
|
if ( !isDefined(heightEnt) )
|
|
return false;
|
|
#/
|
|
|
|
self maps\mp\_matchdata::logKillstreakEvent( "aastrike", self.origin );
|
|
|
|
self thread finishAAStrike( lifeId );
|
|
self thread teamPlayerCardSplash( "used_aastrike", self, self.team );
|
|
return true;
|
|
}
|
|
|
|
cycleTargets()
|
|
{
|
|
self endon("stopFindingTargets");
|
|
self endon("disconnect");
|
|
self endon ( "owner_gone" );
|
|
self endon ( "game_ended" );
|
|
|
|
for( ;; )
|
|
{
|
|
wait(.05);
|
|
self findTargets();
|
|
wait( randomIntRange(4,5) );
|
|
}
|
|
|
|
}
|
|
|
|
findTargets()
|
|
{
|
|
|
|
self endon ( "disconnect" );
|
|
self endon ( "owner_gone" );
|
|
self endon ( "game_ended" );
|
|
|
|
lbTargets = [];
|
|
heliTargets = [];
|
|
uavTargets = [];
|
|
|
|
if ( isDefined( level.littleBirds ) && level.littleBirds.size )
|
|
{
|
|
foreach ( lb in level.littleBirds )
|
|
{
|
|
if ( isDefined( lb.team ) && lb.team != self.team )
|
|
lbTargets[lbTargets.size] = lb;
|
|
}
|
|
}
|
|
|
|
if ( isDefined(level.helis) && level.helis.size )
|
|
{
|
|
foreach ( heli in level.helis )
|
|
{
|
|
if ( heli.team != self.team )
|
|
heliTargets[heliTargets.size] = heli;
|
|
}
|
|
}
|
|
|
|
otherTeam = getOtherTeam( self.team );
|
|
|
|
if ( isDefined( level.activeUAVs[otherTeam] ) )
|
|
{
|
|
foreach ( uav in level.uavmodels[otherTeam] )
|
|
{
|
|
uavTargets[uavTargets.size] = uav;
|
|
}
|
|
}
|
|
|
|
targetCount = 0;
|
|
foreach( lb in lbTargets )
|
|
{
|
|
wait( 3 );
|
|
|
|
if ( targetCount % 2 )
|
|
self thread fireAtTarget( lb, self.team, true );
|
|
else
|
|
self thread fireAtTarget( lb, self.team, false );
|
|
|
|
targetCount++;
|
|
}
|
|
|
|
foreach( heli in heliTargets )
|
|
{
|
|
wait( 3 );
|
|
self thread fireAtTarget( heli, self.team, true );
|
|
}
|
|
|
|
foreach( uav in uavTargets )
|
|
{
|
|
wait( 0.5 );
|
|
self thread fireAtTarget( uav, self.team, false );
|
|
}
|
|
|
|
/*
|
|
if( level.ac130InUse && isDefined( level.ac130.owner ) && level.ac130.owner.team != self.team )
|
|
{
|
|
ac130Target = level.ac130.planemodel;
|
|
wait( 6 );
|
|
self thread fireAtTarget( ac130Target, self.team, true );
|
|
}
|
|
*/
|
|
|
|
}
|
|
|
|
earlyAbortWatcher()
|
|
{
|
|
self endon( "stopFindingTargets" );
|
|
|
|
team = self.team;
|
|
|
|
if ( bot_is_fireteam_mode() )
|
|
{
|
|
self waittill( "killstreak_disowned" );
|
|
}
|
|
else
|
|
{
|
|
self waittill_either( "killstreak_disowned", "game_ended" );
|
|
}
|
|
|
|
self notify( "owner_gone" );
|
|
|
|
level.teamAirDenied[getOtherTeam(team)] = false;
|
|
level.airDeniedPlayer = undefined;
|
|
}
|
|
|
|
finishAAStrike( lifeId )
|
|
{
|
|
self endon ( "disconnect" );
|
|
self endon ( "owner_gone" );
|
|
self endon ( "game_ended" );
|
|
|
|
//message air up there
|
|
level.teamAirDenied[getOtherTeam(self.team)] = true;
|
|
level.airDeniedPlayer = self;
|
|
self thread earlyAbortWatcher();
|
|
|
|
//splash incoming in 10
|
|
//wait ( 1 );
|
|
//splash incoming in 9
|
|
//wait(3)
|
|
//splash incoming in 6
|
|
//wait(4)
|
|
//splash incoming in 2
|
|
//wait( 1 )
|
|
//splash incoming in 1
|
|
|
|
self thread cycleTargets();
|
|
|
|
for( i = 0; i < 4; i++ )
|
|
{
|
|
wait ( 6 );
|
|
if ( i == 1 || i == 3 )
|
|
self thread doFlyBy( true );
|
|
else
|
|
self thread doFlyBy( false );
|
|
}
|
|
|
|
wait(3);
|
|
|
|
self notify("stopFindingTargets");
|
|
level.teamAirDenied[getOtherTeam(self.team)] = false;
|
|
level.airDeniedPlayer = undefined;
|
|
}
|
|
|
|
fireAtTarget( curTarget, team, showIcon )
|
|
{
|
|
if ( !isDefined(curTarget) )
|
|
return;
|
|
|
|
upVector = (0, 0, 14000 );
|
|
miniUpVector = (0, 0, 1500);
|
|
backDist = 15000;
|
|
forwardDist = 20000;
|
|
|
|
targetPos = curTarget.origin;
|
|
upVector = (0,0,1) * (targetPos) + (0,0,1000);
|
|
|
|
curTargetYaw = curTarget.angles * (0,1,0);
|
|
|
|
forward = AnglesToForward( curTargetYaw );
|
|
startpos = curTarget.origin + miniUpVector + forward * backDist * -1;
|
|
endPos = curTarget.origin + miniUpVector + forward * forwardDist;
|
|
|
|
rocket1 = MagicBullet( "aamissile_projectile_mp", startpos + (0,0,-75), curTarget.origin, self );
|
|
rocket1 Missile_SetTargetEnt( curTarget );
|
|
rocket1 Missile_SetFlightmodeDirect();
|
|
|
|
rocket2 = MagicBullet( "aamissile_projectile_mp", startpos + (RandomInt(500), RandomInt(500), -75), curTarget.origin, self );
|
|
rocket2 Missile_SetTargetEnt( curTarget );
|
|
rocket2 Missile_SetFlightmodeDirect();
|
|
|
|
if ( showIcon )
|
|
plane = spawnplane( self, "script_model", startpos, "compass_objpoint_airstrike_friendly", "compass_objpoint_airstrike_friendly" );
|
|
else
|
|
plane = spawnplane( self, "script_model", startpos );
|
|
|
|
if ( self.team == "allies" )
|
|
plane setModel( "vehicle_av8b_harrier_jet_mp" );
|
|
else
|
|
plane setModel( "vehicle_av8b_harrier_jet_opfor_mp" );
|
|
|
|
length = distance(startPos, endPos);
|
|
|
|
plane.angles = vectorToAngles( endPos-startPos );
|
|
|
|
plane thread AASoundManager(length);
|
|
plane thread playPlaneFx();
|
|
|
|
length = distance(startPos, endPos);
|
|
plane moveTo( endPos * 2, length/2000, 0, 0 );
|
|
|
|
wait( length/3000 );
|
|
plane delete();
|
|
}
|
|
|
|
|
|
AASoundManager( length )
|
|
{
|
|
self playloopsound( "veh_aastrike_flyover_loop" );
|
|
|
|
wait( (length/2) / 2000 );
|
|
self stopLoopSound();
|
|
self playloopsound( "veh_aastrike_flyover_outgoing_loop" );
|
|
}
|
|
|
|
|
|
doFlyBy( showIcon )
|
|
{
|
|
self endon ( "disconnect" );
|
|
|
|
randSpawn = randomInt( level.spawnPoints.size - 1 );
|
|
targetPos = level.spawnPoints[randSpawn].origin * (1,1,0);
|
|
|
|
backDist = 20000;
|
|
forwardDist = 20000;
|
|
heightEnt = GetEnt( "airstrikeheight", "targetname" );
|
|
|
|
upVector = (0, 0, heightEnt.origin[2] + randomIntRange(-100, 600) );
|
|
|
|
forward = AnglesToForward( (0,randomInt(45),0) );
|
|
|
|
startpos = targetPos + upVector + forward * backDist * -1;
|
|
endPos = targetPos + upVector + forward * forwardDist;
|
|
|
|
plane2StartPos = startpos + ( randomIntRange(400,500), randomIntRange(400,500), randomIntRange(200,300) );
|
|
plane2EndPos = endPos + ( randomIntRange(400,500), randomIntRange(400,500), randomIntRange(200,300) );
|
|
|
|
if ( showIcon )
|
|
plane = spawnplane( self, "script_model", startpos, "hud_minimap_harrier_green", "hud_minimap_harrier_red" );
|
|
else
|
|
plane = spawnplane( self, "script_model", startpos );
|
|
|
|
plane2 = spawnplane( self, "script_model", plane2StartPos );
|
|
|
|
if ( self.team == "allies" )
|
|
{
|
|
plane setModel( "vehicle_av8b_harrier_jet_mp" );
|
|
plane2 setModel( "vehicle_av8b_harrier_jet_mp" );
|
|
}
|
|
else
|
|
{
|
|
plane setModel( "vehicle_av8b_harrier_jet_opfor_mp" );
|
|
plane2 setModel( "vehicle_av8b_harrier_jet_opfor_mp" );
|
|
}
|
|
|
|
plane.angles = vectorToAngles( endPos-startPos );
|
|
plane playloopsound( "veh_aastrike_flyover_loop" );
|
|
plane thread playPlaneFx();
|
|
|
|
plane2.angles = vectorToAngles( endPos-plane2StartPos );
|
|
plane2 thread playPlaneFx();
|
|
|
|
length = distance(startPos, endPos);
|
|
plane moveTo( endPos * 2, length/1800, 0, 0 );
|
|
wait( randomFloatRange( .25, .5 ) );
|
|
plane2 moveTo( plane2EndPos * 2, length/1800, 0, 0 );
|
|
|
|
wait( length/1600 );
|
|
plane delete();
|
|
plane2 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" );
|
|
}
|
|
|