mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-10 18:57:58 -05:00
1069 lines
30 KiB
Plaintext
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" );
|
|
}
|