mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-10 18:57:58 -05:00
816 lines
22 KiB
Plaintext
816 lines
22 KiB
Plaintext
#include maps/mp/killstreaks/_spyplane;
|
|
#include maps/mp/_popups;
|
|
#include maps/mp/_challenges;
|
|
#include maps/mp/_scoreevents;
|
|
#include maps/mp/gametypes/_weapon_utils;
|
|
#include maps/mp/gametypes/_damagefeedback;
|
|
#include maps/mp/gametypes/_weaponobjects;
|
|
#include maps/mp/gametypes/_hostmigration;
|
|
#include maps/mp/gametypes/_spawning;
|
|
#include maps/mp/gametypes/_hud;
|
|
#include maps/mp/gametypes/_gameobjects;
|
|
#include maps/mp/_heatseekingmissile;
|
|
#include maps/mp/killstreaks/_killstreakrules;
|
|
#include maps/mp/gametypes/_spawnlogic;
|
|
#include maps/mp/killstreaks/_helicopter;
|
|
#include maps/mp/killstreaks/_airsupport;
|
|
#include maps/mp/killstreaks/_killstreaks;
|
|
#include common_scripts/utility;
|
|
#include maps/mp/gametypes/_hud_util;
|
|
#include maps/mp/_utility;
|
|
|
|
init()
|
|
{
|
|
precachemodel( "veh_t6_drone_pegasus_mp" );
|
|
precacheshader( "compass_lodestar" );
|
|
precacheitem( "remote_mortar_missile_mp" );
|
|
precachestring( &"remotemortar" );
|
|
level.remote_mortar_fx[ "laserTarget" ] = loadfx( "weapon/remote_mortar/fx_rmt_mortar_laser_loop" );
|
|
level.remote_mortar_fx[ "missileExplode" ] = loadfx( "weapon/remote_mortar/fx_rmt_mortar_explosion" );
|
|
registerkillstreak( "remote_mortar_mp", "remote_mortar_mp", "killstreak_remote_mortar", "remote_mortar_used", ::remote_mortar_killstreak, 1 );
|
|
registerkillstreakaltweapon( "remote_mortar_mp", "remote_mortar_missile_mp" );
|
|
registerkillstreakstrings( "remote_mortar_mp", &"KILLSTREAK_EARNED_REMOTE_MORTAR", &"KILLSTREAK_REMOTE_MORTAR_NOT_AVAILABLE", &"KILLSTREAK_REMOTE_MORTAR_INBOUND" );
|
|
registerkillstreakdialog( "remote_mortar_mp", "mpl_killstreak_planemortar", "kls_reaper_used", "", "kls_reaper_enemy", "", "kls_reaper_ready" );
|
|
registerkillstreakdevdvar( "remote_mortar_mp", "scr_givemortarremote" );
|
|
setkillstreakteamkillpenaltyscale( "remote_mortar_mp", level.teamkillreducedpenalty );
|
|
overrideentitycameraindemo( "remote_mortar_mp", 1 );
|
|
set_dvar_float_if_unset( "scr_remote_mortar_lifetime", 45 );
|
|
level.remore_mortar_infrared_vision = "remote_mortar_infrared";
|
|
level.remore_mortar_enhanced_vision = "remote_mortar_enhanced";
|
|
minimaporigins = getentarray( "minimap_corner", "targetname" );
|
|
if ( minimaporigins.size )
|
|
{
|
|
uavorigin = maps/mp/gametypes/_spawnlogic::findboxcenter( minimaporigins[ 0 ].origin, minimaporigins[ 1 ].origin );
|
|
}
|
|
else
|
|
{
|
|
uavorigin = ( 0, 0, 1 );
|
|
}
|
|
if ( level.script == "mp_la" )
|
|
{
|
|
uavorigin += vectorScale( ( 0, 0, 1 ), 1200 );
|
|
}
|
|
if ( level.script == "mp_hydro" )
|
|
{
|
|
uavorigin += vectorScale( ( 0, 0, 1 ), 2000 );
|
|
}
|
|
if ( level.script == "mp_concert" )
|
|
{
|
|
uavorigin += vectorScale( ( 0, 0, 1 ), 750 );
|
|
}
|
|
if ( level.script == "mp_vertigo" )
|
|
{
|
|
uavorigin += vectorScale( ( 0, 0, 1 ), 500 );
|
|
}
|
|
level.remotemortarrig = spawn( "script_model", uavorigin );
|
|
level.remotemortarrig setmodel( "tag_origin" );
|
|
level.remotemortarrig.angles = vectorScale( ( 0, 0, 1 ), 115 );
|
|
level.remotemortarrig hide();
|
|
level.remotemortarrig thread rotaterig( 1 );
|
|
level.remote_zoffset = 8000;
|
|
level.remote_radiusoffset = 9000;
|
|
remote_mortar_height = getstruct( "remote_mortar_height", "targetname" );
|
|
if ( isDefined( remote_mortar_height ) )
|
|
{
|
|
level.remote_radiusoffset = ( remote_mortar_height.origin[ 2 ] / level.remote_zoffset ) * level.remote_radiusoffset;
|
|
level.remote_zoffset = remote_mortar_height.origin[ 2 ];
|
|
}
|
|
}
|
|
|
|
remote_mortar_killstreak( hardpointtype )
|
|
{
|
|
/#
|
|
assert( hardpointtype == "remote_mortar_mp" );
|
|
#/
|
|
if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 )
|
|
{
|
|
return 0;
|
|
}
|
|
if ( !self isonground() || self isusingremote() )
|
|
{
|
|
self iprintlnbold( &"KILLSTREAK_REMOTE_MORTAR_NOT_USABLE" );
|
|
return 0;
|
|
}
|
|
self setusingremote( hardpointtype );
|
|
self freezecontrolswrapper( 1 );
|
|
self disableweaponcycling();
|
|
result = self maps/mp/killstreaks/_killstreaks::initridekillstreak( "qrdrone" );
|
|
if ( result != "success" )
|
|
{
|
|
if ( result != "disconnect" )
|
|
{
|
|
self notify( "remote_mortar_unlock" );
|
|
self clearusingremote();
|
|
self enableweaponcycling();
|
|
}
|
|
return 0;
|
|
}
|
|
killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team, 0, 1 );
|
|
if ( killstreak_id == -1 )
|
|
{
|
|
self clearusingremote();
|
|
self enableweaponcycling();
|
|
self notify( "remote_mortar_unlock" );
|
|
return 0;
|
|
}
|
|
self.killstreak_waitamount = getDvarFloat( #"F9AB897A" ) * 1000;
|
|
remote = self remote_mortar_spawn();
|
|
remote setdrawinfrared( 1 );
|
|
remote thread remote_killstreak_abort();
|
|
remote thread remote_killstreak_game_end();
|
|
remote thread remote_owner_exit();
|
|
remote thread remote_owner_teamkillkicked();
|
|
remote thread remote_damage_think();
|
|
remote thread play_lockon_sounds( self );
|
|
remote thread maps/mp/_heatseekingmissile::missiletarget_lockonmonitor( self, "remote_end" );
|
|
remote thread maps/mp/_heatseekingmissile::missiletarget_proximitydetonateincomingmissile( "crashing" );
|
|
remote.killstreak_id = killstreak_id;
|
|
remote thread play_remote_fx();
|
|
remote playloopsound( "mpl_ks_reaper_exterior_loop", 1 );
|
|
self.pilottalking = 0;
|
|
remote.copilotvoicenumber = self.bcvoicenumber;
|
|
remote.pilotvoicenumber = self.bcvoicenumber + 1;
|
|
if ( remote.pilotvoicenumber > 3 )
|
|
{
|
|
remote.pilotvoicenumber = 0;
|
|
}
|
|
self clientnotify( "krms" );
|
|
self player_linkto_remote( remote );
|
|
self freezecontrolswrapper( 0 );
|
|
self thread player_aim_think( remote );
|
|
self thread player_fire_think( remote );
|
|
self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( "remote_mortar_mp", self.pers[ "team" ] );
|
|
remote thread remote_killstreak_copilot( remote.copilotvoicenumber );
|
|
level.globalkillstreakscalled++;
|
|
self addweaponstat( "remote_mortar_mp", "used", 1 );
|
|
self thread visionswitch();
|
|
level waittill( "remote_unlinked" );
|
|
if ( isDefined( remote ) )
|
|
{
|
|
remote stoploopsound( 4 );
|
|
}
|
|
if ( !isDefined( self ) )
|
|
{
|
|
return 1;
|
|
}
|
|
self clientnotify( "krme" );
|
|
self clearclientflag( 1 );
|
|
self clientnotify( "nofutz" );
|
|
self clearusingremote();
|
|
return 1;
|
|
}
|
|
|
|
remote_killstreak_copilot( voice )
|
|
{
|
|
level endon( "remote_end" );
|
|
wait 2,5;
|
|
while ( 1 )
|
|
{
|
|
self thread playpilotdialog( "reaper_used", 0, voice );
|
|
wait randomfloatrange( 4,5, 15 );
|
|
}
|
|
}
|
|
|
|
remote_killstreak_abort()
|
|
{
|
|
level endon( "remote_end" );
|
|
/#
|
|
assert( isDefined( self.owner ) );
|
|
#/
|
|
/#
|
|
assert( isplayer( self.owner ) );
|
|
#/
|
|
self.owner waittill_any( "disconnect", "joined_team", "joined_spectators" );
|
|
self thread remote_killstreak_end( 0, 1 );
|
|
}
|
|
|
|
remote_owner_teamkillkicked( hardpointtype )
|
|
{
|
|
level endon( "remote_end" );
|
|
self.owner waittill( "teamKillKicked" );
|
|
self thread remote_killstreak_end();
|
|
}
|
|
|
|
remote_owner_exit()
|
|
{
|
|
level endon( "remote_end" );
|
|
wait 1;
|
|
while ( 1 )
|
|
{
|
|
timeused = 0;
|
|
while ( self.owner usebuttonpressed() )
|
|
{
|
|
timeused += 0,05;
|
|
if ( timeused > 0,25 )
|
|
{
|
|
self thread remote_killstreak_end();
|
|
return;
|
|
}
|
|
wait 0,05;
|
|
}
|
|
wait 0,05;
|
|
}
|
|
}
|
|
|
|
remote_killstreak_game_end()
|
|
{
|
|
level endon( "remote_end" );
|
|
/#
|
|
assert( isDefined( self.owner ) );
|
|
#/
|
|
/#
|
|
assert( isplayer( self.owner ) );
|
|
#/
|
|
level waittill( "game_ended" );
|
|
self thread remote_killstreak_end();
|
|
}
|
|
|
|
remote_mortar_spawn()
|
|
{
|
|
self setclientflag( 1 );
|
|
self clientnotify( "reapfutz" );
|
|
remote = spawnplane( self, "script_model", level.remotemortarrig gettagorigin( "tag_origin" ) );
|
|
/#
|
|
assert( isDefined( remote ) );
|
|
#/
|
|
remote setmodel( "veh_t6_drone_pegasus_mp" );
|
|
remote.targetname = "remote_mortar";
|
|
remote setowner( self );
|
|
remote setteam( self.team );
|
|
remote.team = self.team;
|
|
remote.owner = self;
|
|
remote.numflares = 2;
|
|
remote.flareoffset = vectorScale( ( 0, 0, 1 ), 256 );
|
|
remote.attackers = [];
|
|
remote.attackerdata = [];
|
|
remote.attackerdamage = [];
|
|
remote.flareattackerdamage = [];
|
|
remote.pilotvoicenumber = self.bcvoicenumber + 1;
|
|
if ( remote.pilotvoicenumber > 3 )
|
|
{
|
|
remote.pilotvoicenumber = 0;
|
|
}
|
|
angle = randomint( 360 );
|
|
xoffset = cos( angle ) * level.remote_radiusoffset;
|
|
yoffset = sin( angle ) * level.remote_radiusoffset;
|
|
anglevector = vectornormalize( ( xoffset, yoffset, level.remote_zoffset ) );
|
|
anglevector *= 6100;
|
|
remote linkto( level.remotemortarrig, "tag_origin", anglevector, ( 0, angle - 90, 0 ) );
|
|
remoteobjidfriendly = maps/mp/gametypes/_gameobjects::getnextobjid();
|
|
objective_add( remoteobjidfriendly, "invisible", remote.origin, &"remotemortar", self );
|
|
objective_state( remoteobjidfriendly, "active" );
|
|
objective_onentity( remoteobjidfriendly, remote );
|
|
objective_team( remoteobjidfriendly, self.team );
|
|
self.remoteobjidfriendly = remoteobjidfriendly;
|
|
remote.fx = spawn( "script_model", ( 0, 0, 1 ) );
|
|
remote.fx setmodel( "tag_origin" );
|
|
remote.fx setinvisibletoplayer( remote.owner, 1 );
|
|
remote remote_mortar_visibility();
|
|
target_setturretaquire( remote, 1 );
|
|
return remote;
|
|
}
|
|
|
|
rotaterig( clockwise )
|
|
{
|
|
turn = 360;
|
|
if ( clockwise )
|
|
{
|
|
turn = -360;
|
|
}
|
|
for ( ;; )
|
|
{
|
|
if ( !clockwise )
|
|
{
|
|
self rotateyaw( turn, 30 );
|
|
wait 30;
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
self rotateyaw( turn, 45 );
|
|
wait 45;
|
|
}
|
|
}
|
|
}
|
|
|
|
remote_mortar_visibility()
|
|
{
|
|
players = get_players();
|
|
_a315 = players;
|
|
_k315 = getFirstArrayKey( _a315 );
|
|
while ( isDefined( _k315 ) )
|
|
{
|
|
player = _a315[ _k315 ];
|
|
if ( player == self.owner )
|
|
{
|
|
self setinvisibletoplayer( player );
|
|
}
|
|
else
|
|
{
|
|
self setvisibletoplayer( player );
|
|
}
|
|
_k315 = getNextArrayKey( _a315, _k315 );
|
|
}
|
|
}
|
|
|
|
play_lockon_sounds( player )
|
|
{
|
|
player endon( "disconnect" );
|
|
self endon( "death" );
|
|
self endon( "remote_end" );
|
|
self.locksounds = spawn( "script_model", self.origin );
|
|
wait 0,1;
|
|
self.locksounds linkto( self, "tag_player" );
|
|
while ( 1 )
|
|
{
|
|
self waittill( "locking on" );
|
|
while ( 1 )
|
|
{
|
|
if ( enemy_locking() )
|
|
{
|
|
self playsoundtoplayer( "uin_alert_lockon", player );
|
|
wait 0,125;
|
|
}
|
|
if ( enemy_locked() )
|
|
{
|
|
self playsoundtoplayer( "uin_alert_lockon", player );
|
|
wait 0,125;
|
|
}
|
|
if ( !enemy_locking() && !enemy_locked() )
|
|
{
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
enemy_locking()
|
|
{
|
|
if ( isDefined( self.locking_on ) && self.locking_on )
|
|
{
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
enemy_locked()
|
|
{
|
|
if ( isDefined( self.locked_on ) && self.locked_on )
|
|
{
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
create_remote_mortar_hud( remote )
|
|
{
|
|
self.missile_hud = newclienthudelem( self );
|
|
self.missile_hud.alignx = "left";
|
|
self.missile_hud.aligny = "bottom";
|
|
self.missile_hud.horzalign = "user_left";
|
|
self.missile_hud.vertalign = "user_bottom";
|
|
self.missile_hud.font = "small";
|
|
self.missile_hud settext( "[{+attack}]" + "Fire Missile" );
|
|
self.missile_hud.hidewheninmenu = 1;
|
|
self.missile_hud.hidewhenindemo = 1;
|
|
self.missile_hud.x = 5;
|
|
self.missile_hud.y = -40;
|
|
self.missile_hud.fontscale = 1,25;
|
|
self.zoom_hud = newclienthudelem( self );
|
|
self.zoom_hud.alignx = "left";
|
|
self.zoom_hud.aligny = "bottom";
|
|
self.zoom_hud.horzalign = "user_left";
|
|
self.zoom_hud.vertalign = "user_bottom";
|
|
self.zoom_hud.font = "small";
|
|
self.zoom_hud settext( &"KILLSTREAK_INCREASE_ZOOM" );
|
|
self.zoom_hud.hidewheninmenu = 1;
|
|
self.zoom_hud.hidewhenindemo = 1;
|
|
self.zoom_hud.x = 5;
|
|
self.zoom_hud.y = -25;
|
|
self.zoom_hud.fontscale = 1,25;
|
|
self.hud_prompt_exit = newclienthudelem( self );
|
|
self.hud_prompt_exit.alignx = "left";
|
|
self.hud_prompt_exit.aligny = "bottom";
|
|
self.hud_prompt_exit.horzalign = "user_left";
|
|
self.hud_prompt_exit.vertalign = "user_bottom";
|
|
self.hud_prompt_exit.font = "small";
|
|
self.hud_prompt_exit.fontscale = 1,25;
|
|
self.hud_prompt_exit.hidewheninmenu = 1;
|
|
self.hud_prompt_exit.hidewhenindemo = 1;
|
|
self.hud_prompt_exit.archived = 0;
|
|
self.hud_prompt_exit.x = 5;
|
|
self.hud_prompt_exit.y = -10;
|
|
self.hud_prompt_exit settext( level.remoteexithint );
|
|
self thread fade_out_hint_hud( remote );
|
|
}
|
|
|
|
fade_out_hint_hud( remote )
|
|
{
|
|
self endon( "disconnect" );
|
|
remote endon( "death" );
|
|
wait 8;
|
|
time = 0;
|
|
while ( time < 2 )
|
|
{
|
|
if ( !isDefined( self.missile_hud ) )
|
|
{
|
|
return;
|
|
}
|
|
self.missile_hud.alpha -= 0,025;
|
|
self.zoom_hud.alpha -= 0,025;
|
|
time += 0,05;
|
|
wait 0,05;
|
|
}
|
|
self.missile_hud.alpha = 0;
|
|
self.zoom_hud.alpha = 0;
|
|
}
|
|
|
|
remove_hud()
|
|
{
|
|
if ( isDefined( self.missile_hud ) )
|
|
{
|
|
self.missile_hud destroy();
|
|
}
|
|
if ( isDefined( self.zoom_hud ) )
|
|
{
|
|
self.zoom_hud destroy();
|
|
}
|
|
if ( isDefined( self.hud_prompt_exit ) )
|
|
{
|
|
self.hud_prompt_exit destroy();
|
|
}
|
|
}
|
|
|
|
remote_killstreak_end( explode, disconnected )
|
|
{
|
|
level notify( "remote_end" );
|
|
if ( !isDefined( explode ) )
|
|
{
|
|
explode = 0;
|
|
}
|
|
if ( !isDefined( disconnected ) )
|
|
{
|
|
disconnected = 0;
|
|
}
|
|
if ( isDefined( self.owner ) )
|
|
{
|
|
if ( disconnected == 0 )
|
|
{
|
|
if ( explode )
|
|
{
|
|
self.owner sendkillstreakdamageevent( 600 );
|
|
self.owner thread maps/mp/gametypes/_hud::fadetoblackforxsec( 0,5, 0,5, 0,1, 0,25 );
|
|
wait 1;
|
|
}
|
|
else
|
|
{
|
|
self.owner sendkillstreakdamageevent( 600 );
|
|
self.owner thread maps/mp/gametypes/_hud::fadetoblackforxsec( 0, 0,25, 0,1, 0,25 );
|
|
wait 0,25;
|
|
}
|
|
}
|
|
self.owner unlink();
|
|
self.owner.killstreak_waitamount = undefined;
|
|
self.owner enableweaponcycling();
|
|
self.owner remove_hud();
|
|
if ( isDefined( level.gameended ) && level.gameended )
|
|
{
|
|
self.owner freezecontrolswrapper( 1 );
|
|
}
|
|
}
|
|
self maps/mp/gametypes/_spawning::remove_tvmissile_influencers();
|
|
objective_delete( self.owner.remoteobjidfriendly );
|
|
releaseobjid( self.owner.remoteobjidfriendly );
|
|
target_setturretaquire( self, 0 );
|
|
level notify( "remote_unlinked" );
|
|
maps/mp/killstreaks/_killstreakrules::killstreakstop( "remote_mortar_mp", self.team, self.killstreak_id );
|
|
if ( isDefined( self.owner ) )
|
|
{
|
|
self.owner setinfraredvision( 0 );
|
|
self.owner useservervisionset( 0 );
|
|
}
|
|
if ( isDefined( self.fx ) )
|
|
{
|
|
self.fx delete();
|
|
}
|
|
if ( explode )
|
|
{
|
|
self remote_explode();
|
|
}
|
|
else
|
|
{
|
|
self remote_leave();
|
|
}
|
|
}
|
|
|
|
player_linkto_remote( remote )
|
|
{
|
|
leftarc = 40;
|
|
rightarc = 40;
|
|
uparc = 25;
|
|
downarc = 65;
|
|
if ( isDefined( level.remotemotarviewleft ) )
|
|
{
|
|
leftarc = level.remotemotarviewleft;
|
|
}
|
|
if ( isDefined( level.remotemotarviewright ) )
|
|
{
|
|
rightarc = level.remotemotarviewright;
|
|
}
|
|
if ( isDefined( level.remotemotarviewup ) )
|
|
{
|
|
uparc = level.remotemotarviewup;
|
|
}
|
|
if ( isDefined( level.remotemotarviewdown ) )
|
|
{
|
|
downarc = level.remotemotarviewdown;
|
|
}
|
|
/#
|
|
leftarc = getdvarintdefault( "scr_remotemortar_right", leftarc );
|
|
rightarc = getdvarintdefault( "scr_remotemortar_left", rightarc );
|
|
uparc = getdvarintdefault( "scr_remotemortar_up", uparc );
|
|
downarc = getdvarintdefault( "scr_remotemortar_down", downarc );
|
|
#/
|
|
self playerlinkweaponviewtodelta( remote, "tag_player", 1, leftarc, rightarc, uparc, downarc );
|
|
self player_center_view();
|
|
}
|
|
|
|
player_center_view( org )
|
|
{
|
|
wait 0,05;
|
|
lookvec = vectorToAngle( level.uavrig.origin - self geteye() );
|
|
self setplayerangles( lookvec );
|
|
}
|
|
|
|
player_aim_think( remote )
|
|
{
|
|
level endon( "remote_end" );
|
|
wait 0,25;
|
|
playfxontag( level.remote_mortar_fx[ "laserTarget" ], remote.fx, "tag_origin" );
|
|
remote.fx playloopsound( "mpl_ks_reaper_laser" );
|
|
while ( 1 )
|
|
{
|
|
origin = self geteye();
|
|
forward = anglesToForward( self getplayerangles() );
|
|
endpoint = origin + ( forward * 15000 );
|
|
trace = bullettrace( origin, endpoint, 0, remote );
|
|
remote.fx.origin = trace[ "position" ];
|
|
remote.fx.angles = vectorToAngle( trace[ "normal" ] );
|
|
if ( isDefined( self.pegasus_influencer ) )
|
|
{
|
|
removeinfluencer( self.pegasus_influencer );
|
|
self.pegasus_influencer = undefined;
|
|
}
|
|
if ( isDefined( self.active_pegasus ) )
|
|
{
|
|
self.pegasus_influencer = maps/mp/gametypes/_spawning::create_pegasus_influencer( trace[ "position" ], self.team );
|
|
}
|
|
wait 0,05;
|
|
}
|
|
}
|
|
|
|
player_fire_think( remote )
|
|
{
|
|
level endon( "remote_end" );
|
|
end_time = getTime() + self.killstreak_waitamount;
|
|
shot = 0;
|
|
while ( getTime() < end_time )
|
|
{
|
|
self.active_pegasus = undefined;
|
|
while ( !self attackbuttonpressed() )
|
|
{
|
|
wait 0,05;
|
|
}
|
|
self playlocalsound( "mpl_ks_reaper_fire" );
|
|
self playrumbleonentity( "sniper_fire" );
|
|
if ( ( shot % 3 ) == 1 )
|
|
{
|
|
if ( isDefined( remote.owner ) && isDefined( remote.owner.pilottalking ) && remote.owner.pilottalking )
|
|
{
|
|
shot = 0;
|
|
}
|
|
remote thread playpilotdialog( "reaper_fire", 0,25, undefined, 0 );
|
|
}
|
|
shot = ( shot + 1 ) % 3;
|
|
origin = self geteye();
|
|
earthquake( 0,3, 0,5, origin, 256 );
|
|
angles = self getplayerangles();
|
|
forward = anglesToForward( angles );
|
|
right = anglesToRight( angles );
|
|
up = anglesToUp( angles );
|
|
offset = ( ( origin + ( forward * 100 ) ) + ( right * -40 ) ) + ( up * -100 );
|
|
missile = magicbullet( "remote_mortar_missile_mp", offset, ( origin + ( forward * 1000 ) ) + ( up * -100 ), self, remote.fx );
|
|
self.active_pegasus = missile;
|
|
missile thread remote_missile_life( remote );
|
|
missile waittill( "death" );
|
|
self playlocalsound( "mpl_ks_reaper_explosion" );
|
|
}
|
|
if ( isDefined( self.pegasus_influencer ) )
|
|
{
|
|
removeinfluencer( self.pegasus_influencer );
|
|
self.pegasus_influencer = undefined;
|
|
}
|
|
remote thread remote_killstreak_end();
|
|
}
|
|
|
|
remote_missile_life( remote )
|
|
{
|
|
self endon( "death" );
|
|
maps/mp/gametypes/_hostmigration::waitlongdurationwithhostmigrationpause( 6 );
|
|
playfx( level.remote_mortar_fx[ "missileExplode" ], self.origin );
|
|
self delete();
|
|
}
|
|
|
|
remote_damage_think()
|
|
{
|
|
level endon( "remote_end" );
|
|
self.health = 999999;
|
|
maxhealth = level.heli_amored_maxhealth;
|
|
damagetaken = 0;
|
|
self.lowhealth = 0;
|
|
self setcandamage( 1 );
|
|
target_set( self, vectorScale( ( 0, 0, 1 ), 30 ) );
|
|
while ( 1 )
|
|
{
|
|
self waittill( "damage", damage, attacker, direction_vec, point, meansofdeath, tagname, modelname, partname, weapon );
|
|
self.health = 999999;
|
|
heli_friendlyfire = maps/mp/gametypes/_weaponobjects::friendlyfirecheck( self.owner, attacker );
|
|
while ( !heli_friendlyfire )
|
|
{
|
|
continue;
|
|
}
|
|
if ( isplayer( attacker ) )
|
|
{
|
|
attacker maps/mp/gametypes/_damagefeedback::updatedamagefeedback( meansofdeath );
|
|
if ( attacker hasperk( "specialty_armorpiercing" ) )
|
|
{
|
|
if ( meansofdeath == "MOD_RIFLE_BULLET" || meansofdeath == "MOD_PISTOL_BULLET" )
|
|
{
|
|
damage += int( damage * level.cac_armorpiercing_data );
|
|
}
|
|
}
|
|
}
|
|
if ( meansofdeath == "MOD_RIFLE_BULLET" || meansofdeath == "MOD_PISTOL_BULLET" )
|
|
{
|
|
damage *= level.heli_armor_bulletdamage;
|
|
}
|
|
if ( isDefined( weapon ) )
|
|
{
|
|
if ( maps/mp/gametypes/_weapon_utils::islauncherweapon( weapon ) || weapon == "remote_missile_missile_mp" )
|
|
{
|
|
damage = maxhealth + 1;
|
|
}
|
|
}
|
|
while ( damage <= 0 )
|
|
{
|
|
continue;
|
|
}
|
|
self.owner playlocalsound( "reaper_damaged" );
|
|
self.owner sendkillstreakdamageevent( int( damage ) );
|
|
damagetaken += damage;
|
|
if ( damagetaken >= maxhealth )
|
|
{
|
|
if ( self.owner isenemyplayer( attacker ) )
|
|
{
|
|
maps/mp/_scoreevents::processscoreevent( "destroyed_remote_mortar", attacker, self.owner, weapon );
|
|
attacker maps/mp/_challenges::addflyswatterstat( weapon, self );
|
|
attacker addweaponstat( weapon, "destroyed_controlled_killstreak", 1 );
|
|
attacker destroyedplayercontrolledaircraft();
|
|
break;
|
|
}
|
|
level thread maps/mp/_popups::displayteammessagetoall( &"KILLSTREAK_DESTROYED_REMOTE_MORTAR", attacker );
|
|
self thread remote_killstreak_end( 1 );
|
|
return;
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
if ( !self.lowhealth && damagetaken >= ( maxhealth / 2 ) )
|
|
{
|
|
playfxontag( level.fx_u2_damage_trail, self, "tag_origin" );
|
|
self.lowhealth = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
remote_leave()
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "death" );
|
|
self unlink();
|
|
tries = 10;
|
|
yaw = 0;
|
|
while ( tries > 0 )
|
|
{
|
|
exitvector = anglesToForward( self.angles + ( 0, yaw, 0 ) ) * 20000;
|
|
exitpoint = ( self.origin[ 0 ] + exitvector[ 0 ], self.origin[ 1 ] + exitvector[ 1 ], self.origin[ 2 ] - 2500 );
|
|
exitpoint = self.origin + exitvector;
|
|
nfz = crossesnoflyzone( self.origin, exitpoint );
|
|
if ( isDefined( nfz ) )
|
|
{
|
|
if ( ( tries % 2 ) == 1 && tries != 1 )
|
|
{
|
|
yaw *= -1;
|
|
tries--;
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
if ( tries != 1 )
|
|
{
|
|
yaw += 10;
|
|
yaw *= -1;
|
|
}
|
|
}
|
|
tries--;
|
|
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
tries = 0;
|
|
}
|
|
}
|
|
self thread maps/mp/killstreaks/_spyplane::flattenyaw( self.angles[ 1 ] + yaw );
|
|
self moveto( exitpoint, 8, 4 );
|
|
if ( self.lowhealth )
|
|
{
|
|
playfxontag( level.chopper_fx[ "damage" ][ "heavy_smoke" ], self, "tag_origin" );
|
|
}
|
|
self thread play_afterburner_fx();
|
|
maps/mp/gametypes/_hostmigration::waitlongdurationwithhostmigrationpause( 8 );
|
|
self delete();
|
|
}
|
|
|
|
play_remote_fx()
|
|
{
|
|
self.exhaustfx = spawn( "script_model", self.origin );
|
|
self.exhaustfx setmodel( "tag_origin" );
|
|
self.exhaustfx linkto( self, "tag_turret", vectorScale( ( 0, 0, 1 ), 25 ) );
|
|
wait 0,1;
|
|
playfxontag( level.fx_cuav_burner, self.exhaustfx, "tag_origin" );
|
|
}
|
|
|
|
play_afterburner_fx()
|
|
{
|
|
if ( !isDefined( self.exhaustfx ) )
|
|
{
|
|
self.exhaustfx = spawn( "script_model", self.origin );
|
|
self.exhaustfx setmodel( "tag_origin" );
|
|
self.exhaustfx linkto( self, "tag_turret", vectorScale( ( 0, 0, 1 ), 25 ) );
|
|
}
|
|
self endon( "death" );
|
|
wait 0,1;
|
|
playfxontag( level.fx_cuav_afterburner, self.exhaustfx, "tag_origin" );
|
|
}
|
|
|
|
remote_explode()
|
|
{
|
|
self notify( "death" );
|
|
self hide();
|
|
forward = anglesToForward( self.angles ) * 200;
|
|
playfx( level.fx_u2_explode, self.origin, forward );
|
|
self playsound( "evt_helicopter_midair_exp" );
|
|
wait 0,2;
|
|
self notify( "delete" );
|
|
self delete();
|
|
}
|
|
|
|
visionswitch()
|
|
{
|
|
self endon( "disconnect" );
|
|
level endon( "remote_end" );
|
|
inverted = 1;
|
|
self setinfraredvision( 1 );
|
|
self useservervisionset( 1 );
|
|
self setvisionsetforplayer( level.remore_mortar_infrared_vision, 1 );
|
|
for ( ;; )
|
|
{
|
|
while ( self changeseatbuttonpressed() )
|
|
{
|
|
if ( !inverted )
|
|
{
|
|
self setinfraredvision( 1 );
|
|
self setvisionsetforplayer( level.remore_mortar_infrared_vision, 0,5 );
|
|
self playlocalsound( "mpl_ks_reaper_view_select" );
|
|
}
|
|
else
|
|
{
|
|
self setinfraredvision( 0 );
|
|
self setvisionsetforplayer( level.remore_mortar_enhanced_vision, 0,5 );
|
|
self playlocalsound( "mpl_ks_reaper_view_select" );
|
|
}
|
|
inverted = !inverted;
|
|
while ( self changeseatbuttonpressed() )
|
|
{
|
|
wait 0,05;
|
|
}
|
|
}
|
|
wait 0,05;
|
|
}
|
|
}
|