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