‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
scene_shared.gsc
Go to the documentation of this file.
1 // http://tawiki/display/Design/Scene+System /////////////////////////////////////////////////////////
4 
5 #using scripts\codescripts\struct;
6 
7 #using scripts\shared\ai_shared;
8 #using scripts\shared\animation_shared;
9 #using scripts\shared\array_shared;
10 #using scripts\shared\callbacks_shared;
11 #using scripts\shared\clientfield_shared;
12 #using scripts\shared\flag_shared;
13 #using scripts\shared\flagsys_shared;
14 #using scripts\shared\laststand_shared;
15 #using scripts\shared\player_shared;
16 #using scripts\shared\scene_debug_shared;
17 #using scripts\shared\scriptbundle_shared;
18 #using scripts\shared\spawner_shared;
19 #using scripts\shared\system_shared;
20 #using scripts\shared\trigger_shared;
21 #using scripts\shared\util_shared;
22 #using scripts\shared\lui_shared;
23 
24 #insert scripts\shared\shared.gsh;
25 #insert scripts\shared\version.gsh;
26 
27 #precache( "lui_menu", "CPSkipSceneMenu" );
28 #precache( "lui_menu_data", "showSkipButton" );
29 #precache( "lui_menu_data", "hostIsSkipping" );
30 #precache( "lui_menu_data", "sceneSkipEndTime" );
31 
32 #namespace scene;
33 
34 #using_animtree( "all_player" );
35 function private ‪prepare_player_model_anim( ent )
36 {
37  if ( !‪IS_EQUAL( ent.animtree, "all_player" ) )
38  {
39  ent UseAnimTree( #animtree );
40  ent.animtree = "all_player";
41  }
42 }
43 
44 #using_animtree( "generic" );
45 function private ‪prepare_generic_model_anim( ent )
46 {
47  if ( !‪IS_EQUAL( ent.animtree, "generic" ) )
48  {
49  ent UseAnimTree( #animtree );
50  ent.animtree = "generic";
51  }
52 }
53 
54 #define TEST_SCENES array()
55 
56 #define NEW_STATE(__state) flagsys::clear( "ready" );\
57  flagsys::clear( "done" );\
58  flagsys::clear( "main_done" );\
59  _str_state = __state;\
60  self notify( "new_state" );\
61  self endon( "new_state" );\
62  self notify(__state);\
63  log( __state );\
64  waittillframeend;
65 
66 #define DAMAGE_STR(dmg) ( !isdefined( dmg ) || dmg == "none" ? "" : dmg )
67 
68 // Player weapon animation indexes defined in code
69 #define WEAP_RAISE 30
70 #define WEAP_FIRST_RAISE 31
71 
72 #define DEFAULT_ACTOR_WEAPON GetWeapon( "ar_standard" )
73 
75 // ___ ___ ___ _ _ ___ ___ ___ _ ___ ___ _____
76 // / __| / __| | __| | \| | | __| / _ \ | _ ) _ | | | __| / __| |_ _|
77 // \__ \ | (__ | _| | .` | | _| | (_) | | _ \ | || | | _| | (__ | |
78 // |___/ \___| |___| |_|\_| |___| \___/ |___/ \__/ |___| \___| |_|
79 //
81 
83 {
85  var ‪_is_valid;
86  var ‪_str_name;
92 
94  {
95  ‪_is_valid = true;
96  ‪_b_spawnonce_used = false;
97  ‪_b_set_goal = true;
98  }
99 
101  {
102  }
103 
104  function ‪first_init( s_objdef, o_scene, e_ent )
105  {
106  ‪cScriptBundleObjectBase::init( s_objdef, o_scene, e_ent );
107 
109 
110  return self;
111  }
112 
113  function ‪initialize( b_force_first_frame = false )
114  {
115  if ( ‪has_init_state() || b_force_first_frame )
116  {
117  ‪NEW_STATE( "init" );
118 
119  //Exclude the player since now need to spawn or init him.
120  if ( ( !‪IS_TRUE(‪_s.sharedIGC) && !‪IS_TRUE(‪_s.player) ) && ‪IS_TRUE( ‪_s.spawnoninit ) || b_force_first_frame )
121  {
122  ‪_spawn( undefined, ‪IS_TRUE( ‪_s.firstframe ) || isdefined( ‪_s.initanim ) || isdefined( ‪_s.initanimloop ) );
123  }
124 
125  if ( ‪IS_TRUE( ‪_s.firstframe ) || b_force_first_frame )
126  {
127  if ( !‪error( !isdefined( ‪_s.mainanim ), "No animation defined for first frame." ) )
128  {
129  ‪_str_death_anim = ‪_s.mainanimdeath;
130  ‪_str_death_anim_loop = ‪_s.mainanimdeathloop;
131 
132  ‪_play_anim( ‪_s.mainanim, 0, 0, 0 );
133  }
134  }
135  else if ( isdefined( ‪_s.initanim ) )
136  {
137  ‪_str_death_anim = ‪_s.initanimdeath;
138  ‪_str_death_anim_loop = ‪_s.initanimdeathloop;
139 
140  ‪_play_anim( ‪_s.initanim, ‪_s.initdelaymin, ‪_s.initdelaymax, 1 );
141 
142  if ( ‪is_alive() )
143  {
144  if ( isdefined( ‪_s.initanimloop ) )
145  {
146  ‪_str_death_anim = ‪_s.initanimloopdeath;
147  ‪_str_death_anim_loop = ‪_s.initanimloopdeathloop;
148 
149  ‪_play_anim( ‪_s.initanimloop, 0, 0, 1 );
150  }
151  }
152  }
153  else if ( isdefined( ‪_s.initanimloop ) )
154  {
155  ‪_str_death_anim = ‪_s.initanimloopdeath;
156  ‪_str_death_anim_loop = ‪_s.initanimloopdeathloop;
157 
158  ‪_play_anim( ‪_s.initanimloop, ‪_s.initdelaymin, ‪_s.initdelaymax, 1 );
159  }
160  }
161  else
162  {
163  ‪flagsys::set( "ready" );
164  }
165 
166  if ( !‪_is_valid )
167  {
168  ‪flagsys::set( "done" );
169  }
170  }
171 
172  function ‪play()
173  {
174  ‪NEW_STATE( "play" );
175 
176  if( ‪IS_TRUE(‪_s.hide) && ‪_is_valid )
177  {
178  ‪_spawn( undefined, false, false );
179  ‪_e Hide();
180  }
181  else if ( isdefined( ‪_s.mainanim ) && ‪_is_valid )
182  {
183  ‪_str_death_anim = ‪_s.mainanimdeath;
184  ‪_str_death_anim_loop = ‪_s.mainanimdeathloop;
185 
186  //if it is a starting of a scene and no value is provided, do a default 0.2 animation blend.
187  if ( !‪IS_TRUE( ‪_s.IsCutScene ) )
188  {
189  if( !isdefined( ‪_s.MainBlend ) || ‪_s.MainBlend == 0 )
190  {
191  ‪_s.mainblend = 0.2;
192  }
193  else if(‪_s.MainBlend == 0.001) //MALI - A hack to enable 0 blending between cuts, this should be removed once we ship TU5 and _s.MainBlend = 0 should mean 0 not 0.2.
194  {
195  ‪_s.MainBlend = 0;
196  }
197  }
198 
199  ‪_play_anim( ‪_s.mainanim, ‪_s.maindelaymin, ‪_s.maindelaymax, 1, ‪_s.mainblend, ‪_o_bundle.n_start_time );
200 
201  ‪flagsys::set( "main_done" );
202 
203  if ( isdefined( ‪_e ) && ‪IS_TRUE( ‪_s.DynamicPaths ) )
204  {
205  if ( Distance2DSquared( ‪_e.origin, ‪_e.scene_orig_origin ) > 4 )
206  {
207  ‪_e DisconnectPaths( 2, false );
208  }
209  }
210 
211  if ( ‪is_alive() )
212  {
213  if ( !isdefined( ‪_s.EndBlend ) || ‪_s.EndBlend == 0 )
214  {
215  ‪_s.EndBlend = 0.2;
216  }
217 
218  if ( isdefined( ‪_s.endanim ) )
219  {
220  ‪_str_death_anim = ‪_s.endanimdeath;
221  ‪_str_death_anim_loop = ‪_s.endanimdeathloop;
222 
223  ‪_play_anim( ‪_s.endanim, 0, 0, 1, ‪_s.EndBlend );
224 
225  if ( ‪is_alive() )
226  {
227  if ( isdefined( ‪_s.endanimloop ) )
228  {
229  ‪_str_death_anim = ‪_s.endanimloopdeath;
230  ‪_str_death_anim_loop = ‪_s.endanimloopdeathloop;
231 
232  ‪_play_anim( ‪_s.endanimloop, 0, 0, 1 );
233  }
234  }
235  }
236  else if ( isdefined( ‪_s.endanimloop ) )
237  {
238  ‪_str_death_anim = ‪_s.endanimloopdeath;
239  ‪_str_death_anim_loop = ‪_s.endanimloopdeathloop;
240 
241  ‪_play_anim( ‪_s.endanimloop, 0, 0, 1 );
242  }
243  }
244  }
245 
246  thread ‪finish();
247  }
248 
249  function ‪stop( b_clear = false, b_dont_clear_anim = false, b_finished = false )
250  {
251  if ( IsAlive( ‪_e ) )
252  {
253  if ( ‪is_shared_player() )
254  {
255  foreach ( player in level.players )
256  {
257  player StopAnimScripted( .2 );
258  }
259  }
260  else if ( !‪IS_TRUE( ‪_s.DieWhenFinished ) || !b_finished )
261  {
262  if ( !b_dont_clear_anim || IsPlayer( ‪_e ) )
263  {
264  ‪_e StopAnimScripted( .2 );
265  }
266  }
267  }
268 
269  ‪finish( b_clear, !b_finished );
270  }
271 
272  function ‪get_align_ent()
273  {
274  e_align = undefined;
275 
276  if ( isdefined( ‪_s.aligntarget ) && !‪IS_EQUAL( ‪_s.aligntarget, ‪_o_bundle._s.aligntarget ) )
277  {
278  a_scene_ents = [[‪_o_bundle]]->get_ents();
279  if ( isdefined( a_scene_ents[ ‪_s.aligntarget ] ) )
280  {
281  e_align = a_scene_ents[ ‪_s.aligntarget ];
282  }
283  else
284  {
285  e_align = ‪scene::get_existing_ent( ‪_s.aligntarget, false, true );
286  }
287 
288  if ( !isdefined( e_align ) )
289  {
290  str_msg = "Align target '" + ‪STR( ‪_s.aligntarget ) + "' doesn't exist for scene object.";
291 
292  if ( !‪warning( ‪_o_bundle._testing, str_msg ) )
293  {
294  ‪error( GetDvarInt( "scene_align_errors", 1 ), str_msg );
295  }
296  }
297  }
298 
299  if ( !isdefined( e_align ) )
300  {
301  e_align = [[‪scene()]]->get_align_ent();
302  }
303 
304  return e_align;
305  }
306 
307  function ‪get_align_tag()
308  {
309  if ( isdefined( ‪_s.AlignTargetTag ) )
310  {
311  return ‪_s.AlignTargetTag;
312  }
313  else
314  {
315  if ( isdefined( ‪_o_bundle._e_root.e_scene_link ) )
316  {
317  return "tag_origin";
318  }
319  else
320  {
321  return ‪_o_bundle._s.AlignTargetTag;
322  }
323  }
324  }
325 
326  /* Scene Helpers */
327 
328  function ‪scene()
329  {
330  return ‪_o_bundle;
331  }
332 
333  /* internal functions */
334 
336  {
337  self endon( "play" );
338  self endon( "done" );
339 
340  str_damage_types = ‪DAMAGE_STR( ‪_s.runsceneondmg0 ) + ‪DAMAGE_STR( ‪_s.runsceneondmg1 ) + ‪DAMAGE_STR( ‪_s.runsceneondmg2 ) + ‪DAMAGE_STR( ‪_s.runsceneondmg3 ) + ‪DAMAGE_STR( ‪_s.runsceneondmg4 );
341 
342  if ( str_damage_types != "" )
343  {
344  b_run_scene = false;
345 
346  while ( !b_run_scene )
347  {
348  ‪_e waittill( "damage", n_amount, e_attacker, v_org, v_dir, str_mod );
349 
350  switch ( str_mod )
351  {
352  case "MOD_PISTOL_BULLET":
353  case "MOD_RIFLE_BULLET":
354 
355  if ( IsSubStr( str_damage_types, "bullet" ) )
356  {
357  b_run_scene = true;
358  }
359 
360  break;
361 
362  case "MOD_GRENADE":
363  case "MOD_GRENADE_SPLASH":
364  case "MOD_EXPLOSIVE":
365 
366  if ( IsSubStr( str_damage_types, "explosive" ) )
367  {
368  b_run_scene = true;
369  }
370 
371  break;
372 
373  case "MOD_PROJECTILE":
374  case "MOD_PROJECTILE_SPLASH":
375 
376  if ( IsSubStr( str_damage_types, "projectile" ) )
377  {
378  b_run_scene = true;
379  }
380 
381  break;
382 
383  case "MOD_MELEE":
384 
385  if ( IsSubStr( str_damage_types, "melee" ) )
386  {
387  b_run_scene = true;
388  }
389 
390  break;
391 
392  default:
393 
394  if ( IsSubStr( str_damage_types, "all" ) )
395  {
396  b_run_scene = true;
397  }
398  }
399  }
400 
401  thread [[‪scene()]]->play();
402  }
403  }
404 
406  {
407  if ( ‪is_player() )
408  {
409  ‪_str_name = "player " + ‪_s.player;
410  }
411  else
412  {
413  if ( [[‪scene()]]->‪allows_multiple() )
414  {
415  if ( isdefined( ‪_s.name ) )
416  {
417  ‪_str_name = ‪_s.name + "_gen" + level.scene_object_id;
418  }
419  else
420  {
421  ‪_str_name = [[‪scene()]]->get_name() + "_noname" + level.scene_object_id;
422  }
423 
424  level.scene_object_id++;
425  }
426  else
427  {
428  if ( isdefined( ‪_s.name ) )
429  {
430  ‪_str_name = ‪_s.name;
431  }
432  else
433  {
434  ‪_str_name = [[‪scene()]]->get_name() + "_noname" + [[‪scene()]]->get_object_id();
435  }
436  }
437  }
438  }
439 
440  function ‪get_name()
441  {
442  return ‪_str_name;
443  }
444 
445  function ‪get_orig_name()
446  {
447  return ‪_s.name;
448  }
449 
450  function ‪_spawn( e_spawner, b_hide = true, b_set_ready_when_spawned = true )
451  {
452  if ( isdefined( e_spawner ) )
453  {
454  ‪_e = e_spawner;
455  }
456 
457  if ( isdefined( ‪_e ) && ‪IS_TRUE( ‪_e.isDying ) )
458  {
459  ‪_e Delete(); // previous ent is marked for cleanup, do it now so it doesn't delete a frame later when we don't want it to
460  }
461 
462  if ( ‪is_player() )
463  {
464  if ( IsPlayer( ‪_e ) )
465  {
466  ‪_player = ‪_e;
467  }
468  else
469  {
470  n_player = GetDvarInt( "scene_debug_player", 0 );
471  if ( n_player > 0 )
472  {
473  n_player--;
474 
475  if ( n_player == ‪_s.player )
476  {
477  ‪_player = level.activeplayers[ 0 ];
478  }
479  }
480  else
481  {
482  ‪_player = level.activeplayers[ ‪_s.player ];
483  }
484  }
485  }
486 
487  b_skip = ‪IS_EQUAL( ‪_s.type, "actor" ) && IsSubStr( ‪_o_bundle._str_mode, "noai" );
488  b_skip = b_skip || ( ‪IS_EQUAL( ‪_s.type, "player" ) && IsSubStr( ‪_o_bundle._str_mode, "noplayers" ) );
489 
490  if(!b_skip && ‪_should_skip_entity())
491  {
492  b_skip = true;
493  }
494 
495  if ( !b_skip )
496  {
497  if ( !isdefined( ‪_e ) && ‪is_player() && ‪IS_TRUE( ‪_s.newplayermethod ) )
498  {
499  ‪_e = ‪_player;
500  }
501  else if ( !isdefined( ‪_e ) || IsSpawner( ‪_e ) )
502  {
503  b_allows_multiple = [[‪scene()]]->allows_multiple();
504 
505  if ( /*error( !b_allows_multiple && !isdefined( _s.name ), "Scene that don't allow multiple instances must specify a name for all objects." )
506  || */‪error( b_allows_multiple && ‪IS_TRUE( ‪_s.nospawn ), "Scene that allow multiple instances must be allowed to spawn (uncheck 'Do Not Spawn')." ) )
507  {
508  return;
509  }
510 
511  if ( !IsSpawner( ‪_e ) )
512  {
513  e = ‪scene::get_existing_ent( ‪_str_name, b_allows_multiple );
514 
515  if ( !isdefined( e ) && isdefined( ‪_s.name ) )
516  {
517  e = ‪scene::get_existing_ent( ‪_s.name, b_allows_multiple );
518  }
519 
520  if ( IsPlayer( e ) )
521  {
522  if ( !‪IS_TRUE( ‪_s.newplayermethod ) )
523  {
524  e = undefined;
525  }
526  }
527 
528  if ( ( !isdefined( e ) || IsSpawner( e ) ) && ( ( !‪IS_TRUE( ‪_s.nospawn ) && !‪_b_spawnonce_used ) || ‪_o_bundle._testing ) )
529  {
530  e_spawned = ‪spawn_ent( e );
531  }
532  }
533  else
534  {
535  e_spawned = ‪spawn_ent( ‪_e );
536  }
537 
538  if ( isdefined( e_spawned ) )
539  {
540  if ( b_hide && !‪_o_bundle._s ‪scene::is_igc() )
541  {
542  e_spawned Hide(); // Hide teleporting glitches and for any delay set on this object
543  }
544 
545  e_spawned DontInterpolate();
546 
547  e_spawned.scene_spawned = ‪_o_bundle._s.name;
548 
549  if ( !isdefined( e_spawned.targetname ) )
550  {
551  e_spawned.targetname = ‪_s.name;
552  }
553 
554  if ( ‪is_player() )
555  {
556  e_spawned Hide();
557  }
558  }
559 
560  ‪_e = ( isdefined( e_spawned ) ? e_spawned : e );
561 
562  if ( ‪IS_TRUE( ‪_s.spawnonce ) && ‪_b_spawnonce_used )
563  {
564  return;
565  }
566  }
567 
568  ‪error( !‪is_player() && !‪IS_TRUE( ‪_s.nospawn ) && ( !isdefined( ‪_e ) || IsSpawner( ‪_e ) ), "Object failed to spawn or doesn't exist." );
569  }
570 
571  if ( isdefined( ‪_e ) && !IsSpawner( ‪_e ) )
572  {
573  [[self]]->_prepare();
574 
575  if ( b_set_ready_when_spawned )
576  {
577  ‪flagsys::set( "ready" );
578  }
579 
580  if ( ‪IS_TRUE( ‪_s.spawnonce ) )
581  {
582  ‪_b_spawnonce_used = true;
583  }
584  }
585  else
586  {
587  ‪flagsys::set( "ready" );
588  ‪flagsys::set( "done" );
589  ‪finish();
590  }
591  }
592 
593  function ‪_prepare()
594  {
595  if ( ‪IS_TRUE( ‪_s.DynamicPaths ) && ( ‪_str_state == "play" ) )
596  {
597  ‪_e.scene_orig_origin = ‪_e.origin;
598  ‪_e ConnectPaths();
599  }
600 
601  if ( ‪IS_EQUAL( ‪_e.current_scene, ‪_o_bundle._str_name ) )
602  {
603  //Since we do not fire the "scene_sequence_started" on init state, we need to do so here.
604  [[‪_o_bundle]]->trigger_scene_sequence_started( self, ‪_e );
605 
606  return false; // already prepared this entity for this scene
607  }
608 
609  ‪_e endon( "death" );
610 
611  if ( !‪IS_TRUE( ‪_s.IgnoreAliveCheck ) && ‪error( IsAI( ‪_e ) && !IsAlive( ‪_e ), "Trying to play a scene on a dead AI." ) )
612  {
613  return;
614  }
615 
616  // cleanup any current/previous scenes
617  if ( isdefined( ‪_e._o_scene ) )
618  {
619  foreach ( obj in ‪_e._o_scene._a_objects )
620  {
621  if ( obj._e === ‪_e )
622  {
623  [[ obj ]]->finish();
624  break;
625  }
626  }
627  }
628 
629  if ( !IsAI( ‪_e ) && !IsPlayer( ‪_e ) )
630  {
631  if ( !‪is_player() || !‪IS_TRUE( ‪_s.newplayermethod ) )
632  {
633  if ( ‪is_player_model() )
634  {
636  }
637  else
638  {
640  }
641  }
642  }
643 
644  if ( !‪is_player() )
645  {
646  if ( !isdefined( ‪_e._scene_old_takedamage ) )
647  {
648  ‪_e._scene_old_takedamage = ‪_e.takedamage;
649  }
650 
651  if ( IsSentient( ‪_e ) )
652  {
653  // For sentients, don't override if damage/death is turned off
654  ‪_e.takedamage = ‪IS_TRUE( ‪_e.takedamage ) && ‪IS_TRUE( ‪_s.takedamage );
655 
656  if ( !‪IS_TRUE( ‪_e.magic_bullet_shield ) )
657  {
658  ‪_e.allowdeath = ‪IS_TRUE( ‪_s.allowdeath );
659  }
660 
661  if ( ‪IS_TRUE( ‪_s.OverrideAICharacter ) )
662  {
663  ‪_e DetachAll();
664  ‪_e SetModel( ‪_s.model );
665  }
666  }
667  else
668  {
669  ‪_e.health = ( ‪_e.health > 0 ? ‪_e.health : 1 );
670 
671  if ( ‪_s.type === "actor" ) // Drone
672  {
673  ‪_e MakeFakeAI();
674 
675  if ( !‪IS_TRUE( ‪_s.RemoveWeapon ) )
676  {
678  // TODO: see if we can get the weapon from the aitype if using one for the character model
679  }
680  }
681 
682  ‪_e.takedamage = ‪IS_TRUE( ‪_s.takedamage );
683  ‪_e.allowdeath = ‪IS_TRUE( ‪_s.allowdeath );
684  }
685 
687 
688  if ( ‪IS_TRUE( ‪_s.DynamicPaths ) )
689  {
690  ‪_e DisconnectPaths( 2, false );
691  }
692  }
693  else if ( !‪is_shared_player() )
694  {
695  player = ( IsPlayer( ‪_player ) ? ‪_player : ‪_e );
696 
697  ‪_prepare_player( player );
698  }
699 
700  if ( ‪IS_TRUE( ‪_s.RemoveWeapon ) )
701  {
702  if ( !‪IS_TRUE( ‪_e.gun_removed ) )
703  {
704  if ( IsPlayer( ‪_e ) )
705  {
707  }
708  else
709  {
711  }
712  }
713  else
714  {
715  ‪_e._scene_old_gun_removed = true;
716  }
717  }
718 
719  // TODO: refactor all of this stuff so it can be set/cleared on all players in a shared animation
720 
721  ‪_e.animname = ‪_str_name;
722  ‪_e.anim_debug_name = ‪_s.name;
723 
724  ‪_e ‪flagsys::set( "scene" );
725  ‪_e ‪flagsys::set( ‪_o_bundle._str_name );
726  ‪_e.current_scene = ‪_o_bundle._str_name;
727  ‪_e.finished_scene = undefined;
728  ‪_e._o_scene = ‪scene();
729 
730  //only shared IGC can skip the scene if it is just started
731  [[‪_o_bundle]]->trigger_scene_sequence_started( self, ‪_e );
732 
733  if ( ‪IS_TRUE( ‪_e.takedamage ) )
734  {
736  thread ‪_on_death();
737  }
738 
739  if ( IsActor( ‪_e ) )
740  {
741  thread ‪_track_goal();
742 
743  if ( ‪IS_TRUE( ‪_s.LookAtPlayer ) )
744  {
745  ‪_e ‪LookAtEntity( level.activeplayers[0] );
746  }
747  }
748 
749  if ( ‪_o_bundle._s ‪scene::is_igc() || [[ ‪_o_bundle ]]->has_player() )
750  {
751  if ( !IsPlayer( ‪_e ) ) // players handled in _prepare_player
752  {
753  ‪_e SetHighDetail( true );
754  }
755  }
756 
757  return true;
758  }
759 
760  function ‪_prepare_player( player )
761  {
762  if ( ‪IS_TRUE( player.play_scene_transition_effect ) )
763  {
764  player.play_scene_transition_effect = undefined;
766  }
767 
768  if ( ‪IS_EQUAL( player.current_player_scene, ‪_o_bundle._str_name ) )
769  {
770  //Since we do not fire the "scene_sequence_started" on init state, we need to do so here.
771  [[‪_o_bundle]]->trigger_scene_sequence_started( self, player );
772 
773  return false; // already prepared this entity for this scene
774  }
775 
776  player SetHighDetail( true );
777 
778  // close the mobile armory if it's open
779  if ( player ‪flagsys::get( "mobile_armory_in_use" ) )
780  {
781  player ‪flagsys::set("cancel_mobile_armory");
782  player CloseMenu( "ChooseClass_InGame" );
783  player notify( "menuresponse", "ChooseClass_InGame", "cancel" );
784  }
785 
786  //if player was starting to interact with an armory and never finished
787  if( player ‪flagsys::get( "mobile_armory_begin_use" ) )
788  {
789  player ‪util::_enableWeapon();
790  player ‪flagsys::clear( "mobile_armory_begin_use" );
791  }
792 
793  if( GetDvarInt("scene_hide_player") > 0 )
794  {
795  player Hide();
796  }
797 
798  player.current_player_scene = ‪_o_bundle._str_name;
799 
800  if ( !‪IS_TRUE( player.magic_bullet_shield ) )
801  {
802  player.allowdeath = ‪IS_TRUE( ‪_s.allowdeath );
803  }
804 
805  player.scene_takedamage = ‪IS_TRUE( ‪_s.takedamage );
806 
807  if ( isdefined( player.hijacked_vehicle_entity ) )
808  {
809  player.hijacked_vehicle_entity Delete();
810  }
811  else if ( player IsInVehicle() )
812  {
813  vh_occupied = player GetVehicleOccupied();
814  n_seat = vh_occupied GetOccupantSeat( player );
815 
816  vh_occupied UseVehicle( player, n_seat ); // make player exit vehicle
817  }
818 
819  ‪revive_player( player );
820 
821  player thread ‪scene::scene_disable_player_stuff( !‪IS_TRUE( ‪_s.ShowHUD ) );
822 
823  if ( ‪IS_TRUE( ‪_s.FirstWeaponRaise ) )
824  {
825  //SetDvar( "playerWeaponRaisePostIGC", WEAP_FIRST_RAISE );
826  }
827 
828  player.player_anim_look_enabled = !‪IS_TRUE( ‪_s.LockView );
829  player.player_anim_clamp_right = ‪VAL( ‪_s.viewClampRight, 0 );
830  player.player_anim_clamp_left = ‪VAL( ‪_s.viewClampLeft, 0 );
831  player.player_anim_clamp_top = ‪VAL( ‪_s.viewClampBottom, 0 );
832  player.player_anim_clamp_bottom = ‪VAL( ‪_s.viewClampBottom, 0 );
833 
834  if ( ( !‪IS_TRUE( ‪_s.RemoveWeapon ) || ‪IS_TRUE( ‪_s.ShowWeaponInFirstPerson ) ) && !‪IS_TRUE( ‪_s.DisablePrimaryWeaponSwitch ) )
835  {
837  }
838 
839  ‪set_player_stance( player );
840  }
841 
842  function ‪revive_player( player )
843  {
844  if ( player.sessionstate === "spectator" )
845  {
846  player thread [[ level.spawnPlayer ]]();
847  }
848  else if ( player ‪laststand::player_is_in_laststand() )
849  {
850  player notify( "auto_revive" ); // currently CP only
851  }
852  }
853 
854  function ‪set_player_stance( player )
855  {
856  if ( ‪_s.PlayerStance === "crouch" )
857  {
858  player AllowStand( false );
859  player AllowCrouch( true );
860  player AllowProne( false );
861  }
862  else if ( ‪_s.PlayerStance === "prone" )
863  {
864  player AllowStand( false );
865  player AllowCrouch( false );
866  player AllowProne( true );
867  }
868  else // default to stand
869  {
870  player AllowStand( true );
871  player AllowCrouch( false );
872  player AllowProne( false );
873  }
874  }
875 
876  function ‪finish( b_clear = false, b_canceled = false )
877  {
878  if ( isdefined( ‪_str_state ) )
879  {
880  ‪_str_state = undefined;
881  self notify( "new_state" );
882 
883  if ( !‪is_shared_player() && !‪is_alive() ) //TU1: need to only skip this if SHARED scene, not just for !is_player
884  {
885  ‪_cleanup();
886 
887  ‪_e = undefined;
888  ‪_is_valid = false;
889  }
890  else
891  {
892  if ( !‪is_player() )
893  {
894  if ( isdefined( ‪_e._scene_old_takedamage ) )
895  {
896  ‪_e.takedamage = ‪_e._scene_old_takedamage;
897  }
898 
899  if ( !‪IS_TRUE( ‪_e.magic_bullet_shield ) )
900  {
901  ‪_e.allowdeath = true;
902  }
903 
904  ‪_e._scene_old_takedamage = undefined;
905  ‪_e._scene_old_gun_removed = undefined;
906  }
907  else
908  {
909  if ( ‪is_shared_player() )
910  {
911  foreach ( player in level.players )
912  {
913  if( player ‪flagsys::get( "shared_igc" ) )
914  {
915  ‪_finish_player( player );
916  }
917  }
918  }
919  else
920  {
921  player = ( IsPlayer( ‪_player ) ? ‪_player : ‪_e );
922  ‪_finish_player( player );
923  }
924  }
925 
926  if ( ‪IS_TRUE( ‪_s.RemoveWeapon ) && !‪IS_TRUE( ‪_e._scene_old_gun_removed ) )
927  {
928  if ( IsPlayer( ‪_e ) )
929  {
931  }
932  else
933  {
935  }
936  }
937 
938  if ( !IsPlayer( ‪_e ) ) // players are handled in _finish_player
939  {
940  if ( isdefined( ‪_e ) )
941  {
942  ‪_e SetHighDetail( false );
943  }
944  }
945  }
946 
947  ‪flagsys::set( "ready" );
948  ‪flagsys::set( "done" );
949 
950  if ( isdefined( ‪_e ) )
951  {
952  if ( !‪is_player() )
953  {
954  if ( ‪is_alive() && ( ‪IS_TRUE( ‪_s.DeleteWhenFinished ) || b_clear ) )
955  {
957  }
958  else if ( ‪is_alive() && ‪IS_TRUE( ‪_s.DieWhenFinished ) && !b_canceled )
959  {
960  ‪_e.skipdeath = true;
961  ‪_e.allowdeath = true;
962  ‪_e.skipscenedeath = true;
963 
964  ‪_e Kill();
965  }
966  }
967 
968  if ( IsActor( ‪_e ) && IsAlive( ‪_e ) )
969  {
970  if ( ‪IS_TRUE( ‪_s.DelayMovementAtEnd ) )
971  {
972  ‪_e PathMode( "move delayed", true, RandomFloatRange( 2, 3 ) );
973  }
974  else
975  {
976  ‪_e PathMode( "move allowed" );
977  }
978 
979  if ( ‪IS_TRUE( ‪_s.LookAtPlayer ) )
980  {
982  }
983  }
984  }
985 
986  ‪_cleanup();
987  }
988  }
989 
990  function ‪_finish_player( player )
991  {
992  player.scene_set_visible_time = level.time;
993  player SetVisibleToAll();
994 
995  player ‪flagsys::clear( "shared_igc" );
996 
997  if ( !‪IS_TRUE( player.magic_bullet_shield ) )
998  {
999  player.allowdeath = true;
1000  }
1001 
1002  player.current_player_scene = undefined;
1003 
1004  player.scene_takedamage = undefined;
1005  player._scene_old_gun_removed = undefined;
1006 
1007  player thread ‪scene::scene_enable_player_stuff( !‪IS_TRUE( ‪_s.ShowHUD ) );
1008 
1009  //SetDvar( "playerWeaponRaisePostIGC", WEAP_RAISE );
1010 
1011  if(!([[‪_o_bundle]]->‪has_next_scene()) )
1012  {
1014  {
1015  if(![[‪_o_bundle]]->‪is_skipping_scene() && [[‪_o_bundle]]->‪is_scene_shared_sequence()) //if we are not skipping a scene then just notify that the scene sequence has ended
1016  {
1017  [[‪_o_bundle]]->init_scene_sequence_started(false);
1018  }
1020  }
1021  else if(‪_o_bundle._s ‪scene::is_igc())
1022  {
1024  }
1025  }
1026 
1027  n_camera_tween_out = ‪get_camera_tween_out();
1028  if ( n_camera_tween_out > 0 )
1029  {
1030  player StartCameraTween( n_camera_tween_out );
1031  }
1032 
1033  if ( !‪IS_TRUE( ‪_s.DontReloadAmmo ) )
1034  {
1036  }
1037 
1038  player AllowStand( true );
1039  player AllowCrouch( true );
1040  player AllowProne( true );
1041 
1042  player SetHighDetail( false );
1043  }
1044 
1045  function ‪set_objective()
1046  {
1047  if ( !isdefined( ‪_e.script_objective ) )
1048  {
1049  if ( isdefined( ‪_o_bundle._e_root.script_objective ) )
1050  {
1051  ‪_e.script_objective = ‪_o_bundle._e_root.script_objective;
1052  }
1053  else if ( isdefined( ‪_o_bundle._s.script_objective ) )
1054  {
1055  ‪_e.script_objective = ‪_o_bundle._s.script_objective;
1056  }
1057  }
1058  }
1059 
1060  function ‪_on_death()
1061  {
1062  self endon( "cleanup" );
1063  ‪_e waittill( "death" );
1064 
1065  if ( isdefined( ‪_e ) && !‪IS_TRUE( ‪_e.skipscenedeath ) )
1066  {
1067  self thread ‪do_death_anims();
1068  }
1069  }
1070 
1072  {
1073  ent = ‪_e;
1074 
1075  if ( IsAI( ent ) && !isdefined( ‪_str_death_anim ) && !isdefined( ‪_str_death_anim_loop ) )
1076  {
1077  ent StopAnimScripted();
1078 
1079  if ( IsActor( ent ) )
1080  {
1081  ent StartRagDoll();
1082  }
1083  }
1084 
1085  if ( isdefined( ‪_str_death_anim ) )
1086  {
1087  ent.skipdeath = true;
1088  ent ‪animation::play( ‪_str_death_anim, ent, undefined, 1, .2, 0 );
1089  }
1090 
1091  if ( isdefined( ‪_str_death_anim_loop ) )
1092  {
1093  ent.skipdeath = true;
1094  ent ‪animation::play( ‪_str_death_anim_loop, ent, undefined, 1, 0, 0 );
1095  }
1096  }
1097 
1098  function ‪_cleanup()
1099  {
1100  if ( isdefined( ‪_e ) && isdefined( ‪_e.current_scene ) )
1101  {
1102  ‪_e ‪flagsys::clear( ‪_o_bundle._str_name );
1103 
1104  if ( ‪_e.current_scene == ‪_o_bundle._str_name )
1105  {
1106  ‪_e ‪flagsys::clear( "scene" );
1107 
1108  ‪_e.finished_scene = ‪_o_bundle._str_name;
1109  ‪_e.current_scene = undefined;
1110  ‪_e._o_scene = undefined;
1111 
1112  if ( ‪is_player() )
1113  {
1114  if ( !‪IS_TRUE( ‪_s.newplayermethod ) )
1115  {
1116  ‪_e Delete();
1117  thread ‪reset_player();
1118  }
1119 
1120  ‪_e.animname = undefined;
1121  }
1122  }
1123  }
1124 
1125  self notify( "death" );
1126  self endon( "new_state" );
1127 
1128  waittillframeend; // allow death anims and other things to execute before killing those threads
1129 
1130  self notify( "cleanup" );
1131 
1132  if ( IsAI( ‪_e ) )
1133  {
1134  ‪_set_goal();
1135  }
1136 
1137  if ( isdefined( ‪_o_bundle ) && ‪IS_TRUE( ‪_o_bundle.scene_stopping ) ) // don't clear this if the scene is looping
1138  {
1139  ‪_o_bundle = undefined;
1140  }
1141  }
1142 
1143  function ‪_set_goal()
1144  {
1145  if ( !( ‪IS_EQUAL( ‪_e.scene_spawned, ‪_o_bundle._s.name ) && isdefined( ‪_e.target ) ) )
1146  {
1147  if ( !isdefined( ‪_e.script_forcecolor ) )
1148  {
1149  if ( !‪_e ‪flagsys::get( "anim_reach" ) )
1150  {
1151  if ( isdefined( ‪_e.scenegoal ) )
1152  {
1153  ‪_e SetGoal( ‪_e.scenegoal ); // use secene goal
1154  ‪_e.scenegoal = undefined;
1155  }
1156  else if ( ‪_b_set_goal )
1157  {
1158  ‪_e SetGoal( ‪_e.origin ); // default to current location
1159  }
1160  }
1161  }
1162  }
1163  }
1164 
1165  function ‪_track_goal()
1166  {
1167  // disable setting goal when animation is done if goal is changed any time during animation
1168  // (assume scripter knows what they are doing and don't override it)
1169  self endon( "cleanup" );
1170  ‪_e endon( "death" );
1171  ‪_e waittill( "goal_changed" );
1172  ‪_b_set_goal = false;
1173  }
1174 
1175  function ‪_play_anim( animation, n_delay_min = 0, n_delay_max = 0, n_rate = 1, n_blend = 0.2, n_time = 0 )
1176  {
1177  if ( ‪_should_skip_anim( animation ) )
1178  {
1179  return;
1180  }
1181 
1182  if ( n_time != 0 )
1183  {
1184  n_time = [[ ‪_o_bundle ]]->get_anim_relative_start_time( animation, n_time );
1185  }
1186 
1187  n_delay = n_delay_min;
1188  if ( n_delay_max > n_delay_min )
1189  {
1190  n_delay = RandomFloatRange( n_delay_min, n_delay_max );
1191  }
1192 
1193  do_reach = ( ( n_time == 0 ) && ( ‪IS_TRUE( ‪_s.doreach ) && ( !‪IS_TRUE( ‪_o_bundle._testing ) || GetDvarInt( "scene_test_with_reach", 0 ) ) ) );
1194 
1195  ‪_spawn( undefined, !do_reach, !do_reach );
1196 
1197  if ( !IsActor( ‪_e ) )
1198  {
1199  do_reach = false;
1200  }
1201 
1202  if ( n_delay > 0 )
1203  {
1204  if ( n_delay > 0 )
1205  {
1206  wait n_delay;
1207  }
1208  }
1209 
1210  if ( do_reach )
1211  {
1212  [[‪scene()]]->wait_till_scene_ready( self );
1213 
1214  if ( ‪IS_TRUE( ‪_s.DisableArrivalInReach ) )
1215  {
1217  }
1218  else
1219  {
1221  }
1222 
1223  ‪flagsys::set( "ready" );
1224  }
1225  else if ( n_rate > 0 ) // Go ahead and first-frame the anim right away without waiting
1226  {
1227  [[‪scene()]]->wait_till_scene_ready();
1228  }
1229  else if ( isdefined( ‪_s.aligntarget ) )
1230  {
1231  foreach ( o_obj in ‪_o_bundle._a_objects )
1232  {
1233  // If align target is an object in this scene, wait for it to spawn
1234  if ( o_obj._str_name == ‪_s.aligntarget )
1235  {
1236  o_obj ‪flagsys::wait_till( "ready" );
1237  break;
1238  }
1239  }
1240  }
1241 
1242  if ( ‪is_alive() )
1243  {
1244  align = ‪get_align_ent();
1245  tag = ‪get_align_tag();
1246 
1247  if ( align == level )
1248  {
1249  align = ( 0, 0, 0 );
1250  tag = ( 0, 0, 0 );
1251  }
1252 
1253  if ( ‪is_shared_player() )
1254  {
1255  ‪_play_shared_player_anim( animation, align, tag, n_rate, n_time );
1256  }
1257  else
1258  {
1259  if ( ‪is_player() && !‪IS_TRUE( ‪_s.newplayermethod ) )
1260  {
1261  thread ‪link_player();
1262  }
1263 
1264  if ( ( ‪_o_bundle._s ‪scene::is_igc() ) || ( ‪_e.scene_spawned === ‪_o_bundle._s.name ) )
1266  {
1267  ‪_e DontInterpolate();
1268  ‪_e Show();
1269  }
1270 
1271  // Lerping and camera tween
1272  n_lerp = ‪get_lerp_time();
1273 
1274  if ( IsPlayer( ‪_e ) && !‪_o_bundle._s ‪scene::is_igc() )
1275  {
1276  n_camera_tween = ‪get_camera_tween();
1277  if ( n_camera_tween > 0 )
1278  {
1279  ‪_e StartCameraTween( n_camera_tween );
1280  }
1281  }
1283 
1284  if ( ![[ ‪_o_bundle ]]->‪has_next_scene() )
1285  {
1286  n_blend_out = ( IsAI( ‪_e ) ? .2 : 0 );
1287  }
1288  else
1289  {
1290  n_blend_out = 0;
1291  }
1292 
1293  if ( ‪IS_TRUE( ‪_s.DieWhenFinished ) )
1294  {
1295  n_blend_out = 0;
1296  }
1297 
1298  self.current_playing_anim = animation;
1299 
1300  //skip the new animation if we are skipping the scene
1301  if ( ‪IS_TRUE( [[ ‪_o_bundle ]]->‪is_skipping_scene() ) && n_rate != 0 )
1302  {
1303  thread ‪skip_scene( true );
1304  }
1305 
1306  ‪_e ‪animation::play( animation, align, tag, n_rate, n_blend, n_blend_out, n_lerp, n_time, ‪_s.ShowWeaponInFirstPerson );
1307 
1308  if ( !isdefined( ‪_e ) || !‪_e IsPlayingAnimScripted() )
1309  {
1310  self.current_playing_anim = undefined;
1311  }
1312  }
1313  }
1314  else
1315  {
1316  /# ‪log( "No entity for animation '" + animation + "' so not playing it." ); #/
1317  }
1318 
1320  }
1321 
1322  function ‪spawn_ent( e )
1323  {
1324  b_disable_throttle = ( ‪_o_bundle._s ‪scene::is_igc() || ‪IS_TRUE( ‪_o_bundle._s.DontThrottle ) );
1325 
1326  if ( ‪is_player() && !‪IS_TRUE( ‪_s.newplayermethod ) )
1327  {
1328  ‪system::wait_till( "loadout" );
1329  m_player = ‪util::spawn_anim_model( level.player_interactive_model );
1330  return m_player;
1331  }
1332  else if ( isdefined( e ) )
1333  {
1334  if ( IsSpawner( e ) )
1335  {
1336  if ( !‪error( e.count < 1, "Trying to spawn AI for scene with spawner count < 1" ) )
1337  {
1338  return e ‪spawner::spawn( true, undefined, undefined, undefined, b_disable_throttle );
1339  }
1340  }
1341  }
1342  else if ( isdefined( ‪_s.model ) )
1343  {
1344  new_model = undefined;
1345 
1346  if ( ‪is_player_model() )
1347  {
1348  new_model = ‪util::spawn_anim_player_model( ‪_s.model, ‪_o_bundle._e_root.origin, ‪_o_bundle._e_root.angles );
1349  }
1350  else
1351  {
1352  new_model = ‪util::spawn_anim_model( ‪_s.model, ‪_o_bundle._e_root.origin, ‪_o_bundle._e_root.angles, undefined, !b_disable_throttle );
1353  }
1354 
1355  return new_model;
1356  }
1357  }
1358 
1359  function ‪_play_shared_player_anim( animation, align, tag, n_rate, n_time )
1360  {
1361  self.player_animation = animation;
1362  self.player_animation_notify = animation + "_notify";
1363  self.player_animation_length = GetAnimLength( animation );
1364  self.player_align = align;
1365  self.player_tag = tag;
1366  self.player_rate = n_rate;
1367  self.player_time_frac = n_time;
1368  self.player_start_time = GetTime();
1369 
1371 
1372  foreach ( player in level.players )
1373  {
1374  if ( player ‪flagsys::get( "loadout_given" ) && ( player.sessionstate !== "spectator" ) )
1375  {
1376  self thread ‪_play_shared_player_anim_for_player( player );
1377  }
1378  else if( ‪IS_TRUE(player.initialLoadoutGiven) )
1379  {
1380  ‪revive_player( player );
1381  }
1382  }
1383 
1384  waittillframeend;
1385 
1386  do
1387  {
1388  b_playing = false;
1389  a_players = ArrayCopy( level.activeplayers );
1390 
1391  foreach ( player in a_players )
1392  {
1393  if ( isdefined( player ) && player ‪flagsys::get( self.player_animation_notify ) )
1394  {
1395  b_playing = true;
1396  player ‪flagsys::wait_till_clear( self.player_animation_notify );
1397  break;
1398  }
1399  }
1400  }
1401  while ( b_playing );
1402 
1404 
1405  thread [[‪_o_bundle]]->_call_state_funcs( "players_done" );
1406  }
1407 
1409  {
1410  player endon( "death" );
1411 
1412  if ( !isdefined( ‪_o_bundle ) )
1413  return;
1414 
1415  player ‪flagsys::set( "shared_igc" );
1416 
1417  //Do not clear the flag for the init state
1418  if( player ‪flagsys::get( self.player_animation_notify ) )
1419  {
1420  player ‪flagsys::set( self.player_animation_notify + "_skip_init_clear" );
1421  }
1422 
1423  player ‪flagsys::set( self.player_animation_notify );
1424 
1425  if ( isdefined( player GetLinkedEnt() ) )
1426  {
1427  player Unlink();
1428  }
1429 
1430  if ( !‪IS_TRUE( ‪_s.DisableTransitionIn ) )
1431  {
1432  if ( ( player != ‪_player ) || GetDvarInt( "scr_player1_postfx", 0 ) )
1433  {
1434  if ( !isdefined( player.screen_fade_menus ) )
1435  {
1436  if ( !‪IS_TRUE( level.chyron_text_active ) )
1437  {
1438  if ( !‪IS_TRUE( player.fullscreen_black_active ) )
1439  {
1440  player.play_scene_transition_effect = true;
1441  }
1442  }
1443  }
1444  }
1445  }
1446 
1447  player Show(); // Make sure the player is not hidden before hidding to the other players
1448  player SetInvisibleToAll();
1449 
1450  ‪_prepare_player( player );
1451 
1452  n_time_passed = ( GetTime() - self.player_start_time ) / 1000;
1453  n_start_time = self.player_time_frac * self.player_animation_length;
1454  n_time_left = self.player_animation_length - n_time_passed - n_start_time;
1455 
1456  n_time_frac = 1 - ( n_time_left / self.player_animation_length );
1457 
1458  if ( isdefined( ‪_e ) && ( player != ‪_e ) )
1459  {
1460  // Teleport coop players to the player who is triggering this scene
1461  // so that the camera tween and lerping happens from the same place
1462  player DontInterpolate();
1463  player SetOrigin( ‪_e.origin );
1464  player SetPlayerAngles( ‪_e GetPlayerAngles() );
1465  }
1466 
1467  // Lerping and camera tween
1468  n_lerp = ‪get_lerp_time();
1469  if ( !‪_o_bundle._s ‪scene::is_igc() )
1470  {
1471  n_camera_tween = ‪get_camera_tween();
1472  if ( n_camera_tween > 0 )
1473  {
1474  player StartCameraTween( n_camera_tween );
1475  }
1476  }
1478 
1479  if ( n_time_frac < 1 )
1480  {
1481  str_animation = self.player_animation;
1482 
1483  // load gender specific player animation
1484  if ( player ‪util::is_female() )
1485  {
1486  if ( isdefined( ‪_o_bundle._s.s_female_bundle ) )
1487  {
1488  s_bundle = ‪_o_bundle._s.s_female_bundle;
1489  }
1490  }
1491  else
1492  {
1493  if ( isdefined( ‪_o_bundle._s.s_male_bundle ) )
1494  {
1495  s_bundle = ‪_o_bundle._s.s_male_bundle;
1496  }
1497  }
1498 
1499  if ( isdefined( s_bundle ) )
1500  {
1501  foreach ( s_object in s_bundle.objects )
1502  {
1503  if ( isdefined( s_object ) && ‪IS_EQUAL( s_object.type, "player" ) )
1504  {
1505  str_animation = s_object.mainanim;
1506  break;
1507  }
1508  }
1509  }
1510 
1511  player_num = player GetEntityNumber();
1512 
1513  if(!isdefined(self.current_playing_anim))
1514  {
1515  self.current_playing_anim = [];
1516  }
1517 
1518  self.current_playing_anim[player_num] = str_animation;
1519 
1520  //skip the new animation if we are skipping the scene
1521  if ( ‪IS_TRUE( [[ ‪_o_bundle ]]->‪is_skipping_scene() ) )
1522  {
1523  thread ‪skip_scene( true );
1524  }
1525 
1527 
1528  player ‪animation::play( str_animation, self.player_align, self.player_tag, self.player_rate, 0, 0, n_lerp, n_time_frac, ‪_s.ShowWeaponInFirstPerson );
1529 
1530  if( !(player ‪flagsys::get( self.player_animation_notify + "_skip_init_clear" )) )
1531  {
1532  player ‪flagsys::clear( self.player_animation_notify ); // all players use the same aniamtion name for the flag to track when they are done
1533  }
1534  else
1535  {
1536  player ‪flagsys::clear( self.player_animation_notify + "_skip_init_clear" );
1537  }
1538 
1539  if ( !player IsPlayingAnimScripted() )
1540  {
1541  self.current_playing_anim[player_num] = undefined;
1542  }
1543  }
1544  }
1545 
1546  function ‪play_regroup_fx_for_scene( e_player )
1547  {
1548  align = ‪get_align_ent();
1549  v_origin = align.origin;
1550  v_angles = align.angles;
1551 
1552  tag = ‪get_align_tag();
1553  if ( isdefined( tag ) )
1554  {
1555  v_origin = align GetTagOrigin( tag );
1556  v_angles = align GetTagAngles( tag );
1557  }
1558 
1559  v_start = GetStartOrigin( v_origin, v_angles, ‪_s.mainanim );
1560  n_dist_sq = DistanceSquared( e_player.origin, v_start );
1561 
1562  if ( ( n_dist_sq > 500 * 500 || isdefined( e_player.hijacked_vehicle_entity ) ) && ( !‪IS_TRUE( e_player.force_short_scene_transition_effect ) ) )
1563  {
1564  self thread ‪regroup_invulnerability( e_player );
1565  e_player ‪clientfield::increment_to_player( "postfx_igc", 1 ); // full effect
1566  }
1567  else
1568  {
1569  e_player ‪clientfield::increment_to_player( "postfx_igc", 3 ); // minimal effect
1570  }
1571 
1572  ‪util::wait_network_frame(); // make sure postfx capture frame before we teleport
1573  }
1574 
1575  function ‪regroup_invulnerability( e_player )
1576  {
1577  e_player endon( "disconnect" );
1578 
1579  e_player.ignoreme = true;
1580  e_player.b_teleport_invulnerability = true;
1581 
1582  e_player ‪util::streamer_wait( undefined, 0, 7 );
1583 
1584  e_player.ignoreme = false;
1585  e_player.b_teleport_invulnerability = undefined;
1586  }
1587 
1588  function ‪get_lerp_time()
1589  {
1590  if ( IsPlayer( ‪_e ) )
1591  {
1592  return ( isdefined( ‪_s.LerpTime ) ? ‪_s.LerpTime : 0 );
1593  }
1594  else
1595  {
1596  return ( isdefined( ‪_s.EntityLerpTime ) ? ‪_s.EntityLerpTime : 0 );
1597  }
1598  }
1599 
1601  {
1602  return ( isdefined( ‪_s.CameraTween ) ? ‪_s.CameraTween : 0 );
1603  }
1604 
1606  {
1607  return ( isdefined( ‪_s.CameraTweenOut ) ? ‪_s.CameraTweenOut : 0 );
1608  }
1609 
1610  function ‪link_player()
1611  {
1612  self endon( "done" );
1613 
1614  level ‪flag::wait_till( "all_players_spawned" );
1615 
1616  player = ‪_player;
1617  player Hide();
1618 
1619  e_linked = player GetLinkedEnt();
1620  if ( isdefined( e_linked ) && ( e_linked == ‪_e ) )
1621  {
1622  // Update link/clamp if linking to same entity
1623 
1624  if ( ‪IS_TRUE( ‪_s.lockview ) )
1625  {
1626  player PlayerLinkToAbsolute( ‪_e, "tag_player" );
1627  }
1628  else
1629  {
1630  player LerpViewAngleClamp( .2, .1, .1, ‪VAL( ‪_s.viewclampright, 0), ‪VAL( ‪_s.viewclampleft, 0), ‪VAL( ‪_s.viewclamptop, 0), ‪VAL( ‪_s.viewclampbottom, 0) );
1631  }
1632 
1633  return;
1634  }
1635 
1636  player DisableUsability();
1637  player DisableOffhandWeapons();
1638 // player DisableWeapons( true );
1639  player DisableWeapons(); //TODO_CODE: QUICK weapon switch only supported for SP at the momement
1640 
1642 
1643  if ( ‪_s.cameratween > 0 )
1644  {
1645 // player StartCameraTween( _s.cameratween ); //TODO_CODE: only supported for SP at the momement
1646  }
1647 
1648  player notify( "scene_link" );
1649  waittillframeend; // allow level script to do custom stuff before linking
1650 
1651  if ( ‪IS_TRUE( ‪_s.lockview ) )
1652  {
1653  player PlayerLinkToAbsolute( ‪_e, "tag_player" );
1654  }
1655  else
1656  {
1657  player PlayerLinkToDelta( ‪_e, "tag_player", 1, ‪VAL( ‪_s.viewclampright, 0), ‪VAL( ‪_s.viewclampleft, 0), ‪VAL( ‪_s.viewclamptop, 0), ‪VAL( ‪_s.viewclampbottom, 0), 1, 1 );
1658 // player SetPlayerViewRateScale( 100 ); //TODO_CODE: only supported for SP at the momement
1659  }
1660 
1661  wait ( ‪_s.cameratween > .2 ? ‪_s.cameratween : .2 );
1662 
1663  ‪_e Show();
1664  }
1665 
1666  function ‪reset_player()
1667  {
1668  level ‪flag::wait_till( "all_players_spawned" );
1669 
1670  player = ‪_player;
1671 
1672 // player StartCameraTween( .2 ); //TODO_CODE: only supported for SP at the momement
1673 // player ShowViewModel(); //TODO_CODE: only supported for SP at the momement
1674 // player SetLowReady( false ); //TODO_CODE: only supported for SP at the momement
1675 // player ResetPlayerViewRateScale(); //TODO_CODE: only supported for SP at the momement
1676  player EnableUsability();
1677  player EnableOffhandWeapons();
1678  player EnableWeapons();
1679 
1680  player Show();
1681  }
1682 
1684  {
1686  }
1687 
1688  function ‪is_alive()
1689  {
1690  return ( isdefined( ‪_e ) && ( ‪_e.health > 0 || ‪_s.IgnoreAliveCheck === true ) );
1691  }
1692 
1693  function ‪is_player()
1694  {
1695  return ( IsDefined( ‪_s.player ) );
1696  }
1697 
1699  {
1700  return ‪_s.type === "player model";
1701  }
1702 
1704  {
1705  return ( IsDefined( ‪_s.player ) && ‪IS_TRUE( ‪_s.SharedIGC ) );
1706  }
1707 
1709  {
1710  return ( isdefined( ‪_e ) && isdefined( ‪_e.current_scene ) && ( ‪_e.current_scene != ‪_o_bundle._str_name ) );
1711  }
1712 
1713  function ‪_should_skip_anim( animation )
1714  {
1715  if(!‪IS_TRUE(‪_s.player) && !‪IS_TRUE(‪_s.sharedigc) && !‪IS_TRUE(‪_s.KeepWhileSkipping) && ‪IS_TRUE([[‪_o_bundle]]->‪is_skipping_scene()) && ‪IS_TRUE( ‪_s.DeleteWhenFinished ))
1716  {
1717  if( !AnimHasImportantNotifies(animation) )
1718  {
1719  if ( !IsSpawner( ‪_e ) )
1720  {
1721  b_allows_multiple = [[‪scene()]]->allows_multiple();
1722  e = ‪scene::get_existing_ent( ‪_str_name, b_allows_multiple );
1723 
1724  if( isdefined(e) )
1725  {
1726  return false;
1727  }
1728  }
1729 
1730  return true;
1731  }
1732  }
1733 
1734  return false;
1735  }
1736 
1738  {
1739  if(!‪IS_TRUE(‪_s.player) && !‪IS_TRUE(‪_s.sharedigc) && !‪IS_TRUE(‪_s.KeepWhileSkipping) && ‪IS_TRUE([[‪_o_bundle]]->‪is_skipping_scene()) && ‪IS_TRUE( ‪_s.DeleteWhenFinished ))
1740  {
1741  if( isdefined(‪_s.initanim) && AnimHasImportantNotifies(‪_s.initanim) )
1742  {
1743  return false;
1744  }
1745 
1746  if( isdefined(‪_s.mainanim) && AnimHasImportantNotifies(‪_s.mainanim) )
1747  {
1748  return false;
1749  }
1750 
1751  if( isdefined(‪_s.endanim) && AnimHasImportantNotifies(‪_s.endanim) )
1752  {
1753  return false;
1754  }
1755 
1756  if ( !IsSpawner( ‪_e ) )
1757  {
1758  b_allows_multiple = [[‪scene()]]->allows_multiple();
1759  e = ‪scene::get_existing_ent( ‪_str_name, b_allows_multiple );
1760 
1761  if( isdefined(e) )
1762  {
1763  return false;
1764  }
1765  }
1766 
1767  return true;
1768  }
1769 
1770  return false;
1771  }
1772 
1773  function private ‪skip_anim_on_client(entity, anim_name)
1774  {
1775  if(!isdefined(anim_name))
1776  return;
1777 
1778  if(!isdefined(entity))
1779  return;
1780 
1781  if(!( entity IsPlayingAnimScripted()))
1782  return;
1783 
1784  ‪is_looping = IsAnimLooping(anim_name);
1785 
1786  if(‪is_looping)
1787  return;
1788 
1789  entity ‪clientfield::increment( "player_scene_animation_skip" );
1790  }
1791 
1792  function private ‪skip_anim_on_server( entity, anim_name )
1793  {
1794  if(!isdefined(anim_name))
1795  return;
1796 
1797  if(!isdefined(entity))
1798  return;
1799 
1800  //*! \details **Description:**
1801 <br/>ToDo : ‪change this to check on the anim_name
1802  if(!( entity IsPlayingAnimScripted()))
1803  return;
1804 
1805  ‪is_looping = IsAnimLooping(anim_name);
1806 
1807  if(‪is_looping)
1808  {
1809  entity ‪animation::stop();
1810  }
1811  else
1812  {
1813  entity SetAnimTimebyName(anim_name, 1);
1814  }
1815 
1816  entity stopsounds();
1817  }
1818 
1820  {
1821  if(isdefined(self.current_playing_anim))
1822  {
1823  if ( ‪is_shared_player() )
1824  {
1825  foreach ( player in level.players )
1826  {
1827  ‪skip_anim_on_client(player, self.current_playing_anim[player GetEntityNumber()]);
1828  }
1829  }
1830  else
1831  {
1832  ‪skip_anim_on_client(‪_e, self.current_playing_anim );
1833  }
1834 
1835  return true;
1836  }
1837 
1838  return false;
1839  }
1840 
1842  {
1843  if(isdefined(self.current_playing_anim))
1844  {
1845  if ( ‪is_shared_player() )
1846  {
1847  foreach ( player in level.players )
1848  {
1849  ‪skip_anim_on_server(player, self.current_playing_anim[player GetEntityNumber()]);
1850  }
1851  }
1852  else
1853  {
1854  ‪skip_anim_on_server(‪_e, self.current_playing_anim );
1855  }
1856  }
1857  }
1858 
1859  function ‪skip_scene(b_wait_one_frame)
1860  {
1861  if(isdefined(b_wait_one_frame)) //wait for the animation to start
1862  {
1863  wait 0.05;
1864  }
1865 
1867  {
1868  wait 0.05;
1869  }
1870 
1872  }
1873 }
1874 
1876 // ___ ___ ___ _ _ ___
1877 // / __| / __| | __| | \| | | __|
1878 // \__ \ | (__ | _| | .` | | _|
1879 // |___/ \___| |___| |_|\_| |___|
1880 //
1882 
1883 class cScene : cScriptBundleBase
1884 {
1885  var ‪_e_root;
1892 
1894  {
1895  ‪_n_object_id = 0;
1896  ‪_str_mode = "";
1897  ‪_n_streamer_req = -1;
1898  }
1899 
1901  {
1902  }
1903 
1904  function ‪init( str_scenedef, s_scenedef, e_align, ‪a_ents, b_test_run )
1905  {
1906  ‪cScriptBundleBase::init( str_scenedef, s_scenedef, b_test_run );
1907 
1908  if( isdefined( s_scenedef.streamerhint ) && s_scenedef.streamerhint != "" && !‪is_skipping_scene())
1909  {
1910  ‪_n_streamer_req = streamerRequest( "set", s_scenedef.streamerhint );
1911  }
1912 
1913  ‪_str_notify_name = ( IsString( ‪_s.MaleBundle ) ? ‪_s.MaleBundle : ‪_str_name );
1914 
1916 
1917  if ( !‪error( ‪a_ents.size > ‪_s.objects.size, "Trying to use more entities than scene supports." ) )
1918  {
1919  ‪_e_root = e_align;
1920 
1921  ‪ARRAY_ADD( level.active_scenes[ ‪_str_name ], ‪_e_root );
1922  ‪ARRAY_ADD( ‪_e_root.scenes, self );
1923 
1924  a_objs = ‪get_valid_object_defs();
1925 
1926  foreach ( s_obj in a_objs )
1927  {
1928  ‪add_object( [[ [[self]]->‪new_object() ]]->first_init( s_obj, self ) );
1929  }
1930 
1931  ‪_n_request_time = GetTime();
1932  if ( !‪IS_TRUE( ‪_s.DontSync ) )
1933  {
1935  }
1936 
1937  self thread ‪initialize( ‪a_ents );
1938  }
1939  }
1940 
1942  {
1943  ‪DEFAULT( level.scene_sync_list, [] );
1944  ‪DEFAULT( level.scene_sync_list[ ‪_n_request_time ], [] );
1945  ‪array::add( level.scene_sync_list[ ‪_n_request_time ], self, false );
1946  }
1947 
1949  {
1950  if ( isdefined(level.scene_sync_list) && isdefined( level.scene_sync_list[ ‪_n_request_time ] ) )
1951  {
1952  ArrayRemoveValue( level.scene_sync_list[ ‪_n_request_time ], self );
1953 
1954  if ( !level.scene_sync_list[ ‪_n_request_time ].size )
1955  {
1956  level.scene_sync_list[ ‪_n_request_time ] = undefined;
1957  }
1958  }
1959  }
1960 
1961  function ‪new_object()
1962  {
1963  return new ‪cSceneObject();
1964  }
1965 
1967  {
1968  a_obj_defs = [];
1969  foreach ( s_obj in ‪_s.objects )
1970  {
1971  if ( ‪_s.vmtype == "server" || s_obj.vmtype == "server" )
1972  {
1973  if ( isdefined( s_obj.name ) || isdefined( s_obj.model ) || isdefined( s_obj.initanim ) || isdefined( s_obj.mainanim ) )
1974  {
1975  if ( !‪IS_TRUE( s_obj.disabled ) )
1976  {
1977  ‪ARRAY_ADD( a_obj_defs, s_obj );
1978  }
1979  }
1980  }
1981  }
1982  return a_obj_defs;
1983  }
1984 
1985  function ‪initialize( ‪a_ents, b_playing = false )
1986  {
1987  self notify( "new_state" );
1988  self endon( "new_state" );
1989 
1990  self thread ‪sync_with_client_scene( "init", ‪_testing );
1991 
1993 
1994  if ( ‪get_valid_objects().size > 0 )
1995  {
1996  level ‪flagsys::set( ‪_str_name + "_initialized" );
1997  ‪_str_state = "init";
1998 
1999  foreach ( o_obj in ‪_a_objects )
2000  {
2001  thread [[o_obj]]->initialize();
2002  }
2003  }
2004 
2005  if ( !b_playing )
2006  {
2007  thread ‪_call_state_funcs( "init" );
2008  }
2009 
2011 
2012  level ‪flagsys::set( ‪_str_notify_name + "_ready" );
2013 
2014  // stops the scene if all objects die in the initialize state
2015  array::flagsys_wait( ‪_a_objects, "done" );
2016  thread ‪stop();
2017  }
2018 
2019  function ‪get_object_id()
2020  {
2021  ‪_n_object_id++;
2022  return ‪_n_object_id;
2023  }
2024 
2025  function ‪sync_with_client_scene( str_state, b_test_run = false )
2026  {
2027  if ( ‪_s.vmtype == "both" && !‪_s ‪scene::is_igc() )
2028  {
2029  self endon( "new_state" );
2030 
2032 
2033  n_val = undefined;
2034 
2035  if ( b_test_run )
2036  {
2037  switch ( str_state )
2038  {
2039  case "stop":
2040  n_val = 3;
2041  break;
2042  case "init":
2043  n_val = 4;
2044  break;
2045  case "play":
2046  n_val = 5;
2047  break;
2048  }
2049  }
2050  else
2051  {
2052  switch ( str_state )
2053  {
2054  case "stop":
2055  n_val = 0;
2056  break;
2057  case "init":
2058  n_val = 1;
2059  break;
2060  case "play":
2061  n_val = 2;
2062  break;
2063  }
2064  }
2065 
2066  level ‪clientfield::set( ‪_s.name, n_val );
2067  }
2068  }
2069 
2071  {
2073  ‪a_objects = ArrayCopy( ‪_a_objects );
2074 
2075  if ( _assign_ents_by_name( ‪a_objects, ‪a_ents ) )
2076  {
2077  if ( _assign_ents_by_type( ‪a_objects, ‪a_ents, "player", &‪_is_ent_player ) )
2078  {
2079  if ( _assign_ents_by_type( ‪a_objects, ‪a_ents, "actor", &‪_is_ent_actor ) )
2080  {
2081  if ( _assign_ents_by_type( ‪a_objects, ‪a_ents, "vehicle", &‪_is_ent_vehicle ) )
2082  {
2083  if ( _assign_ents_by_type( ‪a_objects, ‪a_ents, "prop" ) )
2084  {
2085  foreach ( ent in ‪a_ents )
2086  {
2087  obj = array::pop( ‪a_objects );
2088  if ( !‪error( !isdefined( obj ), "No scene object to assign entity too. You might have passed in more than the scene supports." ) )
2089  {
2090  obj._e = ent;
2091  }
2092  }
2093  }
2094  }
2095  }
2096  }
2097  }
2098  }
2099 
2100  function _assign_ents_by_name( &‪a_objects, &‪a_ents )
2101  {
2102  if ( ‪a_ents.size )
2103  {
2104  foreach ( str_name, e_ent in ArrayCopy( ‪a_ents ) )
2105  {
2106  foreach ( i, o_obj in ArrayCopy( ‪a_objects ) )
2107  {
2108  if ( isdefined( o_obj._s.name ) && ( ‪STR( o_obj._s.name ) == ToLower( ‪STR( str_name ) ) ) )
2109  {
2110  o_obj._e = e_ent;
2111 
2112  ArrayRemoveIndex( ‪a_ents, str_name, true );
2113  ArrayRemoveIndex( ‪a_objects, i );
2114 
2115  break;
2116  }
2117  }
2118  }
2119 
2120  /#
2121  // Check for any remaining entities with specific names that don't have objects to assign them to
2122  foreach ( i, ent in ‪a_ents )
2123  {
2124  ‪error( IsString( i ), "No scene object with name '" + i + "'." );
2125  }
2126  #/
2127  }
2128 
2129  return ‪a_ents.size;
2130  }
2131 
2132  function _assign_ents_by_type( &‪a_objects, &‪a_ents, str_type, func_test )
2133  {
2134  if ( ‪a_ents.size )
2135  {
2136  a_objects_of_type = ‪get_objects( str_type );
2137 
2138  if ( a_objects_of_type.size )
2139  {
2140  foreach ( ent in ArrayCopy( ‪a_ents ) )
2141  {
2142  if ( isdefined( func_test ) && [[ func_test ]]( ent ) )
2143  {
2144  obj = array::pop_front( a_objects_of_type );
2145  if ( isdefined( obj ) )
2146  {
2147  obj._e = ent;
2148 
2149  ArrayRemoveValue( ‪a_ents, ent, true );
2150  ArrayRemoveValue( ‪a_objects, obj );
2151  }
2152  else
2153  {
2154  break;
2155  }
2156  }
2157  }
2158  }
2159  }
2160 
2161  return ‪a_ents.size;
2162  }
2163 
2164  function ‪_is_ent_player( ent )
2165  {
2166  return ( IsPlayer( ent ) );
2167  }
2168 
2169  function ‪_is_ent_actor( ent )
2170  {
2171  return ( IsActor( ent ) || IsActorSpawner( ent ) );
2172  }
2173 
2174  function ‪_is_ent_vehicle( ent )
2175  {
2176  return ( IsVehicle( ent ) || IsVehicleSpawner( ent ) );
2177  }
2178 
2179  function ‪get_objects( str_type )
2180  {
2181  ‪a_ret = [];
2182  foreach ( obj in ‪_a_objects )
2183  {
2184  if ( obj._s.type == str_type )
2185  {
2186  ‪ARRAY_ADD( ‪a_ret, obj );
2187  }
2188  }
2189  return ‪a_ret;
2190  }
2191 
2192  function ‪get_anim_relative_start_time(animation, n_time)
2193  {
2194  if(!isdefined(self.n_start_time) || self.n_start_time == 0 || !isdefined(self.longest_anim_length) || self.longest_anim_length == 0)
2195  return n_time;
2196 
2197  anim_length = GetAnimLength(animation);
2198  ‪is_looping = IsAnimLooping(animation);
2199 
2200  n_time = self.longest_anim_length / anim_length * n_time;
2201 
2202  if(‪is_looping)
2203  {
2204  if(n_time > 0.95)
2205  n_time = 0.95;
2206  }
2207  else
2208  {
2209  if(n_time > 0.99)
2210  n_time = 0.99;
2211  }
2212 
2213  return n_time;
2214  }
2215 
2217  {
2218  max_anim_length = -1;
2219  player_anim_length = -1;
2220 
2221  foreach ( obj in ‪_a_objects )
2222  {
2223  if(isdefined(obj._s.MainAnim))
2224  {
2225  anim_length = GetAnimLength( obj._s.MainAnim );
2226  }
2227 
2228  if ( ‪IS_EQUAL( obj._s.type, "player" ) )
2229  {
2230  player_anim_length = anim_length;
2231  }
2232 
2233  if(anim_length > max_anim_length)
2234  {
2235  max_anim_length = anim_length;
2236  }
2237  }
2238 
2239  return player_anim_length < max_anim_length;
2240  }
2241 
2242  function ‪play( str_state = "play", ‪a_ents, b_testing = false, str_mode = "" )
2243  {
2244  self notify( "new_state" );
2245  self endon( "new_state" );
2246 
2247  if(str_mode == "skip_scene")
2248  {
2249  thread ‪skip_scene( true );
2250  }
2251  else if(str_mode == "skip_scene_player")
2252  {
2253  self.b_player_scene = true;
2254  thread ‪skip_scene( true );
2255  }
2256  else if(!‪is_skipping_scene() && ‪is_scene_shared_sequence() && !‪is_scene_shared()) //stop the shared sequence if the next (current) scene is not shared.
2257  {
2259  }
2260 
2262 
2263  ‪_testing = b_testing;
2264  ‪_str_mode = str_mode;
2265 
2266  if(‪IS_TRUE(‪_s.SpectateOnJoin))
2267  {
2268  level.scene_should_spectate_on_hot_join = true;
2269  }
2270 
2272 
2273  if ( StrStartsWith( ‪_str_mode, "capture" ) )
2274  {
2275  /* First-frame the scene and move player to align node to stream the scene */
2276 
2277  if ( ‪get_valid_objects().size )
2278  {
2279  foreach ( o_obj in ‪_a_objects )
2280  {
2281  thread [[o_obj]]->initialize( true );
2282  }
2283  }
2284 
2285  thread ‪loop_camera_anim_to_set_up_for_capture(); // put player camera in a more accurate postiion for streaming
2286 
2287  // move the player to the align node and link them so they don't fall if there's nothing under them
2288 
2289  capture_player = level.players[ 0 ];
2290 
2291  v_origin = ‪get_align_ent().origin;
2292 
2293  if ( !isdefined( capture_player.e_capture_link ) )
2294  {
2295  capture_player.e_capture_link = ‪util::spawn_model( "tag_origin", v_origin );
2296  capture_player SetOrigin( v_origin );
2297  capture_player Linkto( level.players[ 0 ].e_capture_link );
2298  }
2299  else
2300  {
2301  capture_player.e_capture_link.origin = v_origin;
2302  }
2303 
2304  wait 15; // give scene time in the init state to load textures, also the code needs time in between captures
2305 
2306  thread ‪_stop_camera_anims();
2307  }
2308 
2309  self thread ‪sync_with_client_scene( "play", b_testing );
2310 
2311  /* Get animation start time from the mode string */
2312 
2313  self.n_start_time = 0;
2314  if ( IsSubStr( str_mode, "skipto" ) )
2315  {
2316  args = StrTok( str_mode, ":" );
2317  if ( isdefined( args[1] ) )
2318  {
2319  self.n_start_time = Float( args[1] );
2320  }
2321  else
2322  {
2323  // skip to end of animation - can't go all the way to 1 because looping animations will assert
2324  self.n_start_time = .95;
2325  }
2326 
2327  self.longest_anim_length = 0;
2328 
2329  foreach ( s_obj in ‪_a_objects )
2330  {
2331  if ( isdefined( s_obj._s.MainAnim ) )
2332  {
2333  anim_length = GetAnimLength( s_obj._s.MainAnim );
2334 
2335  if ( anim_length > self.longest_anim_length )
2336  {
2337  self.longest_anim_length = anim_length;
2338  }
2339  }
2340  }
2341  }
2342 
2343  /* ---------------------------------------------- */
2344 
2345  if ( ‪get_valid_objects().size || ‪_s ‪scene::is_igc() )
2346  {
2347  level ‪flagsys::set( ‪_str_name + "_playing" );
2348  ‪_str_state = "play";
2349 
2350  foreach ( o_obj in ‪_a_objects )
2351  {
2352  thread [[o_obj]]->play();
2353  }
2354 
2356 
2357  level ‪flagsys::set( ‪_str_notify_name + "_ready" );
2358 
2359  if ( self.n_start_time == 0 )
2360  {
2361  self thread ‪_play_camera_anims();
2362  }
2363 
2364  if( ‪_n_streamer_req != -1 && !‪is_skipping_scene())
2365  {
2366  streamerRequest( "play", ‪_s.streamerhint );
2367  }
2368 
2369  thread ‪_call_state_funcs( "play" );
2370 
2371  if ( ‪_s ‪scene::is_igc() )
2372  {
2373  if ( !‪IS_TRUE( ‪_s.DisableSceneSkipping ) && ‪_str_state != "init" )
2374  {
2375  ‪trigger_scene_sequence_started(self); //send self as cscene to force triggering the sequnce
2376  }
2377 
2378  if ( IsString( ‪_s.cameraswitcher ) )
2379  {
2380  ‪_wait_for_camera_animation( ‪_s.cameraswitcher, self.n_start_time );
2381  }
2382  else if ( IsString( ‪_s.extraCamSwitcher1 ) )
2383  {
2384  ‪_wait_for_camera_animation( ‪_s.extraCamSwitcher1, self.n_start_time );
2385  }
2386  else if ( IsString( ‪_s.extraCamSwitcher2 ) )
2387  {
2388  ‪_wait_for_camera_animation( ‪_s.extraCamSwitcher2, self.n_start_time );
2389  }
2390  else if ( IsString( ‪_s.extraCamSwitcher3 ) )
2391  {
2392  ‪_wait_for_camera_animation( ‪_s.extraCamSwitcher3, self.n_start_time );
2393  }
2394  else if ( IsString( ‪_s.extraCamSwitcher4 ) )
2395  {
2396  ‪_wait_for_camera_animation( ‪_s.extraCamSwitcher4, self.n_start_time );
2397  }
2398 
2399  foreach ( o_obj in ‪_a_objects )
2400  {
2401  thread [[o_obj]]->stop( false, ‪IS_TRUE( o_obj._s.DontClamp ), true );
2402  }
2403 
2404  ‪_e_root notify( "scene_done", ‪_str_notify_name );
2405  thread ‪_call_state_funcs( "done" );
2406 
2407  if ( ‪IS_TRUE( ‪_s.SpectateOnJoin ) )
2408  {
2409  level.scene_should_spectate_on_hot_join = undefined;
2410  }
2411  }
2412  else
2413  {
2414  array::flagsys_wait_any_flag( ‪_a_objects, "done", "main_done" );
2415 
2416  if ( isdefined( ‪_e_root ) )
2417  {
2418  ‪_e_root notify( "scene_done", ‪_str_notify_name );
2419  }
2420 
2421  thread ‪_call_state_funcs( "done" );
2422 
2423  if ( ‪IS_TRUE( ‪_s.SpectateOnJoin ) )
2424  {
2425  level.scene_should_spectate_on_hot_join = undefined;
2426  }
2427 
2428  array::flagsys_wait( ‪_a_objects, "done" );
2429  }
2430 
2431  if ( ‪is_looping() || ( StrEndsWith( ‪_str_mode, "loop" ) ) )
2432  {
2433  if ( ‪has_init_state() )
2434  {
2435  level ‪flagsys::clear( ‪_str_name + "_playing" );
2436 
2437  thread ‪initialize();
2438  }
2439  else
2440  {
2441  level ‪flagsys::clear( ‪_str_name + "_initialized" );
2442 
2443  thread ‪play( str_state, undefined, b_testing, str_mode );
2444  }
2445  }
2446  else
2447  {
2448  if ( !StrEndsWith( ‪_str_mode, "single" ) )
2449  {
2450  thread ‪run_next();
2451  }
2452  else
2453  {
2454  if( !‪is_skipping_scene() ) //if we are not skipping a scene then just notify that a scene sequence has ended
2455  {
2457  {
2459  }
2460  }
2461  else if(isdefined(level.linked_scenes)) //if we are skipping a scene, remove it from the linked scenes if it exists
2462  {
2463  ArrayRemoveValue(level.linked_scenes, ‪_s.name );
2464  }
2465 
2467  }
2468 
2469 
2470  if ( !‪_s ‪scene::is_igc() || !‪IS_TRUE( ‪_s.holdCameraLastFrame ) )
2471  {
2472  // Scenes set to hold camera last frame must be stopped manually with scene::stop()
2473  thread ‪stop( false, true );
2474  }
2475  }
2476  }
2477  else
2478  {
2479  thread ‪stop( false, true );
2480  }
2481  }
2482 
2483  function ‪_wait_server_time( n_time, n_start_time = 0 )
2484  {
2485  n_len = ( n_time - ( n_time * n_start_time ) ); // get the length we need to wait from the desired start time fraction
2486  n_len = n_len / .05;
2487 
2488  n_len_int = Int( n_len );
2489  if ( n_len_int != n_len )
2490  {
2491  n_len = Floor( n_len );
2492  }
2493 
2494  n_server_length = n_len * .05; // clamp to full server frames.
2495 
2496  wait n_server_length;
2497  }
2498 
2499  function ‪_wait_for_camera_animation( str_cam, n_start_time )
2500  {
2501  self endon( "skip_camera_anims" );
2502 
2503  if ( IsCamAnimLooping( str_cam ) )
2504  {
2505  level waittill( "forever" );
2506  }
2507  else
2508  {
2509  ‪_wait_server_time( GetCamAnimTime( str_cam ) / 1000, n_start_time );
2510  }
2511  }
2512 
2514  {
2515  level endon( "stop_camera_anims" );
2516  waittillframeend;
2517 
2518  e_align = ‪get_align_ent();
2519 
2520  v_origin = ( isdefined( e_align.origin ) ? e_align.origin : ( 0, 0, 0 ) );
2521  v_angles = ( isdefined( e_align.angles ) ? e_align.angles : ( 0, 0, 0 ) );
2522 
2523  xcam_players = [];
2524 
2525  if(‪IS_TRUE(‪_s.LinkXCamToOnePlayer))
2526  {
2527  foreach ( o_obj in ‪_a_objects )
2528  {
2529  if( isdefined(o_obj) && [[o_obj]]->is_player() && ![[o_obj]]->is_shared_player() )
2530  {
2531  ‪ARRAY_ADD(xcam_players,o_obj._player);
2532  }
2533  }
2534 
2535  if(xcam_players.size == 0)
2536  {
2537  xcam_players = level.players;
2538  }
2539  else
2540  {
2541  self.a_xcam_players = xcam_players;
2542  }
2543  }
2544  else
2545  {
2546  xcam_players = level.players;
2547  }
2548 
2549  if ( IsString( ‪_s.cameraswitcher ) )
2550  {
2551  if(!‪IS_TRUE(‪_s.LinkXCamToOnePlayer))
2552  {
2554  }
2555 
2556  self.camera_v_origin = v_origin;
2557  self.camera_v_angles = v_angles;
2558  self.camera_start_time = GetTime();
2559 
2560  array::thread_all_ents( xcam_players, &‪_play_camera_anim_on_player, v_origin, v_angles, false );
2561  }
2562 
2563  if ( IsString( ‪_s.extraCamSwitcher1 ) )
2564  {
2565  array::thread_all_ents( xcam_players, &‪_play_extracam_on_player, 0, ‪_s.extraCamSwitcher1, v_origin, v_angles );
2566  }
2567 
2568  if ( IsString( ‪_s.extraCamSwitcher2 ) )
2569  {
2570  array::thread_all_ents( xcam_players, &‪_play_extracam_on_player, 1, ‪_s.extraCamSwitcher2, v_origin, v_angles );
2571  }
2572 
2573  if ( IsString( ‪_s.extraCamSwitcher3 ) )
2574  {
2575  array::thread_all_ents( xcam_players, &‪_play_extracam_on_player, 2, ‪_s.extraCamSwitcher3, v_origin, v_angles );
2576  }
2577 
2578  if ( IsString( ‪_s.extraCamSwitcher4 ) )
2579  {
2580  array::thread_all_ents( xcam_players, &‪_play_extracam_on_player, 3, ‪_s.extraCamSwitcher4, v_origin, v_angles );
2581  }
2582  }
2583 
2585  {
2586  self thread ‪_play_camera_anim_on_player(player, self.camera_v_origin, self.camera_v_angles, true);
2587  }
2588 
2589  function ‪_play_camera_anim_on_player( player, v_origin, v_angles, ignore_initial_notetracks )
2590  {
2591  player notify( "new_camera_switcher" );
2592  player DontInterpolate();
2593  player thread ‪scene::scene_disable_player_stuff();
2594 
2595  self.played_camera_anims = true;
2596 
2597  n_start_time = self.camera_start_time;
2598 
2599  if(!isdefined(‪_s.cameraSwitcherGraphicContents) || IsMature( player ))
2600  {
2601  //*! \details **Description:**
2602 <br/>ToDo - Enable once the new exe populated (8/14/2015)
2603  CamAnimScripted( player, ‪_s.cameraswitcher, n_start_time, v_origin, v_angles );
2604  //CamAnimScripted( player, _s.cameraswitcher, n_start_time, v_origin, v_angles, 0, "", ignore_initial_notetracks );
2605  }
2606  else
2607  {
2608  //*! \details **Description:**
2609 <br/>ToDo - Enable once the new exe populated (8/14/2015)
2610  CamAnimScripted( player, ‪_s.cameraSwitcherGraphicContents, n_start_time, v_origin, v_angles );
2611  //CamAnimScripted( player, _s.cameraSwitcherGraphicContents, n_start_time, v_origin, v_angles, 0, "", ignore_initial_notetracks );
2612  }
2613  }
2614 
2616  {
2617  level endon( "stop_camera_anims" );
2618 
2619  while ( true )
2620  {
2622  ‪_wait_for_camera_animation( ‪_s.cameraswitcher );
2623  }
2624  }
2625 
2626  function ‪_play_extracam_on_player( player, n_index, str_camera_anim, v_origin, v_angles )
2627  {
2628  self.played_camera_anims = true;
2629  ExtraCamAnimScripted( player, n_index, str_camera_anim, GetTime(), v_origin, v_angles );
2630  }
2631 
2633  {
2634  if(!‪IS_TRUE(self.played_camera_anims)) //no camera anims were played to be stopped
2635  {
2636  return;
2637  }
2638 
2639  level notify( "stop_camera_anims" );
2640 
2641  xcam_players = [];
2642 
2643  if(isdefined(self.a_xcam_players))
2644  {
2645  xcam_players = self.a_xcam_players;
2646  }
2647  else
2648  {
2649  xcam_players = GetPlayers();
2650  }
2651 
2652  foreach ( player in xcam_players )
2653  {
2654  if ( isdefined( player ) )
2655  {
2656  self thread ‪_stop_camera_anim_on_player( player );
2657  }
2658  }
2659 
2660 // show_players();
2661  }
2662 
2664  {
2665  player endon( "disconnect" );
2666  if ( IsString( ‪_s.cameraswitcher ) )
2667  {
2668  player endon( "new_camera_switcher" );
2669 
2670  player DontInterpolate();
2671  EndCamAnimScripted( player );
2672 
2673  player thread ‪scene::scene_enable_player_stuff();
2674 
2675  if(!‪IS_TRUE(‪_s.LinkXCamToOnePlayer))
2676  {
2678  }
2679  }
2680 
2681  // TODO: do we want the extracam animations to stop?
2682  if ( IsString( ‪_s.extraCamSwitcher1 ) )
2683  {
2684  EndExtraCamAnimScripted( player, 0 );
2685  }
2686 
2687  if ( IsString( ‪_s.extraCamSwitcher2 ) )
2688  {
2689  EndExtraCamAnimScripted( player, 1 );
2690  }
2691 
2692  if ( IsString( ‪_s.extraCamSwitcher3 ) )
2693  {
2694  EndExtraCamAnimScripted( player, 2 );
2695  }
2696 
2697  if ( IsString( ‪_s.extraCamSwitcher4 ) )
2698  {
2699  EndExtraCamAnimScripted( player, 3 );
2700  }
2701  }
2702 
2704  {
2705  }
2706 
2708  {
2709  }
2710 
2712  {
2713  if( ‪_s.name == "cin_ram_02_04_interview_part04" )
2714  {
2715  return false;
2716  }
2717 
2718  return ( ( ‪IS_TRUE(self.skipping_scene) || self.‪_str_mode == "skip_scene" || self.‪_str_mode == "skip_scene_player" ) );
2719  }
2720 
2722  {
2723  return ( ‪IS_TRUE(self.b_player_scene) || self.‪_str_mode == "skip_scene_player") && !array::contains(level.linked_scenes, ‪_s.name);
2724  }
2725 
2727  {
2728  return isdefined(‪_s.nextscenebundle);
2729  }
2730 
2731  function ‪run_next()
2732  {
2733  b_run_next_scene = false;
2734 
2735  if ( isdefined( ‪_s.nextscenebundle ) )
2736  {
2737  self waittill( "stopped", b_finished );
2738 
2739  if ( b_finished )
2740  {
2741  b_skip_scene = ‪is_skipping_scene();
2742 
2743  if(b_skip_scene)
2744  {
2745  self ‪util::waittill_any_timeout( 5, "scene_skip_completed");
2746  }
2747 
2748  if ( ‪_s.scenetype == "fxanim" && ‪IS_EQUAL( ‪_s.nextscenemode, "init" ) )
2749  {
2750  if ( !‪error( !‪has_init_state(), "Scene can't init next scene '" + ‪_s.nextscenebundle + "' because it doesn't have an init state." ) )
2751  {
2752  if ( ‪allows_multiple() )
2753  {
2754  ‪_e_root thread ‪scene::init( ‪_s.nextscenebundle, ‪get_ents() );
2755  }
2756  else
2757  {
2758  ‪_e_root thread ‪scene::init( ‪_s.nextscenebundle );
2759  }
2760  }
2761  }
2762  else
2763  {
2764  if(b_skip_scene)
2765  {
2767  {
2768  ‪_str_mode = "skip_scene_player";
2769  }
2770  else
2771  {
2772  ‪_str_mode = "skip_scene";
2773  }
2774  }
2775  else
2776  {
2777  b_run_next_scene = true;
2778  }
2779 
2780  if ( ‪allows_multiple() )
2781  {
2782  ‪_e_root thread ‪scene::play( ‪_s.nextscenebundle, ‪get_ents(), undefined, undefined, undefined, ‪_str_mode );
2783  }
2784  else
2785  {
2786  ‪_e_root thread ‪scene::play( ‪_s.nextscenebundle, undefined, undefined, undefined, undefined, ‪_str_mode );
2787  }
2788  }
2789  }
2790  }
2791 
2792  if( !‪IS_TRUE(b_run_next_scene) )
2793  {
2794  if(!‪is_skipping_scene()) //if we are not skipping a scene then just notify that the scene sequence has ended
2795  {
2797  {
2799  }
2800  }
2801  else if(isdefined(level.linked_scenes)) //if we are skipping a scene, remove it from the linked scenes if it exists
2802  {
2803  ArrayRemoveValue(level.linked_scenes, ‪_s.name );
2804  }
2805 
2807  }
2808  }
2809 
2811  {
2812  if( IsString( ‪_s._endStreamerHint ) )
2813  {
2814  if( GetDvarInt("scene_hide_player") > 0 )
2815  {
2816  foreach(player in level.players)
2817  {
2818  player Show();
2819  }
2820  }
2821 
2822  streamerRequest( "clear", ‪_s._endStreamerHint );
2823  }
2824  }
2825 
2826  function ‪stop( b_clear = false, b_finished = false )
2827  {
2828  if ( isdefined( ‪_str_state ) )
2829  {
2830  if ( !b_finished )
2831  {
2833  }
2834 
2835  //Handle the case where the scene was explicitly stopped
2836  if(!‪is_skipping_scene())
2837  {
2838  if ( !isdefined( ‪_s.nextscenebundle ) && ‪is_scene_shared_sequence())
2839  {
2841  }
2842  }
2843 
2844  self thread ‪sync_with_client_scene( "stop", b_clear );
2845 
2846  ‪_str_state = undefined;
2847 
2848  self notify( "new_state" );
2849  self notify( "death" );
2850 
2851  level ‪flagsys::clear( ‪_str_name + "_playing" );
2852  level ‪flagsys::clear( ‪_str_name + "_initialized" );
2853 
2854  thread ‪_call_state_funcs( "stop" );
2855 
2856  self.scene_stopping = true;
2857 
2858  if ( IsDefined( ‪_a_objects ) && !b_finished )
2859  {
2860  foreach ( o_obj in ‪_a_objects )
2861  {
2862  if ( isdefined( o_obj ) && ![[ o_obj ]]->in_a_different_scene() )
2863  {
2864  thread [[o_obj]]->stop( b_clear );
2865  }
2866  }
2867  }
2868 
2869  self thread ‪_stop_camera_anims();
2870 
2871  self.scene_stopped = true;
2872  self notify( "stopped", b_finished );
2873 
2875 
2876  ArrayRemoveValue( level.active_scenes[ ‪_str_name ], ‪_e_root );
2877 
2878  if ( level.active_scenes[ ‪_str_name ].size == 0 )
2879  {
2880  level.active_scenes[ ‪_str_name ] = undefined;
2881  }
2882 
2883  if ( isdefined( ‪_e_root ) )
2884  {
2885  ArrayRemoveValue( ‪_e_root.scenes, self );
2886 
2887  if ( ‪_e_root.scenes.size == 0 )
2888  {
2889  ‪_e_root.scenes = undefined;
2890  }
2891 
2892  ‪_e_root notify( "scene_done", ‪_str_notify_name );
2893  ‪_e_root.scene_played = true;
2894  }
2895  }
2896 
2897  if(‪IS_TRUE(‪_s.SpectateOnJoin))
2898  {
2899  level.scene_should_spectate_on_hot_join = undefined;
2900  }
2901 
2902  self thread ‪_release_object();
2903  }
2904 
2906  {
2907  // HACK: Make sure all the objects release their handle to the scene
2909  foreach ( o_obj in ‪_a_objects )
2910  {
2911  o_obj._o_bundle = undefined;
2912  }
2913  }
2914 
2916  {
2917  b_has_init_state = false;
2918 
2919  foreach ( o_scene_object in ‪_a_objects )
2920  {
2921  if ( [[o_scene_object]]->‪has_init_state() )
2922  {
2923  b_has_init_state = true;
2924  break;
2925  }
2926  }
2927 
2928  return b_has_init_state;
2929  }
2930 
2931  function ‪_call_state_funcs( str_state )
2932  {
2933  self endon( "stopped" );
2934 
2935  ‪wait_till_scene_ready( undefined, true );
2936 
2937  if ( str_state == "play" )
2938  {
2939  waittillframeend; // HACK: need to allow init callbacks to happen first if init and play happen on same frame
2940  }
2941 
2942  level notify( ‪_str_notify_name + "_" + str_state );
2943 
2944  if ( isdefined( level.scene_funcs ) && isdefined( level.scene_funcs[ ‪_str_notify_name ] ) && isdefined( level.scene_funcs[ ‪_str_notify_name ][ str_state ] ) )
2945  {
2946  ‪a_ents = ‪get_ents();
2947 
2948  foreach ( handler in level.scene_funcs[ ‪_str_notify_name ][ str_state ] )
2949  {
2950  func = handler[0];
2951  args = handler[1];
2952 
2953  switch ( args.size )
2954  {
2955  case 6:
2956  ‪_e_root thread [[ func ]]( ‪a_ents, args[0], args[1], args[2], args[3], args[4], args[5] );
2957  break;
2958  case 5:
2959  ‪_e_root thread [[ func ]]( ‪a_ents, args[0], args[1], args[2], args[3], args[4] );
2960  break;
2961  case 4:
2962  ‪_e_root thread [[ func ]]( ‪a_ents, args[0], args[1], args[2], args[3] );
2963  break;
2964  case 3:
2965  ‪_e_root thread [[ func ]]( ‪a_ents, args[0], args[1], args[2] );
2966  break;
2967  case 2:
2968  ‪_e_root thread [[ func ]]( ‪a_ents, args[0], args[1] );
2969  break;
2970  case 1:
2971  ‪_e_root thread [[ func ]]( ‪a_ents, args[0] );
2972  break;
2973  case 0:
2974  ‪_e_root thread [[ func ]]( ‪a_ents );
2975  break;
2976  default: AssertMsg( "Too many args passed to scene func." );
2977  }
2978  }
2979  }
2980  }
2981 
2982  function ‪get_ents()
2983  {
2984  ‪a_ents = [];
2985  foreach ( o_obj in ‪_a_objects )
2986  {
2987  ent = [[o_obj]]->get_ent();
2988 
2989  if ( isdefined( o_obj._s.name ) )
2990  {
2991  ‪a_ents[ o_obj._s.name ] = ent;
2992  }
2993  else
2994  {
2995  ‪ARRAY_ADD( ‪a_ents, ent );
2996  }
2997  }
2998 
2999  return ‪a_ents;
3000  }
3001 
3002  function ‪get_root()
3003  {
3004  return ‪_e_root;
3005  }
3006 
3007  function ‪get_align_ent()
3008  {
3009  e_align = ‪_e_root;
3010 
3011  if ( isdefined( ‪_s.aligntarget ) )
3012  {
3013  e_gdt_align = ‪scene::get_existing_ent( ‪_s.aligntarget, false, true );
3014 
3015  if ( isdefined( e_gdt_align ) )
3016  {
3017  e_align = e_gdt_align;
3018  }
3019 
3020  if ( !isdefined( e_gdt_align ) )
3021  {
3022  str_msg = "Align target '" + ‪STR( ‪_s.aligntarget ) + "' doesn't exist for scene.";
3023 
3024  if ( !‪warning( ‪_testing, str_msg ) )
3025  {
3026  ‪error( GetDvarInt( "scene_align_errors", 1 ), str_msg );
3027  }
3028  }
3029  }
3030  else if ( isdefined( ‪_e_root.e_scene_link ) )
3031  {
3032  e_align = ‪_e_root.e_scene_link;
3033  }
3034 
3035  return e_align;
3036  }
3037 
3039  {
3040  return ‪IS_TRUE( ‪_s.allowmultiple );
3041  }
3042 
3043  function ‪is_looping()
3044  {
3045  return ‪IS_TRUE( ‪_s.looping );
3046  }
3047 
3048  function ‪wait_till_scene_ready( o_exclude, b_ignore_streamer = false )
3049  {
3050  ‪a_objects = [];
3051 
3052  if ( isdefined( o_exclude ) )
3053  {
3054  ‪a_objects = array::exclude( ‪_a_objects, o_exclude );
3055  }
3056  else
3057  {
3059  }
3060 
3061  wait_till_objects_ready( ‪a_objects );
3062 
3063  if ( ‪_n_streamer_req != -1 )
3064  {
3065  if ( !b_ignore_streamer )
3066  {
3067  if ( isdefined( level.wait_for_streamer_hint_scenes ) )
3068  {
3069  if ( IsInArray( level.wait_for_streamer_hint_scenes, ‪_s.name ) )
3070  {
3071  if ( !‪is_skipping_scene() )
3072  {
3074  }
3075  }
3076  }
3077  }
3078  }
3079 
3080  ‪flagsys::set( "ready" );
3081 
3083  }
3084 
3085  function wait_till_objects_ready( &‪array )
3086  {
3087  do
3088  {
3089  recheck = false;
3090 
3091  foreach ( ent in ‪array )
3092  {
3093  if ( isdefined( ent ) && !ent ‪flagsys::get( "ready" ) )
3094  {
3095  ent ‪util::waittill_either( "death", "ready" );
3096  recheck = true;
3097  break;
3098  }
3099  }
3100  }
3101  while ( recheck );
3102  }
3103 
3105  {
3106  if ( !‪IS_TRUE( ‪_s.DontSync ) && isdefined(level.scene_sync_list) && IsArray(level.scene_sync_list[ ‪_n_request_time ]) )
3107  {
3108  // Wait for all scene objects that were requested to start on the same frame
3109  wait_till_objects_ready( level.scene_sync_list[ ‪_n_request_time ] );
3110  }
3111  }
3112 
3114  {
3115  a_obj = [];
3116 
3117  foreach ( obj in ‪_a_objects )
3118  {
3119  if ( obj._is_valid )
3120  {
3121  ‪ARRAY_ADD( a_obj, obj );
3122  }
3123  }
3124 
3125  return a_obj;
3126  }
3127 
3128  function ‪on_error()
3129  {
3130  ‪stop();
3131  }
3132 
3133  function ‪get_state()
3134  {
3135  return ‪_str_state;
3136  }
3137 
3139  {
3140  if( !‪IS_TRUE(‪_s.skip_scene) && !(‪_s ‪scene::is_igc()) )
3141  {
3142  foreach ( o_scene_object in ‪_a_objects )
3143  {
3144  if ( o_scene_object._is_valid && [[o_scene_object]]->is_shared_player())
3145  {
3146  b_shared_player = true;
3147  }
3148  }
3149 
3150  if(!isdefined(b_shared_player))
3151  {
3152  self notify("scene_skip_completed");
3153 
3154  return false;
3155  }
3156  }
3157 
3158  return true;
3159  }
3160 
3161  function ‪skip_scene( b_sequence )
3162  {
3163  if(‪IS_TRUE(b_sequence) && ‪IS_TRUE(‪_s.DisableSceneSkipping))
3164  {
3166  return;
3167  }
3168 
3169  if( !‪IS_TRUE(b_sequence) )
3170  {
3171  if(‪_str_state == "init")
3172  {
3173  while(‪_str_state == "init")
3174  {
3175  wait 0.05;
3176  }
3177  }
3178 
3180  {
3181  b_skip_fading = false;
3182  if(!‪IS_TRUE(b_skip_fading))
3183  {
3184  //Freeze player controls
3185  foreach(player in level.players)
3186  {
3187  player FreezeControls( true );
3188  }
3189 
3190  level.suspend_scene_skip_until_fade = true;
3191  level thread ‪lui::screen_fade( 1, 1, 0, "black", false, "scene_system" );
3192  wait 1;
3193  level.suspend_scene_skip_until_fade = undefined;
3194  }
3195 
3196  SetPauseWorld( false );
3197  }
3198 
3199  while(‪IS_TRUE(level.suspend_scene_skip_until_fade))
3200  {
3201  wait 0.05;
3202  }
3203  }
3204 
3205  if(isdefined( ‪_s.nextscenebundle ))
3206  {
3207  bNextSceneExist = true;
3208  }
3209  else
3210  {
3211  bNextSceneExist = false;
3212  }
3213 
3215 
3216  wait 0.05;
3217 
3218  ‪_call_state_funcs("skip_started");
3219 
3220  thread ‪_skip_scene();
3221 
3222  scene_skip_timeout = GetTime() + 4000;
3223 
3224  while( !‪IS_TRUE(self.scene_stopped) && GetTime() < scene_skip_timeout )
3225  {
3226  wait 0.05;
3227  }
3228 
3229  ‪_call_state_funcs("skip_completed");
3230  self notify("scene_skip_completed");
3231 
3232  if(!bNextSceneExist)
3233  {
3235  {
3236  if(isdefined(level.linked_scenes))
3237  {
3238  linked_scenes_timeout = GetTime() + 4000;
3239  while(level.linked_scenes.size > 0 && GetTime() < linked_scenes_timeout)
3240  {
3241  wait 0.05;
3242  }
3243  }
3244 
3246  }
3247  else if(‪IS_TRUE(self.skipping_scene))
3248  {
3249  self.skipping_scene = undefined;
3250 
3251  if(isdefined(level.linked_scenes))
3252  {
3253  //level.skipping_linked_scenes--;
3254  ArrayRemoveValue(level.linked_scenes, ‪_s.name );
3255  }
3256  }
3257  }
3258  else
3259  {
3261  {
3262  if( ‪_s ‪scene::is_igc() )
3263  {
3264  foreach(player in level.players)
3265  {
3266  player stopsounds();
3267  }
3268  }
3269  }
3270  }
3271  }
3272 
3273  function private ‪finish_skip_scene()
3274  {
3275  if(isdefined(level.player_skipping_scene))
3276  {
3277  //Send a notify to the client that the skipping is completed.
3278  foreach(player in level.players)
3279  {
3280  player ‪clientfield::increment_to_player( "player_scene_skip_completed" );
3281  player FreezeControls( false );
3282 
3283  //Stop sounds on the player
3284  player stopsounds();
3285  }
3286 
3287  self.b_player_scene = undefined;
3288  self.skipping_scene = undefined;
3289  level.player_skipping_scene = undefined;
3290  level.linked_scenes = undefined;
3292  level notify("scene_skip_sequence_ended");
3293 
3295 
3296  b_skip_fading = false;
3297  if ( !‪IS_TRUE( b_skip_fading ) )
3298  {
3299  if ( !‪IS_TRUE( level.level_ending ) )
3300  {
3301  level thread ‪lui::screen_fade( 1, 0, 1, "black", false, "scene_system" );
3302  }
3303  }
3304  }
3305  }
3306 
3307  function private ‪_skip_scene()
3308  {
3309  self endon( "stopped" );
3310 
3311  wait 0.05; //wait one frame to make sure all entities spawned since clientfields cannot be sent on the same spawn frame.
3312 
3313  //animations on clients
3314  foreach ( o_scene_object in ‪_a_objects )
3315  {
3316  if ( o_scene_object._is_valid )
3317  {
3318  [[o_scene_object]]->skip_scene_on_client();
3319  }
3320  }
3321 
3322  wait 0.05; //wait one frame to give the clients a chance to process their animations
3323 
3324  //animations on server
3325  foreach ( o_scene_object in ‪_a_objects )
3326  {
3327  if ( o_scene_object._is_valid )
3328  {
3329  [[o_scene_object]]->skip_scene_on_server();
3330  }
3331  }
3332 
3333  self notify( "skip_camera_anims" );
3334  }
3335 
3337  {
3338  if(isdefined(level.player_skipping_scene) && !‪IS_TRUE(‪_s.DisableSceneSkipping) && array::contains(level.linked_scenes, ‪_s.name))
3339  {
3340  return true;
3341  }
3342 
3343  return false;
3344  }
3345 
3346  function private ‪is_scene_shared_sequence()
3347  {
3348  return isdefined(level.shared_scene_sequence_started) && isdefined(‪_s.shared_scene_sequence);
3349  }
3350 
3351  function private ‪update_scene_sequence()
3352  {
3353  if(isdefined(‪_s.shared_scene_sequence))
3354  {
3355  if(isdefined(level.shared_scene_sequence_started))
3356  {
3357  level.shared_scene_sequence_name = ‪_s.name;
3358  }
3359  else
3360  {
3361  level.shared_scene_sequence_name = undefined;
3362  }
3363  }
3364  }
3365 
3366  function private ‪init_scene_sequence_started( b_started)
3367  {
3368  if(‪IS_TRUE(b_started))
3369  {
3371 
3372  if(isdefined(level.shared_scene_sequence_started))
3373  {
3374  return;
3375  }
3376 
3377  ‪_s.shared_scene_sequence = true;
3378 
3379  if(isdefined(‪_s.s_female_bundle))
3380  {
3381  ‪_s.s_female_bundle.shared_scene_sequence = ‪_s.shared_scene_sequence;
3382  }
3383 
3384  if ( IsString( ‪_s.nextscenebundle ) )
3385  {
3386  s_cur_bundle = ‪scene::get_scenedef( ‪_s.nextscenebundle );
3387  while( true )
3388  {
3389  s_cur_bundle.shared_scene_sequence = ‪_s.shared_scene_sequence;
3390 
3391  if(isdefined(s_cur_bundle.s_female_bundle))
3392  {
3393  s_cur_bundle.s_female_bundle.shared_scene_sequence = ‪_s.shared_scene_sequence;
3394  }
3395 
3396  if ( IsString( s_cur_bundle.nextscenebundle ) )
3397  {
3398  s_cur_bundle = ‪scene::get_scenedef( s_cur_bundle.nextscenebundle );
3399  }
3400  else
3401  {
3402  break;
3403  }
3404  }
3405  }
3406 
3407  level.shared_scene_sequence_started = true;
3409  level notify("scene_sequence_started");
3410  }
3411  else
3412  {
3413  if(!isdefined(level.shared_scene_sequence_started))
3414  {
3415  return;
3416  }
3417 
3418  if(isdefined(‪_s.shared_scene_sequence))
3419  {
3420  level.shared_scene_sequence_started = undefined;
3422  level notify("scene_sequence_ended", ‪_s.name);
3423  }
3424  }
3425  }
3426 
3427  function private ‪trigger_scene_sequence_started( scene_object, entity )
3428  {
3429  if(self === scene_object)
3430  {
3431  if(!‪is_skipping_scene())
3432  {
3434  }
3435 
3436  return;
3437  }
3438 
3439  if ( IsPlayer( entity ) )
3440  {
3441  if ( !‪IS_TRUE( ‪_s.DisableSceneSkipping ) && !‪is_skipping_scene())
3442  {
3443  if ( [[scene_object]]->is_shared_player() || (‪_s ‪scene::is_igc()) )
3444  {
3445  if(‪_str_state != "init" || (isdefined(scene_object._s.initanim) || isdefined(scene_object._s.initanimloop)))
3446  {
3448  }
3449  }
3450  }
3451  }
3452  }
3453 
3454  function ‪has_player()
3455  {
3456  foreach ( obj in ‪_a_objects )
3457  {
3458  if ( ‪IS_EQUAL( obj._s.type, "player" ) )
3459  {
3460  return true;
3461  }
3462  }
3463 
3464  return false;
3465  }
3466 }
3467 
3469 // _ __ __ _ ___ ___ _ _ ___ ___ ___ ___ ___ ___ _ _ ___ ___ ___ _ ___ ___ _____
3470 // /_\ \ \ / / /_\ | _ \ | __| | \| | | __| / __| / __| / __| / __| | __| | \| | | __| / _ \ | _ ) _ | | | __| / __| |_ _|
3471 // / _ \ \ \/\/ / / _ \ | / | _| | .` | | _| \__ \ \__ \ \__ \ | (__ | _| | .` | | _| | (_) | | _ \ | || | | _| | (__ | |
3472 // /_/ \_\ \_/\_/ /_/ \_\ |_|_\ |___| |_|\_| |___| |___/ |___/ |___/ \___| |___| |_|\_| |___| \___/ |___/ \__/ |___| \___| |_|
3473 //
3475 
3477 {
3478  function ‪play( str_alert_state )
3479  {
3480  ‪NEW_STATE( "play" );
3481 
3482  switch ( str_alert_state )
3483  {
3484  case "low_alert":
3485  ‪log( "LOW ALERT" );
3486  if ( isdefined( ‪_s.LowAlertAnim ) )
3487  {
3488  ‪_str_death_anim = ‪_s.LowAlertAnimDeath;
3489  ‪_str_death_anim_loop = ‪_s.LowAlertAnimDeathLoop;
3490 
3491  ‪_play_anim( ‪_s.LowAlertAnim );
3492  }
3493  break;
3494  case "high_alert":
3495  ‪log( "HIGH ALERT" );
3496  if ( isdefined( ‪_s.HighAlertAnim ) )
3497  {
3498  ‪_str_death_anim = ‪_s.HighAlertAnimDeath;
3499  ‪_str_death_anim_loop = ‪_s.HighAlertAnimDeathLoop;
3500 
3501  ‪_play_anim( ‪_s.HighAlertAnim );
3502  }
3503  break;
3504  case "combat":
3505  ‪log( "COMBAT ALERT" );
3506  if ( isdefined( ‪_s.CombatAlertAnim ) )
3507  {
3508  ‪_str_death_anim = ‪_s.CombatAlertAnimDeath;
3509  ‪_str_death_anim_loop = ‪_s.CombatAlertAnimDeathLoop;
3510 
3511  ‪_play_anim( ‪_s.CombatAlertAnim );
3512  }
3513  break;
3514  default: ‪error( 1, "Unsupported alert state" );
3515  }
3516 
3517  thread ‪finish();
3518  }
3519 
3520  function ‪_prepare()
3521  {
3522  if ( ‪cSceneObject::_prepare() )
3523  {
3524  if ( IsAI( ‪_e ) )
3525  {
3527  }
3528  }
3529  }
3530 
3532  {
3533  self endon( "play" );
3534  self endon( "done" );
3535 
3536  ‪_e waittill( "alert", str_alert_state );
3537 
3538  thread [[‪scene()]]->play( str_alert_state );
3539  }
3540 }
3541 
3543 // _ __ __ _ ___ ___ _ _ ___ ___ ___ ___ ___ ___ _ _ ___
3544 // /_\ \ \ / / /_\ | _ \ | __| | \| | | __| / __| / __| / __| / __| | __| | \| | | __|
3545 // / _ \ \ \/\/ / / _ \ | / | _| | .` | | _| \__ \ \__ \ \__ \ | (__ | _| | .` | | _|
3546 // /_/ \_\ \_/\_/ /_/ \_\ |_|_\ |___| |_|\_| |___| |___/ |___/ |___/ \___| |___| |_|\_| |___|
3547 //
3549 
3550 class cAwarenessScene : cScene
3551 {
3552  function ‪new_object()
3553  {
3554  return new ‪cAwarenessSceneObject();
3555  }
3556 
3557  function ‪init( str_scenedef, s_scenedef, e_align, ‪a_ents, b_test_run )
3558  {
3559  ‪cScene::init( str_scenedef, s_scenedef, e_align, ‪a_ents, b_test_run );
3560  }
3561 
3562  function ‪play( str_awareness_state = "low_alert" )
3563  {
3564  self notify( "new_state" );
3565  self endon( "new_state" );
3566 
3567  if ( ‪get_valid_objects().size > 0 )
3568  {
3569  foreach ( o_obj in ‪_a_objects )
3570  {
3571  thread [[o_obj]]->play( str_awareness_state );
3572  }
3573 
3574  level ‪flagsys::set( ‪_str_name + "_playing" );
3575  ‪_str_state = "play";
3576 
3578 
3579  thread ‪_call_state_funcs( str_awareness_state );
3580 
3581  array::flagsys_wait_any_flag( ‪_a_objects, "done", "main_done" );
3582 
3583  if ( ‪is_looping() )
3584  {
3585  if ( ‪has_init_state() )
3586  {
3587  // TODO: do this on return to unaware?
3588  //level flagsys::clear( _str_name + "_playing" );
3589  //thread initialize();
3590  }
3591  }
3592  else
3593  {
3594  thread ‪stop();
3595  }
3596  }
3597  else
3598  {
3599  thread ‪stop( false, true );
3600  }
3601  }
3602 }
3603 
3605 // _ _ ___ _ ___ ___ ___ ___
3606 // | || | | __| | | | _ \ | __| | _ \ / __|
3607 // | __ | | _| | |__ | _/ | _| | / \__ \
3608 // |_||_| |___| |____| |_| |___| |_|_\ |___/
3609 //
3611 
3612 function ‪get_existing_ent( str_name, b_spawner_only = false, b_nodes_and_structs = false )
3613 {
3614  e = undefined;
3615 
3616  if ( b_spawner_only )
3617  {
3618  e_array = GetSpawnerArray( str_name, "script_animname" ); // a spawner exists with script_animname
3619  if ( e_array.size == 0 )
3620  {
3621  e_array = GetSpawnerArray( str_name, "targetname" ); // lastly grab any ent with targetname
3622  }
3623 
3624  Assert( e_array.size <= 1, "Multiple spawners found." );
3625 
3626  foreach ( ent in e_array )
3627  {
3628  if ( !isdefined( ent.isDying ) )
3629  {
3630  e = ent;
3631  break;
3632  }
3633  }
3634  }
3635  else
3636  {
3637  e = GetEnt( str_name, "animname", false ); // entity already exists
3638  if ( !‪is_valid_ent( e ) )
3639  {
3640  e = GetEnt( str_name, "script_animname" ); // a spawner exists with script_animname
3641  if ( !‪is_valid_ent( e ) )
3642  {
3643  e = GetEnt( str_name + "_ai", "targetname", true ); // any already spawned AI
3644  if ( !‪is_valid_ent( e ) )
3645  {
3646  e = GetEnt( str_name + "_vh", "targetname", true ); // any already spawned vehicles
3647  if ( !‪is_valid_ent( e ) )
3648  {
3649  e = GetEnt( str_name, "targetname", true ); // any spawned ents that don't have a targetname suffix
3650  if ( !‪is_valid_ent( e ) )
3651  {
3652  e = GetEnt( str_name, "targetname" ); // lastly grab any ent with targetname
3653  if ( !‪is_valid_ent( e ) && b_nodes_and_structs )
3654  {
3655  e = GetNode( str_name, "targetname" ); // if no ent, grab node with targetname
3656  if ( !‪is_valid_ent( e ) )
3657  {
3658  e = ‪struct::get( str_name, "targetname" ); // if no node, grab struct with targetname
3659  }
3660  }
3661  }
3662  }
3663  }
3664  }
3665  }
3666  }
3667 
3668  if ( !‪is_valid_ent( e ) )
3669  {
3670  e = undefined;
3671  }
3672 
3673  return e;
3674 }
3675 
3676 function ‪is_valid_ent( ent )
3677 {
3678  return ( isdefined( ent ) && ( ( !isdefined( ent.isDying ) && !ent ‪ai::is_dead_sentient() ) || self._s.IgnoreAliveCheck === true ) );
3679 }
3680 
3682 {
3683  self endon( "death" );
3684 
3685  self.isDying = true;
3686 
3687  if ( isdefined( self.targetname ) )
3688  {
3689  self.targetname = self.targetname + "_sync_deleting";
3690  }
3691 
3692  if ( isdefined( self.animname ) )
3693  {
3694  self.animname = self.animname + "_sync_deleting";
3695  }
3696 
3697  if ( isdefined( self.script_animname ) )
3698  {
3699  self.script_animname = self.script_animname + "_sync_deleting";
3700  }
3701 
3702  if(!IsPlayer(self))
3703  {
3704  SetHideonClientWhenScriptedAnimCompleted( self );
3705  self StopAnimScripted();
3706  }
3707  else
3708  {
3710  self Ghost();
3711  }
3712 
3713  self NotSolid();
3714 
3715  if(isAlive(self))
3716  {
3717  if(isSentient( self ))
3718  {
3719  self.ignoreall = true;
3720  }
3721 
3722  if(IsActor(self))
3723  {
3724  self PathMode("dont move");
3725  }
3726  }
3727 
3728  wait 1; //this will make the server wait until the client syned the transition to the next shot
3729 
3730  self delete();
3731 }
3732 
3734 // _ _ _____ ___ _ ___ _____ __ __
3735 // | | | | |_ _| |_ _| | | |_ _| |_ _| \ \ / /
3736 // | |_| | | | | | | |__ | | | | \ V /
3737 // \___/ |_| |___| |____| |___| |_| |_|
3738 //
3740 
3741 ‪REGISTER_SYSTEM_EX( "scene", &‪__init__, &‪__main__, undefined )
3742 
3743 function ‪__init__()
3744 {
3745  /* INIT SYSTEM VARS */
3746 
3747  level.scene_object_id = 0;
3748  level.active_scenes = [];
3749  level.sceneSkippedCount = 0;
3750  level.wait_for_streamer_hint_scenes = [];
3751  streamerRequest( "clear" );
3752 
3753  foreach ( s_scenedef in ‪struct::get_script_bundles( "scene" ) )
3754  {
3755  s_scenedef.editaction = undefined; // only used in the asset editor
3756  s_scenedef.newobject = undefined; // only used in the asset editor
3757 
3758  if ( IsString( s_scenedef.FemaleBundle ) )
3759  {
3760  // Set the MaleBundle attribute of female bundles so they know which male bundle they are associated with
3761  s_female_bundle = ‪struct::get_script_bundle( "scene", s_scenedef.FemaleBundle );
3762  s_female_bundle.MaleBundle = s_scenedef.name;
3763 
3764  s_scenedef.s_female_bundle = s_female_bundle;
3765  s_female_bundle.s_male_bundle = s_scenedef;
3766  }
3767 
3768  if ( IsString( s_scenedef.NextSceneBundle ) )
3769  {
3770 
3771  foreach ( i, s_object in s_scenedef.objects )
3772  {
3773  // Disable transition fx between shots in chained bundles
3774  if ( ‪IS_EQUAL( s_object.type, "player" ) )
3775  {
3776  s_object.DisableTransitionOut = true;
3777  }
3778  }
3779 
3780  s_next_bundle = ‪struct::get_script_bundle( "scene", s_scenedef.NextSceneBundle );
3781 
3782  s_next_bundle.DontSync = true;
3783 
3784  foreach ( i, s_object in s_next_bundle.objects )
3785  {
3786  // Disable transition fx between shots in chained bundles
3787  if ( ‪IS_EQUAL( s_object.type, "player" ) )
3788  {
3789  s_object.DisableTransitionIn = true;
3790  }
3791 
3792  //let he next scene know that it is a isCutScene (a scene was played before it);
3793  s_object.isCutScene = true;
3794  }
3795 
3796  // Do the same for the female bundle if one exists
3797 
3798  if ( isdefined( s_next_bundle.FemaleBundle ) )
3799  {
3800  s_next_female_bundle = ‪struct::get_script_bundle( "scene", s_next_bundle.FemaleBundle );
3801 
3802  if ( isdefined( s_next_female_bundle ) )
3803  {
3804  s_next_female_bundle.DontSync = true;
3805 
3806  foreach ( i, s_object in s_next_female_bundle.objects )
3807  {
3808  // Disable transition fx between shots in chained bundles
3809  if ( ‪IS_EQUAL( s_object.type, "player" ) )
3810  {
3811  s_object.DisableTransitionIn = true;
3812  }
3813 
3814  //let he next scene know that it is a isCutScene (a scene was played before it);
3815  s_object.isCutScene = true;
3816  }
3817  }
3818  }
3819  }
3820 
3821  // if this bundle has a streamer hint then loop through the next bundles
3822  // and give them the same streamer hint
3823  if ( IsString( s_scenedef.streamerHint ) )
3824  {
3825  s_cur_bundle = s_scenedef;
3826  while( true )
3827  {
3828  s_cur_bundle._endStreamerHint = s_scenedef.streamerHint;
3829  if ( IsString( s_cur_bundle.NextSceneBundle ) )
3830  {
3831  s_cur_bundle = ‪struct::get_script_bundle( "scene", s_cur_bundle.NextSceneBundle );
3832  }
3833  else
3834  {
3835  break;
3836  }
3837  }
3838  }
3839 
3840  foreach ( i, s_object in s_scenedef.objects )
3841  {
3842  if ( ‪IS_EQUAL( s_object.type, "player" ) )
3843  {
3844  ‪DEFAULT( s_object.cameratween, 0 );
3845 
3846  if ( isdefined( s_object.player ) )
3847  {
3848  s_object.player--; // adjust for zero-based level.players index
3849  }
3850  else
3851  {
3852  s_object.player = 0;
3853  }
3854 
3855  s_object.name = "player " + ( s_object.player + 1 );
3856  s_object.NewPlayerMethod = true; // Fully switching over to new method, no longer supporting ol-style player linkto method
3857  }
3858  else
3859  {
3860  s_object.player = undefined;
3861  }
3862  }
3863 
3864  if ( s_scenedef.vmtype == "both" && !s_scenedef ‪is_igc() )
3865  {
3866  n_clientbits = GetMinBitCountForNum( 3 );
3867 
3868  ‪clientfield::register( "world", s_scenedef.name, ‪VERSION_SHIP, n_clientbits, "int" );
3869  }
3870  }
3871 
3872  ‪clientfield::register( "toplayer", "postfx_igc", ‪VERSION_SHIP, 2, "counter" );
3873  ‪clientfield::register( "world", "in_igc", ‪VERSION_SHIP, 4, "int" );
3874 
3875  ‪clientfield::register( "toplayer", "player_scene_skip_completed", ‪VERSION_SHIP, 2, "counter" );
3876 
3877  ‪clientfield::register( "allplayers", "player_scene_animation_skip", ‪VERSION_SHIP, 2, "counter" );
3878  ‪clientfield::register( "actor", "player_scene_animation_skip", ‪VERSION_SHIP, 2, "counter" );
3879  ‪clientfield::register( "vehicle", "player_scene_animation_skip", ‪VERSION_SHIP, 2, "counter" );
3880  ‪clientfield::register( "scriptmover", "player_scene_animation_skip", ‪VERSION_SHIP, 2, "counter" );
3881 
3884 }
3885 
3886 function ‪remove_invalid_scene_objects( s_scenedef )
3887 {
3888  a_invalid_object_indexes = [];
3889 
3890  foreach ( i, s_object in s_scenedef.objects )
3891  {
3892  if ( !isdefined( s_object.name ) && !isdefined( s_object.model ) && !‪IS_EQUAL( s_object.type, "player" ) )
3893  {
3894  ‪ARRAY_ADD( a_invalid_object_indexes, i );
3895  }
3896  }
3897 
3898  for ( i = a_invalid_object_indexes.size - 1; i >= 0 ; i-- )
3899  {
3900  ArrayRemoveIndex( s_scenedef.objects, a_invalid_object_indexes[i] );
3901  }
3902 
3903  return s_scenedef;
3904 }
3905 
3906 function ‪__main__()
3907 {
3908  /* RUN INSTANCES */
3909 
3910  a_instances = ArrayCombine(
3911  ‪struct::get_array( "scriptbundle_scene", "classname" ),
3912  ‪struct::get_array( "scriptbundle_fxanim", "classname" ),
3913  false, false
3914  );
3915 
3916  foreach ( s_instance in a_instances )
3917  {
3918  if ( isdefined( s_instance.linkto ) )
3919  {
3920  s_instance thread ‪_scene_link();
3921  }
3922 
3923  if ( isdefined( s_instance.script_flag_set ) )
3924  {
3925  level ‪flag::init( s_instance.script_flag_set );
3926  }
3927 
3928  if ( isdefined( s_instance.scriptgroup_initscenes ) )
3929  {
3930  foreach ( trig in GetEntArray( s_instance.scriptgroup_initscenes, "scriptgroup_initscenes" ) )
3931  {
3932  s_instance thread ‪_trigger_init( trig );
3933  }
3934  }
3935 
3936  if ( isdefined( s_instance.scriptgroup_playscenes ) )
3937  {
3938  foreach ( trig in GetEntArray( s_instance.scriptgroup_playscenes, "scriptgroup_playscenes" ) )
3939  {
3940  s_instance thread ‪_trigger_play( trig );
3941  }
3942  }
3943 
3944  if ( isdefined( s_instance.scriptgroup_stopscenes ) )
3945  {
3946  foreach ( trig in GetEntArray( s_instance.scriptgroup_stopscenes, "scriptgroup_stopscenes" ) )
3947  {
3948  s_instance thread ‪_trigger_stop( trig );
3949  }
3950  }
3951  }
3952 
3953  level thread ‪on_load_wait();
3954  level thread ‪run_instances();
3955 }
3956 
3957 function private ‪_scene_link()
3958 {
3959  self.e_scene_link = ‪util::spawn_model( "tag_origin", self.origin, self.angles );
3960 
3961  e_linkto = GetEnt( self.linkto, "linkname" );
3962  self.e_scene_link LinkTo( e_linkto );
3963 
3964  ‪util::waittill_any_ents_two( self, "death", e_linkto, "death" ); // Delete link ent when either the scene root entity dies or the entity that it's linked to
3965 
3966  self.e_scene_link Delete();
3967 }
3968 
3970 {
3971  // wait for client script so "both" type scenes will work properly on load.
3974  level ‪flagsys::set( "scene_on_load_wait" );
3975 }
3976 
3978 {
3979  foreach ( s_instance in ‪struct::get_script_bundle_instances( "scene" ) )
3980  {
3981  if ( ‪SPAWNFLAG( s_instance, ‪SPAWNFLAG_SCRIPTBUNDLE_PLAY ) )
3982  {
3983  s_instance thread ‪play();
3984  }
3985  else if ( ‪SPAWNFLAG( s_instance, ‪SPAWNFLAG_SCRIPTBUNDLE_INIT ) )
3986  {
3987  s_instance thread ‪init();
3988  }
3989  }
3990 }
3991 
3992 function ‪_trigger_init( trig )
3993 {
3994  trig endon( "death" );
3995 
3996  trig ‪trigger::wait_till();
3997 
3998  ‪a_ents = [];
3999  if ( ‪get_player_count( self.scriptbundlename ) > 0 )
4000  {
4001  if ( IsPlayer( trig.who ) )
4002  {
4003  ‪a_ents[ 0 ] = trig.who;
4004  }
4005  }
4006 
4007  self thread ‪_init_instance( undefined, ‪a_ents );
4008 }
4009 
4010 function ‪_trigger_play( trig )
4011 {
4012  trig endon( "death" );
4013 
4014  do
4015  {
4016  trig ‪trigger::wait_till();
4017 
4018  ‪a_ents = [];
4019  if ( ‪get_player_count( self.scriptbundlename ) > 0 )
4020  {
4021  if ( IsPlayer( trig.who ) )
4022  {
4023  ‪a_ents[ 0 ] = trig.who;
4024  }
4025  }
4026 
4027  self thread ‪play( ‪a_ents );
4028  }
4029  while ( ‪IS_TRUE( ‪get_scenedef( self.scriptbundlename ).looping ) );
4030 }
4031 
4032 function ‪_trigger_stop( trig )
4033 {
4034  trig endon( "death" );
4035  trig ‪trigger::wait_till();
4036  self thread ‪stop();
4037 }
4038 
4052 function ‪add_scene_func( str_scenedef, func, str_state = "play", ... )
4053 {
4054  /#
4055  Assert( isdefined( ‪get_scenedef( str_scenedef ) ), "Trying to add a scene function for scene '" + str_scenedef + "' that doesn't exist." );
4056  #/
4057 
4058  ‪DEFAULT( level.scene_funcs, [] );
4059  ‪DEFAULT( level.scene_funcs[ str_scenedef ], [] );
4060  ‪DEFAULT( level.scene_funcs[ str_scenedef ][ str_state ], [] );
4061 
4062  ‪array::add( level.scene_funcs[ str_scenedef ][ str_state ], Array( func, vararg ), false );
4063 }
4064 
4078 function ‪remove_scene_func( str_scenedef, func, str_state = "play" )
4079 {
4080  /#
4081  Assert( isdefined( ‪get_scenedef( str_scenedef ) ), "Trying to remove a scene function for scene '" + str_scenedef + "' that doesn't exist." );
4082  #/
4083 
4084  ‪DEFAULT( level.scene_funcs, [] );
4085 
4086  if ( isdefined( level.scene_funcs[ str_scenedef ] ) && isdefined( level.scene_funcs[ str_scenedef ][ str_state ] ) )
4087  {
4088  for ( i = level.scene_funcs[ str_scenedef ][ str_state ].size - 1; i >= 0; i-- )
4089  {
4090  if ( level.scene_funcs[ str_scenedef ][ str_state ][ i ][ 0 ] == func )
4091  {
4092  ArrayRemoveIndex( level.scene_funcs[ str_scenedef ][ str_state ], i );
4093  }
4094  }
4095  }
4096 }
4097 
4098 function ‪get_scenedef( str_scenedef )
4099 {
4100  return ‪struct::get_script_bundle( "scene", str_scenedef );
4101 }
4102 
4103 function ‪get_scenedefs( str_type = "scene" )
4104 {
4105  a_scenedefs = [];
4106 
4107  foreach ( s_scenedef in ‪struct::get_script_bundles( "scene" ) )
4108  {
4109  if ( s_scenedef.sceneType == str_type )
4110  {
4111  ‪ARRAY_ADD( a_scenedefs, s_scenedef );
4112  }
4113  }
4114 
4115  return a_scenedefs;
4116 }
4117 
4141 function ‪spawn( arg1, arg2, arg3, arg4, b_test_run )
4142 {
4143  str_scenedef = arg1;
4144 
4145  Assert( isdefined( str_scenedef ), "Cannot create a scene without a scene def." );
4146 
4147  if ( IsVec( arg2 ) )
4148  {
4149  v_origin = arg2;
4150  v_angles = arg3;
4151  ‪a_ents = arg4;
4152  }
4153  else // overloaded the params so you can put them in different orders
4154  {
4155  ‪a_ents = arg2;
4156  v_origin = arg3;
4157  v_angles = arg4;
4158  }
4159 
4160  s_instance = SpawnStruct();
4161  s_instance.origin = ( isdefined( v_origin ) ? v_origin : (0, 0, 0) );
4162  s_instance.angles = ( isdefined( v_angles ) ? v_angles : (0, 0, 0) );
4163  s_instance.classname = "scriptbundle_scene";
4164  s_instance.scriptbundlename = str_scenedef;
4165  s_instance ‪struct::init();
4166 
4167  s_instance ‪scene::init( str_scenedef, ‪a_ents, undefined, b_test_run );
4168 
4169  return s_instance;
4170 }
4171 
4206 function ‪init( arg1, arg2, arg3, b_test_run )
4207 {
4208  if ( self == level )
4209  {
4210  if ( IsString( arg1 ) )
4211  {
4212  if ( IsString( arg2 ) )
4213  {
4214  str_value = arg1;
4215  str_key = arg2;
4216  ‪a_ents = arg3;
4217  }
4218  else
4219  {
4220  str_value = arg1;
4221  ‪a_ents = arg2;
4222  }
4223 
4224  if ( isdefined( str_key ) )
4225  {
4226  a_instances = ‪struct::get_array( str_value, str_key );
4227 
4228  /#
4229  Assert( a_instances.size, "No scene instances with KVP '" + str_key + "'/'" + str_value + "'." );
4230  #/
4231  }
4232  else
4233  {
4234  a_instances = ‪struct::get_array( str_value, "targetname" );
4235  if ( !a_instances.size )
4236  {
4237  a_instances = ‪struct::get_array( str_value, "scriptbundlename" );
4238  }
4239  }
4240 
4241  if ( !a_instances.size )
4242  {
4243  ‪_init_instance( str_value, ‪a_ents, b_test_run );
4244  }
4245  else
4246  {
4247  foreach ( s_instance in a_instances )
4248  {
4249  if ( isdefined( s_instance ) )
4250  {
4251  s_instance thread ‪_init_instance( undefined, ‪a_ents, b_test_run );
4252  }
4253  }
4254  }
4255  }
4256  }
4257  else
4258  {
4259  if ( IsString( arg1 ) )
4260  {
4261  ‪_init_instance( arg1, arg2, b_test_run );
4262  }
4263  else
4264  {
4265  ‪_init_instance( arg2, arg1, b_test_run );
4266  }
4267 
4268  return self;
4269  }
4270 }
4271 
4272 function ‪_init_instance( str_scenedef, ‪a_ents, b_test_run = false )
4273 {
4274  level ‪flagsys::wait_till( "scene_on_load_wait" );
4275 
4276  ‪DEFAULT( str_scenedef, self.scriptbundlename );
4277 
4278  s_bundle = ‪get_scenedef( str_scenedef );
4279 
4280  /#
4281 
4282  Assert( isdefined( str_scenedef ), "Scene at (" + ( isdefined( self.origin ) ? self.origin : "level" ) + ") is missing its scene def." );
4283  Assert( isdefined( s_bundle ), "Scene at (" + ( isdefined( self.origin ) ? self.origin : "level" ) + ") is using a scene name '" + str_scenedef + "' that doesn't exist." );
4284 
4285  #/
4286 
4287  o_scene = ‪get_active_scene( str_scenedef );
4288 
4289  if ( !isdefined( o_scene ) )
4290  {
4291  if ( s_bundle.scenetype == "awareness" )
4292  {
4293  o_scene = new cAwarenessScene();
4294  }
4295  else
4296  {
4297  o_scene = new cScene();
4298  }
4299 
4300  s_bundle = ‪_load_female_scene( s_bundle, ‪a_ents );
4301 
4302  [[o_scene]]->init( s_bundle.name, s_bundle, self, ‪a_ents, b_test_run );
4303  }
4304  else
4305  {
4306  thread [[o_scene]]->initialize( ‪a_ents, true );
4307  }
4308 
4309  return o_scene;
4310 }
4311 
4312 function private ‪_load_female_scene( s_bundle, ‪a_ents )
4313 {
4314  /* Check if this bundle has a player object */
4315 
4316  b_has_player = false;
4317  foreach ( s_object in s_bundle.objects )
4318  {
4319  if ( !isDefined( s_object ) )
4320  continue;
4321 
4322  if ( ‪IS_EQUAL( s_object.type, "player" ) )
4323  {
4324  b_has_player = true;
4325  break;
4326  }
4327  }
4328 
4329  /* Check if if a player was passed in to use for the scene */
4330 
4331  if ( b_has_player )
4332  {
4333  e_player = undefined;
4334  if ( IsPlayer( ‪a_ents ) )
4335  {
4336  e_player = ‪a_ents;
4337  }
4338  else if ( IsArray( ‪a_ents ) )
4339  {
4340  foreach ( ent in ‪a_ents )
4341  {
4342  if ( IsPlayer( ent ) )
4343  {
4344  e_player = ent;
4345  break;
4346  }
4347  }
4348  }
4349 
4350  /* Default to first player none are passed in */
4351 
4352  if ( !isdefined( e_player ) )
4353  {
4354  e_player = level.activeplayers[0];
4355  }
4356 
4357  if ( IsPlayer( e_player ) && e_player ‪util::is_female() )
4358  {
4359  if ( isdefined( s_bundle.FemaleBundle ) )
4360  {
4361  s_female_bundle = ‪struct::get_script_bundle( "scene", s_bundle.FemaleBundle );
4362  if ( isdefined( s_female_bundle ) )
4363  {
4364  return s_female_bundle;
4365  }
4366  }
4367  }
4368  }
4369 
4370  return s_bundle;
4371 }
4372 
4407 function ‪play( arg1, arg2, arg3, b_test_run = false, str_state, str_mode = "" )
4408 {
4409  if(isdefined(arg1) && IsString(arg1) && arg1 == "p7_fxanim_zm_castle_rocket_bell_tower_bundle")
4410  {
4411  arg1 = arg1;
4412  }
4413 
4414 
4415  s_tracker = SpawnStruct();
4416  s_tracker.n_scene_count = 1;
4417 
4418  if ( self == level )
4419  {
4420  if ( IsString( arg1 ) )
4421  {
4422  if ( IsString( arg2 ) )
4423  {
4424  str_value = arg1;
4425  str_key = arg2;
4426  ‪a_ents = arg3;
4427  }
4428  else
4429  {
4430  str_value = arg1;
4431  ‪a_ents = arg2;
4432  }
4433 
4434  str_scenedef = str_value;
4435 
4436  if ( isdefined( str_key ) )
4437  {
4438  a_instances = ‪struct::get_array( str_value, str_key );
4439 
4440  str_scenedef = undefined; // use struct scenedef
4441 
4442  /#
4443  Assert( a_instances.size, "No scene instances with KVP '" + str_key + "'/'" + str_value + "'." );
4444  #/
4445  }
4446  else
4447  {
4448  a_instances = ‪struct::get_array( str_value, "targetname" );
4449  if ( !a_instances.size )
4450  {
4451  a_instances = ‪struct::get_array( str_value, "scriptbundlename" );
4452  }
4453  else
4454  {
4455  str_scenedef = undefined; // use struct scenedef
4456  }
4457  }
4458 
4459  if ( isdefined( str_scenedef ) )
4460  {
4461  a_active_instances = ‪get_active_scenes( str_scenedef );
4462  a_instances = ArrayCombine( a_active_instances, a_instances, false, false );
4463  }
4464 
4465  if ( !a_instances.size )
4466  {
4467  self thread ‪_play_instance( s_tracker, str_scenedef, ‪a_ents, b_test_run, undefined, str_mode );
4468  }
4469  else
4470  {
4471  s_tracker.n_scene_count = a_instances.size;
4472 
4473  foreach ( s_instance in a_instances )
4474  {
4475  if ( isdefined( s_instance ) )
4476  {
4477  s_instance thread ‪_play_instance( s_tracker, str_scenedef, ‪a_ents, b_test_run, str_state, str_mode );
4478  }
4479  }
4480  }
4481  }
4482  }
4483  else
4484  {
4485  if ( IsString( arg1 ) )
4486  {
4487  self thread ‪_play_instance( s_tracker, arg1, arg2, b_test_run, str_state, str_mode );
4488  }
4489  else
4490  {
4491  self thread ‪_play_instance( s_tracker, arg2, arg1, b_test_run, str_state, str_mode );
4492  }
4493  }
4494 
4495  for ( i = 0; i < s_tracker.n_scene_count; i++ )
4496  {
4497  s_tracker waittill( "scene_done" );
4498  }
4499 }
4500 
4501 function ‪_play_instance( s_tracker, str_scenedef, ‪a_ents, b_test_run = false, str_state, str_mode )
4502 {
4503  ‪DEFAULT( str_scenedef, self.scriptbundlename );
4504 
4505  if ( self.scriptbundlename === str_scenedef ) // Radiant placed scene, only play once unless specified to play more than once
4506  {
4507  if ( !‪IS_TRUE( self.script_play_multiple ) )
4508  {
4509  if ( ‪IS_TRUE( self.scene_played ) && !b_test_run )
4510  {
4511  waittillframeend;
4512  while ( ‪is_playing( str_scenedef ) )
4513  {
4515  }
4516 
4517  s_tracker notify( "scene_done" );
4518  return;
4519  }
4520  }
4521 
4522  self.scene_played = true;
4523  }
4524 
4525  o_scene = ‪_init_instance( str_scenedef, ‪a_ents, b_test_run );
4526 
4527  if ( IsDefined(o_scene) )
4528  {
4529 
4530  if( (!isdefined(str_mode) || str_mode == "") && [[o_scene]]->‪should_skip_linked_to_players_scene() )
4531  {
4532  ‪skip_scene( o_scene._s.name, false, false, true);
4533  }
4534 
4535  thread [[o_scene]]->play( str_state, ‪a_ents, b_test_run, str_mode );
4536  }
4537 
4538  self waittillmatch( "scene_done", str_scenedef );
4539 
4540  if ( isdefined( self ) )
4541  {
4542  if ( isdefined( self.scriptbundlename ) && ‪IS_TRUE( ‪get_scenedef( self.scriptbundlename ).looping ) )
4543  {
4544  self.scene_played = false;
4545  }
4546 
4547  if ( isdefined( self.script_flag_set ) )
4548  {
4549  level ‪flag::set( self.script_flag_set );
4550  }
4551  }
4552 
4553  s_tracker notify( "scene_done" );
4554 }
4555 
4563 function ‪skipto_end( arg1, arg2, arg3, n_time, b_include_players = false )
4564 {
4565  str_mode = "skipto";
4566 
4567  if ( !b_include_players )
4568  {
4569  str_mode += "_noplayers";
4570  }
4571 
4572  if ( isdefined( n_time ) )
4573  {
4574  str_mode += ":" + n_time;
4575  }
4576 
4577  ‪play( arg1, arg2, arg3, false, undefined, str_mode );
4578 }
4579 
4587 function ‪skipto_end_noai( arg1, arg2, arg3, n_time )
4588 {
4589  str_mode = "skipto_noai_noplayers";
4590  if ( isdefined( n_time ) )
4591  {
4592  str_mode += ":" + n_time;
4593  }
4594 
4595  ‪play( arg1, arg2, arg3, false, undefined, str_mode );
4596 }
4597 
4632 function ‪stop( arg1, arg2, arg3 )
4633 {
4634  if ( self == level )
4635  {
4636  if ( IsString( arg1 ) )
4637  {
4638  if ( IsString( arg2 ) )
4639  {
4640  str_value = arg1;
4641  str_key = arg2;
4642  b_clear = arg3;
4643  }
4644  else
4645  {
4646  str_value = arg1;
4647  b_clear = arg2;
4648  }
4649 
4650  if ( isdefined( str_key ) )
4651  {
4652  a_instances = ‪struct::get_array( str_value, str_key );
4653 
4654  /#
4655  Assert( a_instances.size, "No scene instances with KVP '" + str_key + "'/'" + str_value + "'." );
4656  #/
4657 
4658  str_value = undefined;
4659  }
4660  else
4661  {
4662  a_instances = ‪struct::get_array( str_value, "targetname" );
4663  if ( !a_instances.size )
4664  {
4665  a_instances = ‪get_active_scenes( str_value );
4666  }
4667  else
4668  {
4669  str_value = undefined;
4670  }
4671  }
4672 
4673  foreach ( s_instance in ArrayCopy( a_instances ) )
4674  {
4675  if ( isdefined( s_instance ) )
4676  {
4677  s_instance ‪_stop_instance( b_clear, str_value );
4678  }
4679  }
4680  }
4681  }
4682  else
4683  {
4684  if ( IsString( arg1 ) )
4685  {
4686  ‪_stop_instance( arg2, arg1 );
4687  }
4688  else
4689  {
4690  ‪_stop_instance( arg1 );
4691  }
4692  }
4693 }
4694 
4695 function ‪_stop_instance( b_clear = false, str_scenedef )
4696 {
4697  if ( isdefined( self.scenes ) )
4698  {
4699  foreach ( o_scene in ArrayCopy( self.scenes ) )
4700  {
4701  str_scene_name = [[o_scene]]->get_name();
4702 
4703  if ( !isdefined( str_scenedef ) || ( str_scene_name == str_scenedef ) )
4704  {
4705  thread [[o_scene]]->stop( b_clear );
4706  }
4707  }
4708  }
4709 }
4710 
4711 function ‪has_init_state( str_scenedef )
4712 {
4713  s_scenedef = ‪get_scenedef( str_scenedef );
4714  foreach ( s_obj in s_scenedef.objects )
4715  {
4716  if ( !‪IS_TRUE( s_obj.disabled ) && s_obj ‪_has_init_state() )
4717  {
4718  return true;
4719  }
4720  }
4721 
4722  return false;
4723 }
4724 
4726 {
4727  return ( ‪IS_TRUE( self.spawnoninit ) || isdefined( self.initanim ) || isdefined( self.initanimloop ) || ‪IS_TRUE( self.firstframe ) );
4728 }
4729 
4746 function ‪get_prop_count( str_scenedef )
4747 {
4748  return ‪_get_type_count( "prop", str_scenedef );
4749 }
4750 
4767 function ‪get_vehicle_count( str_scenedef )
4768 {
4769  return ‪_get_type_count( "vehicle", str_scenedef );
4770 }
4771 
4788 function ‪get_actor_count( str_scenedef )
4789 {
4790  return ‪_get_type_count( "actor", str_scenedef );
4791 }
4792 
4809 function ‪get_player_count( str_scenedef )
4810 {
4811  return ‪_get_type_count( "player", str_scenedef );
4812 }
4813 
4814 function ‪_get_type_count( str_type, str_scenedef )
4815 {
4816  s_scenedef = ( isdefined( str_scenedef ) ? ‪get_scenedef( str_scenedef ) : ‪get_scenedef( self.scriptbundlename ) );
4817 
4818  n_count = 0;
4819  foreach ( s_obj in s_scenedef.objects )
4820  {
4821  if ( isdefined( s_obj.type ) )
4822  {
4823  if ( ToLower( s_obj.type ) == ToLower( str_type ) )
4824  {
4825  n_count++;
4826  }
4827  }
4828  }
4829 
4830  return n_count;
4831 }
4832 
4844 function ‪is_active( str_scenedef )
4845 {
4846  if ( self == level )
4847  {
4848  return ( ‪get_active_scenes( str_scenedef ).size > 0 );
4849  }
4850  else
4851  {
4852  return ( isdefined( ‪get_active_scene( str_scenedef ) ) );
4853  }
4854 }
4855 
4866 function ‪is_playing( str_scenedef )
4867 {
4868  if ( self == level )
4869  {
4870  return ( level ‪flagsys::get( str_scenedef + "_playing" ) );
4871  }
4872  else
4873  {
4874  ‪DEFAULT( str_scenedef, self.scriptbundlename );
4875 
4876  o_scene = ‪get_active_scene( str_scenedef );
4877  if ( isdefined( o_scene ) )
4878  {
4879  return ( ‪IS_EQUAL( o_scene._str_state, "play" ) );
4880  }
4881  }
4882 
4883  return false;
4884 }
4885 
4896 function ‪is_ready( str_scenedef )
4897 {
4898  if ( self == level )
4899  {
4900  return ( level ‪flagsys::get( str_scenedef + "_ready" ) );
4901  }
4902  else
4903  {
4904  ‪DEFAULT( str_scenedef, self.scriptbundlename );
4905 
4906  o_scene = ‪get_active_scene( str_scenedef );
4907  if ( isdefined( o_scene ) )
4908  {
4909  return ( o_scene ‪flagsys::get( "ready" ) );
4910  }
4911  }
4912 
4913  return false;
4914 }
4915 
4916 function ‪get_active_scenes( str_scenedef )
4917 {
4918  ‪DEFAULT( level.active_scenes, [] );
4919 
4920  if ( isdefined( str_scenedef ) )
4921  {
4922  return ( isdefined( level.active_scenes[ str_scenedef ] ) ? level.active_scenes[ str_scenedef ] : [] );
4923  }
4924  else
4925  {
4926  a_active_scenes = [];
4927  foreach ( str_scenedef, _ in level.active_scenes )
4928  {
4929  a_active_scenes = ArrayCombine( a_active_scenes, level.active_scenes[ str_scenedef ], false, false );
4930  }
4931 
4932  return a_active_scenes;
4933  }
4934 }
4935 
4936 function ‪get_active_scene( str_scenedef )
4937 {
4938  if ( isdefined( str_scenedef ) && isdefined( self.scenes ) )
4939  {
4940  foreach ( o_scene in self.scenes )
4941  {
4942  if ( [[o_scene]]->‪get_name() == str_scenedef )
4943  {
4944  return o_scene;
4945  }
4946  }
4947  }
4948 }
4949 
4950 
4951 //TODO: this should be turned into something more automatic and part of the system
4952 function ‪delete_scene_data( str_scenename )
4953 {
4954  if(IsDefined( level.scriptbundles["scene"][str_scenename] ))
4955  {
4956  level.scriptbundles["scene"][str_scenename] = undefined;
4957  }
4958 }
4959 
4960 function ‪is_igc()
4961 {
4962  return ( IsString( self.cameraswitcher )
4963  || IsString( self.extraCamSwitcher1 )
4964  || IsString( self.extraCamSwitcher2 )
4965  || IsString( self.extraCamSwitcher3 )
4966  || IsString( self.extraCamSwitcher4 ) );
4967 }
4968 
4969 function ‪scene_disable_player_stuff( b_hide_hud = true )
4970 {
4971  self notify( "scene_disable_player_stuff" );
4972 
4973  self notify( "kill_hint_text" );
4974 
4975  self DisableOffhandWeapons();
4976 
4977  if ( b_hide_hud )
4978  {
4979  ‪set_igc_active( true );
4980 
4981  level notify( "disable_cybercom", self, true );
4982  self ‪util::show_hud( 0 );
4983 
4984  ‪util::wait_network_frame(); // let "in_igc" get set so deleted weapon objects can bypass HUD effects
4985  self notify( "delete_weapon_objects" );
4986  }
4987 }
4988 
4989 function ‪scene_enable_player_stuff( b_hide_hud = true )
4990 {
4991  self endon( "scene_disable_player_stuff" );
4992  self endon( "disconnect" );
4993 
4994  wait .5;
4995 
4996  self EnableOffhandWeapons();
4997 
4998  if ( b_hide_hud )
4999  {
5000  ‪set_igc_active( false );
5001  level notify( "enable_cybercom", self );
5002  self notify( "scene_enable_cybercom" ); //TU1: Need to track when the scene system is turning it on per player.
5003  self ‪util::show_hud( 1 );
5004  }
5005 }
5006 
5007 function ‪updateIGCViewtime(b_in_igc)
5008 {
5009  if (b_in_igc && !isDefined(level.igcStartTime))
5010  {
5011  level.igcStartTime = GetTime();
5012  }
5013  else if (!b_in_igc && isDefined(level.igcStartTime))
5014  {
5015  igcViewtimeSec = GetTime() - level.igcStartTime;
5016  level.igcStartTime = undefined;
5017  foreach (player in level.players)
5018  {
5019  if (!isDefined(player.totalIGCViewtime))
5020  {
5021  player.totalIGCViewtime = 0;
5022  }
5023  player.totalIGCViewtime += int(igcViewtimeSec / 1000);
5024  }
5025  }
5026 }
5027 
5028 function ‪set_igc_active( b_in_igc )
5029 {
5030  n_ent_num = self GetEntityNumber();
5031  n_players_in_igc_field = level ‪clientfield::get( "in_igc" );
5032 
5033  if ( b_in_igc )
5034  {
5035  n_players_in_igc_field |= ( 1 << n_ent_num );
5036  }
5037  else
5038  {
5039  n_players_in_igc_field &= ~( 1 << n_ent_num );
5040  }
5041  ‪updateIGCViewtime(b_in_igc);
5042  level ‪clientfield::set( "in_igc", n_players_in_igc_field );
5043 }
5044 
5046 {
5047  n_players_in_igc = level ‪clientfield::get( "in_igc" );
5048  n_entnum = self GetEntityNumber();
5049  return ( n_players_in_igc & ( 1 << n_entnum ) );
5050 }
5051 
5053 {
5054  str_mode = GetDvarString( "scene_menu_mode", "default" );
5055 
5056  if ( IsSubStr( str_mode, "capture" ) )
5057  {
5058  return true;
5059  }
5060  else
5061  {
5062  return false;
5063  }
5064 }
5065 
5067 {
5068  return ‪IS_TRUE(level.scene_should_spectate_on_hot_join);
5069 }
5070 
5072 {
5073  while(‪IS_TRUE(level.scene_should_spectate_on_hot_join))
5074  {
5075  wait 0.05;
5076  }
5077 }
5078 
5079 //-----------------------------------------------------------------SCENE-SKIPPING--------------------------------------------------------------------------------
5080 
5081 function ‪skip_scene( scene_name, b_sequence, b_player_scene, b_check_linked_scene )
5082 {
5083  if(!isdefined(scene_name))
5084  {
5085  if(isdefined(level.shared_scene_sequence_name))
5086  {
5087  scene_name = level.shared_scene_sequence_name;
5088  }
5089 
5090  if(!isdefined(scene_name))
5091  {
5092  if(isdefined(level.players) && isdefined(level.players[0].current_scene))
5093  {
5094  scene_name = level.players[0].current_scene;
5095  }
5096 
5097  if(!isdefined(scene_name))
5098  {
5099  foreach(player in level.players)
5100  {
5101  if(isdefined(player.current_scene))
5102  {
5103  scene_name = player.current_scene;
5104  break;
5105  }
5106  }
5107  }
5108  }
5109  }
5110 
5111  //check if it is a player scene
5112  if(!‪IS_TRUE(b_sequence) && !isdefined(b_player_scene) )
5113  {
5114  foreach(player in level.players)
5115  {
5116  if(isdefined(player.current_scene) && player.current_scene == scene_name)
5117  {
5118  b_player_scene = true;
5119  break;
5120  }
5121  }
5122  }
5123 
5124  //start skipping player scenes and the scenes linked to it.
5125  if(!‪IS_TRUE(b_sequence) && ‪IS_TRUE(b_player_scene))
5126  {
5127  //start the player scene
5128  a_instances = ‪get_active_scenes( scene_name );
5129 
5130  b_can_skip_player_scene = false;
5131 
5132  foreach ( s_instance in ArrayCopy( a_instances ) )
5133  {
5134  if ( isdefined( s_instance ) )
5135  {
5136  b_shared_scene = (s_instance ‪_skip_scene( scene_name, b_sequence, true, false ));
5137 
5138  if(b_shared_scene == 2)
5139  break;
5140 
5141  if(b_shared_scene == 1)
5142  {
5143  b_can_skip_player_scene = true;
5144  break;
5145  }
5146  }
5147  }
5148 
5149  //if it is a player skippable scene, we need to skip all the scenes that are associated with it.
5150  if( ‪IS_TRUE(b_can_skip_player_scene) )
5151  {
5152  a_instances = ‪get_active_scenes();
5153 
5154  foreach ( s_instance in ArrayCopy( a_instances ) )
5155  {
5156  if ( isdefined( s_instance ) )
5157  {
5158  s_instance ‪_skip_scene( scene_name, b_sequence, false, true );
5159  }
5160  }
5161  }
5162  else
5163  {
5164  level.shared_scene_sequence_started = undefined;
5165  level.shared_scene_sequence_name = undefined;
5166  }
5167 
5168  return;
5169  }
5170 
5171 
5172  a_instances = ‪struct::get_array( scene_name, "targetname" );
5173 
5174  if ( !a_instances.size )
5175  {
5176  a_instances = ‪get_active_scenes( scene_name );
5177  }
5178 
5179  foreach ( s_instance in ArrayCopy( a_instances ) )
5180  {
5181  if ( isdefined( s_instance ) )
5182  {
5183  s_instance ‪_skip_scene( scene_name, b_sequence, b_player_scene, b_check_linked_scene );
5184  }
5185  }
5186 }
5187 
5188 function ‪_skip_scene( skipped_scene_name, b_sequence, b_player_scene, b_check_linked_scene )
5189 {
5190  b_shared_scene = 0;
5191 
5192  if ( isdefined( self.scenes ) )
5193  {
5194  foreach ( o_scene in ArrayCopy( self.scenes ) )
5195  {
5196  //scene is skipping already
5197  if( ‪IS_TRUE(o_scene.skipping_scene) )
5198  continue;
5199 
5200  //If a player scene skipping is starting, we can only skip the shared IGCs ones
5201  if( !‪IS_TRUE(b_sequence) && ‪IS_TRUE(b_player_scene) && !‪IS_TRUE(b_check_linked_scene) )
5202  {
5203  if(o_scene._s.name === skipped_scene_name)
5204  {
5205  if(‪IS_TRUE(o_scene._s.DisableSceneSkipping))
5206  {
5207  return 2;
5208  }
5209  else
5210  {
5211  if(o_scene._str_state === "init")
5212  continue;
5213 
5214  b_shared_scene = 1;
5215  }
5216  }
5217  else if(!isdefined(skipped_scene_name))
5218  {
5219  if([[o_scene]]->‪is_scene_shared())
5220  {
5221  if(‪IS_TRUE(o_scene._s.DisableSceneSkipping))
5222  {
5223  return 2;
5224  }
5225  else
5226  {
5227  if(o_scene._str_state === "init")
5228  continue;
5229 
5230  b_shared_scene = 1;
5231  }
5232  }
5233  else
5234  {
5235  continue;
5236  }
5237  }
5238  else
5239  {
5240  continue;
5241  }
5242  }
5243 
5244  str_scene_name = [[o_scene]]->get_name();
5245 
5246  if( !‪IS_TRUE(b_sequence) )
5247  {
5248  b_linked_scene = array::contains(level.linked_scenes, str_scene_name);
5249 
5250  //ignore non linked player scenes
5251  if( ‪IS_TRUE(b_check_linked_scene) && (!b_linked_scene || ‪IS_TRUE(o_scene._s.DisableSceneSkipping)) )
5252  {
5253  continue;
5254  }
5255 
5256  if( !b_linked_scene && o_scene._str_state === "init" )
5257  {
5258  continue;
5259  }
5260 
5261  if ( ( !isdefined(skipped_scene_name) || str_scene_name == skipped_scene_name ) || (b_linked_scene && !‪IS_TRUE(o_scene._s.DisableSceneSkipping)) )
5262  {
5263  if( ( !isdefined(skipped_scene_name) || str_scene_name == skipped_scene_name) && ‪IS_TRUE(b_player_scene) && !‪IS_TRUE(b_check_linked_scene) && !b_linked_scene) //if player scene
5264  {
5265  b_shared_scene = 1;
5266  o_scene.b_player_scene = true;
5267  level.player_skipping_scene = str_scene_name;
5268  }
5269 
5270  o_scene.skipping_scene = true;
5271  thread [[o_scene]]->skip_scene( b_sequence );
5272  }
5273  }
5274  else
5275  {
5276  o_scene.b_player_scene = b_player_scene;
5277  o_scene.skipping_scene = true;
5278  thread [[o_scene]]->skip_scene( b_sequence);
5279  }
5280  }
5281  }
5282 
5283  return b_shared_scene;
5284 }
5285 
5286 function ‪add_player_linked_scene(linked_scene_str)
5287 {
5288  ‪DEFAULT( level.linked_scenes, [] );
5289 
5290  ‪array::add(level.linked_scenes, linked_scene_str);
5291 }
5292 
5293 function ‪remove_player_linked_scene(linked_scene_str)
5294 {
5295  if(isdefined(level.linked_scenes))
5296  {
5297  ArrayRemoveValue( level.linked_scenes, linked_scene_str );
5298  }
5299 }
5300 
5301 
5303 {
5304  while(isdefined(level.player_skipping_scene))
5305  {
5306  wait 0.05;
5307  }
5308 }
5309 
5311 {
5312  return isdefined(level.player_skipping_scene);
5313 }
5314 
5316 {
5317  self endon( "disconnect" );
5318 
5319  while(1)
5320  {
5321  level waittill("scene_sequence_started");
5322 
5323  self thread ‪should_skip_scene_loop();
5324  self thread ‪watch_scene_ending();
5325  self thread ‪watch_scene_skipping();
5326 
5327  level waittill( "scene_sequence_ended" );
5328  }
5329 }
5330 
5332 {
5333  level endon("scene_sequence_started");
5334 
5335  if(isdefined(self.scene_skip_timer))
5336  {
5337 
5338  self.scene_skip_timer = undefined;
5339  }
5340 
5341  if(isdefined(self.scene_skip_start_time))
5342  {
5343  self.scene_skip_start_time = undefined;
5344  }
5345 
5346  foreach(player in level.players)
5347  {
5348  if(isdefined(player.skip_scene_menu_handle))
5349  {
5350  player CloseLuiMenu( player.skip_scene_menu_handle );
5351  player.skip_scene_menu_handle = undefined;
5352  }
5353  }
5354 }
5355 
5357 {
5358  self endon( "disconnect" );
5359  self endon( "scene_being_skipped");
5360 
5361  level waittill( "scene_sequence_ended" );
5362 
5364 }
5365 
5367 {
5368  self endon( "disconnect" );
5369  level endon( "scene_sequence_ended");
5370 
5371  self waittill( "scene_being_skipped");
5372  level.sceneSkippedCount++;
5374 }
5375 
5377 {
5378  self endon( "disconnect" );
5379  level endon( "scene_sequence_ended" );
5380 
5381  b_skip_scene = false;
5383 
5384  wait 0.05; //wait a frame for the menus to be closed
5385 
5386  foreach(player in level.players)
5387  {
5388  if(isdefined(player.skip_scene_menu_handle))
5389  {
5390  player CloseLuiMenu( player.skip_scene_menu_handle );
5391  wait 0.05; //wait a frame for the menus to be closed
5392  }
5393 
5394  player.skip_scene_menu_handle = player OpenLuiMenu( "CPSkipSceneMenu" );
5395 
5396  player SetLUIMenuData( player.skip_scene_menu_handle, "showSkipButton", 0 );
5397  player SetLUIMenuData( player.skip_scene_menu_handle, "hostIsSkipping", 0 );
5398  player SetLUIMenuData( player.skip_scene_menu_handle, "sceneSkipEndTime", 0 );
5399  }
5400 
5401  while(1)
5402  {
5403  if((self ‪any_button_pressed()) && !‪IS_TRUE(level.chyron_text_active))
5404  {
5405  if(!isdefined(self.scene_skip_timer))
5406  {
5407  self SetLUIMenuData( self.skip_scene_menu_handle, "showSkipButton", 1 );
5408  }
5409 
5410  self.scene_skip_timer = GetTime();
5411  }
5412  else if(isdefined(self.scene_skip_timer))
5413  {
5414  if((GetTime() - self.scene_skip_timer) > 3000)
5415  {
5416  self SetLUIMenuData( self.skip_scene_menu_handle, "showSkipButton", 2 );
5417 
5418  self.scene_skip_timer = undefined;
5419  }
5420  }
5421 
5422  if((self PrimaryButtonPressedLocal()) && !‪IS_TRUE(level.chyron_text_active))
5423  {
5424  if( !isdefined(self.scene_skip_start_time) )
5425  {
5426  foreach(player in level.players)
5427  {
5428  if(player IsHost())
5429  {
5430  player SetLUIMenuData( player.skip_scene_menu_handle, "sceneSkipEndTime", GetTime() + 2500 );
5431  continue;
5432  }
5433 
5434  if(isdefined(player.skip_scene_menu_handle))
5435  {
5436  player SetLUIMenuData( player.skip_scene_menu_handle, "hostIsSkipping", 1 );
5437  }
5438  }
5439 
5440 
5441  self.scene_skip_start_time = GetTime();
5442  }
5443  else if((GetTime() - self.scene_skip_start_time) > 2500)
5444  {
5445  b_skip_scene = true;
5446  break;
5447  }
5448  }
5449  else if( isdefined(self.scene_skip_start_time) )
5450  {
5451  foreach(player in level.players)
5452  {
5453  if(player IsHost())
5454  {
5455  player SetLUIMenuData( player.skip_scene_menu_handle, "sceneSkipEndTime", 0 );
5456  continue;
5457  }
5458 
5459  if(isdefined(player.skip_scene_menu_handle))
5460  {
5461  player SetLUIMenuData( player.skip_scene_menu_handle, "hostIsSkipping", 2 );
5462  }
5463  }
5464 
5465  self.scene_skip_start_time = undefined;
5466  }
5467 
5468  if(‪IS_TRUE(level.chyron_text_active))
5469  {
5470  while(‪IS_TRUE(level.chyron_text_active))
5471  {
5472  wait 0.05;
5473  }
5474 
5475  //give Chyron text a chance to fade out
5476  wait 3;
5477  }
5478 
5479  wait 0.05;
5480  }
5481 
5482  if(b_skip_scene)
5483  {
5484 
5485  self playsound( "uin_igc_skip" ); //C.Ayers: Plays a skip sound with a duck to cover up the switch
5486 
5487  self notify("scene_being_skipped");
5488  level notify("scene_skip_sequence_started");
5489 
5490  ‪scene::skip_scene(level.shared_scene_sequence_name, false, true);
5491  }
5492 }
5493 
5495 {
5496  //DPad
5497  if( self ActionSlotOneButtonPressed() )
5498  {
5499  return true;
5500  }
5501  else if( self ActionSlotTwoButtonPressed() )
5502  {
5503  return true;
5504  }
5505  else if( self ActionSlotThreeButtonPressed() )
5506  {
5507  return true;
5508  }
5509  else if( self ActionSlotFourButtonPressed() )
5510  {
5511  return true;
5512  }
5513 
5514  //Action Buttons
5515  else if(self JumpButtonPressed() )
5516  {
5517  return true;
5518  }
5519  else if(self StanceButtonPressed() )
5520  {
5521  return true;
5522  }
5523  else if(self WeaponSwitchButtonPressed() )
5524  {
5525  return true;
5526  }
5527  else if(self ReloadButtonPressed() )
5528  {
5529  return true;
5530  }
5531 
5532  //Triggers
5533  else if(self fragbuttonpressed() )
5534  {
5535  return true;
5536  }
5537  else if(self throwbuttonpressed() )
5538  {
5539  return true;
5540  }
5541  else if(self AttackButtonPressed())
5542  {
5543  return true;
5544  }
5545  else if(self secondaryoffhandbuttonpressed() )
5546  {
5547  return true;
5548  }
5549 
5550  //Sticks
5551  else if(self meleebuttonpressed() )
5552  {
5553  return true;
5554  }
5555 
5556  return false;
5557 }
5558 
5560 {
5561  if( self IsHost() )
5562  {
5563  self thread ‪watch_scene_skip_requests();
5564  }
5565 }
5566 
5568 {
5569  // Clear out the igc active level flag so if somebody hot joins in they don't think they are in an igc
5570  self ‪set_igc_active( false );
5571 }
5572 
5573 //-------------------------------------------------------------------------------------------------------------------------------------------------
5574 
5575 
5576 function ‪add_scene_ordered_notetrack( group_name, str_note )
5577 {
5578  ‪DEFAULT( level.scene_ordered_notetracks, [] );
5579 
5580  group_obj = level.scene_ordered_notetracks[group_name];
5581 
5582  if(!isdefined( group_obj ))
5583  {
5584  group_obj = SpawnStruct();
5585  group_obj.count = 0;
5586  group_obj.current_count = 0;
5587 
5588  level.scene_ordered_notetracks[group_name] = group_obj;
5589  }
5590 
5591  group_obj.count++;
5592 
5593  self thread ‪_wait_for_ordered_notify( group_obj.count - 1, group_obj, group_name, str_note );
5594 }
5595 
5596 function private ‪_wait_for_ordered_notify( id, group_obj, group_name, str_note )
5597 {
5598  self waittill(str_note);
5599 
5600  if( group_obj.current_count == id )
5601  {
5602  group_obj.current_count++;
5603  self notify("scene_" + str_note);
5604  wait 0.05;
5605 
5606  //if we fired all notifies, release all arrays
5607  if(group_obj.current_count == group_obj.count)
5608  {
5609  group_obj.pending_notifies = undefined;
5610  level.scene_ordered_notetracks[group_name] = undefined;
5611  }
5612  else if( isdefined(group_obj.pending_notifies) && ((group_obj.current_count + group_obj.pending_notifies.size) == group_obj.count) )
5613  {
5614  self thread ‪_fire_ordered_notitifes( group_obj, group_name);
5615  }
5616  }
5617  else
5618  {
5619  if( !isdefined(group_obj.pending_notifies) )
5620  {
5621  group_obj.pending_notifies = [];
5622  }
5623 
5624  //out of order notetrack fired...insert it in it's ordered position
5625  notetrack = SpawnStruct();
5626  notetrack.id = id;
5627  notetrack.str_note = str_note;
5628 
5629  i = 0;
5630  while(i < group_obj.pending_notifies.size && group_obj.pending_notifies[i].id < id)
5631  {
5632  i++;
5633  }
5634 
5635  ArrayInsert(group_obj.pending_notifies, notetrack, i);
5636 
5637  if( (group_obj.current_count + group_obj.pending_notifies.size) == group_obj.count )
5638  {
5639  self thread ‪_fire_ordered_notitifes( group_obj, group_name);
5640  }
5641  }
5642 }
5643 
5644 function private ‪_fire_ordered_notitifes( group_obj, group_name )
5645 {
5646  if( isdefined(group_obj.pending_notifies) )
5647  {
5648  while( group_obj.pending_notifies.size > 0)
5649  {
5650  self notify("scene_" + group_obj.pending_notifies[0].str_note);
5651  ArrayRemoveIndex(group_obj.pending_notifies, 0);
5652  wait 0.05;
5653  }
5654  }
5655 
5656  group_obj.pending_notifies = undefined;
5657  level.scene_ordered_notetracks[group_name] = undefined;
5658 }
5659 
5660 function ‪add_wait_for_streamer_hint_scene( str_scene_name )
5661 {
5662  ‪DEFAULT( level.wait_for_streamer_hint_scenes, [] );
5663  ‪array::add( level.wait_for_streamer_hint_scenes, str_scene_name );
5664 }
‪init
‪function init(str_scenedef, s_scenedef, e_align, a_ents, b_test_run)
Definition: scene_shared.gsc:1904
‪cSceneObject::skip_scene_on_client
‪function skip_scene_on_client()
Definition: scene_shared.gsc:1819
‪trigger_scene_sequence_started
‪function private trigger_scene_sequence_started(scene_object, entity)
Definition: scene_shared.gsc:3427
‪cSceneObject::destructor
‪destructor()
Definition: scene_shared.gsc:100
‪cSceneObject::stop
‪function stop(b_clear=false, b_dont_clear_anim=false, b_finished=false)
Definition: scene_shared.gsc:249
‪remove_invalid_scene_objects
‪function remove_invalid_scene_objects(s_scenedef)
Definition: scene_shared.gsc:3886
‪_wait_for_camera_animation
‪function _wait_for_camera_animation(str_cam, n_start_time)
Definition: scene_shared.gsc:2499
‪_n_streamer_req
‪var _n_streamer_req
Definition: scene_shared.gsc:1891
‪get_script_bundles
‪function get_script_bundles(str_type)
Definition: struct.csc:77
‪skipto_end
‪function skipto_end(arg1, arg2, arg3, n_time, b_include_players=false)
Definition: scene_shared.gsc:4563
‪cSceneObject::is_shared_player
‪function is_shared_player()
Definition: scene_shared.gsc:1703
‪remove_scene_func
‪function remove_scene_func(str_scenedef, func, str_state="play")
Definition: scene_shared.gsc:4078
‪is_skipping_scene
‪function is_skipping_scene()
Definition: scene_shared.gsc:2711
‪_e_root
‪cSceneObject _e_root
‪get_valid_objects
‪function get_valid_objects()
Definition: scene_shared.gsc:3113
‪switch_to_primary_weapon
‪function switch_to_primary_weapon(b_immediate=false)
Definition: player_shared.gsc:330
‪_play_camera_anim_on_player_callback
‪function _play_camera_anim_on_player_callback(player)
Definition: scene_shared.gsc:2584
‪waittill_skip_sequence_completed
‪function waittill_skip_sequence_completed()
Definition: scene_shared.gsc:5302
‪cSceneObject::_play_shared_player_anim_for_player
‪function _play_shared_player_anim_for_player(player)
Definition: scene_shared.gsc:1408
‪cSceneObject::get_orig_name
‪function get_orig_name()
Definition: scene_shared.gsc:445
‪_str_mode
‪var _str_mode
Definition: scene_shared.gsc:1888
‪cSceneObject::regroup_invulnerability
‪function regroup_invulnerability(e_player)
Definition: scene_shared.gsc:1575
‪is_skipping_in_progress
‪function is_skipping_in_progress()
Definition: scene_shared.gsc:5310
‪is_valid_ent
‪function is_valid_ent(ent)
Definition: scene_shared.gsc:3676
‪cSceneObject
Definition: scene_shared.csc:66
‪cScriptBundleObjectBase
Definition: scriptbundle_shared.csc:7
‪get_object_id
‪function get_object_id()
Definition: scene_shared.gsc:2019
‪cSceneObject::_on_death
‪function _on_death()
Definition: scene_shared.gsc:1060
‪_a_objects
‪var _a_objects
Definition: scriptbundle_shared.csc:80
‪cSceneObject::skip_scene
‪function skip_scene(b_wait_one_frame)
Definition: scene_shared.gsc:1859
‪destroy_dev_info
‪function destroy_dev_info()
Definition: scene_shared.gsc:2707
‪_n_request_time
‪var _n_request_time
Definition: scene_shared.gsc:1890
‪update_scene_sequence
‪function private update_scene_sequence()
Definition: scene_shared.gsc:3351
‪remove_player_linked_scene
‪function remove_player_linked_scene(linked_scene_str)
Definition: scene_shared.gsc:5293
‪cSceneObject::do_death_anims
‪function do_death_anims()
Definition: scene_shared.gsc:1071
‪cAwarenessSceneObject::_prepare
‪function _prepare()
Definition: scene_shared.gsc:3520
‪_stop_camera_anims
‪function _stop_camera_anims()
Definition: scene_shared.gsc:2632
‪take_weapons
‪function take_weapons()
Definition: player_shared.gsc:114
‪is_igc
‪function is_igc()
Definition: scene_shared.gsc:4960
‪finish_skip_scene
‪function private finish_skip_scene()
Definition: scene_shared.gsc:3273
‪_fire_ordered_notitifes
‪function private _fire_ordered_notitifes(group_obj, group_name)
Definition: scene_shared.gsc:5644
‪prepare_player_model_anim
‪function private prepare_player_model_anim(ent)
Definition: scene_shared.gsc:35
‪is_scene_shared_sequence
‪function private is_scene_shared_sequence()
Definition: scene_shared.gsc:3346
‪is_active
‪function is_active(str_scenedef)
Definition: scene_shared.gsc:4844
‪cScriptBundleObjectBase::_e
‪var _e
Definition: scriptbundle_shared.gsc:14
‪clear
‪function clear(str_flag)
Definition: flag_shared.csc:130
‪skip_scene
‪function skip_scene(b_sequence)
Definition: scene_shared.gsc:3161
‪new_object
‪function new_object()
Definition: scene_shared.gsc:1961
‪add_scene_func
‪function add_scene_func(str_scenedef, func, str_state="play",...)
Definition: scene_shared.gsc:4052
‪cScriptBundleObjectBase::warning
‪function warning(condition, str_msg)
Definition: scriptbundle_shared.gsc:58
‪cSceneObject::_prepare
‪function _prepare()
Definition: scene_shared.gsc:593
‪cSceneObject::is_player
‪function is_player()
Definition: scene_shared.gsc:1693
‪cSceneObject::_set_goal
‪function _set_goal()
Definition: scene_shared.gsc:1143
‪has_init_state
‪function has_init_state()
Definition: scene_shared.gsc:2915
‪add_scene_ordered_notetrack
‪function add_scene_ordered_notetrack(group_name, str_note)
Definition: scene_shared.gsc:5576
‪_play_camera_anim_on_player
‪function _play_camera_anim_on_player(player, v_origin, v_angles, ignore_initial_notetracks)
Definition: scene_shared.gsc:2589
‪get_active_scene
‪function get_active_scene(str_scenedef)
Definition: scene_shared.gsc:4936
‪display_dev_info
‪function display_dev_info()
Definition: scene_shared.gsc:2703
‪get_objects
‪function get_objects(str_type)
Definition: scene_shared.gsc:2179
‪warning
‪function warning(msg)
Definition: _util.gsc:38
‪SPAWNFLAG_SCRIPTBUNDLE_PLAY
‪#define SPAWNFLAG_SCRIPTBUNDLE_PLAY
Definition: shared.gsh:93
‪cSceneObject::scene
‪function scene()
Definition: scene_shared.csc:313
‪cSceneObject::get_align_ent
‪function get_align_ent()
Definition: scene_shared.gsc:272
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪streamer_wait
‪function streamer_wait(n_stream_request_id, n_wait_frames=0, n_timeout=0, b_bonuszm_streamer_fallback=true)
Definition: util_shared.gsc:86
‪waittill_either
‪function waittill_either(msg1, msg2)
Definition: util_shared.gsc:303
‪spawn
‪function spawn(arg1, arg2, arg3, arg4, b_test_run)
Definition: scene_shared.gsc:4141
‪stop
‪function stop(b_clear=false, b_finished=false)
Definition: scene_shared.gsc:2826
‪get_array
‪function get_array(kvp_value, kvp_key="targetname")
Definition: struct.csc:34
‪has_next_scene
‪function has_next_scene()
Definition: scene_shared.gsc:2726
‪get_prop_count
‪function get_prop_count(str_scenedef)
Definition: scene_shared.gsc:4746
‪cSceneObject::set_objective
‪function set_objective()
Definition: scene_shared.gsc:1045
‪screen_fade
‪function screen_fade(n_time, n_target_alpha=1, n_start_alpha=0, str_color="black", b_force_close_menu=false)
Definition: lui_shared.csc:372
‪VAL
‪#define VAL(__var, __default)
Definition: shared.gsh:272
‪show_hud
‪function show_hud(b_show)
Definition: util_shared.gsc:4025
‪cSceneObject::_is_valid
‪var _is_valid
Definition: scene_shared.csc:71
‪should_spectate_on_join
‪function should_spectate_on_join()
Definition: scene_shared.gsc:5066
‪cSceneObject::finish
‪function finish(b_clear=false, b_canceled=false)
Definition: scene_shared.gsc:876
‪_init_instance
‪function _init_instance(str_scenedef, a_ents, b_test_run=false)
Definition: scene_shared.gsc:4272
‪loop_camera_anim_to_set_up_for_capture
‪function loop_camera_anim_to_set_up_for_capture()
Definition: scene_shared.gsc:2615
‪cSceneObject::_str_death_anim_loop
‪var _str_death_anim_loop
Definition: scene_shared.gsc:90
‪on_player_disconnect
‪function on_player_disconnect()
Definition: scene_shared.gsc:5567
‪SPAWNFLAG_SCRIPTBUNDLE_INIT
‪#define SPAWNFLAG_SCRIPTBUNDLE_INIT
Definition: shared.gsh:92
‪cScriptBundleObjectBase::_s
‪var _s
Definition: scriptbundle_shared.csc:9
‪delete_scene_data
‪function delete_scene_data(str_scenename)
Definition: scene_shared.gsc:4952
‪assign_ents
‪function assign_ents(a_ents)
Definition: scene_shared.gsc:2070
‪initialize
‪function initialize(a_ents, b_playing=false)
Definition: scene_shared.gsc:1985
‪cSceneObject::first_init
‪function first_init(s_objdef, o_scene, e_ent)
Definition: scene_shared.gsc:104
‪constructor
‪constructor()
Definition: scene_shared.gsc:1893
‪is_player_anim_ending_early
‪function is_player_anim_ending_early()
Definition: scene_shared.gsc:2216
‪cSceneObject::get_lerp_time
‪function get_lerp_time()
Definition: scene_shared.gsc:1588
‪waittill_any_timeout
‪function waittill_any_timeout(n_timeout, string1, string2, string3, string4, string5)
Definition: util_shared.csc:423
‪_get_type_count
‪function _get_type_count(str_type, str_scenedef)
Definition: scene_shared.gsc:4814
‪BONUSZM_SCENE_SEQUENCE_ENDED_CALLBACK
‪#define BONUSZM_SCENE_SEQUENCE_ENDED_CALLBACK(__scene)
Definition: shared.gsh:544
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪cSceneObject::play
‪function play()
Definition: scene_shared.gsc:172
‪on_disconnect
‪function on_disconnect()
Definition: _wager.gsc:88
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪_enableWeapon
‪function _enableWeapon()
Definition: util_shared.gsc:1145
‪cSceneObject::_cleanup
‪function _cleanup()
Definition: scene_shared.gsc:1098
‪get_scenedef
‪function get_scenedef(str_scenedef)
Definition: scene_shared.gsc:4098
‪_play_camera_anims
‪function _play_camera_anims()
Definition: scene_shared.gsc:2513
‪cAwarenessSceneObject
Definition: scene_shared.gsc:3476
‪remove_on_loadout
‪function remove_on_loadout(func, obj)
Definition: callbacks_shared.gsc:225
‪should_skip_scene_loop
‪function should_skip_scene_loop()
Definition: scene_shared.gsc:5376
‪add_object
‪function add_object(o_object)
Definition: scriptbundle_shared.csc:128
‪cSceneObject::_str_state
‪var _str_state
Definition: scene_shared.gsc:87
‪add
‪function add(entity, dyingplayer, team, timeout)
Definition: _deathicons.gsc:43
‪error
‪function error(msg)
Definition: _util.gsc:28
‪spawn_model
‪function spawn_model(n_client, str_model, origin=(0, 0, 0), angles=(0, 0, 0))
Definition: util_shared.csc:92
‪_testing
‪var _testing
Definition: scriptbundle_shared.csc:82
‪get_existing_ent
‪function get_existing_ent(str_name, b_spawner_only=false, b_nodes_and_structs=false)
Definition: scene_shared.gsc:3612
‪streamer_request_completed
‪function streamer_request_completed()
Definition: scene_shared.gsc:2810
‪a_objects
‪function _assign_ents_by_name a_objects
Definition: scene_shared.gsc:2101
‪wait_until_spectate_on_join_completes
‪function wait_until_spectate_on_join_completes()
Definition: scene_shared.gsc:5071
‪is_ready
‪function is_ready(str_scenedef)
Definition: scene_shared.gsc:4896
‪synced_delete
‪function synced_delete()
Definition: scene_shared.gsc:3681
‪get_state
‪function get_state()
Definition: scene_shared.gsc:3133
‪get_vehicle_count
‪function get_vehicle_count(str_scenedef)
Definition: scene_shared.gsc:4767
‪get_player_count
‪function get_player_count(str_scenedef)
Definition: scene_shared.gsc:4809
‪_str_notify_name
‪var _str_notify_name
Definition: scene_shared.gsc:1889
‪is_female
‪function is_female()
Definition: util_shared.gsc:3448
‪run_instances
‪function run_instances()
Definition: scene_shared.gsc:3977
‪cSceneObject::_on_damage_run_scene_thread
‪function _on_damage_run_scene_thread()
Definition: scene_shared.gsc:335
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪spawn_anim_model
‪function spawn_anim_model(model_name, origin, angles, n_spawnflags=0, b_throttle)
Definition: util_shared.gsc:1575
‪_is_ent_actor
‪function _is_ent_actor(ent)
Definition: scene_shared.gsc:2169
‪cSceneObject::_should_skip_anim
‪function _should_skip_anim(animation)
Definition: scene_shared.gsc:1713
‪attach_weapon
‪function attach_weapon(weaponObject, tag="tag_weapon_right")
Definition: animation_shared.gsc:654
‪watch_scene_ending
‪function watch_scene_ending()
Definition: scene_shared.gsc:5356
‪spawn_anim_player_model
‪function spawn_anim_player_model(model_name, origin, angles, n_spawnflags=0)
Definition: util_shared.gsc:1595
‪_str_name
‪var _str_name
Definition: scriptbundle_shared.csc:79
‪cSceneObject::_play_shared_player_anim
‪function _play_shared_player_anim(animation, align, tag, n_rate, n_time)
Definition: scene_shared.gsc:1359
‪is_playing
‪function is_playing(str_scenedef)
Definition: scene_shared.gsc:4866
‪on_error
‪function on_error()
Definition: scene_shared.gsc:3128
‪watch_scene_skipping
‪function watch_scene_skipping()
Definition: scene_shared.gsc:5366
‪wait_network_frame
‪function wait_network_frame(n_count=1)
Definition: util_shared.gsc:64
‪cAwarenessSceneObject::play
‪function play(str_alert_state)
Definition: scene_shared.gsc:3478
‪give_back_weapons
‪function give_back_weapons(b_immediate=false)
Definition: player_shared.gsc:203
‪cSceneObject::_spawn
‪function _spawn(clientNum, b_hide=true)
Definition: scene_shared.csc:358
‪cSceneObject::_str_death_anim
‪var _str_death_anim
Definition: scene_shared.gsc:89
‪STR
‪#define STR(__var)
Definition: shared.gsh:297
‪_call_state_funcs
‪function _call_state_funcs(str_state)
Definition: scene_shared.gsc:2931
‪_play_extracam_on_player
‪function _play_extracam_on_player(player, n_index, str_camera_anim, v_origin, v_angles)
Definition: scene_shared.gsc:2626
‪cScriptBundleObjectBase::_o_bundle
‪var _o_bundle
Definition: scriptbundle_shared.csc:10
‪REGISTER_SYSTEM_EX
‪#define REGISTER_SYSTEM_EX(__sys, __func_init_preload, __func_init_postload, __reqs)
Definition: shared.gsh:209
‪cScriptBundleObjectBase::log
‪function log(str_msg)
Definition: scriptbundle_shared.csc:45
‪on_player_connect
‪function on_player_connect()
Definition: scene_shared.gsc:5559
‪has_player
‪function has_player()
Definition: scene_shared.gsc:3454
‪get_ents
‪function get_ents()
Definition: scene_shared.gsc:2982
‪cSceneObject::get_camera_tween
‪function get_camera_tween()
Definition: scene_shared.gsc:1600
‪increment_to_player
‪function increment_to_player(str_field_name, n_increment_count=1)
Definition: clientfield_shared.gsc:169
‪ARRAY_ADD
‪#define ARRAY_ADD(__array, __item)
Definition: shared.gsh:304
‪is_dead_sentient
‪function is_dead_sentient()
Definition: ai_shared.gsc:210
‪cSceneObject::_finish_player
‪function _finish_player(player)
Definition: scene_shared.gsc:990
‪get_actor_count
‪function get_actor_count(str_scenedef)
Definition: scene_shared.gsc:4788
‪cSceneObject::skip_scene_on_server
‪function skip_scene_on_server()
Definition: scene_shared.gsc:1841
‪__init__
‪function __init__()
Definition: scene_shared.gsc:3743
‪watch_scene_skip_requests
‪function watch_scene_skip_requests()
Definition: scene_shared.gsc:5315
‪wait_till_scene_ready
‪function wait_till_scene_ready(o_exclude, b_ignore_streamer=false)
Definition: scene_shared.gsc:3048
‪scene_disable_player_stuff
‪function scene_disable_player_stuff(b_hide_hud=true)
Definition: scene_shared.gsc:4969
‪is_capture_mode
‪function is_capture_mode()
Definition: scene_shared.gsc:5052
‪cScriptBundleObjectBase::error
‪function error(condition, str_msg)
Definition: scriptbundle_shared.csc:50
‪NEW_STATE
‪#define NEW_STATE(__state)
Definition: scene_shared.gsc:56
‪should_skip_linked_to_players_scene
‪function should_skip_linked_to_players_scene()
Definition: scene_shared.gsc:3336
‪_n_object_id
‪var _n_object_id
Definition: scene_shared.gsc:1887
‪__main__
‪function __main__()
Definition: scene_shared.gsc:3906
‪increment
‪function increment(str_field_name, n_increment_count=1)
Definition: clientfield_shared.gsc:110
‪sync_with_client_scene
‪function sync_with_client_scene(str_state, b_test_run=false)
Definition: scene_shared.gsc:2025
‪SPAWNFLAG
‪#define SPAWNFLAG(__e, __f)
Definition: shared.gsh:95
‪wait_till
‪function wait_till(str_flag)
Definition: flag_shared.csc:189
‪cSceneObject::_b_set_goal
‪var _b_set_goal
Definition: scene_shared.gsc:91
‪_wait_server_time
‪function _wait_server_time(n_time, n_start_time=0)
Definition: scene_shared.gsc:2483
‪cSceneObject::in_a_different_scene
‪function in_a_different_scene()
Definition: scene_shared.csc:547
‪cSceneObject::get_name
‪function get_name()
Definition: scene_shared.gsc:440
‪allows_multiple
‪function allows_multiple()
Definition: scene_shared.gsc:3038
‪cScriptBundleObjectBase::init
‪function init(s_objdef, o_bundle, e_ent, localclientnum)
Definition: scriptbundle_shared.csc:22
‪prepare_generic_model_anim
‪function private prepare_generic_model_anim(ent)
Definition: scene_shared.gsc:45
‪init_scene_sequence_started
‪function private init_scene_sequence_started(b_started)
Definition: scene_shared.gsc:3366
‪run_next
‪function run_next()
Definition: scene_shared.gsc:2731
‪get_align_ent
‪function get_align_ent()
Definition: scene_shared.gsc:3007
‪get_script_bundle_instances
‪function get_script_bundle_instances(str_type, str_name="")
Definition: struct.csc:99
‪DEFAULT_ACTOR_WEAPON
‪#define DEFAULT_ACTOR_WEAPON
Definition: scene_shared.gsc:72
‪is_scene_shared
‪function is_scene_shared()
Definition: scene_shared.gsc:3138
‪get_name
‪function get_name()
Definition: scriptbundle_shared.csc:108
‪cSceneObject::constructor
‪constructor()
Definition: scene_shared.gsc:93
‪is_looping
‪function is_looping()
Definition: scene_shared.gsc:3043
‪skipto_end_noai
‪function skipto_end_noai(arg1, arg2, arg3, n_time)
Definition: scene_shared.gsc:4587
‪_trigger_init
‪function _trigger_init(trig)
Definition: scene_shared.gsc:3992
‪get_active_scenes
‪function get_active_scenes(str_scenedef)
Definition: scene_shared.gsc:4916
‪get_anim_relative_start_time
‪function get_anim_relative_start_time(animation, n_time)
Definition: scene_shared.gsc:2192
‪get_valid_object_defs
‪function get_valid_object_defs()
Definition: scene_shared.gsc:1966
‪waittill_any_ents_two
‪function waittill_any_ents_two(ent1, string1, ent2, string2)
Definition: util_shared.csc:535
‪_is_ent_player
‪function _is_ent_player(ent)
Definition: scene_shared.gsc:2164
‪cSceneObject::_track_goal
‪function _track_goal()
Definition: scene_shared.gsc:1165
‪cSceneObject::spawn_ent
‪function spawn_ent(e)
Definition: scene_shared.gsc:1322
‪get_root
‪function get_root()
Definition: scene_shared.gsc:3002
‪cSceneObject::skip_anim_on_client
‪function private skip_anim_on_client(entity, anim_name)
Definition: scene_shared.gsc:1773
‪updateIGCViewtime
‪function updateIGCViewtime(b_in_igc)
Definition: scene_shared.gsc:5007
‪_has_init_state
‪function _has_init_state()
Definition: scene_shared.gsc:4725
‪reach
‪function reach(animation, v_origin_or_ent, v_angles_or_tag, b_disable_arrivals=false)
Definition: animation_shared.gsc:335
‪MAKE_ARRAY
‪#define MAKE_ARRAY(__array)
Definition: shared.gsh:303
‪_release_object
‪function _release_object()
Definition: scene_shared.gsc:2905
‪get_scenedefs
‪function get_scenedefs(str_type="scene")
Definition: scene_shared.gsc:4103
‪cSceneObject::initialize
‪function initialize(b_force_first_frame=false)
Definition: scene_shared.gsc:113
‪cSceneObject::reset_player
‪function reset_player()
Definition: scene_shared.gsc:1666
‪on_loadout
‪function on_loadout(func, obj)
Definition: callbacks_shared.gsc:213
‪_s
‪class cScriptBundleObjectBase _s
‪cSceneObject::_str_name
‪var _str_name
Definition: scene_shared.csc:69
‪cSceneObject::get_camera_tween_out
‪function get_camera_tween_out()
Definition: scene_shared.gsc:1605
‪a_ents
‪function _query_ents_by_substring_helper a_ents
Definition: util_shared.gsc:3334
‪cSceneObject::_spawn
‪function _spawn(e_spawner, b_hide=true, b_set_ready_when_spawned=true)
Definition: scene_shared.gsc:450
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪IS_EQUAL
‪#define IS_EQUAL(__a, __b)
Definition: shared.gsh:250
‪_stop_camera_anim_on_player
‪function _stop_camera_anim_on_player(player)
Definition: scene_shared.gsc:2663
‪destructor
‪destructor()
Definition: scene_shared.gsc:1900
‪cSceneObject::_b_spawnonce_used
‪var _b_spawnonce_used
Definition: scene_shared.csc:73
‪LookAtEntity
‪function LookAtEntity(lookTargetEntity, lookDuration, lookSpeed, eyesOnly, interruptOthers)
Definition: zombie_shared.gsc:24
‪cSceneObject::has_init_state
‪function has_init_state()
Definition: scene_shared.csc:537
‪player_is_in_laststand
‪function player_is_in_laststand()
Definition: laststand_shared.gsc:18
‪array
‪function wait_till_objects_ready array
Definition: scene_shared.gsc:3086
‪cSceneObject::_play_anim
‪function _play_anim(animation, n_delay_min=0, n_delay_max=0, n_rate=1, n_blend=0.2, n_time=0)
Definition: scene_shared.gsc:1175
‪clear_scene_skipping_ui
‪function clear_scene_skipping_ui()
Definition: scene_shared.gsc:5331
‪cSceneObject::is_player_model
‪function is_player_model()
Definition: scene_shared.gsc:1698
‪set_igc_active
‪function set_igc_active(b_in_igc)
Definition: scene_shared.gsc:5028
‪_play_instance
‪function _play_instance(s_tracker, str_scenedef, a_ents, b_test_run=false, str_state, str_mode)
Definition: scene_shared.gsc:4501
‪cSceneObject::get_align_tag
‪function get_align_tag()
Definition: scene_shared.gsc:307
‪cAwarenessSceneObject::_on_alert_run_scene_thread
‪function _on_alert_run_scene_thread()
Definition: scene_shared.gsc:3531
‪cSceneObject::link_player
‪function link_player()
Definition: scene_shared.gsc:1610
‪cSceneObject::set_player_stance
‪function set_player_stance(player)
Definition: scene_shared.gsc:854
‪add_to_sync_list
‪function add_to_sync_list()
Definition: scene_shared.gsc:1941
‪cSceneObject::skip_anim_on_server
‪function private skip_anim_on_server(entity, anim_name)
Definition: scene_shared.gsc:1792
‪cSceneObject::revive_player
‪function revive_player(player)
Definition: scene_shared.gsc:842
‪detach_weapon
‪function detach_weapon(weaponObject, tag="tag_weapon_right")
Definition: animation_shared.gsc:694
‪cSceneObject::_should_skip_entity
‪function _should_skip_entity()
Definition: scene_shared.gsc:1737
‪add_player_linked_scene
‪function add_player_linked_scene(linked_scene_str)
Definition: scene_shared.gsc:5286
‪_skip_scene
‪function private _skip_scene()
Definition: scene_shared.gsc:3307
‪DAMAGE_STR
‪#define DAMAGE_STR(dmg)
Definition: scene_shared.gsc:66
‪change
‪function change(team)
Definition: _teams.gsc:258
‪sync_with_other_scenes
‪function sync_with_other_scenes()
Definition: scene_shared.gsc:3104
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪get_script_bundle
‪function get_script_bundle(str_type, str_name)
Definition: struct.csc:45
‪_is_ent_vehicle
‪function _is_ent_vehicle(ent)
Definition: scene_shared.gsc:2174
‪_scene_link
‪function private _scene_link()
Definition: scene_shared.gsc:3957
‪fill_current_clip
‪function fill_current_clip()
Definition: player_shared.gsc:345
‪any_button_pressed
‪function any_button_pressed()
Definition: scene_shared.gsc:5494
‪_wait_for_ordered_notify
‪function private _wait_for_ordered_notify(id, group_obj, group_name, str_note)
Definition: scene_shared.gsc:5596
‪cSceneObject::_player
‪var _player
Definition: scene_shared.gsc:88
‪_load_female_scene
‪function private _load_female_scene(s_bundle, a_ents)
Definition: scene_shared.gsc:4312
‪on_connect
‪function on_connect()
Definition: _arena.gsc:20
‪_trigger_stop
‪function _trigger_stop(trig)
Definition: scene_shared.gsc:4032
‪cSceneObject::_prepare_player
‪function _prepare_player(player)
Definition: scene_shared.gsc:760
‪is_igc_active
‪function is_igc_active()
Definition: scene_shared.gsc:5045
‪wait_till_clear
‪function wait_till_clear(str_flag)
Definition: flag_shared.csc:248
‪is_skipping_player_scene
‪function is_skipping_player_scene()
Definition: scene_shared.gsc:2721
‪on_load_wait
‪function on_load_wait()
Definition: scene_shared.gsc:3969
‪cSceneObject::_play_anim
‪function _play_anim(clientNum, animation, n_delay_min=0, n_delay_max=0, n_rate=1, n_blend, str_siege_shot, loop)
Definition: scene_shared.csc:461
‪play
‪function play(str_state="play", a_ents, b_testing=false, str_mode="")
Definition: scene_shared.gsc:2242
‪cSceneObject::is_alive
‪function is_alive()
Definition: scene_shared.gsc:1688
‪scene_enable_player_stuff
‪function scene_enable_player_stuff(b_hide_hud=true)
Definition: scene_shared.gsc:4989
‪add_wait_for_streamer_hint_scene
‪function add_wait_for_streamer_hint_scene(str_scene_name)
Definition: scene_shared.gsc:5660
‪cSceneObject::finish
‪function finish(b_clear=false)
Definition: scene_shared.csc:238
‪_stop_instance
‪function _stop_instance(b_clear=false, str_scenedef)
Definition: scene_shared.gsc:4695
‪cSceneObject::_assign_unique_name
‪function _assign_unique_name()
Definition: scene_shared.csc:320
‪cSceneObject::play_regroup_fx_for_scene
‪function play_regroup_fx_for_scene(e_player)
Definition: scene_shared.gsc:1546
‪_trigger_play
‪function _trigger_play(trig)
Definition: scene_shared.gsc:4010
‪remove_from_sync_list
‪function remove_from_sync_list()
Definition: scene_shared.gsc:1948
‪a_ret
‪return a_ret
Definition: util_shared.gsc:3330
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265
‪_str_state
‪var _str_state
Definition: scene_shared.gsc:1886