‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_scrambler.csc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\clientfield_shared;
4 #using scripts\shared\fx_shared;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\util_shared;
7 
8 #insert scripts\shared\shared.gsh;
9 #insert scripts\shared\version.gsh;
10 
11 #precache( "client_fx", "_t6/misc/fx_equip_light_red" );
12 #precache( "client_fx", "_t6/misc/fx_equip_light_green" );
13 
14 #namespace scrambler;
15 
16 function ‪init_shared()
17 {
18  level._effect["scrambler_enemy_light"] = "_t6/misc/fx_equip_light_red";
19  level._effect["scrambler_friendly_light"] = "_t6/misc/fx_equip_light_green";
20 
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";
29 
31  //TODO T7 - if this is going live again, the below 'counteruav' clientfield needs to get updated to be scrambler specific. In its current state it is shared with the counteruav
32  //clientfield::register( "scriptmover", "counteruav", VERSION_SHIP, 1, "int", &spawnedGlobalScramber,!CF_HOST_ONLY, !CF_CALLBACK_ZERO_ON_NEW_ENT );
33 
34  level.scramblers = [];
35  level.playerPersistent = [];
36  localClientNum = 0;
37  ‪util::waitforclient( localClientNum );
38 
39  level thread ‪scramblerUpdate( localClientNum );
40  level thread ‪checkForPlayerSwitch();
41 }
42 
43 function ‪spawnedScrambler(localClientNum, ‪set)
44 {
45  if ( !‪set )
46  return;
47 
48  if ( localClientNum != 0 )
49  return;
50 
51  self ‪spawned(localClientNum, ‪set, true);
52 }
53 
54 function ‪spawnedGlobalScramber( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
55 {
56  if ( !newVal )
57  return;
58 
59  if ( localClientNum != 0 )
60  return;
61 
62  self ‪spawned(localClientNum, newVal, false);
63 }
64 
65 function ‪spawned(localClientNum, ‪set, isLocalized)
66 {
67  if ( !‪set )
68  return;
69 
70  if ( localClientNum != 0 )
71  return;
72 
73  scramblerHandle = level.scramblerHandle;
74  level.scramblerHandle++;
75 
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;
86 
87  players = level.localPlayers;
88  owner = self GetOwner( localClientNum );
89 
90  ‪util::local_players_entity_thread( self,&‪spawnedPerClient, isLocalized, scramblerHandle );
91 
92  level thread ‪cleanUpScramblerOnDelete( self, scramblerHandle, isLocalIzed, localClientNum );
93 }
94 
95 function ‪spawnedPerClient(localClientNum, isLocalized, scramblerHandle)
96 {
97  player = GetLocalPlayer( localClientNum );
98  isEnemy = self ‪isEnemyScrambler( localClientNum );
99  owner = self GetOwner( localClientNum );
100  scramblerIndex = undefined;
101 
102  for ( i = 0; i < level.scramblers.size; i++ )
103  {
104  if ( level.scramblers[i].scramblerHandle == scramblerHandle )
105  {
106  scramblerIndex = i;
107  break;
108  }
109  }
110 
111  if ( !isdefined( scramblerIndex ) )
112  return;
113 
114  if ( !isEnemy )
115  {
116  if ( isLocalized )
117  {
118  if ( owner == player && !IsSpectating( localClientNum, false ) )
119  {
120  player AddFriendlyScrambler( self.origin[0], self.origin[1], scramblerHandle );
121  }
122 
123  //play ally sccramble sounds
124  if ( isdefined( level.scramblers[scramblerIndex].sndEnt ) )
125  {
126  level.scramblers[scramblerIndex].sndId = level.scramblers[scramblerIndex].sndEnt playloopsound(level.scramblesoundalert);
127  playsound (0, level.scramblesoundburst, level.scramblers[scramblerIndex].sndEnt.origin);
128  }
129  if ( isdefined( level.scramblers[scramblerIndex].sndPingEnt ) )
130  level.scramblers[scramblerIndex].sndPingId = level.scramblers[scramblerIndex].sndPingEnt playloopsound(level.scramblesoundping);
131  //iprintlnbold ("friendly Scrambler sound " + self.origin + level.scramblers[scramblerIndex].sndEnt.origin );
132  }
133  }
134  else
135  {
136  scrambleSound = level.scramblesound;
137  if ( isLocalized == false )
138  {
139  scrambleSound = level.globalscramblesound;
140  }
141 
142  //play enemy sccramble sounds
143  if ( isdefined( level.scramblers[scramblerIndex].sndEnt ) )
144  level.scramblers[scramblerIndex].sndId = level.scramblers[scramblerIndex].sndEnt playloopsound(scrambleSound);
145  //iprintlnbold ("enemy Scrambler sound " + self.origin + level.scramblers[scramblerIndex].sndEnt.origin );
146  }
147 
148  self thread ‪fx::blinky_light( localClientNum, "tag_light", level._effect["scrambler_friendly_light"], level._effect["scrambler_enemy_light"] );
149 }
150 
151 function ‪scramblerUpdate( localClientNum )
152 {
153  nearestEnemy = level.scramblerVOOuterRadius;
154  nearestFriendly = level.scramblerVOOuterRadius;
155 
156  for ( ;; )
157  {
158  // NOTE: this functionality is reliant on the level.localPlayers[] being valid. First check this if anything
159  // is reported as not working here.
160  players = level.localPlayers;
161  for (localClientNum = 0; localClientNum < players.size; localClientNum++)
162  {
163  player = players[localClientNum];
164 
165  if (!isdefined ( player.team ))
166  continue; // hopefully it'll show up soon, so just do nothing for now
167 
168  if (!isdefined ( level.playerPersistent[localClientNum] ) )
169  {
170  level.playerPersistent[localClientNum] = spawnStruct();
171  level.playerPersistent[localClientNum].previousTeam = player.team;
172  player removeallFriendlyScramblers();
173  }
174 
175  if ( level.playerPersistent[localClientNum].previousTeam != player.team )
176  {
177  teamChanged = true;
178  level.playerPersistent[localClientNum].previousTeam = player.team;
179  }
180  else
181  teamChanged = false;
182 
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;
190 
191  for ( i = 0; i < level.scramblers.size; i++ )
192  {
193  if (!isdefined( level.scramblers[i].cent ) )
194  continue;
195 
196  if ( isdefined( level.scramblers[i].cent.stunned ) && level.scramblers[i].cent.stunned )
197  {
198  level.scramblers[i].cent.reenable = true;
199  player RemoveFriendlyScrambler( level.scramblers[i].scramblerHandle );
200  continue;
201  }
202  else if ( isdefined( level.scramblers[i].cent.reenable ) && level.scramblers[i].cent.reenable )
203  {
204  teamChanged = true;
205  level.scramblers[i].cent.reenable = false;
206  }
207 
208  if ( level.scramblers[i].isLocalized )
209  {
210  distToScrambler = distanceSquared( player.origin, level.scramblers[i].cent.origin );
211 
212  }
213 
214  if ( !level.scramblers[i].isLocalized && level.scramblers[i].cent ‪isEnemyScrambler( localClientNum ) )
215  {
216  isGlobalScrambler = 1;
217  }
218 
219  isEnemy = level.scramblers[i].cent ‪isEnemyScrambler( localClientNum );
220 
221  if ( level.scramblers[i].team != level.scramblers[i].cent.team )
222  {
223  scramblerTeamChanged = true;
224  level.scramblers[i].team = level.scramblers[i].cent.team;
225  }
226  else
227  {
228  scramblerTeamChanged = false;
229  }
230 
231  if ( teamChanged || scramblerTeamChanged )
232  level.scramblers[i] ‪restartSound( isEnemy );
233 
234  if ( isEnemy )
235  {
236  if ( nearestEnemy > distToScrambler )
237  {
238  nearestEnemyScramblerCent = level.scramblers[i].cent;
239  nearestEnemy = distToScrambler;
240  }
241 
242  if ( ( level.scramblers[i].isLocalized ) && ( teamChanged || scramblerTeamChanged ) )
243  player RemoveFriendlyScrambler( level.scramblers[i].scramblerHandle );
244  }
245  else if ( level.scramblers[i].isLocalized )
246  {
247  if ( nearestFriendly > distToScrambler )
248  nearestFriendly = distToScrambler;
249 
250  owner = level.scramblers[i].cent GetOwner( localClientNum );
251 
252  if ( owner == player && !IsSpectating( localClientNum, false ) )
253  {
254  if ( teamChanged || scramblerTeamChanged )
255  {
256  player AddFriendlyScrambler( level.scramblers[i].cent.origin[0], level.scramblers[i].cent.origin[1], level.scramblers[i].scramblerHandle );
257  }
258  }
259  }
260  }
261 
262 
263  if ( nearestEnemy < level.scramblerVOOuterRadius )
264  enemyVOScramblerAmount = 1 - ( ( nearestEnemy - level.scramblerInnerRadius ) / ( level.scramblerVOOuterRadius - level.scramblerInnerRadius ) );
265  else
266  enemyVOScramblerAmount = 0;
267 
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 );
273 
274  if ( level.scramblers.size > 0 && isdefined(nearestEnemyScramblerCent) )
275  {
276  player SetNearestEnemyScrambler( nearestEnemyScramblerCent );
277  }
278  else
279  {
280  player ClearNearestEnemyScrambler();
281  }
282 
283  //player SetEnemyScramblerAmount( enemyScramblerAmount );
284 
285  if ( isGlobalScrambler && ( player HasPerk( localClientNum, "specialty_immunecounteruav" ) == false ) )
286  player SetEnemyGlobalScrambler( 1 );
287  else
288  player SetEnemyGlobalScrambler( 0 );
289 
290  if (enemyVOScramblerAmount > 1)
291  enemyVOScramblerAmount = 1;
292 
293  if ( GetDvarfloat( "snd_futz" ) != enemyVOScramblerAmount )
294  SetDvar( "snd_futz", enemyVOScramblerAmount );
295  }
296 
297  wait( 0.25 );
299  }
300 }
301 
302 
303 function ‪cleanUpScramblerOnDelete( scramblerEnt, scramblerHandle, isLocalized, localClientNum )
304 {
305  scramblerEnt waittill( "entityshutdown" );
306  players = level.localPlayers;
307 
308  for ( j = 0; j < level.scramblers.size; j++ )
309  {
310  size = level.scramblers.size;
311  if ( scramblerHandle == level.scramblers[j].scramblerHandle )
312  {
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;
323  break;
324  }
325  }
326 
327  if ( isLocalized )
328  {
329  for ( i = 0; i < players.size; i++ )
330  {
331  players[i] RemoveFriendlyScrambler( scramblerHandle );
332  }
333  }
334 }
335 
336 
337 
338 function ‪isEnemyScrambler( localClientNum )
339 {
340  /#
341  if ( GetDvarInt( "scr_forceEnemyScrambler", 0 ) )
342  return true;
343  #/
344  enemy = !‪util::friend_not_foe(localClientNum);
345  return enemy;
346 }
347 
349 {
350  while ( true )
351  {
352  level waittill( "player_switch" );
353  waittillframeend;
354 
355  players = level.localPlayers;
356  for (localClientNum = 0; localClientNum < players.size; localClientNum++)
357  {
358  for ( j = 0; j < level.scramblers.size; j++ )
359  {
360  ent = level.scramblers[j].cent;
361 
362  ent thread ‪fx::stop_blinky_light( localClientNum );
363 
364  ent thread ‪fx::blinky_light( localClientNum, "tag_light", level._effect["scrambler_friendly_light"], level._effect["scrambler_enemy_light"] );
365 
366  isEnemy = ent ‪isEnemyScrambler( localClientNum );
367 
368  level.scramblers[j] ‪restartSound( isEnemy );
369  }
370 
371  }
372  }
373 }
374 
375 function ‪restartSound( isEnemy )
376 {
377  if ( self.sndId != -1 )
378  {
379  self.sndEnt StopAllLoopSounds( 0.1 );
380  self.sndId = -1;
381  }
382 
383  if ( !isEnemy )
384  {
385  if ( self.isLocalized )
386  {
387  self.sndId = self.sndEnt playloopsound( level.scramblesoundalert );
388  }
389  }
390  else
391  {
392  isLocalized = self.isLocalized;
393  scrambleSound = level.scramblesound;
394  if ( isLocalized == false )
395  {
396  scrambleSound = level.globalscramblesound;
397  }
398 
399  self.sndId = self.sndEnt playloopsound( scrambleSound );
400  }
401 }
‪waitforclient
‪function waitforclient(client)
Definition: util_shared.csc:60
‪isEnemyScrambler
‪function isEnemyScrambler(localClientNum)
Definition: _scrambler.csc:338
‪checkForPlayerSwitch
‪function checkForPlayerSwitch()
Definition: _scrambler.csc:348
‪CF_CALLBACK_ZERO_ON_NEW_ENT
‪#define CF_CALLBACK_ZERO_ON_NEW_ENT
Definition: version.gsh:103
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪init_shared
‪function init_shared()
Definition: _scrambler.csc:16
‪stop_blinky_light
‪function stop_blinky_light(localClientNum)
Definition: fx_shared.csc:315
‪friend_not_foe
‪function friend_not_foe(localClientIndex, predicted)
Definition: util_shared.csc:1164
‪restartSound
‪function restartSound(isEnemy)
Definition: _scrambler.csc:375
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪local_players_entity_thread
‪function local_players_entity_thread(entity, func, arg1, arg2, arg3, arg4)
Definition: util_shared.csc:1493
‪scramblerUpdate
‪function scramblerUpdate(localClientNum)
Definition: _scrambler.csc:151
‪blinky_light
‪function blinky_light(localClientNum, tagName, friendlyfx, enemyfx)
Definition: fx_shared.csc:280
‪CF_HOST_ONLY
‪#define CF_HOST_ONLY
Definition: version.gsh:102
‪cleanUpScramblerOnDelete
‪function cleanUpScramblerOnDelete(scramblerEnt, scramblerHandle, isLocalized, localClientNum)
Definition: _scrambler.csc:303
‪spawnedGlobalScramber
‪function spawnedGlobalScramber(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _scrambler.csc:54
‪spawnedPerClient
‪function spawnedPerClient(localClientNum, isLocalized, scramblerHandle)
Definition: _scrambler.csc:95
‪spawnedScrambler
‪function spawnedScrambler(localClientNum, set)
Definition: _scrambler.csc:43
‪spawned
‪function spawned(localClientNum, set, isLocalized)
Definition: _scrambler.csc:65
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪waitforallclients
‪function waitforallclients()
Definition: util_shared.csc:36
‪register
‪function register()
Definition: _ai_tank.gsc:126