‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
teamgather_shared.gsc
Go to the documentation of this file.
1 
2 #using scripts\codescripts\struct;
3 
4 #using scripts\shared\callbacks_shared;
5 #using scripts\shared\clientfield_shared;
6 #using scripts\shared\doors_shared;
7 #using scripts\shared\flagsys_shared;
8 #using scripts\shared\gameobjects_shared;
9 #using scripts\shared\scene_shared;
10 #using scripts\shared\system_shared;
11 #using scripts\shared\util_shared;
12 #using scripts\shared\visionset_mgr_shared;
13 
14 #insert scripts\shared\shared.gsh;
15 #insert scripts\shared\version.gsh;
16 
17 #namespace teamgather;
18 
19 #define FLOOR_EFFECTS_ACTIVE 0
20 
21 #define GATHER_POSITION_OFFSET -100.0
22 
23 #define IN_POSITION_MIN_TIME (0.0)
24 #define DISPLAY_SUCCESS_TEXT_TIME (0) // 2
25 
26 #precache( "triggerstring", "TEAM_GATHER_HOLD_FOR_TEAM_ENTER" );
27 #precache( "string", "TEAM_GATHER_TEAM_STEALTH_ENTER" );
28 #precache( "string", "TEAM_GATHER_PLAYERS_READY" );
29 #precache( "string", "TEAM_GATHER_TIME_REMAINING_1" );
30 #precache( "string", "TEAM_GATHER_TIME_REMAINING_2" );
31 #precache( "string", "TEAM_GATHER_TIME_REMAINING_3" );
32 #precache( "string", "TEAM_GATHER_TIME_REMAINING_4" );
33 #precache( "string", "TEAM_GATHER_TIME_REMAINING_5" );
34 #precache( "string", "TEAM_GATHER_TIME_REMAINING_6" );
35 #precache( "string", "TEAM_GATHER_TIME_REMAINING_7" );
36 #precache( "string", "TEAM_GATHER_TIME_REMAINING_8" );
37 #precache( "string", "TEAM_GATHER_TIME_REMAINING_9" );
38 #precache( "string", "TEAM_GATHER_TIME_REMAINING_10" );
39 #precache( "string", "TEAM_GATHER_TEAM_EVENT_ABORTED" );
40 #precache( "string", "TEAM_GATHER_PLAYER_STARTING_EVENT" );
41 #precache( "string", "TEAM_GATHER_NUM_PLAYERS" );
42 #precache( "string", "TEAM_GATHER_HOLD_TO_GO_NOW" );
43 #precache( "string", "TEAM_GATHER_GATHER_SUCCESS" );
44 #precache( "string", "TEAM_GATHER_START_IN_1" );
45 #precache( "string", "TEAM_GATHER_START_IN_2" );
46 #precache( "string", "TEAM_GATHER_START_IN_3" );
47 #precache( "string", "TEAM_GATHER_START_IN_4" );
48 #precache( "string", "TEAM_GATHER_START_IN_5" );
49 #precache( "string", "TEAM_GATHER_START_IN_6" );
50 #precache( "string", "TEAM_GATHER_START_IN_7" );
51 #precache( "string", "TEAM_GATHER_START_IN_8" );
52 #precache( "string", "TEAM_GATHER_START_IN_9" );
53 #precache( "string", "TEAM_GATHER_START_IN_10" );
54 
55 #define GATHER_RADIUS (42*5) // 42*4
56 #define TELEPORT_RADIUS ( GATHER_RADIUS - 42 )
57 #define GATHER_COUNTDOWN 10 // 10
58 #define MIN_PLAYER_TELEPORT_DISTANCE (42*2)
59 
60 #define GATHER_FLOOR_EFFECT "_t6/misc/fx_ui_flagbase_pmc"
61 
62 #define WAYPOINT_SHADER "T7_hud_prompt_press_64" // "t7_hud_waypoints_beacon"
63 #define COMPASS_SHADER "T7_hud_prompt_press_64" // "t7_hud_minimap_beacon_key"
64 
65 #precache( "material", WAYPOINT_SHADER );
66 #precache( "material", COMPASS_SHADER );
67 
68 #precache( "fx", "_t6/misc/fx_ui_flagbase_pmc" );
69 
70 
71 
72 //*****************************************************************************
73 //*****************************************************************************
74 
76 {
78 
81 
83 
85 
88 
91 
94 
96 
97  var ‪m_e_player_leader; // Player who started the teamgather event
98 
100  {
101  ‪e_gameobject = undefined;
102  ‪n_font_scale = 2.0;
103  ‪v_font_color = ( 1.0, 1.0, 1.0 );
104 
105  ‪m_teamgather_complete = false;
106 
107  ‪m_num_players = 0;
109 
110  ‪m_gather_fx = undefined;
111 
112  ‪m_teamgather_complete = false;
113  ‪m_success = false;
114  }
115 
117  {
118  }
119 
120  //*******************************************************
121  //*******************************************************
122  function ‪cleanup()
123  {
126  }
127 
128  //*******************************************************
129  //*******************************************************
130  function ‪create_teamgather_event( v_interact_pos, v_interact_angles, v_gather_pos, e_interact_entity )
131  {
132  ‪m_v_interact_position = v_interact_pos;
133  ‪m_v_interact_angles = v_interact_angles;
134 
135  ‪m_e_interact_entity = e_interact_entity;
136 
137  ‪m_v_gather_position = v_gather_pos;
138 
139  // Create the interact gameobject
140  ‪e_gameobject = ‪setup_gameobject( v_interact_pos, undefined, &"TEAM_GATHER_HOLD_FOR_TEAM_ENTER", ‪m_e_interact_entity );
141  ‪e_gameobject.c_teamgather = self;
142 
143  // Wait for the interact to be triggered by a player
144  ‪e_gameobject waittill( "player_interaction" );
145 
146  // Disable the interaction gameobject
148 
149  // Add Team Action Advertisement over the door
150 
151  // Change color of the door
152 
153  // Spawn the indicator effect on the ground
155 
156  // Highlight Interact Entity - ON
158 
159  // MAIN - Wait for the results of the gather, BLOCKING
160  b_success = ‪gather_players();
161 
162  // End - Cleanup gather effect on the floor
164 
165  // Highlight Interact Entity - OFF
167 
168  // How did it go?
169  if( ‪IS_TRUE(b_success) )
170  {
172  }
173  else
174  {
176  }
177 
178  return( b_success );
179  }
180 
181  //*******************************************************
182  //*******************************************************
184  {
186  {
187  x_off = 0;
188  y_off = 180;
189  a_players = ‪get_players_playing();
190 
191  for( i=0; i<a_players.size; i++ )
192  {
193  e_player = a_players[i];
194  e_player.success_hud_elem = e_player ‪__create_client_hud_elem( "center", "middle", "center", "top", x_off, y_off, ‪n_font_scale, ‪v_font_color, &"TEAM_GATHER_GATHER_SUCCESS" );
195  }
196 
198 
199  for( i=0; i<a_players.size; i++ )
200  {
201  e_player = a_players[i];
202  e_player.success_hud_elem Destroy();
203  }
204  }
205  }
206 
207  //*******************************************************
208  //*******************************************************
210  {
211  x_off = 0;
212  y_off = 180;
213  a_players = ‪get_players_playing();
214 
215  for( i=0; i<a_players.size; i++ )
216  {
217  e_player = a_players[i];
218  e_player.failure_hud_elem = e_player ‪__create_client_hud_elem( "center", "middle", "center", "top", x_off, y_off, ‪n_font_scale, ‪v_font_color, &"TEAM_GATHER_TEAM_EVENT_ABORTED" );
219  }
220 
222 
223  for( i=0; i<a_players.size; i++ )
224  {
225  e_player = a_players[i];
226  e_player.failure_hud_elem Destroy();
227  }
228  }
229 
230  //*******************************************************
231  //*******************************************************
232  function ‪setup_gameobject( v_pos, STR_MODEL, STR_USE_HINT, e_los_ignore_me )
233  {
234  n_radius = 48;
235 
236  // Setup a USE Trigger
237  e_trigger = ‪spawn( "trigger_radius_use", v_pos, 0, n_radius, 30 );
238  e_trigger TriggerIgnoreTeam();
239  e_trigger SetVisibleToAll();
240  e_trigger SetTeamForTrigger( "none" );
241  e_trigger UseTriggerRequireLookAt();
242  e_trigger SetCursorHint( "HINT_NOICON" );
243 
244  // You can add multiple models into the gameobjects model array, each with their own relative offset
245  gobj_model_offset = ( 0, 0, 0 );
246  if( IsDefined(STR_MODEL) )
247  {
248  gobj_visuals[0] = ‪spawn( "script_model", v_pos + gobj_model_offset );
249  gobj_visuals[0] setModel( STR_MODEL );
250  }
251  else
252  {
253  gobj_visuals = [];
254  }
255 
256  // This is the LUA objective name, defined in the gametype LUA script
257  // CP currently only uses coop
258  // It defines the look and style of the LUA icons
259  //gobj_objective_name = &"bomb";
260  gobj_objective_name = undefined;
261 
262  // Create the gameobject
263  gobj_team = "allies";
264  gobj_trigger = e_trigger;
265  gobj_offset = ( 0, 0, -5 );
266  e_object = ‪gameobjects::create_use_object( gobj_team, gobj_trigger, gobj_visuals, gobj_offset, gobj_objective_name );
267 
268  // Setup gameobject params
269  e_object ‪gameobjects::allow_use( "any" );
270  e_object ‪gameobjects::set_use_time( 0.0 ); // How long the progress bar takes to complete
271  e_object ‪gameobjects::set_use_text( "" );
272  e_object ‪gameobjects::set_use_hint_text( STR_USE_HINT );
273  e_object ‪gameobjects::set_visible_team( "any" ); // How can see the gameobject
274 
275  // Setup gameobject callbacks
276  e_object.onUse = &‪onUseGameobject;
277 
278  // OLD STYLE OBJECTIVES
279  e_object ‪gameobjects::set_3d_icon( "friendly", ‪WAYPOINT_SHADER );
280  e_object ‪gameobjects::set_3d_icon( "enemy", ‪WAYPOINT_SHADER );
281  e_object ‪gameobjects::set_2d_icon( "friendly", ‪COMPASS_SHADER );
282  e_object ‪gameobjects::set_2d_icon( "enemy", ‪COMPASS_SHADER );
283 
284  e_object thread ‪gameobjects::hide_icon_distance_and_los( (1,1,1), 42*20, true, e_los_ignore_me );
285 
286  return( e_object );
287  }
288 
289 
290  //*******************************************************
291  //*******************************************************
292  // Called when gameobject has been "used"
293  function ‪onUseGameobject( player )
294  {
295  //iprintlnbold( "Starting Team Gather" );
296  self.c_teamgather.m_e_player_leader = player;
297  self notify( "player_interaction" );
298  }
299 
300  //*******************************************************
301  //*******************************************************
302  // self = class
304  {
306  {
307  return;
308  }
309 
310  v_pos = ‪m_v_gather_position;
311 
312  // Make sure the gather position is on the plane of the floor
313  v_start = ( v_pos[0], v_pos[1], v_pos[2]+20 );
314  v_end = ( v_pos[0], v_pos[1], v_pos[2]-94 );
315  ‪trace = BulletTrace( v_start, v_end, 0, undefined );
316 
317  v_floor_pos = ‪trace[ "position" ];
318 
319  ‪m_gather_fx = spawnFx( ‪GATHER_FLOOR_EFFECT, v_floor_pos );
320  triggerFx( ‪m_gather_fx );
321  }
322 
323  //*******************************************************
324  //*******************************************************
325  // self = class
327  {
329  {
330  return;
331  }
332 
333  if( IsDefined(‪m_gather_fx) )
334  {
335  ‪m_gather_fx Delete();
336  ‪m_gather_fx = undefined;
337  }
338  }
339 
340  //*******************************************************
341  //*******************************************************
342  // self = class
343  function ‪interact_entity_highlight( highlight_object )
344  {
345  if( IsDefined(‪m_e_interact_entity) )
346  {
347  if( ‪IS_TRUE(highlight_object) )
348  {
349  ‪m_e_interact_entity ‪clientfield::set( "teamgather_material", 1 );
350  }
351  else
352  {
353  ‪m_e_interact_entity ‪clientfield::set( "teamgather_material", 0 );
354  }
355  }
356  }
357 
358  //*******************************************************
359  // Wait for players to gather at the team gather position
360  //*******************************************************
361  // self = class
362  function ‪gather_players()
363  {
365 
367 
368  // Wait for the gather players function to finish
369  b_success = ‪teamgather_main_update();
370 
371  return( b_success );
372  }
373 
374 
375  //******************************************************
376  //******************************************************
377  // self = class
379  {
380  // Display HUD for the players
381  a_players = ‪get_players_playing();
382 
383  // Flow goes straight to Success if just 1 player
384  if( a_players.size <= 1 )
385  {
386  return;
387  }
388 
389  for( i=0; i<a_players.size; i++ )
390  {
391  e_player = a_players[i];
392  if( e_player == self.‪m_e_player_leader )
393  {
394  self thread ‪display_hud_player_leader( e_player );
395  }
396  else
397  {
398  self thread ‪display_hud_player_team_member( e_player );
399  }
400  }
401  }
402 
403  //******************************************************
404  //******************************************************
406  {
407  return( self.‪m_teamgather_complete );
408  }
409 
410  //******************************************************
411  //******************************************************
412  function ‪set_teamgather_complete( success )
413  {
414  self.m_teamgather_complete = true;
415  self.m_success = success;
416  }
417 
418  //******************************************************
419  // UPDATE
420  //******************************************************
421  // self = class
423  {
424  // While there's time remaing in the teamgather
425  while( !‪is_teamgather_complete() )
426  {
427  // Check if the team are in the gather radius
429 
430  // If all players out of position, trigger failure
431  if( ‪m_num_players_ready == 0 )
432  {
434  break;
435  }
436 
437  // If all the players are in position for, trigger success
439  {
440  if( ‪players_in_position( true ) )
441  {
443  break;
444  }
445  }
446  else
447  {
448  ‪players_in_position( false );
449  }
450 
451  // Update time remaining
452  time_remaining = ‪get_time_remaining();
453  if( time_remaining <= 0 )
454  {
456  break;
457  }
458 
460  }
461 
462  // Check for success
463  if( ‪m_success == true )
464  {
465  // Teleport any players out of position into the event area
467  }
468  else
469  {
470 
471  }
472 
473  // Cleanup
474  a_players = ‪get_players_playing();
475  for( i=0; i<a_players.size; i++ )
476  {
477  e_player = a_players[i];
478  if( ‪IS_TRUE(e_player.in_gather_position) )
479  {
480  e_player ‪util::_enableWeapon();
481  }
482  e_player.in_gather_position = undefined;
483  }
484 
485  return( ‪m_success );
486  }
487 
488  //******************************************************
489  //******************************************************
490  // self = class
491  function ‪players_in_position( in_position )
492  {
493  if( ‪IS_TRUE(in_position) )
494  {
495  if( !IsDefined(self.in_position_start_time) )
496  {
497  self.in_position_start_time = gettime();
498  }
499 
500  time = gettime();
501  dt = ( time - self.in_position_start_time ) / 1000;
502  if( dt >= ‪IN_POSITION_MIN_TIME )
503  {
504  return( true );
505  }
506  }
507  else
508  {
509  self.in_position_start_time = undefined;
510  }
511 
512  return( false );
513  }
514 
515  //******************************************************
516  //******************************************************
517  // self = class
518  function ‪update_players_in_radius( force_player_into_position )
519  {
520  // Setup
521  a_players = ‪get_players_playing();
522  ‪m_num_players = a_players.size;
523 
524  for( i=0; i<a_players.size; i++ )
525  {
526  a_players[i].in_gather_position = undefined;
527  }
528 
529  // Update players radius check and weapon state every frame
531  for( i=0; i<a_players.size; i++ )
532  {
533  e_player = a_players[i];
534 
535  // Update players gather status
536  e_player.in_gather_position = ‪is_player_in_gather_position( e_player );
537 
538  // If force into position flag is set, make sure he's in position
539  if( ‪IS_TRUE(force_player_into_position) && !‪IS_TRUE(e_player.in_gather_position) )
540  {
542  }
543 
544  // If the player is in position, lower his weapon is down
545  if( ‪IS_TRUE(e_player.in_gather_position) )
546  {
547  e_player ‪player_lowready_state( true );
549  }
550 
551  // If not in position, lower his weapon
552  else
553  {
554  e_player ‪player_lowready_state( false );
555 
556  // If its a team member and they aren't in position, they can use the X button to zoom into position
557  if( e_player != ‪m_e_player_leader )
558  {
560  }
561  }
562  }
563  }
564 
565  //******************************************************
566  //******************************************************
567  // self = class
568  function ‪is_player_in_gather_position( e_player )
569  {
570  player_valid = true;
571 
572  // Basic 2d check to see if player is in range
573  n_dist = Distance2D( e_player.origin, ‪m_v_gather_position );
574  if( n_dist > ‪GATHER_RADIUS )
575  {
576  player_valid = false;
577  }
578  else
579  {
580  v_start_pos = ( e_player.origin[0], e_player.origin[1],e_player.origin[2]+32 );
582 
583  // If below the point, reject
584  if( (e_player.origin[2] - v_end_pos[2]) < -64 )
585  {
586  player_valid = false;
587  }
588 
589  // Cast a ray to the floor to check no geo is blocking
590  v_trace = BulletTrace( v_start_pos, v_end_pos, 0, undefined );
591  v_trace_pos = v_trace[ "position" ];
592  dz = abs( v_trace_pos[2] - ‪m_v_gather_position[2] );
593  if( dz > 64 )
594  {
595  player_valid = false;
596  }
597  }
598 
599  return( player_valid);
600  }
601 
602  //******************************************************
603  //******************************************************
604  // self = player
605  function ‪player_lowready_state( lower_weapon )
606  {
607  // Lower weapon
608  if( lower_weapon )
609  {
610  if( self ‪util::isWeaponEnabled() )
611  {
613  }
614  }
615  // Raise weapon
616  else
617  {
618  if( !(self ‪util::isWeaponEnabled()) )
619  {
620  self ‪util::_enableWeapon();
621  }
622  }
623  }
624 
625  //******************************************************
626  //******************************************************
627  // self = class
628  function ‪team_member_zoom_button_check( e_player )
629  {
630  // Did the player request to zoom into position?
631  if( (e_player UseButtonPressed()) )
632  {
634  }
635  }
636 
637  //******************************************************
638  //******************************************************
639  // self = class
640  function ‪teleport_player_into_position( e_player )
641  {
642  a_players = ‪get_players_playing();
643 
644  // Keep on creating potential spawn positions until we find one that works
645  while( 1 )
646  {
647  x_offset = RandomFloatRange( -‪TELEPORT_RADIUS, ‪TELEPORT_RADIUS );
648  y_offset = RandomFloatRange( -‪TELEPORT_RADIUS, ‪TELEPORT_RADIUS );
649  e_player.zoom_pos = ( ‪m_v_gather_position[0]+x_offset, ‪m_v_gather_position[1]+y_offset, ‪m_v_gather_position[2] );
650 
651  // Need to be away from other players
652  reject = false;
653  for( i=0; i<a_players.size; i++ )
654  {
655  if( e_player != a_players[i] )
656  {
657  dist = Distance2D( e_player.origin, a_players[i].origin );
659  {
660  reject = true;
661  break;
662  }
663  }
664  }
665 
666  // Make sure its not ahead to the interact position
667  if( !reject )
668  {
669  v_forward = AnglesToForward( ‪m_v_interact_angles );
670  v_dir = vectornormalize( e_player.zoom_pos - ‪m_v_interact_position );
671  dp = vectordot( v_forward, v_dir );
672 
673  // 0.0 = parallel, -ve is safe
674  if( dp > -0.5 ) // -0.5
675  {
676  //iprintlnbold( "Player DP REJECTION" );
677  reject = true;
678  }
679  }
680 
681  if( reject )
682  {
683  break;
684  }
685 
686  if( !positionWouldTelefrag( e_player.zoom_pos ) )
687  {
688  break;
689  }
690  }
691 
692  // Reposition the player
693  e_player SetOrigin( e_player.zoom_pos );
694 
695  // Look at the gather position
696  v0 = ( self.m_v_interact_position[0], self.m_v_interact_position[1], self.m_v_interact_position[2] );
697  v1 = ( e_player.zoom_pos[0], e_player.zoom_pos[1], self.m_v_interact_position[2] );
698  v_dir = vectornormalize( v0 - v1 );
699  v_angles = VectorToAngles( v_dir );
700 
701  e_player SetPlayerAngles( v_angles );
702  }
703 
704  //******************************************************
705  //******************************************************
706  // self = class
707  function ‪display_hud_player_leader( e_player )
708  {
709  e_player endon( "disconnect" );
710 
711  y_start = 180;
712 
713  x_off = 0;
714  y_off = y_start;
715  gather_hud_elem = e_player ‪__create_client_hud_elem( "center", "middle", "center", "top", x_off, y_off, ‪n_font_scale, ‪v_font_color, &"TEAM_GATHER_TEAM_STEALTH_ENTER" );
716 
717  x_off = 0;
718  y_off = y_start + 100;
719  ready_hud_elem = e_player ‪__create_client_hud_elem( "center", "middle", "center", "top", x_off, y_off, ‪n_font_scale, ‪v_font_color, "" );
720 
721  x_off = -45;
722  y_off = y_start + 130;
723  execute_hud_elem = e_player ‪__create_client_hud_elem( "left", "middle", "center", "top", x_off, y_off, ‪n_font_scale, ‪v_font_color, "" );
724 
725  a_time_remaining = ‪array( "0", &"TEAM_GATHER_TIME_REMAINING_1", &"TEAM_GATHER_TIME_REMAINING_2", &"TEAM_GATHER_TIME_REMAINING_3", &"TEAM_GATHER_TIME_REMAINING_4",
726  &"TEAM_GATHER_TIME_REMAINING_5", &"TEAM_GATHER_TIME_REMAINING_6", &"TEAM_GATHER_TIME_REMAINING_7", &"TEAM_GATHER_TIME_REMAINING_8",
727  &"TEAM_GATHER_TIME_REMAINING_9", &"TEAM_GATHER_TIME_REMAINING_10" );
728 
729  while( !‪is_teamgather_complete() )
730  {
731  // Create the text for the number of players ready
732  // TODO - TEXT WARNING
733  ready_hud_elem setText( &"TEAM_GATHER_PLAYERS_READY", ‪m_num_players_ready, ‪m_num_players );
734 
735  // Create the text for the time remaining
737  execute_hud_elem setText( a_time_remaining[ time_remaining ] );
738 
740  }
741 
742  gather_hud_elem Destroy();
743  ready_hud_elem Destroy();
744  execute_hud_elem Destroy();
745  }
746 
747  //******************************************************
748  //******************************************************
749  // self = class
751  {
752  e_player endon( "disconnect" );
753 
754  y_start = 180;
755 
756  x_off = 0;
757  y_off = y_start;
758 
759  // TODO - TEXT WARNING
760  starting_hud_elem = e_player ‪__create_client_hud_elem( "center", "middle", "center", "top", x_off, y_off, ‪n_font_scale, ‪v_font_color, "" );
761  starting_hud_elem setText( &"TEAM_GATHER_PLAYER_STARTING_EVENT", self.‪m_e_player_leader ); // self.m_e_player_leader.playername
762 
763  x_off = -118;
764  y_off = y_start + 40;
765  gathered_hud_elem = e_player ‪__create_client_hud_elem( "left", "middle", "center", "top", x_off, y_off, ‪n_font_scale, ‪v_font_color, "" );
766 
767  x_off = -118 + 172;
768  y_off = y_start + 40;
769  start_in_hud_elem = e_player ‪__create_client_hud_elem( "left", "middle", "center", "top", x_off, y_off, ‪n_font_scale, ‪v_font_color, "" );
770 
771  x_off = 0;
772  y_off = y_start + 80;
773  go_hud_elem = e_player ‪__create_client_hud_elem( "center", "middle", "center", "top", x_off, y_off, ‪n_font_scale, ‪v_font_color, "" );
774 
775  a_start_in = ‪array( "0", &"TEAM_GATHER_START_IN_1", &"TEAM_GATHER_START_IN_2", &"TEAM_GATHER_START_IN_3", &"TEAM_GATHER_START_IN_4",
776  &"TEAM_GATHER_START_IN_5", &"TEAM_GATHER_START_IN_6", &"TEAM_GATHER_START_IN_7", &"TEAM_GATHER_START_IN_8",
777  &"TEAM_GATHER_START_IN_9", &"TEAM_GATHER_START_IN_10" );
778 
780  {
781  // Display num players gathered
782  // TODO - TEXT WARNING
783  gathered_hud_elem setText( &"TEAM_GATHER_NUM_PLAYERS", int(‪m_num_players_ready), int(‪m_num_players) );
784 
785  // Display start in time
786  time_remaining = ‪get_time_remaining_in_seconds();
787  start_in_hud_elem setText( a_start_in[ time_remaining ] );
788 
789  // Can the player use X to teleport to position?
790  if( ‪IS_TRUE(e_player.in_gather_position) )
791  {
792  go_hud_elem setText( "" );
793  }
794  else
795  {
796  go_hud_elem setText( &"TEAM_GATHER_HOLD_TO_GO_NOW" );
797  }
798 
800  }
801 
802  starting_hud_elem Destroy();
803  gathered_hud_elem Destroy();
804  start_in_hud_elem Destroy();
805  go_hud_elem Destroy();
806  }
807 
808  //******************************************************
809  //******************************************************
810  // self = the player
811  function ‪__create_client_hud_elem( alignX, alignY, horzAlign, vertAlign, xOffset, yOffset, fontScale, color, str_text )
812  {
813  hud_elem = NewClientHudElem( self );
814  hud_elem.elemType = "font";
815  hud_elem.font = "objective";
816  hud_elem.alignX = alignX;
817  hud_elem.alignY = alignY;
818  hud_elem.horzAlign = horzAlign;
819  hud_elem.vertAlign = vertAlign;
820  hud_elem.x += xOffset;
821  hud_elem.y += yOffset;
822  hud_elem.foreground = true;
823  hud_elem.fontScale = fontScale;
824  hud_elem.alpha = 1;
825  hud_elem.color = color;
826  hud_elem.hidewheninmenu = true;
827  hud_elem SetText( str_text );
828  return hud_elem;
829  }
830 
831  //******************************************************
832  //******************************************************
833  // self = class
834  function ‪start_player_timer( total_time )
835  {
836  self.e_gameobject.start_time = gettime();
837  self.e_gameobject.total_time = total_time;
838  }
839 
840  //******************************************************
841  //******************************************************
842  // self = class
844  {
845  time = gettime();
846  dt = ( time - self.e_gameobject.start_time ) / 1000;
847  time_remaining = self.e_gameobject.total_time - dt;
848  return( time_remaining );
849  }
850 
851  //******************************************************
852  //******************************************************
853  // self = class
855  {
856  time_remaining = int ( ‪get_time_remaining() );
857  time_remaining += 1;
858  if( time_remaining > ‪GATHER_COUNTDOWN )
859  {
860  time_remaining = ‪GATHER_COUNTDOWN;
861  }
862 
863  if( time_remaining > 10 )
864  {
865  time_remaining = 10;
866  }
867  else if( time_remaining < 1 )
868  {
869  time_remaining = 1;
870  }
871 
872  return( time_remaining );
873  }
874 
875  //******************************************************
876  // Returns an array of "playing" players
877  //******************************************************
879  {
880  a_players = [];
881 
882  a_all_players = getplayers();
883  for( i=0; i<a_all_players.size; i++ )
884  {
885  e_player = a_all_players[i];
886  if( e_player.sessionstate == "playing" )
887  {
888  a_players[a_players.size] = e_player;
889  }
890  }
891 
892  return( a_players );
893  }
894 }
895 
896 
897 //*****************************************************************************
898 //*****************************************************************************
899 //*****************************************************************************
900 //*****************************************************************************
901 
902 function ‪setup_teamgather( v_interact_pos, v_interact_angles, e_interact_entity )
903 {
904  // Calculate the gather position
905  v_forward = AnglesToForward( v_interact_angles );
906  v_gather_pos = v_interact_pos + ( v_forward * ‪GATHER_POSITION_OFFSET );
907 
908  // Cast a ray to clip the gather positon to the floor
909  v_start = ( v_gather_pos[0], v_gather_pos[1], v_gather_pos[2] + 20 );
910  v_end = ( v_gather_pos[0], v_gather_pos[1], v_gather_pos[2] - 100 );
911  v_trace = BulletTrace( v_start, v_end, 0, undefined );
912  v_floor_pos = v_trace[ "position" ];
913 
914  v_gather_pos = ( v_gather_pos[0], v_gather_pos[1], v_floor_pos[2]+10 );
915 
916  c_teamgather = new ‪cTeamGather();
917  success = [[ c_teamgather ]]->create_teamgather_event( v_interact_pos, v_interact_angles, v_gather_pos, e_interact_entity );
918 
919  // Return the player if successful
920  if( success )
921  {
922  e_player = c_teamgather.m_e_player_leader;
923  }
924  else
925  {
926  e_player = undefined;
927  }
928 
929  // TODO: Clean up the class, there is no delete() available....
930  [[ c_teamgather ]]->cleanup();
931 
932  return( e_player );
933 }
934 
‪create_use_object
‪function create_use_object(ownerTeam, trigger, visuals, offset, objectiveName, allowInitialHoldDelay=false, allowWeaponCyclingDuringHold=false)
Definition: gameobjects_shared.gsc:1491
‪cTeamGather
Definition: teamgather_shared.gsc:75
‪GATHER_COUNTDOWN
‪#define GATHER_COUNTDOWN
Definition: teamgather_shared.gsc:57
‪isWeaponEnabled
‪function isWeaponEnabled()
Definition: util_shared.gsc:1158
‪allow_use
‪function allow_use(relativeTeam)
Definition: gameobjects_shared.gsc:3485
‪cTeamGather::spawn_floor_effect
‪function spawn_floor_effect()
Definition: teamgather_shared.gsc:303
‪IN_POSITION_MIN_TIME
‪#define IN_POSITION_MIN_TIME
Definition: teamgather_shared.gsc:23
‪TELEPORT_RADIUS
‪#define TELEPORT_RADIUS
Definition: teamgather_shared.gsc:56
‪cTeamGather::player_lowready_state
‪function player_lowready_state(lower_weapon)
Definition: teamgather_shared.gsc:605
‪cTeamGather::m_gather_fx
‪var m_gather_fx
Definition: teamgather_shared.gsc:82
‪set_use_time
‪function set_use_time(time)
Definition: gameobjects_shared.gsc:3455
‪cTeamGather::display_hud_player_leader
‪function display_hud_player_leader(e_player)
Definition: teamgather_shared.gsc:707
‪set_2d_icon
‪function set_2d_icon(relativeTeam, shader)
Definition: gameobjects_shared.gsc:3564
‪GATHER_FLOOR_EFFECT
‪#define GATHER_FLOOR_EFFECT
Definition: teamgather_shared.gsc:60
‪cTeamGather::m_e_interact_entity
‪var m_e_interact_entity
Definition: teamgather_shared.gsc:84
‪cTeamGather::interact_entity_highlight
‪function interact_entity_highlight(highlight_object)
Definition: teamgather_shared.gsc:343
‪set_3d_icon
‪function set_3d_icon(relativeTeam, shader)
Definition: gameobjects_shared.gsc:3570
‪cTeamGather::m_v_gather_position
‪var m_v_gather_position
Definition: teamgather_shared.gsc:95
‪cTeamGather::teamgather_main_update
‪function teamgather_main_update()
Definition: teamgather_shared.gsc:422
‪trace
‪function trace(from, to, target)
Definition: grapple.gsc:369
‪cTeamGather::set_teamgather_complete
‪function set_teamgather_complete(success)
Definition: teamgather_shared.gsc:412
‪cTeamGather::update_players_in_radius
‪function update_players_in_radius(force_player_into_position)
Definition: teamgather_shared.gsc:518
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪cTeamGather::setup_gameobject
‪function setup_gameobject(v_pos, STR_MODEL, STR_USE_HINT, e_los_ignore_me)
Definition: teamgather_shared.gsc:232
‪_enableWeapon
‪function _enableWeapon()
Definition: util_shared.gsc:1145
‪cTeamGather::create_teamgather_event
‪function create_teamgather_event(v_interact_pos, v_interact_angles, v_gather_pos, e_interact_entity)
Definition: teamgather_shared.gsc:130
‪COMPASS_SHADER
‪#define COMPASS_SHADER
Definition: teamgather_shared.gsc:63
‪cTeamGather::__create_client_hud_elem
‪function __create_client_hud_elem(alignX, alignY, horzAlign, vertAlign, xOffset, yOffset, fontScale, color, str_text)
Definition: teamgather_shared.gsc:811
‪cTeamGather::get_time_remaining_in_seconds
‪function get_time_remaining_in_seconds()
Definition: teamgather_shared.gsc:854
‪cTeamGather::teleport_player_into_position
‪function teleport_player_into_position(e_player)
Definition: teamgather_shared.gsc:640
‪cTeamGather::players_in_position
‪function players_in_position(in_position)
Definition: teamgather_shared.gsc:491
‪cTeamGather::gather_players
‪function gather_players()
Definition: teamgather_shared.gsc:362
‪GATHER_RADIUS
‪#define GATHER_RADIUS
Definition: teamgather_shared.gsc:55
‪cTeamGather::is_teamgather_complete
‪function is_teamgather_complete()
Definition: teamgather_shared.gsc:405
‪cTeamGather::create_player_huds
‪function create_player_huds()
Definition: teamgather_shared.gsc:378
‪cTeamGather::e_gameobject
‪var e_gameobject
Definition: teamgather_shared.gsc:77
‪hide_icon_distance_and_los
‪function hide_icon_distance_and_los(v_color, hide_distance, los_check, ignore_ent)
Definition: gameobjects_shared.gsc:3690
‪set_visible_team
‪function set_visible_team(relativeTeam)
Definition: gameobjects_shared.gsc:3491
‪cTeamGather::v_font_color
‪var v_font_color
Definition: teamgather_shared.gsc:80
‪cTeamGather::m_teamgather_complete
‪var m_teamgather_complete
Definition: teamgather_shared.gsc:86
‪cTeamGather::destructor
‪destructor()
Definition: teamgather_shared.gsc:116
‪cTeamGather::n_font_scale
‪var n_font_scale
Definition: teamgather_shared.gsc:79
‪cTeamGather::m_num_players_ready
‪var m_num_players_ready
Definition: teamgather_shared.gsc:90
‪_disableWeapon
‪function _disableWeapon()
Definition: util_shared.gsc:1137
‪cTeamGather::team_member_zoom_button_check
‪function team_member_zoom_button_check(e_player)
Definition: teamgather_shared.gsc:628
‪cTeamGather::get_time_remaining
‪function get_time_remaining()
Definition: teamgather_shared.gsc:843
‪cTeamGather::start_player_timer
‪function start_player_timer(total_time)
Definition: teamgather_shared.gsc:834
‪cTeamGather::is_player_in_gather_position
‪function is_player_in_gather_position(e_player)
Definition: teamgather_shared.gsc:568
‪GATHER_POSITION_OFFSET
‪#define GATHER_POSITION_OFFSET
Definition: teamgather_shared.gsc:21
‪cTeamGather::cleanup_floor_effect
‪function cleanup_floor_effect()
Definition: teamgather_shared.gsc:326
‪setup_teamgather
‪class cTeamGather setup_teamgather(v_interact_pos, v_interact_angles, e_interact_entity)
Definition: teamgather_shared.gsc:902
‪array
‪function filter array
Definition: array_shared.csc:16
‪cTeamGather::m_success
‪var m_success
Definition: teamgather_shared.gsc:87
‪cTeamGather::m_v_interact_angles
‪var m_v_interact_angles
Definition: teamgather_shared.gsc:93
‪cTeamGather::display_hud_player_team_member
‪function display_hud_player_team_member(e_player)
Definition: teamgather_shared.gsc:750
‪set_use_hint_text
‪function set_use_hint_text(text)
Definition: gameobjects_shared.gsc:3475
‪cTeamGather::cleanup
‪function cleanup()
Definition: teamgather_shared.gsc:122
‪DISPLAY_SUCCESS_TEXT_TIME
‪#define DISPLAY_SUCCESS_TEXT_TIME
Definition: teamgather_shared.gsc:24
‪cTeamGather::m_e_player_leader
‪var m_e_player_leader
Definition: teamgather_shared.gsc:97
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪cTeamGather::onUseGameobject
‪function onUseGameobject(player)
Definition: teamgather_shared.gsc:293
‪cTeamGather::m_num_players
‪var m_num_players
Definition: teamgather_shared.gsc:89
‪set_use_text
‪function set_use_text(text)
Definition: gameobjects_shared.gsc:3460
‪cTeamGather::m_v_interact_position
‪var m_v_interact_position
Definition: teamgather_shared.gsc:92
‪FLOOR_EFFECTS_ACTIVE
‪#define FLOOR_EFFECTS_ACTIVE
Definition: teamgather_shared.gsc:19
‪cTeamGather::teamgather_failure
‪function teamgather_failure()
Definition: teamgather_shared.gsc:209
‪cTeamGather::constructor
‪constructor()
Definition: teamgather_shared.gsc:99
‪destroy_object
‪function destroy_object(deleteTrigger, forceHide, b_connect_paths=false)
Definition: gameobjects_shared.gsc:3872
‪MIN_PLAYER_TELEPORT_DISTANCE
‪#define MIN_PLAYER_TELEPORT_DISTANCE
Definition: teamgather_shared.gsc:58
‪WAYPOINT_SHADER
‪#define WAYPOINT_SHADER
Definition: teamgather_shared.gsc:62
‪cTeamGather::teamgather_success
‪function teamgather_success()
Definition: teamgather_shared.gsc:183
‪cTeamGather::get_players_playing
‪function get_players_playing()
Definition: teamgather_shared.gsc:878
‪disable_object
‪function disable_object(forceHide)
Definition: gameobjects_shared.gsc:3909
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265