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

591 lines
13 KiB
Plaintext

#include maps/mp/killstreaks/_emp;
#include maps/mp/_tacticalinsertion;
#include maps/mp/gametypes/_weaponobjects;
#include maps/mp/gametypes/_hostmigration;
#include maps/mp/killstreaks/_killstreakrules;
#include maps/mp/killstreaks/_killstreaks;
#include common_scripts/utility;
#include maps/mp/_utility;
init()
{
level._effect[ "emp_flash" ] = loadfx( "weapon/emp/fx_emp_explosion" );
_a9 = level.teams;
_k9 = getFirstArrayKey( _a9 );
while ( isDefined( _k9 ) )
{
team = _a9[ _k9 ];
level.teamemping[ team ] = 0;
_k9 = getNextArrayKey( _a9, _k9 );
}
level.empplayer = undefined;
level.emptimeout = 40;
level.empowners = [];
if ( level.teambased )
{
level thread emp_teamtracker();
}
else
{
level thread emp_playertracker();
}
level thread onplayerconnect();
registerkillstreak( "emp_mp", "emp_mp", "killstreak_emp", "emp_used", ::emp_use );
registerkillstreakstrings( "emp_mp", &"KILLSTREAK_EARNED_EMP", &"KILLSTREAK_EMP_NOT_AVAILABLE", &"KILLSTREAK_EMP_INBOUND" );
registerkillstreakdialog( "emp_mp", "mpl_killstreak_emp_activate", "kls_emp_used", "", "kls_emp_enemy", "", "kls_emp_ready" );
registerkillstreakdevdvar( "emp_mp", "scr_giveemp" );
maps/mp/killstreaks/_killstreaks::createkillstreaktimer( "emp_mp" );
/#
set_dvar_float_if_unset( "scr_emp_timeout", 40 );
set_dvar_int_if_unset( "scr_emp_damage_debug", 0 );
#/
}
onplayerconnect()
{
for ( ;; )
{
level waittill( "connected", player );
player thread onplayerspawned();
}
}
onplayerspawned()
{
self endon( "disconnect" );
for ( ;; )
{
self waittill( "spawned_player" );
if ( level.teambased || emp_isteamemped( self.team ) && !level.teambased && isDefined( level.empplayer ) && level.empplayer != self )
{
self setempjammed( 1 );
}
}
}
emp_isteamemped( check_team )
{
_a64 = level.teams;
_k64 = getFirstArrayKey( _a64 );
while ( isDefined( _k64 ) )
{
team = _a64[ _k64 ];
if ( team == check_team )
{
}
else
{
if ( level.teamemping[ team ] )
{
return 1;
}
}
_k64 = getNextArrayKey( _a64, _k64 );
}
return 0;
}
emp_use( lifeid )
{
/#
assert( isDefined( self ) );
#/
killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( "emp_mp", self.team, 0, 1 );
if ( killstreak_id == -1 )
{
return 0;
}
myteam = self.pers[ "team" ];
if ( level.teambased )
{
self thread emp_jamotherteams( myteam, killstreak_id );
}
else
{
self thread emp_jamplayers( self, killstreak_id );
}
self.emptime = getTime();
self notify( "used_emp" );
self playlocalsound( "mpl_killstreak_emp_activate" );
self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( "emp_mp", self.pers[ "team" ] );
level.globalkillstreakscalled++;
self addweaponstat( "emp_mp", "used", 1 );
return 1;
}
emp_jamotherteams( teamname, killstreak_id )
{
level endon( "game_ended" );
overlays = [];
/#
assert( isDefined( level.teams[ teamname ] ) );
#/
level notify( "EMP_JamOtherTeams" + teamname );
level endon( "EMP_JamOtherTeams" + teamname );
level.empowners[ teamname ] = self;
_a121 = level.players;
_k121 = getFirstArrayKey( _a121 );
while ( isDefined( _k121 ) )
{
player = _a121[ _k121 ];
if ( player.team == teamname )
{
}
else
{
player playlocalsound( "mpl_killstreak_emp_blast_front" );
}
_k121 = getNextArrayKey( _a121, _k121 );
}
visionsetnaked( "flash_grenade", 1,5 );
thread empeffects();
wait 0,1;
visionsetnaked( "flash_grenade", 0 );
if ( isDefined( level.nukedetonated ) )
{
visionsetnaked( level.nukevisionset, 5 );
}
else
{
visionsetnaked( getDvar( "mapname" ), 5 );
}
level.teamemping[ teamname ] = 1;
level notify( "emp_update" );
level destroyotherteamsactivevehicles( self, teamname );
level destroyotherteamsequipment( self, teamname );
/#
level.emptimeout = getDvarFloat( #"35E553D4" );
#/
maps/mp/gametypes/_hostmigration::waitlongdurationwithhostmigrationpauseemp( level.emptimeout );
level.teamemping[ teamname ] = 0;
maps/mp/killstreaks/_killstreakrules::killstreakstop( "emp_mp", teamname, killstreak_id );
level notify( "emp_update" );
level notify( "emp_end" + teamname );
}
emp_jamplayers( owner, killstreak_id )
{
level notify( "EMP_JamPlayers" );
level endon( "EMP_JamPlayers" );
overlays = [];
/#
assert( isDefined( owner ) );
#/
_a180 = level.players;
_k180 = getFirstArrayKey( _a180 );
while ( isDefined( _k180 ) )
{
player = _a180[ _k180 ];
if ( player == owner )
{
}
else
{
player playlocalsound( "mpl_killstreak_emp_blast_front" );
}
_k180 = getNextArrayKey( _a180, _k180 );
}
visionsetnaked( "flash_grenade", 1,5 );
thread empeffects();
wait 0,1;
visionsetnaked( "flash_grenade", 0 );
if ( isDefined( level.nukedetonated ) )
{
visionsetnaked( level.nukevisionset, 5 );
}
else
{
visionsetnaked( getDvar( "mapname" ), 5 );
}
level notify( "emp_update" );
level.empplayer = owner;
level.empplayer thread empplayerffadisconnect();
level destroyactivevehicles( owner );
level destroyequipment( owner );
level notify( "emp_update" );
/#
level.emptimeout = getDvarFloat( #"35E553D4" );
#/
maps/mp/gametypes/_hostmigration::waitlongdurationwithhostmigrationpause( level.emptimeout );
maps/mp/killstreaks/_killstreakrules::killstreakstop( "emp_mp", level.empplayer.team, killstreak_id );
level.empplayer = undefined;
level notify( "emp_update" );
level notify( "emp_ended" );
}
empplayerffadisconnect()
{
level endon( "EMP_JamPlayers" );
level endon( "emp_ended" );
self waittill( "disconnect" );
level notify( "emp_update" );
}
empeffects()
{
_a241 = level.players;
_k241 = getFirstArrayKey( _a241 );
while ( isDefined( _k241 ) )
{
player = _a241[ _k241 ];
playerforward = anglesToForward( player.angles );
playerforward = ( playerforward[ 0 ], playerforward[ 1 ], 0 );
playerforward = vectornormalize( playerforward );
empdistance = 20000;
empent = spawn( "script_model", ( player.origin + vectorScale( ( 0, 0, 1 ), 8000 ) ) + ( playerforward * empdistance ) );
empent setmodel( "tag_origin" );
empent.angles += vectorScale( ( 0, 0, 1 ), 270 );
empent thread empeffect( player );
_k241 = getNextArrayKey( _a241, _k241 );
}
}
empeffect( player )
{
player endon( "disconnect" );
self setinvisibletoall();
self setvisibletoplayer( player );
wait 0,5;
playfxontag( level._effect[ "emp_flash" ], self, "tag_origin" );
self playsound( "wpn_emp_bomb" );
self deleteaftertime( 11 );
}
emp_teamtracker()
{
level endon( "game_ended" );
for ( ;; )
{
level waittill_either( "joined_team", "emp_update" );
_a279 = level.players;
_k279 = getFirstArrayKey( _a279 );
while ( isDefined( _k279 ) )
{
player = _a279[ _k279 ];
if ( player.team == "spectator" )
{
}
else
{
emped = emp_isteamemped( player.team );
player setempjammed( emped );
if ( emped )
{
player notify( "emp_jammed" );
}
}
_k279 = getNextArrayKey( _a279, _k279 );
}
}
}
emp_playertracker()
{
level endon( "game_ended" );
for ( ;; )
{
level waittill_either( "joined_team", "emp_update" );
_a306 = level.players;
_k306 = getFirstArrayKey( _a306 );
while ( isDefined( _k306 ) )
{
player = _a306[ _k306 ];
if ( player.team == "spectator" )
{
}
else if ( isDefined( level.empplayer ) && level.empplayer != player )
{
player setempjammed( 1 );
player notify( "emp_jammed" );
}
else
{
player setempjammed( 0 );
}
_k306 = getNextArrayKey( _a306, _k306 );
}
}
}
destroyotherteamsequipment( attacker, teamemping )
{
_a328 = level.teams;
_k328 = getFirstArrayKey( _a328 );
while ( isDefined( _k328 ) )
{
team = _a328[ _k328 ];
if ( team == teamemping )
{
}
else
{
destroyequipment( attacker, team );
destroytacticalinsertions( attacker, team );
}
_k328 = getNextArrayKey( _a328, _k328 );
}
}
destroyequipment( attacker, teamemped )
{
i = 0;
while ( i < level.missileentities.size )
{
item = level.missileentities[ i ];
if ( !isDefined( item.name ) )
{
i++;
continue;
}
else if ( !isDefined( item.owner ) )
{
i++;
continue;
}
else if ( isDefined( teamemped ) && item.owner.team != teamemped )
{
i++;
continue;
}
else if ( item.owner == attacker )
{
i++;
continue;
}
else if ( !isweaponequipment( item.name ) && item.name != "proximity_grenade_mp" )
{
i++;
continue;
}
else
{
watcher = item.owner getwatcherforweapon( item.name );
if ( !isDefined( watcher ) )
{
i++;
continue;
}
else
{
watcher thread maps/mp/gametypes/_weaponobjects::waitanddetonate( item, 0, attacker, "emp_mp" );
}
}
i++;
}
}
destroytacticalinsertions( attacker, victimteam )
{
i = 0;
while ( i < level.players.size )
{
player = level.players[ i ];
if ( !isDefined( player.tacticalinsertion ) )
{
i++;
continue;
}
else if ( level.teambased && player.team != victimteam )
{
i++;
continue;
}
else
{
if ( attacker == player )
{
i++;
continue;
}
else
{
player.tacticalinsertion thread maps/mp/_tacticalinsertion::fizzle();
}
}
i++;
}
}
getwatcherforweapon( weapname )
{
if ( !isDefined( self ) )
{
return undefined;
}
if ( !isplayer( self ) )
{
return undefined;
}
i = 0;
while ( i < self.weaponobjectwatcherarray.size )
{
if ( self.weaponobjectwatcherarray[ i ].weapon != weapname )
{
i++;
continue;
}
else
{
return self.weaponobjectwatcherarray[ i ];
}
i++;
}
return undefined;
}
destroyotherteamsactivevehicles( attacker, teamemping )
{
_a431 = level.teams;
_k431 = getFirstArrayKey( _a431 );
while ( isDefined( _k431 ) )
{
team = _a431[ _k431 ];
if ( team == teamemping )
{
}
else
{
destroyactivevehicles( attacker, team );
}
_k431 = getNextArrayKey( _a431, _k431 );
}
}
destroyactivevehicles( attacker, teamemped )
{
turrets = getentarray( "auto_turret", "classname" );
destroyentities( turrets, attacker, teamemped );
targets = target_getarray();
destroyentities( targets, attacker, teamemped );
rcbombs = getentarray( "rcbomb", "targetname" );
destroyentities( rcbombs, attacker, teamemped );
remotemissiles = getentarray( "remote_missile", "targetname" );
destroyentities( remotemissiles, attacker, teamemped );
remotedrone = getentarray( "remote_drone", "targetname" );
destroyentities( remotedrone, attacker, teamemped );
planemortars = getentarray( "plane_mortar", "targetname" );
_a458 = planemortars;
_k458 = getFirstArrayKey( _a458 );
while ( isDefined( _k458 ) )
{
planemortar = _a458[ _k458 ];
if ( isDefined( teamemped ) && isDefined( planemortar.team ) )
{
if ( planemortar.team != teamemped )
{
}
else }
else if ( planemortar.owner == attacker )
{
}
else
{
planemortar notify( "emp_deployed" );
}
_k458 = getNextArrayKey( _a458, _k458 );
}
satellites = getentarray( "satellite", "targetname" );
_a477 = satellites;
_k477 = getFirstArrayKey( _a477 );
while ( isDefined( _k477 ) )
{
satellite = _a477[ _k477 ];
if ( isDefined( teamemped ) && isDefined( satellite.team ) )
{
if ( satellite.team != teamemped )
{
}
else }
else if ( satellite.owner == attacker )
{
}
else
{
satellite notify( "emp_deployed" );
}
_k477 = getNextArrayKey( _a477, _k477 );
}
if ( isDefined( level.missile_swarm_owner ) )
{
if ( level.missile_swarm_owner isenemyplayer( attacker ) )
{
level.missile_swarm_owner notify( "emp_destroyed_missile_swarm" );
}
}
}
destroyentities( entities, attacker, team )
{
meansofdeath = "MOD_EXPLOSIVE";
weapon = "killstreak_emp_mp";
damage = 5000;
direction_vec = ( 0, 0, 1 );
point = ( 0, 0, 1 );
modelname = "";
tagname = "";
partname = "";
_a515 = entities;
_k515 = getFirstArrayKey( _a515 );
while ( isDefined( _k515 ) )
{
entity = _a515[ _k515 ];
if ( isDefined( team ) && isDefined( entity.team ) )
{
if ( entity.team != team )
{
}
else }
else if ( entity.owner == attacker )
{
}
else
{
entity notify( "damage" );
}
_k515 = getNextArrayKey( _a515, _k515 );
}
}
drawempdamageorigin( pos, ang, radius )
{
/#
while ( getDvarInt( #"D04570F2" ) )
{
line( pos, pos + ( anglesToForward( ang ) * radius ), ( 0, 0, 1 ) );
line( pos, pos + ( anglesToRight( ang ) * radius ), ( 0, 0, 1 ) );
line( pos, pos + ( anglesToUp( ang ) * radius ), ( 0, 0, 1 ) );
line( pos, pos - ( anglesToForward( ang ) * radius ), ( 0, 0, 1 ) );
line( pos, pos - ( anglesToRight( ang ) * radius ), ( 0, 0, 1 ) );
line( pos, pos - ( anglesToUp( ang ) * radius ), ( 0, 0, 1 ) );
wait 0,05;
#/
}
}
isenemyempkillstreakactive()
{
if ( level.teambased || maps/mp/killstreaks/_emp::emp_isteamemped( self.team ) && !level.teambased && isDefined( level.empplayer ) && level.empplayer != self )
{
return 1;
}
return 0;
}
isempweapon( weaponname )
{
if ( isDefined( weaponname ) && weaponname != "emp_mp" || weaponname == "emp_grenade_mp" && weaponname == "emp_grenade_zm" )
{
return 1;
}
return 0;
}
isempkillstreakweapon( weaponname )
{
if ( isDefined( weaponname ) && weaponname == "emp_mp" )
{
return 1;
}
return 0;
}