2023-04-13 17:30:38 +02:00

162 lines
14 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\clientfield_shared;
#using scripts\shared\system_shared;
#using scripts\shared\util_shared;
#using scripts\shared\vehicle_shared;
#using_animtree ( "mp_emp_power_core" );
#precache( "client_fx", "killstreaks/fx_emp_core" );
#namespace emp;
function autoexec __init__sytem__() { system::register("emp",&__init__,undefined,undefined); }
function __init__()
{
clientfield::register( "scriptmover", "emp_turret_init", 1, 1, "int", &emp_turret_init, !true, !true );
clientfield::register( "vehicle", "emp_turret_deploy", 1, 1, "int", &emp_turret_deploy_start, !true, !true );
thread monitor_emp_killstreaks();
}
function monitor_emp_killstreaks()
{
level endon( "disconnect" );
if ( !isdefined( level.emp_killstreaks ) )
level.emp_killstreaks = [];
for(;;)
{
has_at_least_one_active_enemy_turret = false;
ArrayRemoveValue( level.emp_killstreaks, undefined );
local_players = GetLocalPlayers();
foreach( local_player in local_players )
{
if ( local_player IsLocalPlayer() == false )
continue; // Note: a player joining a game is not a local player until after spawning in (is this a bug?)
closest_enemy_emp = emp::get_closest_enemy_emp_killstreak( local_player );
if ( isdefined( closest_enemy_emp ) )
{
has_at_least_one_active_enemy_turret = true;
localClientNum = local_player GetLocalClientNumber();
update_distance_to_closest_emp( localClientNum, Distance( local_player.origin, closest_enemy_emp.origin ) );
}
}
wait ( has_at_least_one_active_enemy_turret ? 0.1 : 0.7 );
}
}
function get_closest_enemy_emp_killstreak( local_player )
{
closest_emp = undefined;
closest_emp_distance_squared = 99999999;
foreach( emp in level.emp_killstreaks )
{
if ( emp.owner == local_player || emp.team == local_player.team )
continue;
distance_squared = DistanceSquared( local_player.origin, emp.origin );
if ( distance_squared < closest_emp_distance_squared )
{
closest_emp = emp;
closest_emp_distance_squared = distance_squared;
}
}
return closest_emp;
}
function update_distance_to_closest_emp( localClientNum, new_value )
{
if ( !isdefined( localClientNum ) )
return;
distance_to_closest_enemy_emp_ui_model = GetUIModel( GetUIModelForController( localClientNum ), "distanceToClosestEnemyEmpKillstreak" );
if ( isdefined( distance_to_closest_enemy_emp_ui_model ) )
SetUIModelValue( distance_to_closest_enemy_emp_ui_model, new_value );
// /# IPrintLnBold( "Distance to Closest Enemy EMP: " + new_value ); #/
}
function emp_turret_init( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
self endon("entityshutdown");
if ( !newVal )
return;
self UseAnimTree( #animtree );
self SetAnimRestart( %o_turret_emp_core_deploy, 1.0, 0.0, 0.0 );
self SetAnimTime( %o_turret_emp_core_deploy, 0.0 );
}
function cleanup_fx_on_shutdown( localClientNum, handle )
{
self endon("kill_fx_cleanup");
self waittill( "entityshutdown" );
StopFx( localClientNum, handle );
}
function emp_turret_deploy_start( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
self endon("entityshutdown");
self util::waittill_dobj( localClientNum );
if ( !isdefined(self) )
return;
if ( newVal )
{
self thread emp_turret_deploy(localClientNum);
}
else
{
self notify("kill_fx_cleanup");
if ( isdefined( self.fxHandle ) )
{
StopFx( localClientNum, self.fxHandle );
self.fxHandle = undefined;
}
}
}
function emp_turret_deploy( localClientNum )
{
self endon("entityshutdown");
self UseAnimTree( #animtree );
self SetAnimRestart( %o_turret_emp_core_deploy, 1.0, 0.0, 1.0 );
length = GetAnimLength( %o_turret_emp_core_deploy );
// self waittill("end"); // length of deploy anim
wait length * 0.75;
self UseAnimTree( #animtree );
self SetAnim( %o_turret_emp_core_spin, 1.0 );
self.fxHandle = PlayFxOnTag( localClientNum, "killstreaks/fx_emp_core", self, "tag_fx" );
self thread cleanup_fx_on_shutdown( localClientNum, self.fxHandle );
wait length * 0.25;
self SetAnim( %o_turret_emp_core_deploy, 0.0 ); // stop deploy anim
}