#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 }