1 #using scripts\codescripts\struct;
3 #using scripts\shared\clientfield_shared;
4 #using scripts\shared\fx_shared;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\util_shared;
8 #insert scripts\shared\shared.gsh;
9 #insert scripts\shared\version.gsh;
11 #precache( "client_fx", "_t6/misc/fx_equip_light_red" );
12 #precache( "client_fx", "_t6/misc/fx_equip_light_green" );
18 level._effect[
"scrambler_enemy_light"] =
"_t6/misc/fx_equip_light_red";
19 level._effect[
"scrambler_friendly_light"] =
"_t6/misc/fx_equip_light_green";
21 level.scramblerHandle = 1;
22 level.scramblerVOOuterRadius = 1200 * 1200;
23 level.scramblerInnerRadius = 500 * 500;
24 level.scramblesound =
"mpl_scrambler_static";
25 level.globalscramblesound =
"mpl_cuav_static";
26 level.scramblesoundalert =
"mpl_scrambler_alert";
27 level.scramblesoundping =
"mpl_scrambler_ping";
28 level.scramblesoundburst =
"mpl_scrambler_burst";
34 level.scramblers = [];
35 level.playerPersistent = [];
48 if ( localClientNum != 0 )
59 if ( localClientNum != 0 )
62 self spawned(localClientNum, newVal,
false);
70 if ( localClientNum != 0 )
73 scramblerHandle = level.scramblerHandle;
74 level.scramblerHandle++;
76 size = level.scramblers.size;
77 level.scramblers[size] = spawnstruct();
78 level.scramblers[size].scramblerHandle = scramblerHandle;
79 level.scramblers[size].cent =
self;
80 level.scramblers[size].team =
self.team;
81 level.scramblers[size].isLocalized = isLocalized;
82 level.scramblers[size].sndEnt =
spawn( 0,
self.origin,
"script_origin" );
83 level.scramblers[size].sndId = -1;
84 level.scramblers[size].sndPingEnt =
spawn( 0,
self.origin,
"script_origin" );
85 level.scramblers[size].sndPingId = -1;
87 players = level.localPlayers;
88 owner =
self GetOwner( localClientNum );
97 player = GetLocalPlayer( localClientNum );
99 owner =
self GetOwner( localClientNum );
100 scramblerIndex = undefined;
102 for ( i = 0; i < level.scramblers.size; i++ )
104 if ( level.scramblers[i].scramblerHandle == scramblerHandle )
111 if ( !isdefined( scramblerIndex ) )
118 if ( owner == player && !IsSpectating( localClientNum,
false ) )
120 player AddFriendlyScrambler(
self.origin[0],
self.origin[1], scramblerHandle );
124 if ( isdefined( level.scramblers[scramblerIndex].sndEnt ) )
126 level.scramblers[scramblerIndex].sndId = level.scramblers[scramblerIndex].sndEnt playloopsound(level.scramblesoundalert);
127 playsound (0, level.scramblesoundburst, level.scramblers[scramblerIndex].sndEnt.origin);
129 if ( isdefined( level.scramblers[scramblerIndex].sndPingEnt ) )
130 level.scramblers[scramblerIndex].sndPingId = level.scramblers[scramblerIndex].sndPingEnt playloopsound(level.scramblesoundping);
136 scrambleSound = level.scramblesound;
137 if ( isLocalized ==
false )
139 scrambleSound = level.globalscramblesound;
143 if ( isdefined( level.scramblers[scramblerIndex].sndEnt ) )
144 level.scramblers[scramblerIndex].sndId = level.scramblers[scramblerIndex].sndEnt playloopsound(scrambleSound);
148 self thread
fx::blinky_light( localClientNum,
"tag_light", level._effect[
"scrambler_friendly_light"], level._effect[
"scrambler_enemy_light"] );
153 nearestEnemy = level.scramblerVOOuterRadius;
154 nearestFriendly = level.scramblerVOOuterRadius;
160 players = level.localPlayers;
161 for (localClientNum = 0; localClientNum < players.size; localClientNum++)
163 player = players[localClientNum];
165 if (!isdefined ( player.team ))
168 if (!isdefined ( level.playerPersistent[localClientNum] ) )
170 level.playerPersistent[localClientNum] = spawnStruct();
171 level.playerPersistent[localClientNum].previousTeam = player.team;
172 player removeallFriendlyScramblers();
175 if ( level.playerPersistent[localClientNum].previousTeam != player.team )
178 level.playerPersistent[localClientNum].previousTeam = player.team;
183 enemyScramblerAmount = 0.0;
184 friendlyScramblerAmount = 0.0;
185 nearestEnemy = level.scramblerVOOuterRadius;
186 nearestFriendly = level.scramblerVOOuterRadius;
187 isGlobalScrambler = 0;
188 distToScrambler = level.scramblerVOOuterRadius;
189 nearestEnemyScramblerCent = undefined;
191 for ( i = 0; i < level.scramblers.size; i++ )
193 if (!isdefined( level.scramblers[i].cent ) )
196 if ( isdefined( level.scramblers[i].cent.stunned ) && level.scramblers[i].cent.stunned )
198 level.scramblers[i].cent.reenable =
true;
199 player RemoveFriendlyScrambler( level.scramblers[i].scramblerHandle );
202 else if ( isdefined( level.scramblers[i].cent.reenable ) && level.scramblers[i].cent.reenable )
205 level.scramblers[i].cent.reenable =
false;
208 if ( level.scramblers[i].isLocalized )
210 distToScrambler = distanceSquared( player.origin, level.scramblers[i].cent.origin );
214 if ( !level.scramblers[i].isLocalized && level.scramblers[i].cent
isEnemyScrambler( localClientNum ) )
216 isGlobalScrambler = 1;
221 if ( level.scramblers[i].team != level.scramblers[i].cent.team )
223 scramblerTeamChanged =
true;
224 level.scramblers[i].team = level.scramblers[i].cent.team;
228 scramblerTeamChanged =
false;
231 if ( teamChanged || scramblerTeamChanged )
236 if ( nearestEnemy > distToScrambler )
238 nearestEnemyScramblerCent = level.scramblers[i].cent;
239 nearestEnemy = distToScrambler;
242 if ( ( level.scramblers[i].isLocalized ) && ( teamChanged || scramblerTeamChanged ) )
243 player RemoveFriendlyScrambler( level.scramblers[i].scramblerHandle );
245 else if ( level.scramblers[i].isLocalized )
247 if ( nearestFriendly > distToScrambler )
248 nearestFriendly = distToScrambler;
250 owner = level.scramblers[i].cent GetOwner( localClientNum );
252 if ( owner == player && !IsSpectating( localClientNum,
false ) )
254 if ( teamChanged || scramblerTeamChanged )
256 player AddFriendlyScrambler( level.scramblers[i].cent.origin[0], level.scramblers[i].cent.origin[1], level.scramblers[i].scramblerHandle );
263 if ( nearestEnemy < level.scramblerVOOuterRadius )
264 enemyVOScramblerAmount = 1 - ( ( nearestEnemy - level.scramblerInnerRadius ) / ( level.scramblerVOOuterRadius - level.scramblerInnerRadius ) );
266 enemyVOScramblerAmount = 0;
268 if ( nearestFriendly < level.scramblerInnerRadius )
269 friendlyScramblerAmount = 1.0;
270 else if ( nearestFriendly < level.scramblerVOOuterRadius )
271 friendlyScramblerAmount = 1 - ( ( nearestFriendly - level.scramblerInnerRadius ) / ( level.scramblerVOOuterRadius - level.scramblerInnerRadius ) );
272 player SetFriendlyScramblerAmount( friendlyScramblerAmount );
274 if ( level.scramblers.size > 0 && isdefined(nearestEnemyScramblerCent) )
276 player SetNearestEnemyScrambler( nearestEnemyScramblerCent );
280 player ClearNearestEnemyScrambler();
285 if ( isGlobalScrambler && ( player HasPerk( localClientNum,
"specialty_immunecounteruav" ) ==
false ) )
286 player SetEnemyGlobalScrambler( 1 );
288 player SetEnemyGlobalScrambler( 0 );
290 if (enemyVOScramblerAmount > 1)
291 enemyVOScramblerAmount = 1;
293 if ( GetDvarfloat(
"snd_futz" ) != enemyVOScramblerAmount )
294 SetDvar(
"snd_futz", enemyVOScramblerAmount );
305 scramblerEnt waittill(
"entityshutdown" );
306 players = level.localPlayers;
308 for ( j = 0; j < level.scramblers.size; j++ )
310 size = level.scramblers.size;
311 if ( scramblerHandle == level.scramblers[j].scramblerHandle )
313 playsound (0, level.scramblesoundburst, level.scramblers[j].sndEnt.origin);
314 level.scramblers[j].sndEnt
delete();
315 level.scramblers[j].sndEnt =
self.scramblers[size - 1].sndEnt;
316 level.scramblers[j].sndPingEnt
delete();
317 level.scramblers[j].sndPingEnt =
self.scramblers[size - 1].sndPingEnt;
318 level.scramblers[j].cent = level.scramblers[size - 1].cent;
319 level.scramblers[j].scramblerHandle = level.scramblers[size - 1].scramblerHandle;
320 level.scramblers[j].team = level.scramblers[size - 1].team;
321 level.scramblers[j].isLocalized = level.scramblers[size - 1].isLocalized;
322 level.scramblers[size - 1] = undefined;
329 for ( i = 0; i < players.size; i++ )
331 players[i] RemoveFriendlyScrambler( scramblerHandle );
341 if ( GetDvarInt(
"scr_forceEnemyScrambler", 0 ) )
352 level waittill(
"player_switch" );
355 players = level.localPlayers;
356 for (localClientNum = 0; localClientNum < players.size; localClientNum++)
358 for ( j = 0; j < level.scramblers.size; j++ )
360 ent = level.scramblers[j].cent;
364 ent thread
fx::blinky_light( localClientNum,
"tag_light", level._effect[
"scrambler_friendly_light"], level._effect[
"scrambler_enemy_light"] );
377 if (
self.sndId != -1 )
379 self.sndEnt StopAllLoopSounds( 0.1 );
385 if (
self.isLocalized )
387 self.sndId =
self.sndEnt playloopsound( level.scramblesoundalert );
392 isLocalized =
self.isLocalized;
393 scrambleSound = level.scramblesound;
394 if ( isLocalized ==
false )
396 scrambleSound = level.globalscramblesound;
399 self.sndId =
self.sndEnt playloopsound( scrambleSound );