‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_zm_perk_random.gsc
Go to the documentation of this file.
1 #using scripts\shared\util_shared;
2 
3 #using scripts\shared\array_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\flag_shared;
6 #using scripts\shared\scene_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\util_shared;
9 #using scripts\shared\flagsys_shared;
10 
11 #using scripts\zm\_zm_equipment;
12 #using scripts\zm\_zm_perks;
13 #using scripts\zm\_zm_score;
14 #using scripts\zm\_zm_stats;
15 #using scripts\zm\_zm_unitrigger;
16 #using scripts\zm\_zm_utility;
17 #using scripts\zm\_zm_devgui;
18 
19 
20 
21 #insert scripts\shared\shared.gsh;
22 #insert scripts\shared\version.gsh;
23 #insert scripts\zm\_zm_perks.gsh;
24 #insert scripts\zm\_zm_perk_random.gsh;
25 #insert scripts\zm\_zm_utility.gsh;
26 
27 #define RANDOM_PERK_MOVE_MIN 3
28 #define RANDOM_PERK_MOVE_MAX 7
29 
30 
31 
32 
33 #precache( "string", "ZOMBIE_RANDOM_PERK_TOO_MANY" );
34 #precache( "string", "ZOMBIE_RANDOM_PERK_BUY" );
35 #precache( "string", "ZOMBIE_RANDOM_PERK_PICKUP" );
36 #precache( "string", "ZOMBIE_RANDOM_PERK_ELSEWHERE" );
37 
38 
39 
40 #namespace zm_perk_random;
41 
42 ‪REGISTER_SYSTEM_EX( "zm_perk_random", &‪__init__, &‪__main__, undefined )
43 
44 function ‪__init__()
45 {
46  level._random_zombie_perk_cost = 1500;
47 
48  ‪clientfield::register( "scriptmover", "perk_bottle_cycle_state", ‪VERSION_DLC1, 2, "int" );
49  ‪clientfield::register( "zbarrier", "set_client_light_state", ‪VERSION_DLC1, 2, "int" );
50  ‪clientfield::register( "zbarrier", "client_stone_emmissive_blink", ‪VERSION_DLC1, 1, "int" );
51  ‪clientfield::register( "zbarrier", "init_perk_random_machine", ‪VERSION_DLC1, 1, "int" );
52  ‪clientfield::register( "scriptmover", "turn_active_perk_light_green", ‪VERSION_DLC1, 1, "int" );
53  ‪clientfield::register( "scriptmover", "turn_on_location_indicator", ‪VERSION_DLC1, 1, "int" );
54  ‪clientfield::register( "zbarrier", "lightning_bolt_FX_toggle", ‪VERSION_TU10, 1, "int");
55  ‪clientfield::register( "scriptmover", "turn_active_perk_ball_light", ‪VERSION_DLC1, 1, "int" );
56  ‪clientfield::register( "scriptmover", "zone_captured", ‪VERSION_DLC1, 1, "int" );
57 
58  level._effect[ "perk_machine_light_yellow" ] = "dlc1/castle/fx_wonder_fizz_light_yellow";
59  level._effect[ "perk_machine_light_red" ] = "dlc1/castle/fx_wonder_fizz_light_red";
60  level._effect[ "perk_machine_light_green" ] = "dlc1/castle/fx_wonder_fizz_light_green";
61  level._effect[ "perk_machine_location" ] = "fx/zombie/fx_wonder_fizz_lightning_all";
62 
63 
64  level ‪flag::init( "machine_can_reset" );
65 }
66 
67 function ‪__main__()
68 {
69  if ( !IsDefined( level.perk_random_machine_count ) )
70  {
71  level.perk_random_machine_count = 1;
72  }
73  if ( !IsDefined( level.perk_random_machine_state_func ) )
74  {
75  level.perk_random_machine_state_func = &‪process_perk_random_machine_state;
76  }
77 
78  /#
79  level thread ‪setup_devgui();
80  #/
81 
82  level thread ‪setup_perk_random_machines();
83 }
84 
86 {
87  waittillframeend;
88 
89  level.perk_bottle_weapon_array = ArrayCombine( level.machine_assets, level._custom_perks, false, true );
90 
91  level.perk_random_machines = GetEntArray( "perk_random_machine", "targetname" );
92  level.perk_random_machine_count = level.perk_random_machines.size;
93 
95 }
96 
98 {
99 
100  foreach( machine in level.perk_random_machines )
101  {
102  if ( !isDefined(machine.cost ) )
103  {
104  // default perk machine cost
105  machine.cost = ‪ZM_PERK_RANDOM_COST;
106  }
107 
108  machine.current_perk_random_machine = false;
109  machine.uses_at_current_location = 0;
111  machine ‪clientfield::set( "init_perk_random_machine", 1 );
112 
113  wait .5; //let machine init before setting its state
114 
115  machine thread ‪set_perk_random_machine_state( "power_off" );
116 
117  }
118 
119  level.perk_random_machines = array::randomize( level.perk_random_machines );
120 
122 }
123 
124 
126 {
127  b_starting_machine_found = false;
128  for ( i = 0; i < level.perk_random_machines.size; i++ )
129  {
130  //level.perk_random_machines[i] clientfield::set( ZM_BGB_MACHINE_CF_NAME, 1 );
131 
132  // Semi-random implementation (not completely random). The list is randomized
133  // prior to getting here.
134  // Pick from the first perk_random_machine marked as the "start_perk_random_machine"
135  if ( IsDefined( level.perk_random_machines[i].script_noteworthy ) && IsSubStr( level.perk_random_machines[i].script_noteworthy, "start_perk_random_machine" ) && !‪IS_TRUE(b_starting_machine_found))
136  {
137  level.perk_random_machines[i].current_perk_random_machine = true;
138  level.perk_random_machines[i] thread ‪machine_think();
139  level.perk_random_machines[i] thread ‪set_perk_random_machine_state("initial");
140  b_starting_machine_found = true;
141 
142  }
143  else
144  {
145  level.perk_random_machines[i] thread ‪wait_for_power();
146  }
147 
148  }
149 }
150 
152 {
153  self.unitrigger_stub = spawnstruct();
154  self.unitrigger_stub.script_width = 70;
155  self.unitrigger_stub.script_height = 30;
156  self.unitrigger_stub.script_length = 40;
157  self.unitrigger_stub.origin = self.origin + (AnglesToRight( self.angles ) * (self.unitrigger_stub.script_length)) + (AnglesToUp( self.angles ) * (self.unitrigger_stub.script_height / 2));
158  self.unitrigger_stub.angles = self.angles;
159  self.unitrigger_stub.script_unitrigger_type = "unitrigger_box_use";
160  self.unitrigger_stub.trigger_target = self;
161  ‪zm_unitrigger::unitrigger_force_per_player_triggers( self.unitrigger_stub, true );
162  self.unitrigger_stub.prompt_and_visibility_func = &‪perk_random_machine_trigger_update_prompt;
163 
164  // Used for multiple power sources
165  self.unitrigger_stub.script_int = self.script_int;
166 
168 
169 }
170 
172 {
173  can_use = self ‪perk_random_machine_stub_update_prompt( player );
174 
175  if ( isdefined( self.hint_string ) )
176  {
177  if ( isdefined( self.hint_parm1 ) )
178  {
179  self SetHintString( self.hint_string, self.hint_parm1 );
180  }
181  else
182  {
183  self SetHintString( self.hint_string );
184  }
185  }
186 
187  return can_use;
188 }
189 
191 {
192  self SetCursorHint( "HINT_NOICON" );
193 
194  if ( !self ‪trigger_visible_to_player( player ) )
195  return false;
196 
197  self.hint_parm1 = undefined;
198 
199  // Is the power on?
200  n_power_on = ‪is_power_on( self.stub.script_int );
201  if ( !n_power_on )
202  {
203  self.hint_string = &"ZOMBIE_NEED_POWER";
204  return false;
205  }
206  else // machine is powered
207  {
208  if ( self.stub.trigger_target.state == "idle" || self.stub.trigger_target.state == "vending" ) // machine is usable ( orb is present )
209  {
210  n_purchase_limit = player ‪zm_utility::get_player_perk_purchase_limit();
212  {
213  self.hint_string = &"ZOMBIE_RANDOM_PERK_TOO_MANY";
214 
215  if ( IsDefined( n_purchase_limit ) )
216  {
217  self.hint_parm1 = n_purchase_limit; // purchase limit in prompt will update as player gets more slots
218  }
219 
220  return false;
221  }
222  else if ( IsDefined( self.stub.trigger_target.machine_user ) ) // machine is currently activated
223  {
224  if ( ‪IS_TRUE( self.stub.trigger_target.grab_perk_hint ) ) // perk is ready to grab
225  {
226 
227 
228  self.hint_string = &"ZOMBIE_RANDOM_PERK_PICKUP";
229  return true;
230 
231  }
232  else // perk is emerging from portal ( don't show prompt during this time )
233  {
234  self.hint_string = "";
235  return false;
236  }
237  }
238  else // machine is not currently activated, but can be activated
239  {
240  n_purchase_limit = player ‪zm_utility::get_player_perk_purchase_limit();
242  {
243  self.hint_string = &"ZOMBIE_RANDOM_PERK_TOO_MANY";
244 
245  if ( IsDefined( n_purchase_limit ) )
246  {
247  self.hint_parm1 = n_purchase_limit; // purchase limit in prompt will update as player gets more slots
248  }
249 
250  return false;
251  }
252  else
253  {
254  self.hint_string = &"ZOMBIE_RANDOM_PERK_BUY";
255  self.hint_parm1 = level._random_zombie_perk_cost;
256  return true;
257  }
258  }
259  }
260  else // machine is unusable because the orb is not present
261  {
262  self.hint_string = &"ZOMBIE_RANDOM_PERK_ELSEWHERE";
263  return false;
264  }
265  }
266 
267 }
268 
270 {
271  self SetInvisibleToPlayer( player );
272 
273  visible = true;
274 
275  // if the machine is activated, trigger is only visible to the player who is using the machine
276  if ( IsDefined( self.stub.trigger_target.machine_user ) )
277  {
278  if ( ( player != self.stub.trigger_target.machine_user ) || ‪zm_utility::is_placeable_mine( self.stub.trigger_target.machine_user GetCurrentWeapon() ) )
279  {
280  visible = false;
281  }
282  }
283  else // only show the trigger if the player can buy the perk
284  {
285  if ( !player ‪can_buy_perk() )
286  {
287  visible = false;
288  }
289  }
290 
291  if ( !visible )
292  {
293  return false;
294  }
295 
296  if( player ‪player_has_all_available_perks() )
297  {
298  return false;
299  }
300 
301  self SetVisibleToPlayer( player );
302  return true;
303 }
304 
305 // check to see if player has all available perks from this machine
306 function ‪player_has_all_available_perks() // self = player
307 {
308  for( i = 0; i < level._random_perk_machine_perk_list.size; i++ )
309  {
310  if( !self HasPerk( level._random_perk_machine_perk_list[i] ) )
311  {
312  return false;
313  }
314  }
315 
316  return true;
317 }
318 
319 function ‪can_buy_perk() // note: hitting the perk limit is a special case, handled through trigger_visible_to_player and the machine_think function
320 {
321  if ( IsDefined( self.is_drinking ) && ‪IS_DRINKING( self.is_drinking ) )
322  {
323  return false;
324  }
325 
326  current_weapon = self GetCurrentWeapon();
328  {
329  return false;
330  }
331 
333  {
334  return false;
335  }
336 
337  if ( current_weapon == level.weaponNone )
338  {
339  return false;
340  }
341 
342  return true;
343 }
344 
346 {
347  self endon( "kill_trigger" );
348 
349  while ( 1 )
350  {
351  self waittill( "trigger", player );
352  self.stub.trigger_target notify( "trigger", player );
353  }
354 }
355 
356 // self = machine
358 {
359  level notify( "machine_think" );
360  level endon( "machine_think" );
361 
362  //SOUND - Shawn J
363  //self thread machine_sounds();
364 
365  self.num_time_used = 0;
366  self.num_til_moved = RandomIntRange( ‪RANDOM_PERK_MOVE_MIN, ‪RANDOM_PERK_MOVE_MAX );
367 
368  // should only play when the ball first arrives at a location
369  // turn on the light on the ball, because the ball is here and the power is on
370  if (self.state !== "initial" || "idle" ) // ball is already there from initial state
371  {
372  self thread ‪set_perk_random_machine_state("arrive");
373 
374  self waittill("arrived");
375 
376  self thread ‪set_perk_random_machine_state("initial");
377 
378  wait( 1 ); //wait for the machine to initialize
379  }
380 
381  if( isdefined(level.zm_custom_perk_random_power_flag) )
382  {
383  level ‪flag::wait_till( level.zm_custom_perk_random_power_flag );
384  }
385  else
386  {
387  // past this point we know that the zone is captured ( power is on )
388  while( !‪is_power_on(self.script_int) )
389  {
390  wait( 1 );
391  }
392  }
393  self thread ‪set_perk_random_machine_state("idle");
394 
395  if ( isdefined( level.bottle_spawn_location ) )
396  {
397  level.bottle_spawn_location Delete();
398  }
399 
400  level.bottle_spawn_location = ‪spawn( "script_model", self.origin );
401  level.bottle_spawn_location setmodel( "tag_origin" );
402  level.bottle_spawn_location.angles = self.angles;
403 
404  level.bottle_spawn_location.origin += ( 0, 0, 65 );
405 
406  while( 1 )
407  {
408  self waittill( "trigger", player );
409  level ‪flag::clear( "machine_can_reset" ); // machine won't reset until time out or player acquires perk
410 
411  //check to see if this is in a capture zone and continue out of the loop if triggered
412  if ( !player ‪zm_score::can_player_purchase( level._random_zombie_perk_cost ) )
413  {
414  //player iprintln( "Not enough points to buy Perk: " + perk );
415  self playsound( "evt_perk_deny" );
416  //* player zm_audio::create_and_play_dialog( "general", "perk_deny", undefined, 0 );
417  continue;
418  }
419 
420  // MACHINE IS BEING USED
421  self.machine_user = player;
422  self.num_time_used++;
423  player ‪zm_stats::increment_client_stat( "use_perk_random" );
424  player ‪zm_stats::increment_player_stat( "use_perk_random" );
425  player ‪zm_score::minus_to_player_score( level._random_zombie_perk_cost );
426  self thread ‪set_perk_random_machine_state( "vending" );
427 
428  // use-machine vo line
429  if ( IsDefined( level.perk_random_vo_func_usemachine ) && IsDefined( player ) )
430  {
431  player thread [[ level.perk_random_vo_func_usemachine ]]();
432  }
433 
434  while( 1 )
435  {
436  // ACTIVATION SEQUENCE
437  random_perk = ‪get_weighted_random_perk( player ); // decide which perk will be made available
438  //self clientfield::set( "perk_bottle_cycle_state", 1 ); // start effects before we start the bottle cycling
439 
440  self playsound( "zmb_rand_perk_start" );
441  self playloopsound( "zmb_rand_perk_loop", 1 );
442 
443  //bottle spawn/perk cycling will be handled via code like the magic box
445  self notify ("bottle_spawned");
446  self thread ‪start_perk_bottle_cycling();
447  self thread ‪perk_bottle_motion(); // bottle moves into place
448  model = ‪get_perk_weapon_model( random_perk ); // show the actual available perk
449  wait( ‪DELAY_UNTIL_BOTTLE_IN_PLACE ); // delay until the perk becomes unavailable
450  self notify( "done_cycling" );
451 
452  // DOES MACHINE MOVE?
453  if ( self.num_time_used >= self.num_til_moved && level.perk_random_machine_count > 1 )
454  {
455  level.bottle_spawn_location setmodel( "wpn_t7_zmb_perk_bottle_bear_world" );
456  self stoploopsound( .5 );
457 
458  self thread ‪set_perk_random_machine_state( "leaving" );
459 
460  wait 3; // wait for maching to start leaving
461  player ‪zm_score::add_to_player_score( level._random_zombie_perk_cost );
462  level.bottle_spawn_location setmodel( "tag_origin" );
463  self thread ‪machine_selector();
464 
465  //self clientfield::set( "perk_bottle_cycle_state", 0 ); // close vortex effect
466  self ‪clientfield::set( "lightning_bolt_FX_toggle", 0 ); // turn off location indicator
467  //* self HidePart( "j_ball" );
468  self.machine_user = undefined;
469  break;
470  }
471  else
472  {
473  level.bottle_spawn_location setmodel( model );
474  }
475 
476  // PERK IS AVAILABLE TO PLAYER
477  self playsound( "zmb_rand_perk_bottle" );
478  self.grab_perk_hint = true; // unitrigger prompt will show the grab_perk message
479  self thread ‪grab_check( player, random_perk );
480  self thread ‪time_out_check();
481  self ‪util::waittill_either( "grab_check", "time_out_check" );
482  self.grab_perk_hint = false;
483 
484  self playsound( "zmb_rand_perk_stop" );
485  self stoploopsound( .5 );
486 
487  // PERK IS GONE, RETURN TO IDLE STATE
488  //self clientfield::set( "perk_bottle_cycle_state", 0 );
489  self.machine_user = undefined;
490  level.bottle_spawn_location setmodel( "tag_origin" );
491  self thread ‪set_perk_random_machine_state( "idle" );
492  break;
493  }
494 
495  // if the player picked up the perk, this will make us wait until the perk is fully acquired before allowing a reroll
496  level ‪flag::wait_till( "machine_can_reset" );
497  }
498 
499 }
500 
501 function ‪grab_check( player, random_perk )
502 {
503  self endon( "time_out_check" );
504 
505  // only trigger if it's the player who bought the perk
506  perk_is_bought = false;
507 
508  while ( !perk_is_bought )
509  {
510  self waittill( "trigger", e_triggerer );
511  if ( e_triggerer == player )
512  {
513  if ( IsDefined( player.is_drinking ) && ‪IS_DRINKING( player.is_drinking ) )
514  {
515  wait( 0.1 );
516  continue;
517  }
518 
520  {
521  perk_is_bought = true;
522  }
523  else
524  {
525  self playsound( "evt_perk_deny" );
526  // COLLIN: do we have a VO that would work for this? if not we'll leave it at just the deny sound
527  //* player zm_audio::create_and_play_dialog( "general", "sigh" );
528  self notify( "time_out_or_perk_grab" );
529  return;
530  }
531  }
532  }
533 
534  player ‪zm_stats::increment_client_stat( "grabbed_from_perk_random" );
535  player ‪zm_stats::increment_player_stat( "grabbed_from_perk_random" );
536  player thread ‪monitor_when_player_acquires_perk();
537  self notify( "grab_check" );
538  self notify( "time_out_or_perk_grab" );
539  player notify( "perk_purchased", random_perk );
540  gun = player ‪zm_perks::perk_give_bottle_begin( random_perk );
541  evt = player ‪util::waittill_any_ex( "fake_death", "death", "player_downed", "weapon_change_complete", self, "time_out_check" );
542 
543  if ( evt == "weapon_change_complete" )
544  {
545  player thread ‪zm_perks::wait_give_perk( random_perk, true );
546  }
547 
548  // restore player controls and movement
549  player ‪zm_perks::perk_give_bottle_end( gun, random_perk );
550 
551  if ( !‪IS_TRUE( player.has_drunk_wunderfizz ) )
552  {
553  //* player do_player_general_vox( "wunderfizz", "perk_wonder", undefined, 100 );
554  player.has_drunk_wunderfizz = true;
555  }
556 }
557 
558 // if the player picked up the perk, this will make us wait until the perk is fully acquired before allowing a reroll
559 // self = player
561 {
562  self ‪util::waittill_any( "perk_acquired", "death_or_disconnect", "player_downed" );
563  level ‪flag::set( "machine_can_reset" );
564 }
565 
567 {
568  self endon( "grab_check" );
569  wait( ‪DELAY_MACHINE_TIMEOUT );
570 
571  self notify( "time_out_check" );
572  level ‪flag::set( "machine_can_reset" );
573 }
574 
576 {
577  if( isdefined(self.script_int) )
578  {
579  str_wait = "power_on" + self.script_int;
580  level ‪flag::wait_till( str_wait );
581  }
582  else if( isdefined(level.zm_custom_perk_random_power_flag) )
583  {
584  level ‪flag::wait_till( level.zm_custom_perk_random_power_flag );
585  }
586  else
587  {
588  level ‪flag::wait_till( "power_on" );
589  }
590  self thread ‪set_perk_random_machine_state( "away" );
591 }
592 
594 {
595 
596  if ( level.perk_random_machines.size == 1 )
597  {
598  new_machine = level.perk_random_machines[ 0 ];
599  new_machine thread ‪machine_think();
600  }
601  else
602  {
603  do
604  {
605  new_machine = level.perk_random_machines[ RandomInt( level.perk_random_machines.size ) ];
606  }
607  while( new_machine.current_perk_random_machine == true );
608 
609  new_machine.current_perk_random_machine = true;
610  self.current_perk_random_machine = false;
611 
612  wait( 10 );
613  new_machine thread ‪machine_think();
614  }
615 }
616 
618 {
619  if ( !IsDefined( level._random_perk_machine_perk_list ) )
620  {
621  level._random_perk_machine_perk_list = [];
622  }
623 
624  ‪ARRAY_ADD( level._random_perk_machine_perk_list, perk );
625 }
626 
627 // return a random perk that the player doesn't have ( use level-specific weighting function for the perk array if defined )
628 function ‪get_weighted_random_perk( player )
629 {
630  keys = array::randomize( GetArrayKeys( level._random_perk_machine_perk_list ) );
631 
632  // if the level has a custom perk weights function, use that to set up the array with appropriate weighting
633  if ( IsDefined( level.custom_random_perk_weights ) )
634  {
635  keys = player [[ level.custom_random_perk_weights ]]();
636  }
637 
638  /#
639  forced_perk = GetDvarString( "scr_force_perk" );
640  if ( forced_perk != "" && IsDefined( level._random_perk_machine_perk_list[ forced_perk ] ) )
641  {
642  ArrayInsert( keys, forced_perk, 0 );
643  }
644  #/
645 
646  // loop through the list of perks until you find one the player doesn't have; return that perk from the array
647  for ( i = 0; i < keys.size; i++ )
648  {
649  if ( player HasPerk( level._random_perk_machine_perk_list[ keys[ i ]] ) )
650  {
651  continue;
652  }
653  else
654  {
655  return level._random_perk_machine_perk_list[ keys[ i ]];
656  }
657  }
658 
659  return level._random_perk_machine_perk_list[ keys[ 0 ]];
660 }
661 
662 //TEMP until we get this implemented code side
664 {
665  const FLOAT_HEIGHT = 10;
666  const BASE_HEIGHT = 53;
667  const TILT_Z = 10;
668  const FWD_YAW = 90;
669  putOutTime = 3;
670  putBackTime = 10;
671 
672  v_float = AnglesToForward( self.angles - ( 0, FWD_YAW, 0 ) ) * FLOAT_HEIGHT; // draw vector straight forward with reference to the machine angles
673 
674  // reset to original location before we start moving around
675  level.bottle_spawn_location.origin = self.origin + ( 0, 0, BASE_HEIGHT );
676  level.bottle_spawn_location.angles = self.angles;
677 
678  // bottle slides out from behind the portal
679  level.bottle_spawn_location.origin -= v_float;
680  level.bottle_spawn_location MoveTo( level.bottle_spawn_location.origin + v_float, putOutTime, ( putOutTime * 0.5 ) );
681  // what a twist!
682  level.bottle_spawn_location.angles += ( 0, 0, TILT_Z );
683  level.bottle_spawn_location RotateYaw( 720, putOutTime, ( putOutTime * 0.5 ) );
684 
685  //SOUND - Shawn J
686  //level notify( "pmstrt" );
687 
688  self waittill( "done_cycling" );
689  level.bottle_spawn_location.angles = self.angles;
690 
691  // bottle slides back into the portal
692  level.bottle_spawn_location MoveTo( level.bottle_spawn_location.origin - v_float, putBackTime, ( putBackTime * 0.5 ) );
693  level.bottle_spawn_location RotateYaw( 90, putBackTime, ( putBackTime * 0.5 ) );
694 }
695 
696 //TEMP until we get this implemented code side
698 {
699  self endon( "done_cycling" );
700 
701  array_key = GetArrayKeys( level.perk_bottle_weapon_array );
702  ‪timer = 0;
703 
704  while( 1 )
705  {
706  for( i = 0; i < array_key.size; i++ )
707  {
708  if ( isdefined( level.perk_bottle_weapon_array[ array_key[ i ]].weapon ) )
709  {
710  model = ‪GetWeaponModel( level.perk_bottle_weapon_array[ array_key[ i ]].weapon );
711  }
712  else
713  {
714  model = ‪GetWeaponModel( level.perk_bottle_weapon_array[ array_key[ i ]].perk_bottle_weapon );
715  }
716 
717  level.bottle_spawn_location setmodel( model );
718 
719  wait( 0.2 );
720  }
721  }
722 }
723 
724 //TEMP until we get this implemented code side
725 function ‪get_perk_weapon_model( perk )
726 {
727  weapon = level.machine_assets[ perk ].weapon;
728 
729  if ( IsDefined( level._custom_perks[ perk ] ) && IsDefined( level._custom_perks[ perk ].perk_bottle_weapon ) )
730  {
731  weapon = level._custom_perks[ perk ].perk_bottle_weapon;
732  }
733 
734  return ‪GetWeaponModel( weapon );
735 }
736 
738 {
739  self ‪clientfield::set( "client_stone_emmissive_blink", 1 );
740 
741  self thread ‪perk_random_loop_anim(‪ZM_PERK_RANDOM_BALL_SPIN_PIECE_INDEX, "opening", "opening");
742  self thread ‪perk_random_loop_anim(‪ZM_PERK_RANDOM_BODY_IDLE_PIECE_INDEX, "closing", "closing");
743  self thread ‪perk_random_vend_sfx();
744  self notify("vending");
745 
746  self waittill("bottle_spawned");
747 
748  self SetZBarrierPieceState(‪ZM_PERK_RANDOM_BOTTLE_TAG_PIECE_INDEX, "opening"); //move tag origin for bottle
749 
750 }
751 
752 function ‪perk_random_loop_anim(n_piece, s_anim_1, s_anim_2)
753 {
754  self endon ("zbarrier_state_change");
755  current_state = self.state;
756  while (self.state == current_state)
757  {
758  self SetZBarrierPieceState(n_piece, s_anim_1);
759  while ( self GetZBarrierPieceState( n_piece ) == s_anim_1 )
760  {
762  }
763 
764  self SetZBarrierPieceState(n_piece, s_anim_2);
765  while ( self GetZBarrierPieceState( n_piece ) == s_anim_2 )
766  {
768  }
769  }
770 
771 }
772 
774 {
775  self PlayLoopSound("zmb_rand_perk_sparks");
776  level.bottle_spawn_location PlayLoopSound("zmb_rand_perk_vortex"); //the precise location of the protal
777  self waittill ("zbarrier_state_change");
778  self StopLoopSound();
779  level.bottle_spawn_location StopLoopSound();
780 }
781 
783 {
784  self SetZBarrierPieceState(‪ZM_PERK_RANDOM_BODY_IDLE_PIECE_INDEX, "opening");
785 }
786 
788 {
789  self ‪clientfield::set( "client_stone_emmissive_blink", 0 );
790  if(IsDefined(level.perk_random_idle_effects_override))
791  {
792  self [[level.perk_random_idle_effects_override]]();
793  }
794  else
795  {
796  self ‪clientfield::set( "lightning_bolt_FX_toggle", 1 );
797  while (self.state == "idle")
798  {
800  }
801  self ‪clientfield::set( "lightning_bolt_FX_toggle", 0 );
802  }
803 
804 }
805 
807 {
808 
809 
810  while(self GetZBarrierPieceState(‪ZM_PERK_RANDOM_BALL_ON_OFF_PIECE_INDEX) == "opening")
811  {
813  }
814 
815  self notify("arrived");
816 }
817 
819 {
820  while(self GetZBarrierPieceState(‪ZM_PERK_RANDOM_BALL_ON_OFF_PIECE_INDEX) == "closing")
821  {
823  }
824  ‪WAIT_SERVER_FRAME; // make sure animation can end for shutdowns
825  self thread ‪set_perk_random_machine_state( "away" );
826 
827 }
828 
830 {
831  //self clientfield::set( "set_client_light_state", ZM_PERK_RANDOM_NO_LIGHT_BIT );
832 
833  wait .1;
834 
835  for(i = 0; i < self GetNumZBarrierPieces(); i ++)
836  {
837  self HideZBarrierPiece(i);
838  }
839  self notify("zbarrier_state_change");
840 
841 
842  self [[level.perk_random_machine_state_func]](state);
843 }
844 
846 {
847  switch(state)
848  {
849  case "arrive":
850  //show base piece
851  self ShowZBarrierPiece(‪ZM_PERK_RANDOM_BALL_ON_OFF_PIECE_INDEX); // ball
852  self ShowZBarrierPiece(‪ZM_PERK_RANDOM_BODY_ON_OFF_PIECE_INDEX); // base
853  self SetZBarrierPieceState(‪ZM_PERK_RANDOM_BALL_ON_OFF_PIECE_INDEX, "opening");
854  self SetZBarrierPieceState(‪ZM_PERK_RANDOM_BODY_ON_OFF_PIECE_INDEX, "opening");
855  self ‪clientfield::set( "set_client_light_state", ‪ZM_PERK_RANDOM_GREEN_LIGHT_BIT );
856  self thread ‪perk_random_arrive();
857  self.state = "arrive";
858  break;
859  case "idle":
860  //show base piece
861  self ShowZBarrierPiece(‪ZM_PERK_RANDOM_BALL_SPIN_PIECE_INDEX); //idling ball
862  self ShowZBarrierPiece(‪ZM_PERK_RANDOM_BODY_AVAILABLE_PIECE_INDEX); //idling base
863  self SetZBarrierPieceState(‪ZM_PERK_RANDOM_BODY_AVAILABLE_PIECE_INDEX, "opening");
864  self ‪clientfield::set( "set_client_light_state", ‪ZM_PERK_RANDOM_GREEN_LIGHT_BIT );
865  self.state = "idle";
866  self thread ‪perk_random_idle();
867  break;
868  case "power_off":
869  //show base piece
870  self ShowZBarrierPiece(‪ZM_PERK_RANDOM_BODY_AVAILABLE_PIECE_INDEX); //base
871  self SetZBarrierPieceState(‪ZM_PERK_RANDOM_BODY_AVAILABLE_PIECE_INDEX, "closing");
872  self ‪clientfield::set( "set_client_light_state", ‪ZM_PERK_RANDOM_NO_LIGHT_BIT );
873  self.state = "power_off";
874  break;
875  case "vending":
876  //show base piece
877  //this handles waiting for the player to take the perk, if needed
878  self ShowZBarrierPiece(‪ZM_PERK_RANDOM_BALL_SPIN_PIECE_INDEX);
879  self ShowZBarrierPiece(‪ZM_PERK_RANDOM_BODY_IDLE_PIECE_INDEX);
880  self ShowZBarrierPiece(‪ZM_PERK_RANDOM_BOTTLE_TAG_PIECE_INDEX);
881  self ‪clientfield::set( "set_client_light_state", ‪ZM_PERK_RANDOM_GREEN_LIGHT_BIT );
882  self.state = "vending";
883  self thread ‪perk_random_vending();
884  break;
885  case "leaving":
886  //show base piece
887  self ShowZBarrierPiece(‪ZM_PERK_RANDOM_BODY_ON_OFF_PIECE_INDEX);
888  self ShowZBarrierPiece(‪ZM_PERK_RANDOM_BALL_ON_OFF_PIECE_INDEX);
889  self SetZBarrierPieceState(‪ZM_PERK_RANDOM_BALL_ON_OFF_PIECE_INDEX, "closing");
890  self SetZBarrierPieceState(‪ZM_PERK_RANDOM_BODY_ON_OFF_PIECE_INDEX, "closing");
891  self ‪clientfield::set( "set_client_light_state", ‪ZM_PERK_RANDOM_RED_LIGHT_BIT );
892  self thread ‪perk_random_leaving();
893  self.state = "leaving";
894  break;
895  case "away":
896  //show base piece
897  self ShowZBarrierPiece(‪ZM_PERK_RANDOM_BODY_AVAILABLE_PIECE_INDEX); //base
898  self SetZBarrierPieceState(‪ZM_PERK_RANDOM_BODY_AVAILABLE_PIECE_INDEX, "closing");
899  self ‪clientfield::set( "set_client_light_state", ‪ZM_PERK_RANDOM_RED_LIGHT_BIT );
900  self.state = "away";
901  break;
902  case "initial":
903  //show base piece
904  self ShowZBarrierPiece(‪ZM_PERK_RANDOM_BODY_IDLE_PIECE_INDEX); //base
905  self SetZBarrierPieceState(‪ZM_PERK_RANDOM_BODY_IDLE_PIECE_INDEX, "opening");
906  self ShowZBarrierPiece(‪ZM_PERK_RANDOM_BALL_SPIN_PIECE_INDEX); //base
907  self ‪clientfield::set( "set_client_light_state", ‪ZM_PERK_RANDOM_NO_LIGHT_BIT );
908  self.state = "initial";
909  break;
910  default:
911  if( IsDefined( level.custom_perk_random_state_handler ) )
912  {
913  self [[ level.custom_perk_random_state_handler ]]( state );
914  }
915  break;
916  }
917 
918 }
919 
921 {
922  level endon ( "machine_think" );
923 
924  while ( true )
925  {
926  level waittill ( "pmstrt" );
927  rndprk_ent = ‪spawn( "script_origin", self.origin );
928  rndprk_ent stopsounds ();
929  //* rndprk_ent playsound ( "zmb_rand_perk_start" );
930  //* rndprk_ent playloopsound ( "zmb_rand_perk_loop", ( .5 ) );
931  //state_switch = level util::waittill_any_return ( "pmstop", "random_perk_moving" );
932  state_switch = level ‪util::waittill_any_return ( "pmstop", "pmmove", "machine_think" );
933  rndprk_ent stoploopsound ( 1 );
934 
935  if ( state_switch == "pmstop" )
936  {
937  //* rndprk_ent playsound ( "zmb_rand_perk_stop" );
938  }
939 
940  else
941  {
942  //* rndprk_ent playsound ( "zmb_rand_perk_leave" );
943  }
944 
945  rndprk_ent delete();
946  }
947 }
948 
949 function ‪GetWeaponModel( weapon )
950 {
951  return weapon.worldModel;
952 }
953 
954 function ‪is_power_on( n_power_index )
955 {
956  if( isdefined(n_power_index) )
957  {
958  str_power = "power_on" + n_power_index;
959  n_power_on = level ‪flag::get( str_power );
960  }
961  else if( isdefined(level.zm_custom_perk_random_power_flag) )
962  {
963  n_power_on = level ‪flag::get( level.zm_custom_perk_random_power_flag );
964  }
965  else
966  {
967  n_power_on = level ‪flag::get( "power_on" );
968  }
969 
970  return( n_power_on );
971 }
972 
973 
975 // DEVGUI
977 /#
978 function ‪setup_devgui()
979 {
980  level.perk_random_devgui_callback = &‪wunderfizz_devgui_callback;
981 }
982 
984 {
985  players = GetPlayers();
986 
987  a_e_wunderfizzes = GetEntArray( "perk_random_machine", "targetname" );
988  e_wunderfizz = ArrayGetClosest( GetPlayers()[0].origin, a_e_wunderfizzes );
989 
990 
991  switch ( cmd )
992  {
993  case "wunderfizz_leaving":
994  e_wunderfizz thread ‪set_perk_random_machine_state( "leaving" );
995  break;
996 
997  case "wunderfizz_arriving":
998  e_wunderfizz thread ‪set_perk_random_machine_state( "arrive" );
999 
1000  break;
1001  case "wunderfizz_vending":
1002  e_wunderfizz thread ‪set_perk_random_machine_state( "vending" );
1003  e_wunderfizz notify ("bottle_spawned");
1004 
1005 
1006  break;
1007  case "wunderfizz_idle":
1008  e_wunderfizz thread ‪set_perk_random_machine_state( "idle" );
1009 
1010  break;
1011  case "wunderfizz_power_off":
1012  e_wunderfizz thread ‪set_perk_random_machine_state( "power_off" );
1013 
1014  break;
1015  case "wunderfizz_initial":
1016  e_wunderfizz thread ‪set_perk_random_machine_state( "initial" );
1017  break;
1018  case "wunderfizz_away":
1019  e_wunderfizz thread ‪set_perk_random_machine_state( "away" );
1020 
1021  break;
1022  }
1023 }
1024 
1025 #/
1026 
1027 
‪DELAY_MACHINE_TIMEOUT
‪#define DELAY_MACHINE_TIMEOUT
Definition: _zm_perk_random.gsh:22
‪perk_random_arrive
‪function perk_random_arrive()
Definition: _zm_perk_random.gsc:806
‪ZM_PERK_RANDOM_COST
‪#define ZM_PERK_RANDOM_COST
Definition: _zm_perk_random.gsh:31
‪can_buy_perk
‪function can_buy_perk()
Definition: _zm_perk_random.gsc:319
‪DELAY_UNTIL_BOTTLE_IN_PLACE
‪#define DELAY_UNTIL_BOTTLE_IN_PLACE
Definition: _zm_perk_random.gsh:20
‪RANDOM_PERK_MOVE_MAX
‪#define RANDOM_PERK_MOVE_MAX
Definition: _zm_perk_random.gsc:28
‪increment_client_stat
‪function increment_client_stat(stat_name, include_gametype)
Definition: _zm_stats.gsc:389
‪timer
‪function timer(n_time, str_endon, x, y, height)
Definition: lui_shared.gsc:163
‪get_player_perk_purchase_limit
‪function get_player_perk_purchase_limit()
Definition: _zm_utility.gsc:5886
‪ZM_PERK_RANDOM_GREEN_LIGHT_BIT
‪#define ZM_PERK_RANDOM_GREEN_LIGHT_BIT
Definition: _zm_perk_random.gsh:34
‪increment_player_stat
‪function increment_player_stat(stat_name)
Definition: _zm_stats.gsc:369
‪clear
‪function clear(str_flag)
Definition: flag_shared.csc:130
‪set_perk_random_machine_state
‪function set_perk_random_machine_state(state)
Definition: _zm_perk_random.gsc:829
‪grab_check
‪function grab_check(player, random_perk)
Definition: _zm_perk_random.gsc:501
‪VERSION_TU10
‪#define VERSION_TU10
Definition: version.gsh:59
‪perk_random_machine_trigger_update_prompt
‪function perk_random_machine_trigger_update_prompt(player)
Definition: _zm_perk_random.gsc:171
‪add_to_player_score
‪function add_to_player_score(points, b_add_to_total=true, str_awarded_by="")
Definition: _zm_score.gsc:521
‪waittill_either
‪function waittill_either(msg1, msg2)
Definition: util_shared.gsc:303
‪waittill_any_return
‪function waittill_any_return(string1, string2, string3, string4, string5, string6, string7)
Definition: util_shared.csc:212
‪get_weighted_random_perk
‪function get_weighted_random_perk(player)
Definition: _zm_perk_random.gsc:628
‪wait_give_perk
‪function wait_give_perk(perk, bought)
Definition: _zm_perks.gsc:687
‪DELAY_UNTIL_BOTTLE_SPAWN
‪#define DELAY_UNTIL_BOTTLE_SPAWN
Definition: _zm_perk_random.gsh:19
‪machine_selector
‪function machine_selector()
Definition: _zm_perk_random.gsc:593
‪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
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪setup_devgui
‪function setup_devgui()
Definition: _zm_perk_random.gsc:978
‪setup_perk_random_machines
‪function private setup_perk_random_machines()
Definition: _zm_perk_random.gsc:85
‪GetWeaponModel
‪function GetWeaponModel(weapon)
Definition: _zm_perk_random.gsc:949
‪machine_think
‪function machine_think()
Definition: _zm_perk_random.gsc:357
‪start_perk_bottle_cycling
‪function start_perk_bottle_cycling()
Definition: _zm_perk_random.gsc:697
‪ZM_PERK_RANDOM_BODY_ON_OFF_PIECE_INDEX
‪#define ZM_PERK_RANDOM_BODY_ON_OFF_PIECE_INDEX
Definition: _zm_perk_random.gsh:25
‪ZM_PERK_RANDOM_BODY_IDLE_PIECE_INDEX
‪#define ZM_PERK_RANDOM_BODY_IDLE_PIECE_INDEX
Definition: _zm_perk_random.gsh:27
‪ZM_PERK_RANDOM_NO_LIGHT_BIT
‪#define ZM_PERK_RANDOM_NO_LIGHT_BIT
Definition: _zm_perk_random.gsh:33
‪include_perk_in_random_rotation
‪function include_perk_in_random_rotation(perk)
Definition: _zm_perk_random.gsc:617
‪__init__
‪function __init__()
Definition: _zm_perk_random.gsc:44
‪time_out_check
‪function time_out_check()
Definition: _zm_perk_random.gsc:566
‪perk_random_vend_sfx
‪function perk_random_vend_sfx()
Definition: _zm_perk_random.gsc:773
‪monitor_when_player_acquires_perk
‪function monitor_when_player_acquires_perk()
Definition: _zm_perk_random.gsc:560
‪waittill_any_ex
‪function waittill_any_ex(...)
Definition: util_shared.csc:270
‪trigger_visible_to_player
‪function trigger_visible_to_player(player)
Definition: _zm_perk_random.gsc:269
‪ZM_PERK_RANDOM_RED_LIGHT_BIT
‪#define ZM_PERK_RANDOM_RED_LIGHT_BIT
Definition: _zm_perk_random.gsh:36
‪minus_to_player_score
‪function minus_to_player_score(points)
Definition: _zm_score.gsc:551
‪is_power_on
‪function is_power_on(n_power_index)
Definition: _zm_perk_random.gsc:954
‪can_player_purchase
‪function can_player_purchase(n_cost)
Definition: _zm_score.gsc:655
‪VERSION_DLC1
‪#define VERSION_DLC1
Definition: version.gsh:91
‪process_perk_random_machine_state
‪function process_perk_random_machine_state(state)
Definition: _zm_perk_random.gsc:845
‪REGISTER_SYSTEM_EX
‪#define REGISTER_SYSTEM_EX(__sys, __func_init_preload, __func_init_postload, __reqs)
Definition: shared.gsh:209
‪machine_sounds
‪function machine_sounds()
Definition: _zm_perk_random.gsc:920
‪perk_give_bottle_begin
‪function perk_give_bottle_begin(perk)
Definition: _zm_perks.gsc:992
‪is_equipment_that_blocks_purchase
‪function is_equipment_that_blocks_purchase(weapon)
Definition: _zm_equipment.gsc:701
‪waittill_any
‪function waittill_any(str_notify1, str_notify2, str_notify3, str_notify4, str_notify5)
Definition: util_shared.csc:375
‪perk_random_machine_stub_update_prompt
‪function perk_random_machine_stub_update_prompt(player)
Definition: _zm_perk_random.gsc:190
‪ARRAY_ADD
‪#define ARRAY_ADD(__array, __item)
Definition: shared.gsh:304
‪perk_random_unitrigger_think
‪function perk_random_unitrigger_think(player)
Definition: _zm_perk_random.gsc:345
‪__main__
‪function __main__()
Definition: _zm_perk_random.gsc:67
‪wait_till
‪function wait_till(str_flag)
Definition: flag_shared.csc:189
‪can_player_purchase_perk
‪function can_player_purchase_perk()
Definition: _zm_utility.gsc:5899
‪player_has_all_available_perks
‪function player_has_all_available_perks()
Definition: _zm_perk_random.gsc:306
‪perk_bottle_motion
‪function perk_bottle_motion()
Definition: _zm_perk_random.gsc:663
‪perk_random_initial
‪function perk_random_initial()
Definition: _zm_perk_random.gsc:782
‪perk_random_loop_anim
‪function perk_random_loop_anim(n_piece, s_anim_1, s_anim_2)
Definition: _zm_perk_random.gsc:752
‪perk_random_vending
‪function perk_random_vending()
Definition: _zm_perk_random.gsc:737
‪init
‪function init()
Definition: struct.csc:1
‪create_perk_random_machine_unitrigger_stub
‪function create_perk_random_machine_unitrigger_stub()
Definition: _zm_perk_random.gsc:151
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪ZM_PERK_RANDOM_BOTTLE_TAG_PIECE_INDEX
‪#define ZM_PERK_RANDOM_BOTTLE_TAG_PIECE_INDEX
Definition: _zm_perk_random.gsh:28
‪get_perk_weapon_model
‪function get_perk_weapon_model(perk)
Definition: _zm_perk_random.gsc:725
‪perk_random_idle
‪function perk_random_idle()
Definition: _zm_perk_random.gsc:787
‪init_starting_perk_random_machine_location
‪function private init_starting_perk_random_machine_location()
Definition: _zm_perk_random.gsc:125
‪RANDOM_PERK_MOVE_MIN
‪#define RANDOM_PERK_MOVE_MIN
Definition: _zm_perk_random.gsc:27
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪perk_random_leaving
‪function perk_random_leaving()
Definition: _zm_perk_random.gsc:818
‪ZM_PERK_RANDOM_BODY_AVAILABLE_PIECE_INDEX
‪#define ZM_PERK_RANDOM_BODY_AVAILABLE_PIECE_INDEX
Definition: _zm_perk_random.gsh:26
‪unitrigger_force_per_player_triggers
‪function unitrigger_force_per_player_triggers(unitrigger_stub, opt_on_off)
Definition: _zm_unitrigger.gsc:58
‪in_revive_trigger
‪function in_revive_trigger()
Definition: _zm_utility.gsc:1684
‪wunderfizz_devgui_callback
‪function wunderfizz_devgui_callback(cmd)
Definition: _zm_perk_random.gsc:983
‪ZM_PERK_RANDOM_BALL_SPIN_PIECE_INDEX
‪#define ZM_PERK_RANDOM_BALL_SPIN_PIECE_INDEX
Definition: _zm_perk_random.gsh:29
‪IS_DRINKING
‪#define IS_DRINKING(_is_drinking)
Definition: _zm_utility.gsh:1
‪register_static_unitrigger
‪function register_static_unitrigger(unitrigger_stub, trigger_func, recalculate_zone)
Definition: _zm_unitrigger.gsc:236
‪ZM_PERK_RANDOM_BALL_ON_OFF_PIECE_INDEX
‪#define ZM_PERK_RANDOM_BALL_ON_OFF_PIECE_INDEX
Definition: _zm_perk_random.gsh:24
‪is_placeable_mine
‪function is_placeable_mine(weapon)
Definition: _zm_utility.gsc:4267
‪wait_for_power
‪function wait_for_power()
Definition: _zm_perk_random.gsc:575
‪perk_give_bottle_end
‪function perk_give_bottle_end(original_weapon, perk)
Definition: _zm_perks.gsc:1014
‪perk_random_machine_init
‪function perk_random_machine_init()
Definition: _zm_perk_random.gsc:97
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265