1 #using scripts\shared\util_shared;
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;
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;
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;
27 #define RANDOM_PERK_MOVE_MIN 3
28 #define RANDOM_PERK_MOVE_MAX 7
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" );
40 #namespace zm_perk_random;
46 level._random_zombie_perk_cost = 1500;
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";
69 if ( !IsDefined( level.perk_random_machine_count ) )
71 level.perk_random_machine_count = 1;
73 if ( !IsDefined( level.perk_random_machine_state_func ) )
89 level.perk_bottle_weapon_array = ArrayCombine( level.machine_assets, level._custom_perks,
false,
true );
91 level.perk_random_machines = GetEntArray(
"perk_random_machine",
"targetname" );
92 level.perk_random_machine_count = level.perk_random_machines.size;
100 foreach( machine
in level.perk_random_machines )
102 if ( !isDefined(machine.cost ) )
108 machine.current_perk_random_machine =
false;
109 machine.uses_at_current_location = 0;
119 level.perk_random_machines = array::randomize( level.perk_random_machines );
127 b_starting_machine_found =
false;
128 for ( i = 0; i < level.perk_random_machines.size; i++ )
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))
137 level.perk_random_machines[i].current_perk_random_machine =
true;
140 b_starting_machine_found =
true;
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;
165 self.unitrigger_stub.script_int =
self.script_int;
175 if ( isdefined(
self.hint_string ) )
177 if ( isdefined(
self.hint_parm1 ) )
179 self SetHintString(
self.hint_string,
self.hint_parm1 );
183 self SetHintString(
self.hint_string );
192 self SetCursorHint(
"HINT_NOICON" );
197 self.hint_parm1 = undefined;
203 self.hint_string = &
"ZOMBIE_NEED_POWER";
208 if (
self.stub.trigger_target.state ==
"idle" ||
self.stub.trigger_target.state ==
"vending" )
213 self.hint_string = &
"ZOMBIE_RANDOM_PERK_TOO_MANY";
215 if ( IsDefined( n_purchase_limit ) )
217 self.hint_parm1 = n_purchase_limit;
222 else if ( IsDefined(
self.stub.trigger_target.machine_user ) )
224 if (
IS_TRUE(
self.stub.trigger_target.grab_perk_hint ) )
228 self.hint_string = &
"ZOMBIE_RANDOM_PERK_PICKUP";
234 self.hint_string =
"";
243 self.hint_string = &
"ZOMBIE_RANDOM_PERK_TOO_MANY";
245 if ( IsDefined( n_purchase_limit ) )
247 self.hint_parm1 = n_purchase_limit;
254 self.hint_string = &
"ZOMBIE_RANDOM_PERK_BUY";
255 self.hint_parm1 = level._random_zombie_perk_cost;
262 self.hint_string = &
"ZOMBIE_RANDOM_PERK_ELSEWHERE";
271 self SetInvisibleToPlayer( player );
276 if ( IsDefined(
self.stub.trigger_target.machine_user ) )
278 if ( ( player !=
self.stub.trigger_target.machine_user ) ||
zm_utility::is_placeable_mine(
self.stub.trigger_target.machine_user GetCurrentWeapon() ) )
301 self SetVisibleToPlayer( player );
308 for( i = 0; i < level._random_perk_machine_perk_list.size; i++ )
310 if( !
self HasPerk( level._random_perk_machine_perk_list[i] ) )
321 if ( IsDefined(
self.is_drinking ) &&
IS_DRINKING(
self.is_drinking ) )
326 current_weapon =
self GetCurrentWeapon();
337 if ( current_weapon == level.weaponNone )
347 self endon(
"kill_trigger" );
351 self waittill(
"trigger", player );
352 self.stub.trigger_target notify(
"trigger", player );
359 level notify(
"machine_think" );
360 level endon(
"machine_think" );
365 self.num_time_used = 0;
370 if (
self.state !==
"initial" ||
"idle" )
374 self waittill(
"arrived");
381 if( isdefined(level.zm_custom_perk_random_power_flag) )
395 if ( isdefined( level.bottle_spawn_location ) )
397 level.bottle_spawn_location Delete();
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;
404 level.bottle_spawn_location.origin += ( 0, 0, 65 );
408 self waittill(
"trigger", player );
415 self playsound(
"evt_perk_deny" );
421 self.machine_user = player;
422 self.num_time_used++;
429 if ( IsDefined( level.perk_random_vo_func_usemachine ) && IsDefined( player ) )
431 player thread [[ level.perk_random_vo_func_usemachine ]]();
440 self playsound(
"zmb_rand_perk_start" );
441 self playloopsound(
"zmb_rand_perk_loop", 1 );
445 self notify (
"bottle_spawned");
450 self notify(
"done_cycling" );
453 if (
self.num_time_used >=
self.num_til_moved && level.perk_random_machine_count > 1 )
455 level.bottle_spawn_location setmodel(
"wpn_t7_zmb_perk_bottle_bear_world" );
456 self stoploopsound( .5 );
462 level.bottle_spawn_location setmodel(
"tag_origin" );
468 self.machine_user = undefined;
473 level.bottle_spawn_location setmodel( model );
477 self playsound(
"zmb_rand_perk_bottle" );
478 self.grab_perk_hint =
true;
482 self.grab_perk_hint =
false;
484 self playsound(
"zmb_rand_perk_stop" );
485 self stoploopsound( .5 );
489 self.machine_user = undefined;
490 level.bottle_spawn_location setmodel(
"tag_origin" );
503 self endon(
"time_out_check" );
506 perk_is_bought =
false;
508 while ( !perk_is_bought )
510 self waittill(
"trigger", e_triggerer );
511 if ( e_triggerer == player )
513 if ( IsDefined( player.is_drinking ) &&
IS_DRINKING( player.is_drinking ) )
521 perk_is_bought =
true;
525 self playsound(
"evt_perk_deny" );
528 self notify(
"time_out_or_perk_grab" );
537 self notify(
"grab_check" );
538 self notify(
"time_out_or_perk_grab" );
539 player notify(
"perk_purchased", random_perk );
541 evt = player
util::waittill_any_ex(
"fake_death",
"death",
"player_downed",
"weapon_change_complete",
self,
"time_out_check" );
543 if ( evt ==
"weapon_change_complete" )
551 if ( !
IS_TRUE( player.has_drunk_wunderfizz ) )
554 player.has_drunk_wunderfizz =
true;
568 self endon(
"grab_check" );
571 self notify(
"time_out_check" );
577 if( isdefined(
self.script_int) )
579 str_wait =
"power_on" +
self.script_int;
582 else if( isdefined(level.zm_custom_perk_random_power_flag) )
596 if ( level.perk_random_machines.size == 1 )
598 new_machine = level.perk_random_machines[ 0 ];
605 new_machine = level.perk_random_machines[ RandomInt( level.perk_random_machines.size ) ];
607 while( new_machine.current_perk_random_machine ==
true );
609 new_machine.current_perk_random_machine =
true;
610 self.current_perk_random_machine =
false;
619 if ( !IsDefined( level._random_perk_machine_perk_list ) )
621 level._random_perk_machine_perk_list = [];
624 ARRAY_ADD( level._random_perk_machine_perk_list, perk );
630 keys = array::randomize( GetArrayKeys( level._random_perk_machine_perk_list ) );
633 if ( IsDefined( level.custom_random_perk_weights ) )
635 keys = player [[ level.custom_random_perk_weights ]]();
639 forced_perk = GetDvarString(
"scr_force_perk" );
640 if ( forced_perk !=
"" && IsDefined( level._random_perk_machine_perk_list[ forced_perk ] ) )
642 ArrayInsert( keys, forced_perk, 0 );
647 for ( i = 0; i < keys.size; i++ )
649 if ( player HasPerk( level._random_perk_machine_perk_list[ keys[ i ]] ) )
655 return level._random_perk_machine_perk_list[ keys[ i ]];
659 return level._random_perk_machine_perk_list[ keys[ 0 ]];
665 const FLOAT_HEIGHT = 10;
666 const BASE_HEIGHT = 53;
672 v_float = AnglesToForward(
self.angles - ( 0, FWD_YAW, 0 ) ) * FLOAT_HEIGHT;
675 level.bottle_spawn_location.origin =
self.origin + ( 0, 0, BASE_HEIGHT );
676 level.bottle_spawn_location.angles =
self.angles;
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 ) );
682 level.bottle_spawn_location.angles += ( 0, 0, TILT_Z );
683 level.bottle_spawn_location RotateYaw( 720, putOutTime, ( putOutTime * 0.5 ) );
688 self waittill(
"done_cycling" );
689 level.bottle_spawn_location.angles =
self.angles;
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 ) );
699 self endon(
"done_cycling" );
701 array_key = GetArrayKeys( level.perk_bottle_weapon_array );
706 for( i = 0; i < array_key.size; i++ )
708 if ( isdefined( level.perk_bottle_weapon_array[ array_key[ i ]].weapon ) )
710 model =
GetWeaponModel( level.perk_bottle_weapon_array[ array_key[ i ]].weapon );
714 model =
GetWeaponModel( level.perk_bottle_weapon_array[ array_key[ i ]].perk_bottle_weapon );
717 level.bottle_spawn_location setmodel( model );
727 weapon = level.machine_assets[ perk ].weapon;
729 if ( IsDefined( level._custom_perks[ perk ] ) && IsDefined( level._custom_perks[ perk ].perk_bottle_weapon ) )
731 weapon = level._custom_perks[ perk ].perk_bottle_weapon;
744 self notify(
"vending");
746 self waittill(
"bottle_spawned");
754 self endon (
"zbarrier_state_change");
755 current_state =
self.state;
756 while (
self.state == current_state)
758 self SetZBarrierPieceState(n_piece, s_anim_1);
759 while (
self GetZBarrierPieceState( n_piece ) == s_anim_1 )
764 self SetZBarrierPieceState(n_piece, s_anim_2);
765 while (
self GetZBarrierPieceState( n_piece ) == s_anim_2 )
775 self PlayLoopSound(
"zmb_rand_perk_sparks");
776 level.bottle_spawn_location PlayLoopSound(
"zmb_rand_perk_vortex");
777 self waittill (
"zbarrier_state_change");
778 self StopLoopSound();
779 level.bottle_spawn_location StopLoopSound();
790 if(IsDefined(level.perk_random_idle_effects_override))
792 self [[level.perk_random_idle_effects_override]]();
797 while (
self.state ==
"idle")
815 self notify(
"arrived");
835 for(i = 0; i <
self GetNumZBarrierPieces(); i ++)
837 self HideZBarrierPiece(i);
839 self notify(
"zbarrier_state_change");
842 self [[level.perk_random_machine_state_func]](state);
857 self.state =
"arrive";
873 self.state =
"power_off";
882 self.state =
"vending";
893 self.state =
"leaving";
908 self.state =
"initial";
911 if( IsDefined( level.custom_perk_random_state_handler ) )
913 self [[ level.custom_perk_random_state_handler ]]( state );
922 level endon (
"machine_think" );
926 level waittill (
"pmstrt" );
927 rndprk_ent =
spawn(
"script_origin",
self.origin );
928 rndprk_ent stopsounds ();
933 rndprk_ent stoploopsound ( 1 );
935 if ( state_switch ==
"pmstop" )
951 return weapon.worldModel;
956 if( isdefined(n_power_index) )
958 str_power =
"power_on" + n_power_index;
961 else if( isdefined(level.zm_custom_perk_random_power_flag) )
963 n_power_on = level
flag::get( level.zm_custom_perk_random_power_flag );
970 return( n_power_on );
985 players = GetPlayers();
987 a_e_wunderfizzes = GetEntArray(
"perk_random_machine",
"targetname" );
988 e_wunderfizz = ArrayGetClosest( GetPlayers()[0].origin, a_e_wunderfizzes );
993 case "wunderfizz_leaving":
997 case "wunderfizz_arriving":
1001 case "wunderfizz_vending":
1003 e_wunderfizz notify (
"bottle_spawned");
1007 case "wunderfizz_idle":
1011 case "wunderfizz_power_off":
1015 case "wunderfizz_initial":
1018 case "wunderfizz_away":