Files
Recompilable-gscs-for-BO2-z…/patch_mp/maps/mp/killstreaks/_remotemissile.gsc

1069 lines
30 KiB
Plaintext

#include maps/mp/_scoreevents;
#include maps/mp/gametypes/_hud;
#include maps/mp/killstreaks/_killstreakrules;
#include maps/mp/killstreaks/_airsupport;
#include maps/mp/killstreaks/_killstreaks;
#include common_scripts/utility;
#include maps/mp/_utility;
init()
{
precacheitem( "remote_missile_missile_mp" );
precacheitem( "remote_missile_bomblet_mp" );
precacheshader( "mp_hud_cluster_status" );
precacheshader( "mp_hud_armed" );
precacheshader( "mp_hud_deployed" );
precacheshader( "reticle_side_round_big_top" );
precacheshader( "reticle_side_round_big_right" );
precacheshader( "reticle_side_round_big_left" );
precacheshader( "reticle_side_round_big_bottom" );
precacheshader( "hud_remote_missile_target" );
level.rockets = [];
registerkillstreak( "remote_missile_mp", "remote_missile_mp", "killstreak_remote_missile", "remote_missle_used", ::tryusepredatormissile, 1 );
registerkillstreakaltweapon( "remote_missile_mp", "remote_missile_missile_mp" );
registerkillstreakaltweapon( "remote_missile_mp", "remote_missile_bomblet_mp" );
registerkillstreakstrings( "remote_missile_mp", &"KILLSTREAK_EARNED_REMOTE_MISSILE", &"KILLSTREAK_REMOTE_MISSILE_NOT_AVAILABLE", &"KILLSTREAK_REMOTE_MISSILE_INBOUND" );
registerkillstreakdialog( "remote_missile_mp", "mpl_killstreak_cruisemissile", "kls_predator_used", "", "", "", "kls_predator_ready" );
registerkillstreakdevdvar( "remote_missile_mp", "scr_givemissileremote" );
setkillstreakteamkillpenaltyscale( "remote_missile_mp", level.teamkillreducedpenalty );
overrideentitycameraindemo( "remote_missile_mp", 1 );
registerclientfield( "missile", "remote_missile_bomblet_fired", 1, 1, "int" );
registerclientfield( "missile", "remote_missile_fired", 1, 2, "int" );
level.missilesforsighttraces = [];
level.missileremotedeployfx = loadfx( "weapon/predator/fx_predator_cluster_trigger" );
level.missileremotelaunchvert = 18000;
level.missileremotelaunchhorz = 7000;
level.missileremotelaunchtargetdist = 1500;
}
remote_missile_game_end_think( missile, team, killstreak_id, snd_first, snd_third )
{
missile endon( "deleted" );
self endon( "joined_team" );
self endon( "joined_spectators" );
self endon( "disconnect" );
self endon( "Remotemissle_killstreak_done" );
level waittill( "game_ended" );
missile_end_sounds( missile, snd_first, snd_third );
self player_missile_end( missile, 1, 1 );
maps/mp/killstreaks/_killstreakrules::killstreakstop( "remote_missile_mp", team, killstreak_id );
if ( isDefined( missile ) )
{
missile delete();
}
self notify( "Remotemissle_killstreak_done" );
}
tryusepredatormissile( lifeid )
{
if ( !self isonground() || self isusingremote() )
{
self iprintlnbold( &"KILLSTREAK_REMOTE_MISSILE_NOT_USABLE" );
return 0;
}
team = self.team;
killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( "remote_missile_mp", team, 0, 1 );
if ( killstreak_id == -1 )
{
return 0;
}
returnvar = _fire( lifeid, self, team, killstreak_id );
return returnvar;
}
getbestspawnpoint( remotemissilespawnpoints )
{
validenemies = [];
_a102 = remotemissilespawnpoints;
_k102 = getFirstArrayKey( _a102 );
while ( isDefined( _k102 ) )
{
spawnpoint = _a102[ _k102 ];
spawnpoint.validplayers = [];
spawnpoint.spawnscore = 0;
_k102 = getNextArrayKey( _a102, _k102 );
}
_a108 = level.players;
_k108 = getFirstArrayKey( _a108 );
while ( isDefined( _k108 ) )
{
player = _a108[ _k108 ];
if ( !isalive( player ) )
{
}
else if ( player.team == self.team )
{
}
else if ( player.team == "spectator" )
{
}
else
{
bestdistance = 999999999;
bestspawnpoint = undefined;
_a122 = remotemissilespawnpoints;
_k122 = getFirstArrayKey( _a122 );
while ( isDefined( _k122 ) )
{
spawnpoint = _a122[ _k122 ];
spawnpoint.validplayers[ spawnpoint.validplayers.size ] = player;
potentialbestdistance = distance2dsquared( spawnpoint.targetent.origin, player.origin );
if ( potentialbestdistance <= bestdistance )
{
bestdistance = potentialbestdistance;
bestspawnpoint = spawnpoint;
}
_k122 = getNextArrayKey( _a122, _k122 );
}
bestspawnpoint.spawnscore += 2;
}
_k108 = getNextArrayKey( _a108, _k108 );
}
bestspawn = remotemissilespawnpoints[ 0 ];
_a140 = remotemissilespawnpoints;
_k140 = getFirstArrayKey( _a140 );
while ( isDefined( _k140 ) )
{
spawnpoint = _a140[ _k140 ];
_a142 = spawnpoint.validplayers;
_k142 = getFirstArrayKey( _a142 );
while ( isDefined( _k142 ) )
{
player = _a142[ _k142 ];
spawnpoint.spawnscore += 1;
if ( bullettracepassed( player.origin + vectorScale( ( 0, 0, 1 ), 32 ), spawnpoint.origin, 0, player ) )
{
spawnpoint.spawnscore += 3;
}
if ( spawnpoint.spawnscore > bestspawn.spawnscore )
{
bestspawn = spawnpoint;
}
else
{
if ( spawnpoint.spawnscore == bestspawn.spawnscore )
{
if ( cointoss() )
{
bestspawn = spawnpoint;
}
}
}
_k142 = getNextArrayKey( _a142, _k142 );
}
_k140 = getNextArrayKey( _a140, _k140 );
}
return bestspawn;
}
drawline( start, end, timeslice, color )
{
/#
drawtime = int( timeslice * 20 );
time = 0;
while ( time < drawtime )
{
line( start, end, color, 0, 1 );
wait 0,05;
time++;
#/
}
}
_fire( lifeid, player, team, killstreak_id )
{
remotemissilespawnarray = getentarray( "remoteMissileSpawn", "targetname" );
_a180 = remotemissilespawnarray;
_k180 = getFirstArrayKey( _a180 );
while ( isDefined( _k180 ) )
{
spawn = _a180[ _k180 ];
if ( isDefined( spawn.target ) )
{
spawn.targetent = getent( spawn.target, "targetname" );
}
_k180 = getNextArrayKey( _a180, _k180 );
}
if ( remotemissilespawnarray.size > 0 )
{
remotemissilespawn = player getbestspawnpoint( remotemissilespawnarray );
}
else
{
remotemissilespawn = undefined;
}
if ( isDefined( remotemissilespawn ) )
{
startpos = remotemissilespawn.origin;
targetpos = remotemissilespawn.targetent.origin;
vector = vectornormalize( startpos - targetpos );
startpos = ( vector * level.missileremotelaunchvert ) + targetpos;
}
else
{
upvector = ( 0, 0, level.missileremotelaunchvert );
backdist = level.missileremotelaunchhorz;
targetdist = level.missileremotelaunchtargetdist;
forward = anglesToForward( player.angles );
startpos = ( player.origin + upvector ) + ( forward * backdist * -1 );
targetpos = player.origin + ( forward * targetdist );
}
player.killstreak_waitamount = 10;
self setusingremote( "remote_missile_mp" );
self freezecontrolswrapper( 1 );
player disableweaponcycling();
result = self maps/mp/killstreaks/_killstreaks::initridekillstreak( "qrdrone" );
if ( result != "success" )
{
if ( result != "disconnect" )
{
player freezecontrolswrapper( 0 );
player clearusingremote();
player enableweaponcycling();
player.killstreak_waitamount = undefined;
maps/mp/killstreaks/_killstreakrules::killstreakstop( "remote_missile_mp", team, killstreak_id );
}
return 0;
}
rocket = magicbullet( "remote_missile_missile_mp", startpos, targetpos, player );
forceanglevector = vectornormalize( targetpos - startpos );
rocket.angles = vectorToAngle( forceanglevector );
rocket.targetname = "remote_missile";
rocket.team = team;
rocket setteam( team );
rocket thread handledamage();
player linktomissile( rocket, 1 );
rocket.owner = player;
rocket.killcament = player;
player thread cleanupwaiter( rocket, player.team, killstreak_id, rocket.snd_first, rocket.snd_third );
if ( isDefined( level.remote_missile_vision ) )
{
self useservervisionset( 1 );
self setvisionsetforplayer( level.remote_missile_vision, 1 );
}
self setclientflag( 2 );
self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( "remote_missile_mp", self.pers[ "team" ] );
level.globalkillstreakscalled++;
self addweaponstat( "remote_missile_mp", "used", 1 );
rocket thread setup_rockect_map_icon();
rocket missile_sound_play( player );
rocket thread missile_timeout_watch();
rocket thread missile_sound_impact( player, 4000 );
player thread missile_sound_boost( rocket );
player thread missile_deploy_watch( rocket );
player thread watchownerteamkillkicked( rocket );
player thread remote_missile_game_end_think( rocket, player.team, killstreak_id, rocket.snd_first, rocket.snd_third );
player thread watch_missile_death( rocket, player.team, killstreak_id, rocket.snd_first, rocket.snd_third );
rocket maps/mp/gametypes/_spawning::create_tvmissile_influencers( team );
player freezecontrolswrapper( 0 );
player clearusingremote();
player enableweaponcycling();
player waittill( "Remotemissle_killstreak_done" );
return 1;
}
setup_rockect_map_icon()
{
wait 0,1;
self setclientfield( "remote_missile_fired", 1 );
}
watchownerteamkillkicked( rocket )
{
rocket endon( "death" );
rocket endon( "deleted" );
self waittill( "teamKillKicked" );
rocket remove_tvmissile_influencers();
rocket detonate();
}
watch_missile_death( rocket, team, killstreak_id, snd_first, snd_third )
{
level endon( "game_ended" );
rocket endon( "deleted" );
self endon( "joined_team" );
self endon( "joined_spectators" );
self endon( "disconnect" );
rocket waittill( "death" );
missile_end_sounds( rocket, snd_first, snd_third );
self player_missile_end( rocket, 1, 1 );
maps/mp/killstreaks/_killstreakrules::killstreakstop( "remote_missile_mp", team, killstreak_id );
self notify( "Remotemissle_killstreak_done" );
}
player_missile_end( rocket, performplayerkillstreakend, unlink )
{
if ( isDefined( self ) )
{
self thread destroy_missile_hud();
if ( isDefined( performplayerkillstreakend ) && performplayerkillstreakend )
{
self playrumbleonentity( "grenade_rumble" );
if ( level.gameended == 0 )
{
self sendkillstreakdamageevent( 600 );
self thread maps/mp/gametypes/_hud::fadetoblackforxsec( 0, 0,25, 0,1, 0,25 );
wait 0,25;
}
if ( isDefined( rocket ) )
{
rocket hide();
}
}
self clearclientflag( 2 );
self useservervisionset( 0 );
if ( unlink )
{
self unlinkfrommissile();
}
self notify( "remotemissile_done" );
self freezecontrolswrapper( 0 );
self clearusingremote();
self enableweaponcycling();
if ( isDefined( self ) )
{
self.killstreak_waitamount = undefined;
}
}
}
missile_end_sounds( rocket, snd_first, snd_third )
{
if ( isDefined( rocket ) )
{
rocket maps/mp/gametypes/_spawning::remove_tvmissile_influencers();
rocket missile_sound_stop();
}
else
{
if ( isDefined( snd_first ) )
{
snd_first delete();
}
if ( isDefined( snd_third ) )
{
snd_third delete();
}
}
}
missile_timeout_watch()
{
self endon( "death" );
wait 9,95;
if ( isDefined( self ) )
{
self maps/mp/gametypes/_spawning::remove_tvmissile_influencers();
self missile_sound_stop();
}
}
cleanupwaiter( rocket, team, killstreak_id, snd_first, snd_third )
{
rocket endon( "death" );
rocket endon( "deleted" );
self waittill_any( "joined_team", "joined_spectators", "disconnect" );
missile_end_sounds( rocket, snd_first, snd_third );
self player_missile_end( rocket, 0, 0 );
maps/mp/killstreaks/_killstreakrules::killstreakstop( "remote_missile_mp", team, killstreak_id );
if ( isDefined( rocket ) )
{
rocket delete();
}
self notify( "Remotemissle_killstreak_done" );
}
_fire_noplayer( lifeid, player )
{
/#
upvector = ( 0, 0, level.missileremotelaunchvert );
backdist = level.missileremotelaunchhorz;
targetdist = level.missileremotelaunchtargetdist;
forward = anglesToForward( player.angles );
startpos = ( player.origin + upvector ) + ( forward * backdist * -1 );
targetpos = player.origin + ( forward * targetdist );
rocket = magicbullet( "remotemissile_projectile_mp", startpos, targetpos, player );
if ( !isDefined( rocket ) )
{
return;
}
rocket thread handledamage();
rocket.lifeid = lifeid;
rocket.type = "remote";
rocket thread rocket_cleanupondeath();
wait 2;
#/
}
handledamage()
{
self endon( "death" );
self endon( "deleted" );
self setcandamage( 1 );
self.health = 99999;
for ( ;; )
{
self waittill( "damage", damage, attacker, direction_vec, point, meansofdeath, tagname, modelname, partname, weapon );
if ( isDefined( attacker ) && isDefined( self.owner ) )
{
if ( self.owner isenemyplayer( attacker ) )
{
maps/mp/_scoreevents::processscoreevent( "destroyed_remote_missile", attacker, self.owner, weapon );
attacker addweaponstat( weapon, "destroyed_controlled_killstreak", 1 );
break;
}
self.owner sendkillstreakdamageevent( int( damage ) );
}
self remove_tvmissile_influencers();
self detonate();
}
}
staticeffect( duration )
{
self endon( "disconnect" );
staticbg = newclienthudelem( self );
staticbg.horzalign = "fullscreen";
staticbg.vertalign = "fullscreen";
staticbg setshader( "white", 640, 480 );
staticbg.archive = 1;
staticbg.sort = 10;
staticbg.immunetodemogamehudsettings = 1;
static = newclienthudelem( self );
static.horzalign = "fullscreen";
static.vertalign = "fullscreen";
static.archive = 1;
static.sort = 20;
static.immunetodemogamehudsettings = 1;
self setclientflag( 4 );
wait duration;
self clearclientflag( 4 );
static destroy();
staticbg destroy();
}
rocket_cleanupondeath()
{
entitynumber = self getentitynumber();
level.rockets[ entitynumber ] = self;
self waittill( "death" );
}
missile_sound_play( player )
{
snd_first_person = spawn( "script_model", self.origin );
snd_first_person setmodel( "tag_origin" );
snd_first_person linkto( self );
snd_first_person setinvisibletoall();
snd_first_person setvisibletoplayer( player );
snd_first_person playloopsound( "wpn_remote_missile_loop_plr", 0,5 );
self.snd_first = snd_first_person;
snd_third_person = spawn( "script_model", self.origin );
snd_third_person setmodel( "tag_origin" );
snd_third_person linkto( self );
snd_third_person setvisibletoall();
snd_third_person setinvisibletoplayer( player );
snd_third_person playloopsound( "wpn_remote_missile_loop_npc", 0,2 );
self.snd_third = snd_third_person;
}
missile_sound_boost( rocket )
{
self endon( "remotemissile_done" );
self endon( "joined_team" );
self endon( "joined_spectators" );
self endon( "disconnect" );
self waittill( "missile_boost" );
rocket.snd_first playloopsound( "wpn_remote_missile_boost_plr" );
rocket.snd_first playsound( "wpn_remote_missile_fire_boost" );
self playrumbleonentity( "sniper_fire" );
if ( ( rocket.origin[ 2 ] - self.origin[ 2 ] ) > 4000 )
{
rocket notify( "stop_impact_sound" );
rocket thread missile_sound_impact( self, 6000 );
}
}
missile_sound_impact( player, distance )
{
self endon( "death" );
self endon( "stop_impact_sound" );
player endon( "disconnect" );
player endon( "remotemissile_done" );
player endon( "joined_team" );
player endon( "joined_spectators" );
for ( ;; )
{
if ( ( self.origin[ 2 ] - player.origin[ 2 ] ) < distance )
{
self playsound( "wpn_remote_missile_inc" );
return;
}
wait 0,05;
}
}
missile_sound_deploy_bomblets()
{
self.snd_first playloopsound( "wpn_remote_missile_loop_plr", 0,5 );
}
missile_sound_stop()
{
self.snd_first delete();
self.snd_third delete();
}
getvalidtargets( rocket, trace )
{
pixbeginevent( "remotemissile_getVTs_header" );
targets = [];
forward = anglesToForward( rocket.angles );
rocketz = rocket.origin[ 2 ];
mapcenterz = level.mapcenter[ 2 ];
diff = mapcenterz - rocketz;
ratio = diff / forward[ 2 ];
aimtarget = rocket.origin + ( forward * ratio );
rocket.aimtarget = aimtarget;
pixendevent();
pixbeginevent( "remotemissile_getVTs_enemies" );
enemies = self getenemies( 1 );
_a606 = enemies;
_k606 = getFirstArrayKey( _a606 );
while ( isDefined( _k606 ) )
{
player = _a606[ _k606 ];
if ( distance2dsquared( player.origin, aimtarget ) < 360000 && !player hasperk( "specialty_nokillstreakreticle" ) )
{
if ( trace )
{
if ( bullettracepassed( player.origin + vectorScale( ( 0, 0, 1 ), 60 ), player.origin + vectorScale( ( 0, 0, 1 ), 180 ), 0, player ) )
{
targets[ targets.size ] = player;
}
break;
}
else
{
targets[ targets.size ] = player;
}
}
_k606 = getNextArrayKey( _a606, _k606 );
}
dogs = getentarray( "attack_dog", "targetname" );
_a626 = dogs;
_k626 = getFirstArrayKey( _a626 );
while ( isDefined( _k626 ) )
{
dog = _a626[ _k626 ];
if ( dog.aiteam != self.team && distance2dsquared( dog.origin, aimtarget ) < 360000 )
{
if ( trace )
{
if ( bullettracepassed( dog.origin + vectorScale( ( 0, 0, 1 ), 60 ), dog.origin + vectorScale( ( 0, 0, 1 ), 180 ), 0, dog ) )
{
targets[ targets.size ] = dog;
}
break;
}
else
{
targets[ targets.size ] = dog;
}
}
_k626 = getNextArrayKey( _a626, _k626 );
}
tanks = getentarray( "talon", "targetname" );
_a646 = tanks;
_k646 = getFirstArrayKey( _a646 );
while ( isDefined( _k646 ) )
{
tank = _a646[ _k646 ];
if ( tank.aiteam != self.team && distance2dsquared( tank.origin, aimtarget ) < 360000 )
{
if ( trace )
{
if ( bullettracepassed( tank.origin + vectorScale( ( 0, 0, 1 ), 60 ), tank.origin + vectorScale( ( 0, 0, 1 ), 180 ), 0, tank ) )
{
targets[ targets.size ] = tank;
}
break;
}
else
{
targets[ targets.size ] = tank;
}
}
_k646 = getNextArrayKey( _a646, _k646 );
}
turrets = getentarray( "auto_turret", "classname" );
_a665 = turrets;
_k665 = getFirstArrayKey( _a665 );
while ( isDefined( _k665 ) )
{
turret = _a665[ _k665 ];
if ( turret.team != self.team && distance2dsquared( turret.origin, aimtarget ) < 360000 )
{
if ( trace )
{
if ( bullettracepassed( turret.origin + vectorScale( ( 0, 0, 1 ), 60 ), turret.origin + vectorScale( ( 0, 0, 1 ), 180 ), 0, turret ) )
{
targets[ targets.size ] = turret;
}
break;
}
else
{
targets[ targets.size ] = turret;
}
}
_k665 = getNextArrayKey( _a665, _k665 );
}
pixendevent();
return targets;
}
create_missile_hud( rocket )
{
self.deploy_hud_armed = newclienthudelem( self );
self.deploy_hud_armed.alignx = "center";
self.deploy_hud_armed.aligny = "middle";
self.deploy_hud_armed.horzalign = "user_center";
self.deploy_hud_armed.vertalign = "user_center";
self.deploy_hud_armed setshader( "mp_hud_armed", 110, 55 );
self.deploy_hud_armed.hidewheninmenu = 1;
self.deploy_hud_armed.immunetodemogamehudsettings = 1;
self.deploy_hud_armed.x = -25;
self.deploy_hud_armed.y = 161;
self.deploy_hud_deployed = newclienthudelem( self );
self.deploy_hud_deployed.alignx = "center";
self.deploy_hud_deployed.aligny = "middle";
self.deploy_hud_deployed.horzalign = "user_center";
self.deploy_hud_deployed.vertalign = "user_center";
self.deploy_hud_deployed setshader( "mp_hud_deployed", 110, 55 );
self.deploy_hud_deployed.hidewheninmenu = 1;
self.deploy_hud_deployed.immunetodemogamehudsettings = 1;
self.deploy_hud_deployed.alpha = 0,35;
self.deploy_hud_deployed.x = 25;
self.deploy_hud_deployed.y = 161;
self.missile_reticle_top = newclienthudelem( self );
self.missile_reticle_top.alignx = "center";
self.missile_reticle_top.aligny = "middle";
self.missile_reticle_top.horzalign = "user_center";
self.missile_reticle_top.vertalign = "user_center";
self.missile_reticle_top.font = "small";
self.missile_reticle_top setshader( "reticle_side_round_big_top", 140, 64 );
self.missile_reticle_top.hidewheninmenu = 0;
self.missile_reticle_top.immunetodemogamehudsettings = 1;
self.missile_reticle_top.x = 0;
self.missile_reticle_top.y = 0;
self.missile_reticle_bottom = newclienthudelem( self );
self.missile_reticle_bottom.alignx = "center";
self.missile_reticle_bottom.aligny = "middle";
self.missile_reticle_bottom.horzalign = "user_center";
self.missile_reticle_bottom.vertalign = "user_center";
self.missile_reticle_bottom.font = "small";
self.missile_reticle_bottom setshader( "reticle_side_round_big_bottom", 140, 64 );
self.missile_reticle_bottom.hidewheninmenu = 0;
self.missile_reticle_bottom.immunetodemogamehudsettings = 1;
self.missile_reticle_bottom.x = 0;
self.missile_reticle_bottom.y = 0;
self.missile_reticle_right = newclienthudelem( self );
self.missile_reticle_right.alignx = "center";
self.missile_reticle_right.aligny = "middle";
self.missile_reticle_right.horzalign = "user_center";
self.missile_reticle_right.vertalign = "user_center";
self.missile_reticle_right.font = "small";
self.missile_reticle_right setshader( "reticle_side_round_big_right", 64, 140 );
self.missile_reticle_right.hidewheninmenu = 0;
self.missile_reticle_right.immunetodemogamehudsettings = 1;
self.missile_reticle_right.x = 0;
self.missile_reticle_right.y = 0;
self.missile_reticle_left = newclienthudelem( self );
self.missile_reticle_left.alignx = "center";
self.missile_reticle_left.aligny = "middle";
self.missile_reticle_left.horzalign = "user_center";
self.missile_reticle_left.vertalign = "user_center";
self.missile_reticle_left.font = "small";
self.missile_reticle_left setshader( "reticle_side_round_big_left", 64, 140 );
self.missile_reticle_left.hidewheninmenu = 0;
self.missile_reticle_left.immunetodemogamehudsettings = 1;
self.missile_reticle_left.x = 0;
self.missile_reticle_left.y = 0;
self.missile_target_icons = [];
_a764 = level.players;
_k764 = getFirstArrayKey( _a764 );
while ( isDefined( _k764 ) )
{
player = _a764[ _k764 ];
if ( player == self )
{
}
else if ( level.teambased && player.team == self.team )
{
}
else
{
index = player.clientid;
self.missile_target_icons[ index ] = newclienthudelem( self );
self.missile_target_icons[ index ].x = 0;
self.missile_target_icons[ index ].y = 0;
self.missile_target_icons[ index ].z = 0;
self.missile_target_icons[ index ].alpha = 0;
self.missile_target_icons[ index ].archived = 1;
self.missile_target_icons[ index ] setshader( "hud_remote_missile_target", 450, 450 );
self.missile_target_icons[ index ] setwaypoint( 0 );
self.missile_target_icons[ index ].hidewheninmenu = 1;
self.missile_target_icons[ index ].immunetodemogamehudsettings = 1;
}
_k764 = getNextArrayKey( _a764, _k764 );
}
i = 0;
while ( i < 3 )
{
self.missile_target_other[ i ] = newclienthudelem( self );
self.missile_target_other[ i ].x = 0;
self.missile_target_other[ i ].y = 0;
self.missile_target_other[ i ].z = 0;
self.missile_target_other[ i ].alpha = 0;
self.missile_target_other[ i ].archived = 1;
self.missile_target_other[ i ] setshader( "hud_remote_missile_target", 450, 450 );
self.missile_target_other[ i ] setwaypoint( 0 );
self.missile_target_other[ i ].hidewheninmenu = 1;
self.missile_target_other[ i ].immunetodemogamehudsettings = 1;
i++;
}
rocket.iconindexother = 0;
self thread targeting_hud_think( rocket );
self thread reticle_hud_think( rocket );
self thread flash_cluster_armed( rocket );
}
destroy_missile_hud()
{
if ( isDefined( self.deploy_hud_armed ) )
{
self.deploy_hud_armed destroy();
}
if ( isDefined( self.deploy_hud_deployed ) )
{
self.deploy_hud_deployed destroy();
}
if ( isDefined( self.missile_reticle ) )
{
self.missile_reticle destroy();
}
if ( isDefined( self.missile_reticle_top ) )
{
self.missile_reticle_top destroy();
}
if ( isDefined( self.missile_reticle_bottom ) )
{
self.missile_reticle_bottom destroy();
}
if ( isDefined( self.missile_reticle_right ) )
{
self.missile_reticle_right destroy();
}
if ( isDefined( self.missile_reticle_left ) )
{
self.missile_reticle_left destroy();
}
while ( isDefined( self.missile_target_icons ) )
{
_a838 = level.players;
_k838 = getFirstArrayKey( _a838 );
while ( isDefined( _k838 ) )
{
player = _a838[ _k838 ];
if ( player == self )
{
}
else if ( level.teambased && player.team == self.team )
{
}
else
{
index = player.clientid;
if ( isDefined( self.missile_target_icons[ index ] ) )
{
self.missile_target_icons[ index ] destroy();
}
}
_k838 = getNextArrayKey( _a838, _k838 );
}
}
while ( isDefined( self.missile_target_other ) )
{
i = 0;
while ( i < 3 )
{
if ( isDefined( self.missile_target_other[ i ] ) )
{
self.missile_target_other[ i ] destroy();
}
i++;
}
}
}
flash_cluster_armed( rocket )
{
self endon( "disconnect" );
self endon( "remotemissile_done" );
level endon( "game_ended" );
rocket endon( "death" );
self endon( "bomblets_deployed" );
for ( ;; )
{
self.deploy_hud_armed.alpha = 1;
wait 0,35;
self.deploy_hud_armed.alpha = 0;
wait 0,15;
}
}
flash_cluster_deployed( rocket )
{
self endon( "disconnect" );
self endon( "remotemissile_done" );
level endon( "game_ended" );
rocket endon( "death" );
self.deploy_hud_armed.alpha = 0,35;
for ( ;; )
{
self.deploy_hud_deployed.alpha = 1;
wait 0,35;
self.deploy_hud_deployed.alpha = 0;
wait 0,15;
}
}
targeting_hud_think( rocket )
{
self endon( "disconnect" );
self endon( "remotemissile_done" );
rocket endon( "death" );
level endon( "game_ended" );
targets = self getvalidtargets( rocket, 1 );
framessincetargetscan = 0;
while ( 1 )
{
_a910 = self.missile_target_icons;
_k910 = getFirstArrayKey( _a910 );
while ( isDefined( _k910 ) )
{
icon = _a910[ _k910 ];
icon.alpha = 0;
_k910 = getNextArrayKey( _a910, _k910 );
}
framessincetargetscan++;
if ( framessincetargetscan > 5 )
{
targets = self getvalidtargets( rocket, 1 );
framessincetargetscan = 0;
}
while ( targets.size > 0 )
{
_a925 = targets;
_k925 = getFirstArrayKey( _a925 );
while ( isDefined( _k925 ) )
{
target = _a925[ _k925 ];
if ( isDefined( target ) == 0 )
{
}
else if ( isplayer( target ) )
{
if ( isalive( target ) )
{
index = target.clientid;
/#
assert( isDefined( index ) );
#/
self.missile_target_icons[ index ].x = target.origin[ 0 ];
self.missile_target_icons[ index ].y = target.origin[ 1 ];
self.missile_target_icons[ index ].z = target.origin[ 2 ] + 47;
self.missile_target_icons[ index ].alpha = 1;
}
}
else
{
if ( !isDefined( target.missileiconindex ) )
{
target.missileiconindex = rocket.iconindexother;
rocket.iconindexother = ( rocket.iconindexother + 1 ) % 3;
}
index = target.missileiconindex;
self.missile_target_other[ index ].x = target.origin[ 0 ];
self.missile_target_other[ index ].y = target.origin[ 1 ];
self.missile_target_other[ index ].z = target.origin[ 2 ];
self.missile_target_other[ index ].alpha = 1;
}
_k925 = getNextArrayKey( _a925, _k925 );
}
}
wait 0,1;
}
}
reticle_hud_think( rocket )
{
self endon( "disconnect" );
self endon( "remotemissile_done" );
rocket endon( "death" );
level endon( "game_ended" );
first = 1;
while ( 1 )
{
reticlesize = int( min( max( 0, ( 1000 * atan( 600 / max( 0,1, rocket.origin[ 2 ] - self.origin[ 2 ] ) ) ) / 9 ), 1500 ) );
if ( !first )
{
self.missile_reticle_top moveovertime( 0,1 );
self.missile_reticle_bottom moveovertime( 0,1 );
self.missile_reticle_right moveovertime( 0,1 );
self.missile_reticle_left moveovertime( 0,1 );
}
else
{
first = 0;
}
self.missile_reticle_top.y = ( reticlesize * -1 ) / 2,4;
self.missile_reticle_bottom.y = reticlesize / 2,4;
self.missile_reticle_right.x = reticlesize / 2,4;
self.missile_reticle_left.x = ( reticlesize * -1 ) / 2,4;
wait 0,1;
}
}
missile_deploy_watch( rocket )
{
self endon( "disconnect" );
self endon( "remotemissile_done" );
rocket endon( "death" );
level endon( "game_ended" );
wait 0,25;
self thread create_missile_hud( rocket );
waitframes = 2;
explosionradius = 0;
while ( 1 )
{
if ( self attackbuttonpressed() )
{
targets = self getvalidtargets( rocket, 0 );
while ( targets.size > 0 )
{
_a1017 = targets;
_k1017 = getFirstArrayKey( _a1017 );
while ( isDefined( _k1017 ) )
{
target = _a1017[ _k1017 ];
self thread fire_bomblet( rocket, explosionradius, target, waitframes );
waitframes++;
_k1017 = getNextArrayKey( _a1017, _k1017 );
}
}
bomblet = magicbullet( "remote_missile_bomblet_mp", rocket.origin, rocket.origin + ( anglesToForward( rocket.angles ) * 1000 ), self );
bomblet.team = self.team;
bomblet setteam( self.team );
if ( ( rocket.origin[ 2 ] - self.origin[ 2 ] ) > 4000 )
{
bomblet thread missile_sound_impact( self, 8000 );
rocket notify( "stop_impact_sound" );
}
bomblet thread setup_bomblet_map_icon();
rocket setclientfield( "remote_missile_fired", 2 );
bomblet.killcament = self;
i = targets.size;
while ( i <= 8 )
{
self thread fire_random_bomblet( rocket, explosionradius, i % 6, waitframes );
waitframes++;
i++;
}
playfx( level.missileremotedeployfx, rocket.origin, anglesToForward( rocket.angles ) );
self playlocalsound( "mpl_rc_exp" );
self playrumbleonentity( "sniper_fire" );
earthquake( 0,2, 0,2, rocket.origin, 200 );
rocket hide();
rocket setmissilecoasting( 1 );
self thread maps/mp/gametypes/_hud::fadetoblackforxsec( 0, 0,15, 0, 0, "white" );
rocket missile_sound_deploy_bomblets();
self thread bomblet_camera_waiter( rocket );
self thread flash_cluster_deployed( rocket );
self notify( "bomblets_deployed" );
return;
continue;
}
else
{
wait 0,05;
}
}
}
bomblet_camera_waiter( rocket )
{
self endon( "disconnect" );
self endon( "remotemissile_done" );
rocket endon( "death" );
level endon( "game_ended" );
delay = getdvarfloatdefault( "scr_rmbomblet_camera_delaytime", 1 );
self waittill( "bomblet_exploded" );
wait delay;
rocket notify( "death" );
self notify( "remotemissile_done" );
}
fire_bomblet( rocket, explosionradius, target, waitframes )
{
origin = rocket.origin;
targetorigin = target.origin + vectorScale( ( 0, 0, 1 ), 50 );
wait ( waitframes * 0,05 );
if ( isDefined( rocket ) )
{
origin = rocket.origin;
}
bomblet = magicbullet( "remote_missile_bomblet_mp", origin, targetorigin, self, target, vectorScale( ( 0, 0, 1 ), 30 ) );
bomblet.team = self.team;
bomblet setteam( self.team );
bomblet.killcament = self;
bomblet thread setup_bomblet_map_icon();
bomblet thread bomblet_explostion_waiter( self );
}
setup_bomblet_map_icon()
{
wait 0,1;
self setclientfield( "remote_missile_bomblet_fired", 1 );
}
fire_random_bomblet( rocket, explosionradius, quadrant, waitframes )
{
origin = rocket.origin;
angles = rocket.angles;
owner = rocket.owner;
aimtarget = rocket.aimtarget;
wait ( waitframes * 0,05 );
angle = randomintrange( 10 + ( 60 * quadrant ), 50 + ( 60 * quadrant ) );
radius = randomintrange( 200, 700 );
x = min( radius, 550 ) * cos( angle );
y = min( radius, 550 ) * sin( angle );
bomblet = magicbullet( "remote_missile_bomblet_mp", origin, aimtarget + ( x, y, 0 ), self );
bomblet.team = self.team;
bomblet setteam( self.team );
bomblet thread setup_bomblet_map_icon();
bomblet.killcament = self;
bomblet thread bomblet_explostion_waiter( self );
}
bomblet_explostion_waiter( player )
{
player endon( "disconnect" );
player endon( "remotemissile_done" );
player endon( "death" );
level endon( "game_ended" );
self waittill( "death" );
player notify( "bomblet_exploded" );
}