‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
visionset_mgr_shared.csc
Go to the documentation of this file.
1 #using scripts\shared\callbacks_shared;
2 #using scripts\shared\clientfield_shared;
3 #using scripts\shared\filter_shared;
4 #using scripts\shared\postfx_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 #insert scripts\mp\killstreaks\_killstreaks.gsh;
11 
12 #define VSMGR_OVERLAY_STYLE_NONE 0
13 #define VSMGR_OVERLAY_STYLE_POSTFX_BUNDLE 1
14 #define VSMGR_OVERLAY_STYLE_FILTER 2
15 #define VSMGR_OVERLAY_STYLE_BLUR 3
16 #define VSMGR_OVERLAY_STYLE_ELECTRIFIED 4
17 #define VSMGR_OVERLAY_STYLE_BURN 5
18 #define VSMGR_OVERLAY_STYLE_POISON 6
19 #define VSMGR_OVERLAY_STYLE_TRANSPORTED 7
20 #define VSMGR_OVERLAY_STYLE_SPEED_BLUR 8
21 
22 #define VSMGR_VISIONSET_TYPE_NAKED 0
23 #define VSMGR_VISIONSET_TYPE_LASTSTAND 6
24 
25 #namespace visionset_mgr;
26 
27 ‪REGISTER_SYSTEM( "visionset_mgr", &‪__init__, undefined )
28 
29 function ‪__init__()
30 {
31  level.vsmgr_initializing = true;
32  level.vsmgr_default_info_name = "__none"; // underscores force this into the zeroth slot
33 
34  level.vsmgr = [];
35  level.vsmgr_states_inited = [];
36  level.vsmgr_filter_custom_enable = []; // array indexed by filter name, function pointer for special enable function
37  level.vsmgr_filter_custom_disable = []; // array indexed by filter name, function pointer for special enable function
38 
40  ‪register_visionset_info( level.vsmgr_default_info_name, ‪VERSION_SHIP, 1, "undefined", "undefined" );
41 
43  ‪register_overlay_info_style_none( level.vsmgr_default_info_name, ‪VERSION_SHIP, 1 );
44 
46  level thread ‪monitor();
47 }
48 
49 
50 function ‪register_visionset_info( ‪name, version, lerp_step_count, visionset_from, visionset_to, visionset_type = ‪VSMGR_VISIONSET_TYPE_NAKED )
51 {
52  if ( !‪register_info( "visionset", ‪name, version, lerp_step_count ) )
53  {
54  return;
55  }
56 
57  level.vsmgr["visionset"].info[‪name].visionset_from = visionset_from;
58  level.vsmgr["visionset"].info[‪name].visionset_to = visionset_to;
59  level.vsmgr["visionset"].info[‪name].visionset_type = visionset_type;
60 }
61 
62 function ‪register_overlay_info_style_none( ‪name, version, lerp_step_count )
63 {
64  if ( !‪register_info( "overlay", ‪name, version, lerp_step_count ) )
65  {
66  return;
67  }
68 
69  level.vsmgr["overlay"].info[‪name].style = ‪VSMGR_OVERLAY_STYLE_NONE;
70 }
71 
72 
73 function ‪register_overlay_info_style_filter( ‪name, version, lerp_step_count, filter_index, pass_index, material_name, constant_index )
74 {
75  if ( !‪register_info( "overlay", ‪name, version, lerp_step_count ) )
76  {
77  return;
78  }
79 
80  level.vsmgr["overlay"].info[‪name].style = ‪VSMGR_OVERLAY_STYLE_FILTER;
81 
82  level.vsmgr["overlay"].info[‪name].filter_index = filter_index;
83  level.vsmgr["overlay"].info[‪name].pass_index = pass_index;
84  level.vsmgr["overlay"].info[‪name].material_name = material_name;
85  level.vsmgr["overlay"].info[‪name].constant_index = constant_index;
86 }
87 
88 
89 function ‪register_overlay_info_style_blur( ‪name, version, lerp_step_count, transition_in, transition_out, magnitude )
90 {
91  if ( !‪register_info( "overlay", ‪name, version, lerp_step_count ) )
92  {
93  return;
94  }
95 
96  level.vsmgr["overlay"].info[‪name].style = ‪VSMGR_OVERLAY_STYLE_BLUR;
97 
98  level.vsmgr["overlay"].info[‪name].transition_in = transition_in;
99  level.vsmgr["overlay"].info[‪name].transition_out = transition_out;
100  level.vsmgr["overlay"].info[‪name].magnitude = magnitude;
101 }
102 
103 
104 function ‪register_overlay_info_style_electrified( ‪name, version, lerp_step_count, duration )
105 {
106  if ( !‪register_info( "overlay", ‪name, version, lerp_step_count ) )
107  {
108  return;
109  }
110 
111  level.vsmgr["overlay"].info[‪name].style = ‪VSMGR_OVERLAY_STYLE_ELECTRIFIED;
112 
113  level.vsmgr["overlay"].info[‪name].duration = duration;
114 }
115 
116 
117 function ‪register_overlay_info_style_burn( ‪name, version, lerp_step_count, duration )
118 {
119  if ( !‪register_info( "overlay", ‪name, version, lerp_step_count ) )
120  {
121  return;
122  }
123 
124  level.vsmgr["overlay"].info[‪name].style = ‪VSMGR_OVERLAY_STYLE_BURN;
125 
126  level.vsmgr["overlay"].info[‪name].duration = duration;
127 }
128 
129 
130 // NOTE: this will run on all clients when used
131 function ‪register_overlay_info_style_poison( ‪name, version, lerp_step_count )
132 {
133  if ( !‪register_info( "overlay", ‪name, version, lerp_step_count ) )
134  {
135  return;
136  }
137 
138  level.vsmgr[ "overlay" ].info[ ‪name ].style = ‪VSMGR_OVERLAY_STYLE_POISON;
139 }
140 
141 
142 function ‪register_overlay_info_style_transported( ‪name, version, lerp_step_count, duration )
143 {
144  if ( !‪register_info( "overlay", ‪name, version, lerp_step_count ) )
145  {
146  return;
147  }
148 
149  level.vsmgr["overlay"].info[‪name].style = ‪VSMGR_OVERLAY_STYLE_TRANSPORTED;
150 
151  level.vsmgr["overlay"].info[‪name].duration = duration;
152 }
153 
154 // Speed blur duration is managed outside of visionset_mgr
155 function ‪register_overlay_info_style_speed_blur( ‪name, version, lerp_step_count, amount, inner_radius, outer_radius, velocity_should_scale, velocity_scale, blur_in, blur_out, should_offset )
156 {
157  if ( !‪register_info( "overlay", ‪name, version, lerp_step_count ) )
158  {
159  return;
160  }
161 
162  level.vsmgr["overlay"].info[‪name].style = ‪VSMGR_OVERLAY_STYLE_SPEED_BLUR;
163 
164  level.vsmgr["overlay"].info[‪name].amount = amount;
165  level.vsmgr["overlay"].info[‪name].inner_radius = inner_radius;
166  level.vsmgr["overlay"].info[‪name].outer_radius = outer_radius;
167  level.vsmgr["overlay"].info[‪name].velocity_should_scale = velocity_should_scale;
168  level.vsmgr["overlay"].info[‪name].velocity_scale = velocity_scale;
169  level.vsmgr["overlay"].info[‪name].blur_in = blur_in;
170  level.vsmgr["overlay"].info[‪name].blur_out = blur_out;
171  level.vsmgr["overlay"].info[‪name].should_offset = should_offset;
172 }
173 
174 
175 function ‪register_overlay_info_style_postfx_bundle( ‪name, version, lerp_step_count, bundle, duration )
176 {
177  if ( !‪register_info( "overlay", ‪name, version, lerp_step_count ) )
178  {
179  return;
180  }
181 
182  level.vsmgr["overlay"].info[‪name].style = ‪VSMGR_OVERLAY_STYLE_POSTFX_BUNDLE;
183  level.vsmgr["overlay"].info[‪name].bundle = bundle;
184  level.vsmgr["overlay"].info[‪name].duration = duration;
185 }
186 
187 
188 function ‪is_type_currently_default( localClientNum, type )
189 {
190  if ( !level.vsmgr[type].in_use )
191  {
192  return true;
193  }
194 
195  state = ‪get_state( localClientNum, type );
196  curr_info = ‪get_info( type, state.curr_slot );
197 
198  return (curr_info.name == level.vsmgr_default_info_name);
199 }
200 
201 
202 function ‪register_type( type, cf_slot_cb, cf_lerp_cb, update_cb )
203 {
204  level.vsmgr[type] = spawnstruct();
205 
206  level.vsmgr[type].type = type;
207  level.vsmgr[type].in_use = false; // true if items other than the default value has been registered
208  level.vsmgr[type].highest_version = 0;
209  level.vsmgr[type].server_version = getserverhighestclientfieldversion();
210  level.vsmgr[type].cf_slot_name = type + "_slot";
211  level.vsmgr[type].cf_lerp_name = type + "_lerp";
212  level.vsmgr[type].cf_slot_cb = cf_slot_cb;
213  level.vsmgr[type].cf_lerp_cb = cf_lerp_cb;
214  level.vsmgr[type].update_cb = update_cb;
215  level.vsmgr[type].info = [];
216  level.vsmgr[type].sorted_name_keys = [];
217 }
218 
219 function ‪finalize_initialization( localclientnum )
220 {
221  thread ‪finalize_clientfields();
222 
223  if( !isdefined( level._fv2vs_default_visionset ) )
224  {
225  ‪init_fog_vol_to_visionset_monitor( GetDvarString( "mapname" ), 0 );
226  ‪fog_vol_to_visionset_set_info( 0, GetDvarString( "mapname" ) );
227  }
228 }
229 
231 {
232  typeKeys = GetArrayKeys( level.vsmgr );
233  for ( type_index = 0; type_index < typeKeys.size; type_index++ )
234  {
235  level.vsmgr[typeKeys[type_index]] thread ‪finalize_type_clientfields();
236  }
237 
238  level.vsmgr_initializing = false; // registering new infos is not allowed after this point
239 }
240 
241 
243 {
244  /#println( "visionset_mgr [" + self.type + "] client registrations:" );#/
245 
246  if ( 1 >= self.info.size ) // if only the default info has been registered, don't spend bits on this type
247  {
248  return;
249  }
250 
251  self.in_use = true;
252  self.cf_slot_bit_count = GetMinBitCountForNum( self.info.size - 1 );
253  self.cf_lerp_bit_count = self.info[self.sorted_name_keys[0]].lerp_bit_count;
254 
255  for ( i = 0; i < self.sorted_name_keys.size; i++ )
256  {
257  self.info[self.sorted_name_keys[i]].slot_index = i;
258 
259  if ( self.info[self.sorted_name_keys[i]].lerp_bit_count > self.cf_lerp_bit_count )
260  {
261  self.cf_lerp_bit_count = self.info[self.sorted_name_keys[i]].lerp_bit_count;
262  }
263 
264  /#println( " name: " + self.info[self.sorted_name_keys[i]].‪name + ", version: " + self.info[self.sorted_name_keys[i]].version + ", lerp_step_count: " + self.info[self.sorted_name_keys[i]].lerp_step_count + "" );#/
265  }
266 
267  ‪clientfield::register( "toplayer", self.cf_slot_name, self.highest_version, self.cf_slot_bit_count, "int", self.cf_slot_cb, !‪CF_HOST_ONLY, ‪CF_CALLBACK_ZERO_ON_NEW_ENT );
268 
269  // don't spend a clientfield if all slots are just on/off
270  if ( 1 < self.cf_lerp_bit_count )
271  {
272  ‪clientfield::register( "toplayer", self.cf_lerp_name, self.highest_version, self.cf_lerp_bit_count, "float", self.cf_lerp_cb, !‪CF_HOST_ONLY, ‪CF_CALLBACK_ZERO_ON_NEW_ENT );
273  }
274 }
275 
276 
277 function ‪validate_info( type, ‪name, version )
278 {
279  keys = GetArrayKeys( level.vsmgr );
280  for ( i = 0; i < keys.size; i++ )
281  {
282  if ( type == keys[i] )
283  {
284  break;
285  }
286  }
287 
288  assert( i < keys.size, "In visionset_mgr, type '" + type + "'is unknown" );
289 
290  if ( version > level.vsmgr[type].server_version )
291  {
292  return false;
293  }
294 
295  if ( isdefined( level.vsmgr[type].info[‪name] ) && version < level.vsmgr[type].info[‪name].version )
296  {
297  if ( version < level.vsmgr[type].info[‪name].version )
298  {
299  return false;
300  }
301 
302  // the version of this one is higher than the previously registered one, so let's clear the old one and register the new one.
303  level.vsmgr[type].info[‪name] = undefined;
304  }
305 
306  return true;
307 }
308 
309 
311 {
312  for ( i = 0; i < level.vsmgr[type].sorted_name_keys.size; i++ )
313  {
314  if ( ‪name < level.vsmgr[type].sorted_name_keys[i] )
315  {
316  break;
317  }
318  }
319 
320  ArrayInsert( level.vsmgr[type].sorted_name_keys, ‪name, i );
321 }
322 
323 
324 function ‪add_info( type, ‪name, version, lerp_step_count )
325 {
326  self.type = type;
327  self.name = ‪name;
328  self.version = version;
329  self.lerp_step_count = lerp_step_count;
330  self.lerp_bit_count = GetMinBitCountForNum( lerp_step_count );
331 }
332 
333 
334 function ‪register_info( type, ‪name, version, lerp_step_count )
335 {
336  assert( level.vsmgr_initializing, "All info registration in the visionset_mgr system must occur during the first frame while the system is initializing" );
337 
338  lower_name = ToLower( ‪name );
339 
340  if ( !‪validate_info( type, lower_name, version ) )
341  {
342  return false;
343  }
344 
345  ‪add_sorted_name_key( type, lower_name );
346 
347  level.vsmgr[type].info[lower_name] = spawnstruct();
348  level.vsmgr[type].info[lower_name] ‪add_info( type, lower_name, version, lerp_step_count );
349 
350  if ( version > level.vsmgr[type].highest_version )
351  {
352  level.vsmgr[type].highest_version = version;
353  }
354 
355  return true;
356 }
357 
358 
359 function ‪slot_cb( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump, type )
360 {
361  ‪init_states( localClientNum );
362 
363  level.vsmgr[type].state[localClientNum].curr_slot = newVal;
364 
365  if ( bNewEnt || bInitialSnap )
366  {
367  level.vsmgr[type].state[localClientNum].force_update = true;
368  }
369 }
370 
371 
372 function ‪visionset_slot_cb( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
373 {
374  self ‪slot_cb( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump, "visionset" );
375 }
376 
377 
378 function ‪overlay_slot_cb( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
379 {
380  self ‪slot_cb( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump, "overlay" );
381 }
382 
383 
384 function ‪lerp_cb( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump, type )
385 {
386  ‪init_states( localClientNum );
387 
388  level.vsmgr[type].state[localClientNum].curr_lerp = newVal;
389 
390  if ( bNewEnt || bInitialSnap )
391  {
392  level.vsmgr[type].state[localClientNum].force_update = true;
393  }
394 }
395 
396 
397 function ‪visionset_lerp_cb( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
398 {
399  self ‪lerp_cb( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump, "visionset" );
400 }
401 
402 
403 function ‪overlay_lerp_cb( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
404 {
405  self ‪lerp_cb( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump, "overlay" );
406 }
407 
408 
409 function ‪get_info( type, slot )
410 {
411  return level.vsmgr[type].info[level.vsmgr[type].sorted_name_keys[slot]];
412 }
413 
414 
415 function ‪get_state( localClientNum, type )
416 {
417  return level.vsmgr[type].state[localClientNum];
418 }
419 
420 
422 {
423  return (self.force_update || (self.prev_slot != self.curr_slot) || (self.prev_lerp != self.curr_lerp));
424 }
425 
426 
428 {
429  self.prev_slot = self.curr_slot;
430  self.prev_lerp = self.curr_lerp;
431  self.force_update = false;
432 }
433 
434 
435 function ‪init_states( localClientNum )
436 {
437  if ( isdefined( level.vsmgr_states_inited[localClientNum] ) )
438  {
439  return;
440  }
441 
442  typeKeys = GetArrayKeys( level.vsmgr );
443 
444  for ( type_index = 0; type_index < typeKeys.size; type_index++ )
445  {
446  type = typeKeys[type_index];
447 
448  if ( !level.vsmgr[type].in_use )
449  {
450  continue;
451  }
452 
453  if ( !isdefined( level.vsmgr[type].state ) )
454  {
455  level.vsmgr[type].state = [];
456  }
457 
458  level.vsmgr[type].state[localClientNum] = spawnstruct();
459 
460  level.vsmgr[type].state[localClientNum].prev_slot = level.vsmgr[type].info[level.vsmgr_default_info_name].slot_index;
461  level.vsmgr[type].state[localClientNum].curr_slot = level.vsmgr[type].info[level.vsmgr_default_info_name].slot_index;
462 
463  // we'll default these to 1 since they'll get overwritten anyway, unless we didn't need to use the lerp clientfield, in which we want these set to 1
464  level.vsmgr[type].state[localClientNum].prev_lerp = 1;
465  level.vsmgr[type].state[localClientNum].curr_lerp = 1;
466 
467  level.vsmgr[type].state[localClientNum].force_update = false;
468  }
469 
470  level.vsmgr_states_inited[localClientNum] = true;
471 }
472 
474 {
475  if ( !level.isDemoPlaying )
476  {
477  return;
478  }
479 
480  typeKeys = GetArrayKeys( level.vsmgr );
481  oldLerps = [];
482 
483  while ( 1 )
484  {
485  level ‪util::waittill_any( "demo_jump", "demo_player_switch", "visionset_mgr_reset" );
486 
487  for ( type_index = 0; type_index < typeKeys.size; type_index++ )
488  {
489  type = typeKeys[type_index];
490 
491  if ( !level.vsmgr[type].in_use )
492  {
493  continue;
494  }
495 
496  level.vsmgr[type].state[0].force_update = true;
497  }
498  }
499 }
500 
501 
503 {
504  if ( !level.isDemoPlaying )
505  {
506  return;
507  }
508 
509  typeKeys = GetArrayKeys( level.vsmgr );
510 
511  while ( true )
512  {
513  if ( IsSpectating( 0, false ) )
514  {
515  if ( !‪IS_TRUE( level.vsmgr_is_spectating ) )
516  {
518  level notify( "visionset_mgr_reset" );
519  }
520 
521  level.vsmgr_is_spectating = true;
522  }
523  else
524  {
525  if ( ‪IS_TRUE( level.vsmgr_is_spectating ) )
526  {
527  level notify( "visionset_mgr_reset" );
528  }
529 
530  level.vsmgr_is_spectating = false;
531  }
532 
534  }
535 }
536 
537 function ‪monitor()
538 {
539  while ( level.vsmgr_initializing )
540  {
542  }
543 
544  if ( ‪IS_TRUE(level.isDemoPlaying) )
545  {
546  level thread ‪demo_spectate_monitor();
547  level thread ‪demo_jump_monitor();
548  }
549 
550  typeKeys = GetArrayKeys( level.vsmgr );
551 
552  while ( true )
553  {
554  for ( type_index = 0; type_index < typeKeys.size; type_index++ )
555  {
556  type = typeKeys[type_index];
557 
558  if ( !level.vsmgr[type].in_use )
559  {
560  continue;
561  }
562 
563  for ( localClientNum = 0; localClientNum < level.localPlayers.size; localClientNum++ )
564  {
565  ‪init_states( localClientNum );
566 
567  if ( level.vsmgr[type].state[localClientNum] ‪should_update_state() )
568  {
569  level.vsmgr[type] thread [[level.vsmgr[type].update_cb]]( localClientNum, type );
570 
571  level.vsmgr[type].state[localClientNum] ‪transition_state();
572  }
573  }
574  }
575 
577  }
578 }
579 
580 function ‪killcam_visionset_vehicle_mismatch( visionset_to, visionset_vehicle, vehicletype )
581 {
582  if ( visionset_to == visionset_vehicle )
583  {
584  if ( isdefined( self.vehicletype ) && ( self.vehicletype != vehicletype ) )
585  return true;
586  }
587 
588  return false;
589 }
590 
591 function ‪killcam_visionset_player_mismatch( visionset_to, visionset_vehicle )
592 {
593  // some killcams use the player
594  if ( visionset_to == visionset_vehicle )
595  {
596  if ( !self IsPlayer() )
597  return true;
598  }
599 
600  return false;
601 }
602 
603 
604 function ‪visionset_update_cb( localClientNum, type )
605 {
606  state = ‪get_state( localClientNum, type );
607  curr_info = ‪get_info( type, state.curr_slot );
608  prev_info = ‪get_info( type, state.prev_slot );
609 
610 /#
611  //println( "!@#$visionset_update_cb( LCN: " + localClientNum + ", NAME: " + curr_info.name + ", LERP: " + state.curr_lerp + ");" );
612 #/
613 
614  if ( ‪IS_TRUE( level.isDemoPlaying ) && IsSpectating( localClientNum, true ) )
615  {
616  VisionSetNaked( localClientNum, level._fv2vs_default_visionset, 0 );
617  return;
618  }
619 
620  if ( level.vsmgr_default_info_name == curr_info.name )
621  {
623  return;
624  }
625 
626  player = GetLocalPlayer( localClientNum );
627  if( player getinkillcam( localClientNum ) )
628  {
629  if ( isdefined( curr_info.visionset_to ) )
630  {
631  killcament = player getkillcamentity( localClientNum );
632 
633  if( curr_info.visionset_to == ‪MOTHERSHIP_VISIONSET_FILE )
634  {
635  if( ( killcament.type == "vehicle" ) && !( killcament ‪clientfield::get( "mothership" ) ) )
636  return;
637  }
638 
639  if( curr_info.visionset_to == ‪AI_TANK_VISIONSET_FILE || curr_info.visionset_to == "mp_hellstorm" ) // added hellstorm directly for TU4-FFOTD, REMOTE_MISSILE_VISIONSET_FILE
640  {
641  if( ( killcament.type == "vehicle" ) )
642  return;
643  }
644 
645  if ( killcament ‪killcam_visionset_vehicle_mismatch( curr_info.visionset_to, "mp_vehicles_dart", "veh_dart_mp" ) ) // added dart directly for TU9-FFOTD: DART_VISIONSET_FILE, DART_VEHICLE_NAME
646  return;
647 
648  if ( killcament ‪killcam_visionset_player_mismatch( curr_info.visionset_to, "mp_vehicles_turret" ) ) // added turret directly for TU9-FFOTD: TURRET_VISIONSET_FILE
649  return;
650 
651  if ( killcament ‪killcam_visionset_player_mismatch( curr_info.visionset_to, "mp_vehicles_sentinel" ) ) // added turret directly for TU9-FFOTD: SENTINEL_VISIONSET_FILE
652  return;
653  }
654  }
655 
656  if ( !IsDefined( curr_info.visionset_from ) )
657  {
658  if ( curr_info.visionset_type == ‪VSMGR_VISIONSET_TYPE_LASTSTAND )
659  {
660  VisionSetLaststandLerp( localClientNum, curr_info.visionset_to, level._fv2vs_prev_visionsets[localClientNum], state.curr_lerp );
661  }
662  else
663  {
664  VisionSetNakedLerp( localClientNum, curr_info.visionset_to, level._fv2vs_prev_visionsets[localClientNum], state.curr_lerp );
665  }
666  }
667  else
668  {
669  if ( curr_info.visionset_type == ‪VSMGR_VISIONSET_TYPE_LASTSTAND )
670  {
671  VisionSetLaststandLerp( localClientNum, curr_info.visionset_to, curr_info.visionset_from, state.curr_lerp );
672  }
673  else
674  {
675  VisionSetNakedLerp( localClientNum, curr_info.visionset_to, curr_info.visionset_from, state.curr_lerp );
676  }
677  }
678 }
679 
680 
681 function ‪set_poison_overlay( amount )
682 {
683  SetDvar( "r_poisonFX_debug_enable", 1 );
684  SetDvar( "r_poisonFX_pulse", 2 );
685  SetDvar( "r_poisonFX_warpX", -.3 );
686  SetDvar( "r_poisonFX_warpY", .15 );
687  SetDvar( "r_poisonFX_dvisionA", 0 );
688  SetDvar( "r_poisonFX_dvisionX", 0 );
689  SetDvar( "r_poisonFX_dvisionY", 0 );
690  SetDvar( "r_poisonFX_blurMin", 0 );
691  SetDvar( "r_poisonFX_blurMax", 3 );
692 
693  SetDvar( "r_poisonFX_debug_amount", amount );
694 }
695 
697 {
698  SetDvar( "r_poisonFX_debug_amount", 0 );
699  SetDvar( "r_poisonFX_debug_enable", 0 );
700 }
701 
702 function ‪overlay_update_cb( localClientNum, type )
703 {
704  state = ‪get_state( localClientNum, type );
705  curr_info = ‪get_info( type, state.curr_slot );
706  prev_info = ‪get_info( type, state.prev_slot );
707  player = level.localPlayers[localClientNum];
708 
709 /#
710  //println( "!@#$overlay_update_cb( LCN: " + localClientNum + ", NAME: " + curr_info.name + ", LERP: " + state.curr_lerp + ");" );
711 #/
712 
713  if ( state.force_update || state.prev_slot != state.curr_slot )
714  {
715  switch ( prev_info.style )
716  {
718  // do nothing
719  break;
721  player thread ‪postfx::exitPostfxBundle();
722  break;
724  if ( IsDefined( level.vsmgr_filter_custom_disable[ curr_info.material_name ] ) )
725  {
726  player [[ level.vsmgr_filter_custom_disable[ curr_info.material_name ] ]]( state, prev_info, curr_info );
727  }
728  else
729  {
730  setfilterpassenabled( localClientNum, prev_info.filter_index, prev_info.pass_index, false );
731  }
732  break;
734  SetBlurByLocalClientNum( localClientNum, 0, prev_info.transition_out );
735  break;
737  SetElectrified( localClientNum, 0 );
738  break;
740  SetBurn( localClientNum, 0 );
741  break;
744  break;
746  player thread ‪postfx::exitPostfxBundle();
747  break;
749  DisableSpeedBlur( localClientNum );
750  break;
751  }
752  }
753 
754  if ( ‪IS_TRUE( level.isDemoPlaying ) && IsSpectating( localClientNum, false ) )
755  {
756  return;
757  }
758 
759  switch ( curr_info.style )
760  {
762  // do nothing
763  break;
765  if ( state.force_update || state.prev_slot != state.curr_slot || state.prev_lerp <= state.curr_lerp )
766  {
767  player thread postfx::PlayPostfxBundle( curr_info.bundle );
768  }
769  break;
771  if ( state.force_update || state.prev_slot != state.curr_slot || state.prev_lerp != state.curr_lerp )
772  {
773  if ( IsDefined( level.vsmgr_filter_custom_enable[ curr_info.material_name ] ) )
774  {
775  player [[ level.vsmgr_filter_custom_enable[ curr_info.material_name ] ]]( state, prev_info, curr_info );
776  }
777  else
778  {
779  setfilterpassmaterial( localClientNum, curr_info.filter_index, curr_info.pass_index, level.filter_matid[curr_info.material_name] );
780  setfilterpassenabled( localClientNum, curr_info.filter_index, curr_info.pass_index, true );
781 
782  if ( IsDefined( curr_info.constant_index ) )
783  {
784  setfilterpassconstant( localClientNum, curr_info.filter_index, curr_info.pass_index, curr_info.constant_index, state.curr_lerp );
785  }
786  }
787  }
788  break;
790  if ( state.force_update || state.prev_slot != state.curr_slot || state.prev_lerp <= state.curr_lerp )
791  {
792  SetBlurByLocalClientNum( localClientNum, curr_info.magnitude, curr_info.transition_in );
793  }
794  break;
796  if ( state.force_update || state.prev_slot != state.curr_slot || state.prev_lerp <= state.curr_lerp )
797  {
798  SetElectrified( localClientNum, (curr_info.duration * state.curr_lerp) );
799  }
800  break;
802  if ( state.force_update || state.prev_slot != state.curr_slot || state.prev_lerp <= state.curr_lerp )
803  {
804  SetBurn( localClientNum, (curr_info.duration * state.curr_lerp) );
805  }
806  break;
808  if ( state.force_update || state.prev_slot != state.curr_slot || state.prev_lerp != state.curr_lerp )
809  {
810  ‪set_poison_overlay( state.curr_lerp );
811  }
812  break;
814  if ( state.force_update || state.prev_slot != state.curr_slot || state.prev_lerp <= state.curr_lerp )
815  {
816  level thread ‪filter::SetTransported( player );
817  }
818  break;
820  if ( state.force_update || state.prev_slot != state.curr_slot || state.prev_lerp <= state.curr_lerp )
821  {
822  if( isDefined( curr_info.should_offset ) )
823  {
824  EnableSpeedBlur( localClientNum, curr_info.amount, curr_info.inner_radius, curr_info.outer_radius, curr_info.velocity_should_scale, curr_info.velocity_scale, curr_info.blur_in, curr_info.blur_out, curr_info.should_offset );
825  }
826  else if ( isdefined(curr_info.blur_out) )
827  {
828  EnableSpeedBlur( localClientNum, curr_info.amount, curr_info.inner_radius, curr_info.outer_radius, curr_info.velocity_should_scale, curr_info.velocity_scale, curr_info.blur_in, curr_info.blur_out );
829  }
830  else if ( isdefined(curr_info.blur_in) )
831  {
832  EnableSpeedBlur( localClientNum, curr_info.amount, curr_info.inner_radius, curr_info.outer_radius, curr_info.velocity_should_scale, curr_info.velocity_scale, curr_info.blur_in );
833  }
834  else if ( isdefined(curr_info.velocity_scale) )
835  {
836  EnableSpeedBlur( localClientNum, curr_info.amount, curr_info.inner_radius, curr_info.outer_radius, curr_info.velocity_should_scale, curr_info.velocity_scale );
837  }
838  else if ( isdefined(curr_info.velocity_should_scale) )
839  {
840  EnableSpeedBlur( localClientNum, curr_info.amount, curr_info.inner_radius, curr_info.outer_radius, curr_info.velocity_should_scale );
841  }
842  else
843  {
844  EnableSpeedBlur( localClientNum, curr_info.amount, curr_info.inner_radius, curr_info.outer_radius );
845  }
846  }
847  break;
848  }
849 }
850 
852 
853 function ‪init_fog_vol_to_visionset_monitor( default_visionset, default_trans_in, host_migration_active )
854 {
855  level._fv2vs_default_visionset = default_visionset;
856  level._fv2vs_default_trans_in = default_trans_in;
857  level._fv2vs_suffix = "";
858  level._fv2vs_unset_visionset = "_fv2vs_unset";
859 
860  level._fv2vs_prev_visionsets = [];
861  level._fv2vs_prev_visionsets[0] = level._fv2vs_unset_visionset;
862  level._fv2vs_prev_visionsets[1] = level._fv2vs_unset_visionset;
863  level._fv2vs_prev_visionsets[2] = level._fv2vs_unset_visionset;
864  level._fv2vs_prev_visionsets[3] = level._fv2vs_unset_visionset;
865 
866  level._fv2vs_force_instant_transition = [];
867  level._fv2vs_force_instant_transition[0] = false;
868  level._fv2vs_force_instant_transition[1] = false;
869  level._fv2vs_force_instant_transition[2] = false;
870  level._fv2vs_force_instant_transition[3] = false;
871 
872  if ( !isdefined( host_migration_active ) )
873  {
874  level._fv2vs_infos = [];
875 
876  ‪fog_vol_to_visionset_set_info( -1, default_visionset, default_trans_in );
877  }
878 
879  level._fv2vs_inited = true;
880 
881  level thread ‪fog_vol_to_visionset_monitor();
883 }
884 
885 
887 {
888  level._fv2vs_suffix = suffix;
889 }
890 
891 
892 function ‪fog_vol_to_visionset_set_info( id, visionset, trans_in )
893 {
894  if ( !IsDefined( trans_in ) )
895  {
896  trans_in = level._fv2vs_default_trans_in;
897  }
898 
899  level._fv2vs_infos[id] = SpawnStruct();
900 
901  level._fv2vs_infos[id].visionset = visionset;
902  level._fv2vs_infos[id].trans_in = trans_in;
903 }
904 
905 
907 {
908  if ( !‪IS_TRUE( level._fv2vs_inited ) )
909  {
910  return;
911  }
912 
913  level._fv2vs_force_instant_transition[localClientNum] = true;
914 }
915 
916 
918 {
919  level endon( "hmo" );
920 
922 
923  while ( true )
924  {
925  level ‪util::waittill_any( "demo_jump", "demo_player_switch" );
926 
927 /#
928  //println( "CLIENT: force instant transition" );
929 #/
930 
931  players = GetLocalPlayers();
932  for ( localClientNum = 0; localClientNum < players.size; localClientNum++ )
933  {
934  level._fv2vs_force_instant_transition[localClientNum] = true;
935  }
936  }
937 }
938 
940 {
941  level waittill( "hmo" );
942  wait 3;
943 
944 /#
945  //println( "CLIENT: force instant transition due to host migration" );
946 #/
947 
948  ‪init_fog_vol_to_visionset_monitor( level._fv2vs_default_visionset, level._fv2vs_default_trans_in, true );
949 
950  wait 1;
951 
952  level notify( "visionset_mgr_reset" );
953  return;
954 }
955 
957 {
958  level endon( "hmo" ); // Hostmigration kills this thread - it will be rethreaded.
959 
961 
962  was_not_in_default_type = [];
963  was_not_in_default_type[0] = false;
964  was_not_in_default_type[1] = false;
965  was_not_in_default_type[2] = false;
966  was_not_in_default_type[3] = false;
967 
968  while ( true )
969  {
971  waittillframeend; // let the vsmgr update states for this frame first
972 
973  players = GetLocalPlayers();
974  for ( localClientNum = 0; localClientNum < players.size; localClientNum++ )
975  {
976  if ( !‪is_type_currently_default( localClientNum, "visionset" ) )
977  {
978  was_not_in_default_type[localClientNum] = true;
979  continue;
980  }
981 
982  id = GetWorldFogScriptID( localClientNum );
983 
984  //assert( IsDefined( level._fv2vs_infos[id] ), "WorldFogScriptID '" + id + "' was not registered with fog_vol_to_visionset_set_info()" );
985  if ( !IsDefined( level._fv2vs_infos[id] ) )
986  {
987  id = -1; // temp fix for now to not require scriptIDs to be set up on world fogs, discussions need to occur between gameplay and graphics engineering about the way forward
988  }
989 
990  new_visionset = level._fv2vs_infos[id].visionset + level._fv2vs_suffix;
991 
992  if ( was_not_in_default_type[localClientNum] || level._fv2vs_prev_visionsets[localClientNum] != new_visionset || level._fv2vs_force_instant_transition[localClientNum] )
993  {
994 /#
995  //iprintlnbold( "setting " + new_visionset );
996 #/
997  trans = level._fv2vs_infos[id].trans_in;
998  if ( level._fv2vs_force_instant_transition[localClientNum] )
999  {
1000 /#
1001  //println( "Force instant transition set: " + new_visionset );
1002 #/
1003 
1004  trans = 0;
1005  }
1006 
1007  VisionSetNaked( localClientNum, new_visionset, trans );
1008  level._fv2vs_prev_visionsets[localClientNum] = new_visionset;
1009  }
1010 
1011  level._fv2vs_force_instant_transition[localClientNum] = false;
1012  was_not_in_default_type[localClientNum] = false;
1013  }
1014  }
1015 }
1016 
1018 {
1019  level endon( "hmo" ); // Hostmigration kills this thread - it will be rethreaded.
1020 
1021  while ( 1 )
1022  {
1023  level waittill( "respawn" );
1024  players = GetLocalPlayers();
1025  for ( localClientNum = 0; localClientNum < players.size; localClientNum++ )
1026  {
1027  level._fv2vs_prev_visionsets[localClientNum] = level._fv2vs_unset_visionset;
1028  }
1029  }
1030 }
‪VSMGR_OVERLAY_STYLE_TRANSPORTED
‪#define VSMGR_OVERLAY_STYLE_TRANSPORTED
Definition: visionset_mgr_shared.csc:19
‪register_overlay_info_style_electrified
‪function register_overlay_info_style_electrified(name, version, lerp_step_count, duration)
Definition: visionset_mgr_shared.csc:104
‪register_overlay_info_style_blur
‪function register_overlay_info_style_blur(name, version, lerp_step_count, transition_in, transition_out, magnitude)
Definition: visionset_mgr_shared.csc:89
‪demo_spectate_monitor
‪function demo_spectate_monitor()
Definition: visionset_mgr_shared.csc:502
‪on_finalize_initialization
‪function on_finalize_initialization(func, obj)
Definition: callbacks_shared.csc:203
‪demo_jump_monitor
‪function demo_jump_monitor()
Definition: visionset_mgr_shared.csc:473
‪__init__
‪function __init__()
Definition: visionset_mgr_shared.csc:29
‪VSMGR_VISIONSET_TYPE_NAKED
‪#define VSMGR_VISIONSET_TYPE_NAKED
Definition: visionset_mgr_shared.csc:22
‪fog_vol_to_visionset_set_info
‪function fog_vol_to_visionset_set_info(id, visionset, trans_in)
Definition: visionset_mgr_shared.csc:892
‪register_overlay_info_style_none
‪function register_overlay_info_style_none(name, version, lerp_step_count)
Definition: visionset_mgr_shared.csc:62
‪overlay_lerp_cb
‪function overlay_lerp_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: visionset_mgr_shared.csc:403
‪slot_cb
‪function slot_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump, type)
Definition: visionset_mgr_shared.csc:359
‪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
‪SetTransported
‪function SetTransported(player)
Definition: filter_shared.csc:628
‪VSMGR_OVERLAY_STYLE_FILTER
‪#define VSMGR_OVERLAY_STYLE_FILTER
Definition: visionset_mgr_shared.csc:14
‪overlay_update_cb
‪function overlay_update_cb(localClientNum, type)
Definition: visionset_mgr_shared.csc:702
‪VSMGR_OVERLAY_STYLE_ELECTRIFIED
‪#define VSMGR_OVERLAY_STYLE_ELECTRIFIED
Definition: visionset_mgr_shared.csc:16
‪validate_info
‪function validate_info(type, name, version)
Definition: visionset_mgr_shared.csc:277
‪monitor
‪function monitor()
Definition: visionset_mgr_shared.csc:537
‪transition_state
‪function transition_state()
Definition: visionset_mgr_shared.csc:427
‪clear_poison_overlay
‪function clear_poison_overlay()
Definition: visionset_mgr_shared.csc:696
‪finalize_clientfields
‪function finalize_clientfields()
Definition: visionset_mgr_shared.csc:230
‪visionset_lerp_cb
‪function visionset_lerp_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: visionset_mgr_shared.csc:397
‪init_fog_vol_to_visionset_monitor
‪function init_fog_vol_to_visionset_monitor(default_visionset, default_trans_in, host_migration_active)
‪FOG VOL FUNCTIONS.
Definition: visionset_mgr_shared.csc:853
‪get_state
‪function get_state(localClientNum, type)
Definition: visionset_mgr_shared.csc:415
‪finalize_initialization
‪function finalize_initialization(localclientnum)
Definition: visionset_mgr_shared.csc:219
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪AI_TANK_VISIONSET_FILE
‪#define AI_TANK_VISIONSET_FILE
Definition: _killstreaks.gsh:344
‪register_overlay_info_style_burn
‪function register_overlay_info_style_burn(name, version, lerp_step_count, duration)
Definition: visionset_mgr_shared.csc:117
‪VSMGR_OVERLAY_STYLE_BLUR
‪#define VSMGR_OVERLAY_STYLE_BLUR
Definition: visionset_mgr_shared.csc:15
‪fog_vol_to_visionset_monitor
‪function fog_vol_to_visionset_monitor()
Definition: visionset_mgr_shared.csc:956
‪visionset_update_cb
‪function visionset_update_cb(localClientNum, type)
Definition: visionset_mgr_shared.csc:604
‪register_visionset_info
‪function register_visionset_info(name, version, lerp_step_count, visionset_from, visionset_to, visionset_type=VSMGR_VISIONSET_TYPE_NAKED)
Definition: visionset_mgr_shared.csc:50
‪fog_vol_to_visionset_set_suffix
‪function fog_vol_to_visionset_set_suffix(suffix)
Definition: visionset_mgr_shared.csc:886
‪init_states
‪function init_states(localClientNum)
Definition: visionset_mgr_shared.csc:435
‪add_sorted_name_key
‪function add_sorted_name_key(type, name)
Definition: visionset_mgr_shared.csc:310
‪VSMGR_OVERLAY_STYLE_POSTFX_BUNDLE
‪#define VSMGR_OVERLAY_STYLE_POSTFX_BUNDLE
Definition: visionset_mgr_shared.csc:13
‪fog_vol_to_visionset_force_instant_transition
‪function fog_vol_to_visionset_force_instant_transition(localClientNum)
Definition: visionset_mgr_shared.csc:906
‪is_type_currently_default
‪function is_type_currently_default(localClientNum, type)
Definition: visionset_mgr_shared.csc:188
‪VSMGR_OVERLAY_STYLE_SPEED_BLUR
‪#define VSMGR_OVERLAY_STYLE_SPEED_BLUR
Definition: visionset_mgr_shared.csc:20
‪register_type
‪function register_type(type, cf_slot_cb, cf_lerp_cb, update_cb)
Definition: visionset_mgr_shared.csc:202
‪should_update_state
‪function should_update_state()
Definition: visionset_mgr_shared.csc:421
‪set_poison_overlay
‪function set_poison_overlay(amount)
Definition: visionset_mgr_shared.csc:681
‪CF_HOST_ONLY
‪#define CF_HOST_ONLY
Definition: version.gsh:102
‪waittill_any
‪function waittill_any(str_notify1, str_notify2, str_notify3, str_notify4, str_notify5)
Definition: util_shared.csc:375
‪MOTHERSHIP_VISIONSET_FILE
‪#define MOTHERSHIP_VISIONSET_FILE
Definition: _killstreaks.gsh:343
‪VSMGR_OVERLAY_STYLE_POISON
‪#define VSMGR_OVERLAY_STYLE_POISON
Definition: visionset_mgr_shared.csc:18
‪reset_player_fv2vs_infos_on_respawn
‪function reset_player_fv2vs_infos_on_respawn()
Definition: visionset_mgr_shared.csc:1017
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪VSMGR_OVERLAY_STYLE_NONE
‪#define VSMGR_OVERLAY_STYLE_NONE
Definition: visionset_mgr_shared.csc:12
‪visionset_slot_cb
‪function visionset_slot_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: visionset_mgr_shared.csc:372
‪get_info
‪function get_info(type, slot)
Definition: visionset_mgr_shared.csc:409
‪register_overlay_info_style_transported
‪function register_overlay_info_style_transported(name, version, lerp_step_count, duration)
Definition: visionset_mgr_shared.csc:142
‪register_info
‪function register_info(type, name, version, lerp_step_count)
Definition: visionset_mgr_shared.csc:334
‪lerp_cb
‪function lerp_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump, type)
Definition: visionset_mgr_shared.csc:384
‪killcam_visionset_vehicle_mismatch
‪function killcam_visionset_vehicle_mismatch(visionset_to, visionset_vehicle, vehicletype)
Definition: visionset_mgr_shared.csc:580
‪fog_vol_to_visionset_instant_transition_monitor
‪function fog_vol_to_visionset_instant_transition_monitor()
Definition: visionset_mgr_shared.csc:917
‪VSMGR_OVERLAY_STYLE_BURN
‪#define VSMGR_OVERLAY_STYLE_BURN
Definition: visionset_mgr_shared.csc:17
‪register_overlay_info_style_postfx_bundle
‪function register_overlay_info_style_postfx_bundle(name, version, lerp_step_count, bundle, duration)
Definition: visionset_mgr_shared.csc:175
‪exitPostfxBundle
‪function exitPostfxBundle()
Definition: postfx_shared.csc:270
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪register_overlay_info_style_poison
‪function register_overlay_info_style_poison(name, version, lerp_step_count)
Definition: visionset_mgr_shared.csc:131
‪VSMGR_VISIONSET_TYPE_LASTSTAND
‪#define VSMGR_VISIONSET_TYPE_LASTSTAND
Definition: visionset_mgr_shared.csc:23
‪register_overlay_info_style_speed_blur
‪function register_overlay_info_style_speed_blur(name, version, lerp_step_count, amount, inner_radius, outer_radius, velocity_should_scale, velocity_scale, blur_in, blur_out, should_offset)
Definition: visionset_mgr_shared.csc:155
‪register_overlay_info_style_filter
‪function register_overlay_info_style_filter(name, version, lerp_step_count, filter_index, pass_index, material_name, constant_index)
Definition: visionset_mgr_shared.csc:73
‪add_info
‪function add_info(type, name, version, lerp_step_count)
Definition: visionset_mgr_shared.csc:324
‪killcam_visionset_player_mismatch
‪function killcam_visionset_player_mismatch(visionset_to, visionset_vehicle)
Definition: visionset_mgr_shared.csc:591
‪name
‪class GroundFx name
‪WAIT_CLIENT_FRAME
‪#define WAIT_CLIENT_FRAME
Definition: shared.gsh:266
‪overlay_slot_cb
‪function overlay_slot_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: visionset_mgr_shared.csc:378
‪finalize_type_clientfields
‪function finalize_type_clientfields()
Definition: visionset_mgr_shared.csc:242
‪fog_vol_to_visionset_hostmigration_monitor
‪function fog_vol_to_visionset_hostmigration_monitor()
Definition: visionset_mgr_shared.csc:939