1 #using scripts\codescripts\struct;
3 #using scripts\shared\array_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\demo_shared;
6 #using scripts\shared\flag_shared;
7 #using scripts\shared\laststand_shared;
8 #using scripts\shared\trigger_shared;
9 #using scripts\shared\util_shared;
10 #using scripts\shared\visionset_mgr_shared;
12 #insert scripts\shared\shared.gsh;
13 #insert scripts\shared\version.gsh;
15 #using scripts\shared\ai\zombie_utility;
17 #using scripts\zm\_util;
18 #using scripts\zm\_zm;
19 #using scripts\zm\_bb;
20 #using scripts\zm\_zm_audio;
21 #using scripts\zm\_zm_bgb;
22 #using scripts\zm\_zm_equipment;
23 #using scripts\zm\_zm_laststand;
24 #using scripts\zm\_zm_magicbox;
25 #using scripts\zm\_zm_pers_upgrades_functions;
26 #using scripts\zm\_zm_power;
27 #using scripts\zm\_zm_score;
28 #using scripts\zm\_zm_stats;
29 #using scripts\zm\_zm_utility;
30 #using scripts\zm\_zm_weapons;
32 #insert scripts\zm\_zm_perks.gsh;
33 #insert scripts\zm\_zm_utility.gsh;
35 #precache( "fx", "_t6/misc/fx_zombie_cola_dtap_on" );
36 #precache( "fx", "_t6/misc/fx_zombie_cola_jugg_on" );
37 #precache( "fx", "_t6/misc/fx_zombie_cola_on" );
43 level.perk_purchase_limit = 4;
48 if(!level.enable_magic)
58 vending_weapon_upgrade_trigger = [];
61 vending_triggers = GetEntArray(
"zombie_vending",
"targetname" );
65 if ( vending_triggers.size < 1 )
70 level.machine_assets = [];
73 if( !isDefined( level.custom_vending_precaching ) )
77 [[ level.custom_vending_precaching ]]();
84 if ( level._custom_perks.size > 0 )
86 a_keys = GetArrayKeys( level._custom_perks );
88 for ( i = 0; i < a_keys.size; i++ )
90 if ( isdefined( level._custom_perks[ a_keys[ i ] ].perk_machine_thread ) )
92 level thread [[ level._custom_perks[ a_keys[ i ] ].perk_machine_thread ]]();
94 if( isdefined( level._custom_perks[ a_keys[ i ] ].perk_machine_power_override_thread ) )
96 level thread [[ level._custom_perks[ a_keys[ i ] ].perk_machine_power_override_thread ]]();
98 else if( isdefined( level._custom_perks[ a_keys[ i ] ].alias ) && isdefined( level._custom_perks[ a_keys[ i ] ].radiant_machine_name ) && isdefined( level._custom_perks[ a_keys[ i ] ].machine_light_effect ) )
105 if ( isdefined( level.quantum_bomb_register_result_func ) )
116 level endon( str_endon );
118 str_on = s_custom_perk.alias +
"_on";
119 str_off = s_custom_perk.alias +
"_off";
120 str_notify = str_key +
"_power_on";
124 machine = getentarray( s_custom_perk.radiant_machine_name,
"targetname");
125 machine_triggers = GetEntArray( s_custom_perk.radiant_machine_name,
"target" );
127 for( i = 0; i < machine.size; i++ )
129 machine[i] SetModel(level.machine_assets[str_key].off_model);
136 level waittill( str_on );
138 for( i = 0; i < machine.size; i++ )
140 machine[i] SetModel(level.machine_assets[str_key].on_model);
141 machine[i] vibrate((0,-100,0), 0.3, 0.4, 3);
142 machine[i] playsound(
"zmb_perks_power_on");
146 level notify( str_notify );
149 if( isdefined( level.machine_assets[ str_key ].power_on_callback ) )
151 array::thread_all( machine, level.machine_assets[ str_key ].power_on_callback );
154 level waittill( str_off );
156 if( isdefined( level.machine_assets[ str_key ].power_off_callback ) )
158 array::thread_all( machine, level.machine_assets[ str_key ].power_off_callback );
175 if ( level._custom_perks.size > 0 )
177 a_keys = GetArrayKeys( level._custom_perks );
178 for ( i = 0; i < a_keys.size; i++ )
180 if ( isdefined( level._custom_perks[ a_keys[ i ] ].precache_func ) )
182 level [[ level._custom_perks[ a_keys[ i ] ].precache_func ]]();
200 if( !isdefined( level.machine_assets[ perkname ] ) )
204 if( !isdefined( level.machine_assets[ perkname ].power_off_callback ) )
211 array::thread_all( machine_array, level.machine_assets[ perkname ].power_off_callback );
216 if( isdefined(level.override_use_solo_revive) )
218 return [[level.override_use_solo_revive]]();
221 players = GetPlayers();
223 if ( players.size == 1 ||
IS_TRUE( level.force_solo_quick_revive ) )
227 level.using_solo_revive = solo_mode;
235 self.power_on = state;
242 self notify(
"stop_loopsound" );
244 if ( !
IS_TRUE(
self.b_keep_when_turned_off ) )
246 newMachine =
Spawn(
"script_model",
self.origin );
247 newMachine.angles =
self.angles;
248 newMachine.targetname =
self.targetname;
251 newMachine.ishidden =
true;
253 newMachine NotSolid();
267 if( isdefined( level.sndPerksacolaLoopOverride ) )
270 sound_ent =
spawn(
"script_origin",
self.origin );
271 sound_ent playloopsound(
"zmb_perks_machine_loop");
272 sound_ent LinkTo(
self );
273 self waittill(
"stop_loopsound" );
282 if( isdefined( turnOffFx ) )
284 self.perk_fx =
false;
286 if (
IS_TRUE(
self.b_keep_when_turned_off ) && ( isdefined(
self.s_fxloc )))
288 self.s_fxloc Delete();
295 if ( !isdefined(
self) )
298 if ( !
IS_TRUE(
self.b_keep_when_turned_off ))
302 playfxontag( level._effect[ fx ],
self,
"tag_origin" );
308 if ( isdefined(
self ) && ( !isdefined(
self.s_fxloc )))
311 playfxontag( level._effect[ fx ],
self.s_fxloc,
"tag_origin" );
330 players = GetPlayers();
331 if ( players.size == 1 )
336 self endon (
"warning_dialog");
337 level endon(
"switch_flipped");
342 players = GetPlayers();
343 for(i = 0; i < players.size; i++)
345 if(!isDefined(players[i] ))
350 dist = distancesquared(players[i].origin,
self.origin );
356 if(dist < 70*70 &&
timer < 3)
361 if(dist < 70*70 &&
timer == 3)
363 if(!isDefined(players[i] ))
370 self notify (
"warning_dialog");
378 perk =
self.script_noteworthy;
381 if( isdefined( level._custom_perks ) )
383 if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].cost ) && isdefined( level._custom_perks[ perk ].hint_string ) )
386 if( IsFunctionPtr( level._custom_perks[ perk ].cost ) )
388 n_cost = [[level._custom_perks[ perk ].cost]]();
392 n_cost = level._custom_perks[ perk ].cost;
395 self SetHintString( level._custom_perks[ perk ].hint_string, n_cost );
417 if( player isThrowingGrenade() )
422 if( player isSwitchingWeapons() )
439 self endon(
"death" );
445 perk =
self.script_noteworthy;
448 level.revive_machine_is_solo =
false;
455 self endon(
"stop_quickrevive_logic");
456 level.quick_revive_trigger =
self;
459 if (!
IS_TRUE(level.revive_machine_is_solo))
462 if ( !
IS_TRUE( level.initial_quick_revive_power_off ) )
466 players = GetPlayers();
467 foreach ( player
in players )
469 if(!isDefined(player.lives))
474 level.revive_machine_is_solo =
true;
480 self SetHintString( &
"ZOMBIE_NEED_POWER" );
483 self SetCursorHint(
"HINT_NOICON" );
484 self UseTriggerRequireLookAt();
486 cost = level.zombie_vars[
"zombie_perk_cost"];
488 if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].cost ) )
490 if( IsInt( level._custom_perks[ perk ].cost ) )
492 cost = level._custom_perks[ perk ].cost;
496 cost = [[ level._custom_perks[ perk ].cost ]]();
504 notify_name = perk +
"_power_on";
505 level waittill( notify_name );
509 if(!isdefined(level._perkmachinenetworkchoke))
511 level._perkmachinenetworkchoke = 0;
515 level._perkmachinenetworkchoke ++;
518 for(i = 0; i < level._perkmachinenetworkchoke; i ++)
528 if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].hint_string ) )
530 self SetHintString( level._custom_perks[ perk ].hint_string, cost );
535 self waittill(
"trigger", player );
552 self playsound(
"evt_perk_deny");
560 if( isdefined( level.custom_perk_validation ) )
562 valid =
self [[ level.custom_perk_validation ]]( player );
570 current_cost =
self.cost;
580 self playsound(
"evt_perk_deny");
588 self playsound(
"evt_perk_deny");
594 sound =
"evt_bottle_dispense";
595 playsoundatposition(sound,
self.origin);
598 if (isDefined(level._custom_perks[ perk ]) && isDefined(level._custom_perks[ perk ].hash_id))
600 perkHash = level._custom_perks[ perk ].hash_id;
604 player.perk_purchased = perk;
605 player notify(
"perk_purchased", perk );
615 player endon(
"disconnect" );
616 player endon(
"end_game" );
617 player endon(
"perk_abort_drinking" );
621 evt = player
util::waittill_any_return(
"fake_death",
"death",
"player_downed",
"weapon_change_complete",
"perk_abort_drinking",
"disconnect" );
624 if (evt ==
"weapon_change_complete" )
638 player notify(
"burp");
641 if(
IS_TRUE(level.pers_upgrade_cash_back) )
647 if(
IS_TRUE(level.pers_upgrade_perk_lose) )
652 if ( isDefined( level.perk_bought_func ) )
654 player [[ level.perk_bought_func ]]( perk );
657 player.perk_purchased = undefined;
689 self endon(
"player_downed" );
690 self endon(
"disconnect" );
691 self endon(
"end_game" );
692 self endon(
"perk_abort_drinking" );
700 if ( isdefined(
self._retain_perks_array) )
702 keys = getarraykeys(
self._retain_perks_array );
703 foreach( perk
in keys )
705 if (
IS_TRUE(
self._retain_perks_array[perk]) )
717 self endon(
"player_downed" );
718 self endon(
"disconnect" );
719 self endon(
"end_game" );
720 self endon(
"perk_abort_drinking" );
724 if (
IS_TRUE( level.remove_perk_vo_delay ) )
732 self setblur( 9, 0.1 );
734 self setblur(0, 0.1);
740 self SetPerk( perk );
747 self notify(
"perk_bought", perk );
751 if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].player_thread_give ) )
753 self thread [[ level._custom_perks[ perk ].player_thread_give ]]();
767 if(!isDefined(
self.perk_history))
769 self.perk_history = [];
773 if ( !isdefined(
self.perks_active ) )
775 self.perks_active = [];
780 self notify(
"perk_acquired");
793 n_max_total_health = undefined;
799 if( set_preMaxHealth )
801 self.preMaxHealth =
self.maxhealth;
803 n_max_total_health =
self.maxhealth + level.zombie_vars[
"zombie_perk_juggernaut_health"];
808 if( set_preMaxHealth )
810 self.preMaxHealth =
self.maxhealth;
815 n_max_total_health += level.zombie_vars[
"zombie_perk_juggernaut_health"];
819 n_max_total_health = level.zombie_vars[
"player_base_health"];
823 case "health_reboot":
826 n_max_total_health = level.zombie_vars[
"player_base_health"];
828 if( isdefined(
self.n_player_health_boost) )
830 n_max_total_health +=
self.n_player_health_boost;
835 n_max_total_health += level.zombie_vars[
"zombie_perk_juggernaut_health"];
840 if( isdefined(n_max_total_health) )
845 n_max_total_health = n_max_total_health + level.pers_jugg_upgrade_health_bonus;
848 self.maxhealth = n_max_total_health;
849 self SetMaxHealth( n_max_total_health );
851 if( isdefined(clamp_health_to_max_health) && (clamp_health_to_max_health ==
true) )
853 if(
self.health >
self.maxhealth )
855 self.health =
self.maxhealth;
867 self endon(
"death" );
872 players = GetPlayers();
873 for( i = 0; i < players.size; i++ )
875 if(DistanceSquared( players[i].origin,
self.origin ) < dist)
877 if(!players[i] HasPerk(perk) &&
884 self setinvisibletoplayer(players[i],
false);
888 self SetInvisibleToPlayer(players[i],
true);
902 case "specialty_armorvest":
910 self endon(
"disconnect");
912 perk_str = perk +
"_stop";
931 if ( isdefined(
self._retain_perks) &&
self._retain_perks )
935 else if ( isdefined(
self._retain_perks_array ) &&
IS_TRUE(
self._retain_perks_array[ perk ] ) )
941 self UnsetPerk( perk );
945 if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].player_thread_take ) )
947 self thread [[ level._custom_perks[ perk ].player_thread_take ]](
false, perk_str,
result );
953 self.perk_purchased = undefined;
956 if ( isdefined( level.perk_lost_func ) )
958 self [[ level.perk_lost_func ]]( perk );
961 if ( isdefined(
self.perks_active ) && IsInArray(
self.perks_active, perk ) )
963 ArrayRemoveValue(
self.perks_active, perk,
false );
966 self notify(
"perk_lost" );
971 if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].clientfield_set ) )
973 self [[ level._custom_perks[ perk ].clientfield_set ]]( state );
981 self.perk_hud[ perk ] = undefined;
987 self.perk_hud[ perk ].alpha = 0.3;
989 self.perk_hud[ perk ].alpha = 1.0;
998 original_weapon =
self GetCurrentWeapon();
1002 if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].perk_bottle_weapon ) )
1004 weapon = level._custom_perks[ perk ].perk_bottle_weapon;
1007 self GiveWeapon( weapon );
1008 self SwitchToWeapon( weapon );
1010 return original_weapon;
1016 self endon(
"perk_abort_drinking" );
1018 Assert( !original_weapon.isPerkBottle );
1019 Assert( original_weapon != level.weaponReviveTool );
1025 if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].perk_bottle_weapon ) )
1027 weapon = level._custom_perks[ perk ].perk_bottle_weapon;
1033 self TakeWeapon(weapon);
1037 self TakeWeapon(weapon);
1061 self waittill(
"weapon_change_complete" );
1076 if(
self.is_drinking )
1078 self notify(
"perk_abort_drinking" );
1082 if( isdefined(post_delay) )
1095 random_perk = undefined;
1097 a_str_perks = GetArrayKeys( level._custom_perks );
1100 for ( i = 0; i < a_str_perks.size; i++ )
1102 perk = a_str_perks[i];
1104 if ( isdefined(
self.perk_purchased ) &&
self.perk_purchased == perk )
1111 perks[ perks.size ] = perk;
1115 if ( perks.size > 0 )
1117 perks = array::randomize( perks );
1118 random_perk = perks[0];
1124 self PlaySoundToPlayer( level.zmb_laugh_alias,
self );
1127 return( random_perk );
1133 a_str_perks = GetArrayKeys( level._custom_perks );
1136 for ( i = 0; i < a_str_perks.size; i++ )
1138 perk = a_str_perks[i];
1140 if ( isdefined(
self.perk_purchased ) &&
self.perk_purchased == perk )
1147 perks[ perks.size ] = perk;
1151 if ( perks.size > 0 )
1153 perks = array::randomize( perks );
1156 perk_str = perk +
"_stop";
1157 self notify( perk_str );
1168 if ( isdefined(
self.perk_hud ) )
1170 keys = getarraykeys(
self.perk_hud );
1171 for ( i = 0; i <
self.perk_hud.size; i++ )
1173 self.perk_hud[ keys[i] ].x = i * 30;
1180 vending_triggers = GetEntArray(
"zombie_vending",
"targetname" );
1182 range_squared = 180 * 180;
1183 for ( i = 0; i < vending_triggers.size; i++ )
1185 if ( DistanceSquared( vending_triggers[i].origin, position ) < range_squared )
1197 [[level.quantum_bomb_play_mystery_effect_func]]( position );
1199 vending_triggers = GetEntArray(
"zombie_vending",
"targetname" );
1202 for ( i = 1; i < vending_triggers.size; i++ )
1204 if ( DistanceSquared( vending_triggers[i].origin, position ) < DistanceSquared( vending_triggers[nearest].origin, position ) )
1210 players = GetPlayers();
1211 perk = vending_triggers[nearest].script_noteworthy;
1212 for ( i = 0; i < players.size; i++ )
1214 player = players[i];
1221 if ( !player HasPerk( perk ) && ( !isdefined( player.perk_purchased ) || player.perk_purchased != perk) && RandomInt( 5 ) )
1223 if( player ==
self )
1229 player [[level.quantum_bomb_play_player_effect_func]]();
1236 if(
IS_TRUE( level.dont_unset_perk_when_machine_paused ) )
1241 for ( j = 0; j < GetPlayers().size; j++ )
1243 player = GetPlayers()[j];
1244 if (!isdefined(player.disabled_perks))
1245 player.disabled_perks=[];
1246 player.disabled_perks[perk] =
IS_TRUE(player.disabled_perks[perk]) || player HasPerk( perk );
1247 if ( player.disabled_perks[perk] )
1249 player UnsetPerk( perk );
1253 if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].player_thread_take ) )
1255 player thread [[ level._custom_perks[ perk ].player_thread_take ]]( true );
1265 if(
IS_TRUE( level.dont_unset_perk_when_machine_paused ) )
1270 if(!isDefined(perk))
1275 for ( j = 0; j < GetPlayers().size; j++ )
1277 player = GetPlayers()[j];
1278 if ( isdefined(player.disabled_perks) &&
IS_TRUE(player.disabled_perks[perk]) )
1280 player.disabled_perks[perk]=
false;
1283 player SetPerk( perk );
1287 if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].player_thread_give ) )
1289 player thread [[ level._custom_perks[ perk ].player_thread_give ]]();
1297 vending_triggers = GetEntArray(
"zombie_vending",
"targetname" );
1298 foreach ( trigger
in vending_triggers )
1301 if(!isdefined(power_zone))
1306 else if(isdefined(trigger.script_int) && trigger.script_int == power_zone)
1316 vending_triggers = GetEntArray(
"zombie_vending",
"targetname" );
1317 foreach ( trigger
in vending_triggers )
1320 if(!isdefined(power_zone))
1325 else if(isdefined(trigger.script_int) && trigger.script_int == power_zone)
1334 if ( isdefined(
self.disabled_perks) && isdefined(
self.disabled_perks[perk]) &&
self.disabled_perks[perk] )
1344 if(!isDefined(
self))
1349 str_perk = undefined;
1351 if ( isdefined( level._custom_perks[
self.script_noteworthy ] ) && isdefined( isdefined( level._custom_perks[
self.script_noteworthy ].alias ) ) )
1353 str_perk = level._custom_perks[
self.script_noteworthy ].alias;
1364 if(!isdefined(machine))
1369 trig = GetEnt(machine,
"script_noteworthy");
1370 machine_model = undefined;
1375 trig notify (
"warning_dialog");
1377 if(isdefined(trig.target))
1379 parts = GetEntArray(trig.target,
"targetname");
1380 for ( i = 0; i < parts.size; i++ )
1382 if(isdefined(parts[i].classname) && parts[i].classname ==
"script_model")
1384 machine_model = parts[i];
1386 else if(isdefined(parts[i].script_noteworthy && parts[i].script_noteworthy ==
"clip"))
1388 model_clip = parts[i];
1398 if(isdefined(replacement_model) && isdefined(machine_model))
1400 machine_model SetModel(replacement_model);
1402 else if(!isdefined(replacement_model) && isdefined(machine_model))
1404 machine_model Delete();
1405 if(isdefined(model_clip))
1406 model_clip Delete();
1407 if(isdefined(trig.clip))
1411 if(isdefined(trig.bump))
1425 location = level.scr_zm_map_start_location;
1426 if ((location ==
"default" || location ==
"" ) && isdefined(level.default_start_location))
1428 location = level.default_start_location;
1431 match_string = level.scr_zm_ui_gametype +
"_perks_" + location;
1434 if( isdefined( level.override_perk_targetname ) )
1439 foreach(
struct in structs)
1441 if(isdefined(
struct.script_string) )
1443 tokens = strtok(
struct.script_string,
" ");
1444 foreach(token
in tokens)
1446 if(token == match_string )
1448 a_s_spawn_pos[a_s_spawn_pos.size] =
struct;
1454 a_s_spawn_pos[a_s_spawn_pos.size] =
struct;
1458 if( a_s_spawn_pos.size == 0 )
1465 if(
IS_TRUE( level.randomize_perk_machine_location ) )
1467 a_s_random_perk_locs =
struct::get_array(
"perk_random_machine_location",
"targetname" );
1469 if( a_s_random_perk_locs.size > 0 )
1471 a_s_random_perk_locs = array::randomize( a_s_random_perk_locs );
1474 n_random_perks_assigned = 0;
1478 foreach( s_spawn_pos
in a_s_spawn_pos )
1480 perk = s_spawn_pos.script_noteworthy;
1481 if(isdefined(perk) && isdefined(s_spawn_pos.model))
1486 if(
IS_TRUE( level.randomize_perk_machine_location ) && a_s_random_perk_locs.size > 0 && isdefined( s_spawn_pos.script_notify ) )
1488 s_new_loc = a_s_random_perk_locs[n_random_perks_assigned];
1490 s_spawn_pos.origin = s_new_loc.origin;
1491 s_spawn_pos.angles = s_new_loc.angles;
1494 if ( isdefined( s_new_loc.script_int ) )
1496 s_spawn_pos.script_int = s_new_loc.script_int;
1500 if( isdefined( s_new_loc.target ) )
1504 if( isdefined( s_tell_location ) )
1506 util::spawn_model(
"p7_zm_perk_bottle_broken_" + perk , s_tell_location.origin, s_tell_location.angles );
1510 n_random_perks_assigned++;
1513 t_use =
Spawn(
"trigger_radius_use", s_spawn_pos.origin + (0, 0, 60), 0, 40, 80 );
1514 t_use.targetname =
"zombie_vending";
1515 t_use.script_noteworthy = perk;
1518 if(isdefined(s_spawn_pos.script_int))
1520 t_use.script_int = s_spawn_pos.script_int;
1523 t_use TriggerIgnoreTeam();
1526 perk_machine =
Spawn(
"script_model", s_spawn_pos.origin);
1527 if( !isdefined(s_spawn_pos.angles) )
1528 s_spawn_pos.angles = (0,0,0);
1529 perk_machine.angles = s_spawn_pos.angles;
1530 perk_machine SetModel(s_spawn_pos.model);
1532 if(
IS_TRUE(level._no_vending_machine_bump_trigs))
1534 bump_trigger = undefined;
1538 bump_trigger =
Spawn(
"trigger_radius", s_spawn_pos.origin + (0, 0, 20), 0, 40, 80);
1539 bump_trigger.script_activated = 1;
1540 bump_trigger.script_sound =
"zmb_perks_bump_bottle";
1541 bump_trigger.targetname =
"audio_bump_trigger";
1545 if(
IS_TRUE(level._no_vending_machine_auto_collision))
1547 collision = undefined;
1551 collision =
Spawn(
"script_model", s_spawn_pos.origin, 1);
1552 collision.angles = s_spawn_pos.angles;
1553 collision SetModel(
"zm_collision_perks1");
1554 collision.script_noteworthy =
"clip";
1555 collision DisconnectPaths();
1559 t_use.clip = collision;
1560 t_use.machine = perk_machine;
1561 t_use.bump = bump_trigger;
1563 if ( isdefined( s_spawn_pos.script_notify ) )
1565 perk_machine.script_notify = s_spawn_pos.script_notify;
1569 if ( isdefined( s_spawn_pos.target ) )
1571 perk_machine.target = s_spawn_pos.target;
1574 if( isdefined( s_spawn_pos.blocker_model ) )
1576 t_use.blocker_model = s_spawn_pos.blocker_model;
1579 if( isdefined( s_spawn_pos.script_int ) )
1581 perk_machine.script_int = s_spawn_pos.script_int;
1584 if( isdefined( s_spawn_pos.turn_on_notify ) )
1586 perk_machine.turn_on_notify = s_spawn_pos.turn_on_notify;
1589 t_use.script_sound =
"mus_perks_speed_jingle";
1590 t_use.script_string =
"speedcola_perk";
1591 t_use.script_label =
"mus_perks_speed_sting";
1592 t_use.target =
"vending_sleight";
1593 perk_machine.script_string =
"speedcola_perk";
1594 perk_machine.targetname =
"vending_sleight";
1595 if(isdefined(bump_trigger))
1596 bump_trigger.script_string =
"speedcola_perk";
1599 if ( isdefined( level._custom_perks[ perk ] ) && isdefined( level._custom_perks[ perk ].perk_machine_set_kvps ) )
1601 [[ level._custom_perks[ perk ].perk_machine_set_kvps ]]( t_use, perk_machine, bump_trigger, collision );
1609 if (
IS_TRUE( level.vending_machines_powered_on_at_start ) )
1616 assert(isdefined(level.revive_machine_is_solo));
1617 return level.revive_machine_is_solo;
1626 if(
IS_TRUE( level.zombiemode_using_perk_intro_fx) )
1632 if ( isdefined( level._custom_perks ) )
1634 a_keys = GetArrayKeys( level._custom_perks );
1636 for ( i = 0; i < a_keys.size; i++ )
1638 if ( isdefined( level._custom_perks[ a_keys[ i ] ].clientfield_register ) )
1640 level [[ level._custom_perks[ a_keys[ i ] ].clientfield_register ]]();
1650 self waittill(
"trigger", trigPlayer );
1651 trigPlayer playsound(
self.script_sound );
1662 perk_area_origin = level.quick_revive_default_origin;
1664 if(isdefined(perk_machine._linked_ent))
1666 perk_area_origin = perk_machine._linked_ent.origin;
1668 if(isdefined(perk_machine._linked_ent_offset))
1670 perk_area_origin += perk_machine._linked_ent_offset;
1675 players = GetPlayers();
1678 foreach( player
in players )
1680 if( DistanceSquared(player.origin,perk_area_origin) < dist_check )
1692 level endon(
"end_game");
1694 level notify(
"perk_hostmigration");
1695 level endon(
"perk_hostmigration");
1699 level waittill(
"host_migration_end");
1701 if ( isdefined( level._custom_perks ) && level._custom_perks.size > 0 )
1703 a_keys = GetArrayKeys( level._custom_perks );
1705 foreach( key
in a_keys )
1707 if( isdefined( level._custom_perks[key].radiant_machine_name ) && isdefined( level._custom_perks[key].machine_light_effect ) )
1719 a_machines = GetEntArray( s_custom_perk.radiant_machine_name,
"targetname" );
1721 foreach( perk
in a_machines)
1723 if(isDefined(perk.model) && perk.model == level.machine_assets[keyName].on_model )
1731 function spare_change( str_trigger =
"audio_bump_trigger", str_sound =
"zmb_perks_bump_bottle" )
1734 a_t_audio = GetEntArray( str_trigger,
"targetname" );
1735 foreach( t_audio_bump
in a_t_audio )
1737 if ( t_audio_bump.script_sound === str_sound )
1746 self endon(
"death" );
1750 self waittill(
"trigger", player );
1752 if ( player GetStance() ==
"prone" )
1773 if ( level._custom_perks.size > 0 )
1775 a_keys = GetArrayKeys( level._custom_perks );
1777 for ( i = 0; i < a_keys.size; i++ )
1779 if (
self HasPerk( a_keys[ i ] ) )
1781 perk_array[ perk_array.size ] = a_keys[ i ];
1786 return( perk_array );
1791 if ( !isdefined( level._custom_perks ) )
1793 level._custom_perks = [];
1799 if( !isdefined( level.a_revive_success_perk_func ) )
1801 level.a_revive_success_perk_func = [];
1804 level.a_revive_success_perk_func[ level.a_revive_success_perk_func.size ] = revive_func;
1822 Assert( isdefined( str_perk ),
"str_perk is a required argument for register_perk_basic_info!" );
1823 Assert( isdefined( str_alias ),
"str_alias is a required argument for register_perk_basic_info!" );
1824 Assert( isdefined( n_perk_cost ),
"n_perk_cost is a required argument for register_perk_basic_info!" );
1825 Assert( isdefined( str_hint_string ),
"str_hint_string is a required argument for register_perk_basic_info!" );
1826 Assert( isdefined( w_perk_bottle_weapon ),
"w_perk_bottle_weapon is a required argument for register_perk_basic_info!" );
1830 level._custom_perks[ str_perk ].alias = str_alias;
1831 level._custom_perks[ str_perk ].hash_id = HashString(str_alias);
1832 level._custom_perks[ str_perk ].cost = n_perk_cost;
1833 level._custom_perks[ str_perk ].hint_string = str_hint_string;
1834 level._custom_perks[ str_perk ].perk_bottle_weapon = w_perk_bottle_weapon;
1851 Assert( isdefined( str_perk ),
"str_perk is a required argument for register_perk_machine!" );
1852 Assert( isdefined( func_perk_machine_setup ),
"func_perk_machine_setup is a required argument for register_perk_machine!" );
1856 if ( !isdefined( level._custom_perks[ str_perk ].perk_machine_set_kvps ) )
1858 level._custom_perks[ str_perk ].perk_machine_set_kvps = func_perk_machine_setup;
1861 if ( !isdefined( level._custom_perks[ str_perk ].perk_machine_thread ) && isdefined( func_perk_machine_thread ) )
1863 level._custom_perks[ str_perk ].perk_machine_thread = func_perk_machine_thread;
1879 Assert( isdefined( str_perk ),
"str_perk is a required argument for register_perk_machine_power_override!" );
1880 Assert( isdefined( func_perk_machine_power_override ),
"func_perk_machine_power_override is a required argument for register_perk_machine_power_override!" );
1884 if ( !isdefined( level._custom_perks[ str_perk ].perk_machine_power_override_thread ) && isdefined( func_perk_machine_power_override ) )
1886 level._custom_perks[ str_perk ].perk_machine_power_override_thread = func_perk_machine_power_override;
1902 Assert( isdefined( str_perk ),
"str_perk is a required argument for register_perk_precache_func!" );
1903 Assert( isdefined( func_precache ),
"func_precache is a required argument for register_perk_precache_func!" );
1907 if ( !isdefined( level._custom_perks[ str_perk ].precache_func ) )
1909 level._custom_perks[ str_perk ].precache_func = func_precache;
1926 Assert( isdefined( str_perk ),
"str_perk is a required argument for register_perk_threads!" );
1927 Assert( isdefined( func_give_player_perk ),
"func_give_player_perk is a required argument for register_perk_threads!" );
1931 if( !isdefined( level._custom_perks[ str_perk ].player_thread_give ) )
1933 level._custom_perks[ str_perk ].player_thread_give = func_give_player_perk;
1936 if ( isdefined( func_take_player_perk ) )
1938 if ( !isdefined( level._custom_perks[ str_perk ].player_thread_take ) )
1940 level._custom_perks[ str_perk ].player_thread_take = func_take_player_perk;
1959 Assert( isdefined( str_perk ),
"str_perk is a required argument for register_perk_clientfields!" );
1960 Assert( isdefined( func_clientfield_register ),
"func_clientfield_register is a required argument for register_perk_clientfields!" );
1961 Assert( isdefined( func_clientfield_set ),
"func_clientfield_set is a required argument for register_perk_clientfields!" );
1965 if ( !isdefined( level._custom_perks[ str_perk ].clientfield_register ) )
1967 level._custom_perks[ str_perk ].clientfield_register = func_clientfield_register;
1970 if ( !isdefined( level._custom_perks[ str_perk ].clientfield_set ) )
1972 level._custom_perks[ str_perk ].clientfield_set = func_clientfield_set;
1988 Assert( isdefined( str_perk ),
"str_perk is a required argument for register_perk_host_migration_params!" );
1989 Assert( isdefined( str_radiant_name ),
"str_radiant_name is a required argument for register_perk_host_migration_params!" );
1990 Assert( isdefined( str_effect_name ),
"str_effect_name is a required argument for register_perk_host_migration_params!" );
1994 if ( !isdefined( level._custom_perks[ str_perk ].radiant_name ) )
1996 level._custom_perks[ str_perk ].radiant_machine_name = str_radiant_name;
1999 if ( !isdefined( level._custom_perks[ str_perk ].light_effect ) )
2001 level._custom_perks[ str_perk ].machine_light_effect = str_effect_name;
2008 if ( !isdefined( level._custom_perks ) )
2010 level._custom_perks = [];
2013 if ( !isdefined( level._custom_perks[ str_perk ] ) )
2015 level._custom_perks[ str_perk ] = SpawnStruct();
2030 Assert( isdefined( func_damage_override ),
"func_damage_override is a required argument for register_perk_damage_override_func!" );
2032 if ( !isdefined( level.perk_damage_override ) )
2034 level.perk_damage_override = [];
2037 array::add( level.perk_damage_override, func_damage_override,
false );