1 #using scripts\codescripts\struct;
3 #using scripts\shared\array_shared;
4 #using scripts\shared\callbacks_shared;
5 #using scripts\shared\clientfield_shared;
6 #using scripts\shared\demo_shared;
7 #using scripts\shared\flag_shared;
8 #using scripts\shared\flagsys_shared;
9 #using scripts\shared\hud_util_shared;
10 #using scripts\shared\laststand_shared;
11 #using scripts\shared\util_shared;
13 #insert scripts\shared\shared.gsh;
14 #insert scripts\shared\version.gsh;
15 #insert scripts\shared\ai\systems\gib.gsh;
17 #using scripts\shared\ai\zombie_utility;
18 #using scripts\shared\ai\systems\gib;
20 #using scripts\zm\_util;
21 #using scripts\zm\_bb;
22 #using scripts\zm\_zm_audio;
23 #using scripts\zm\_zm_bgb;
24 #using scripts\zm\_zm_blockers;
25 #using scripts\zm\_zm_laststand;
26 #using scripts\zm\_zm_magicbox;
27 #using scripts\zm\_zm_melee_weapon;
28 #using scripts\zm\_zm_net;
29 #using scripts\zm\_zm_perks;
30 #using scripts\zm\_zm_pers_upgrades;
31 #using scripts\zm\_zm_pers_upgrades_functions;
32 #using scripts\zm\_zm_score;
33 #using scripts\zm\_zm_spawner;
34 #using scripts\zm\_zm_stats;
35 #using scripts\zm\_zm_utility;
36 #using scripts\zm\_zm_weapons;
38 #insert scripts\zm\_zm_perks.gsh;
39 #insert scripts\zm\_zm_powerups.gsh;
40 #insert scripts\zm\_zm_utility.gsh;
42 #precache( "material", "black" );
44 #precache( "fx", "zombie/fx_powerup_on_green_zmb" );
45 #precache( "fx", "zombie/fx_powerup_off_green_zmb" );
46 #precache( "fx", "zombie/fx_powerup_grab_green_zmb" );
47 #precache( "fx", "zombie/fx_powerup_on_red_zmb" );
48 #precache( "fx", "zombie/fx_powerup_grab_red_zmb" );
49 #precache( "fx", "zombie/fx_powerup_on_solo_zmb" );
50 #precache( "fx", "zombie/fx_powerup_grab_solo_zmb" );
51 #precache( "fx", "zombie/fx_powerup_on_caution_zmb" );
52 #precache( "fx", "zombie/fx_powerup_grab_caution_zmb" );
54 #namespace zm_powerups;
80 level._effect[
"powerup_on"] =
"zombie/fx_powerup_on_green_zmb";
81 level._effect[
"powerup_off"] =
"zombie/fx_powerup_off_green_zmb";
82 level._effect[
"powerup_grabbed"] =
"zombie/fx_powerup_grab_green_zmb";
83 if (
IS_TRUE(level.using_zombie_powerups))
85 level._effect[
"powerup_on_red"] =
"zombie/fx_powerup_on_red_zmb";
86 level._effect[
"powerup_grabbed_red"] =
"zombie/fx_powerup_grab_red_zmb";
88 level._effect[
"powerup_on_solo"] =
"zombie/fx_powerup_on_solo_zmb";
89 level._effect[
"powerup_grabbed_solo"] =
"zombie/fx_powerup_grab_solo_zmb";
90 level._effect[
"powerup_on_caution"] =
"zombie/fx_powerup_on_caution_zmb";
91 level._effect[
"powerup_grabbed_caution"] =
"zombie/fx_powerup_grab_caution_zmb";
95 if(!level.enable_magic)
114 if( !IsDefined( level.active_powerups ) )
116 level.active_powerups = [];
122 add_zombie_powerup(
"insta_kill_ug",
"zombie_skull", &
"ZOMBIE_POWERUP_INSTA_KILL", &
func_should_never_drop,
POWERUP_ONLY_AFFECTS_GRABBER, !
POWERUP_ANY_TEAM, !
POWERUP_ZOMBIE_GRABBABLE, undefined,
CLIENTFIELD_POWERUP_INSTANT_KILL_UG,
"zombie_powerup_insta_kill_ug_time",
"zombie_powerup_insta_kill_ug_on",
VERSION_SHIP );
124 if(isDefined(level.level_specific_init_powerups))
126 [[level.level_specific_init_powerups]]();
131 level.zombie_powerup_index = 0;
135 level.rare_powerups_active = 0;
138 level.firesale_vox_firstime =
false;
150 self.zombie_vars[
"zombie_powerup_insta_kill_ug_on" ] =
false;
151 self.zombie_vars[
"zombie_powerup_insta_kill_ug_time" ] = 18;
156 if ( !IsDefined( level.zombie_weapons_no_max_ammo ) )
158 level.zombie_weapons_no_max_ammo = [];
161 level.zombie_weapons_no_max_ammo[ weapon ] = 1;
170 if(isDefined(level.current_game_module) && level.current_game_module == 2)
176 flashing_timers = [];
177 flashing_values = [];
179 flashing_delta_time = 0;
180 flashing_is_on =
false;
183 while( flashing_timer >= flashing_min_timer )
196 flashing_timer = flashing_timer - flashing_delta_time - 0.05;
201 flashing_timer = flashing_timer - flashing_delta_time;
205 flashing_timers[flashing_timers.size] = flashing_timer;
206 flashing_values[flashing_values.size] = flashing_value;
208 flashing_is_on = !flashing_is_on;
213 powerup_keys = GetArrayKeys( level.zombie_powerups );
214 for ( powerup_key_index = 0; powerup_key_index < powerup_keys.size; powerup_key_index++ )
216 if ( IsDefined( level.zombie_powerups[powerup_keys[powerup_key_index]].client_field_name ) )
218 powerup_name = powerup_keys[powerup_key_index];
219 client_fields[powerup_name] = SpawnStruct();
221 client_fields[powerup_name].client_field_name = level.zombie_powerups[powerup_name].client_field_name;
222 client_fields[powerup_name].only_affects_grabber = level.zombie_powerups[powerup_name].only_affects_grabber;
223 client_fields[powerup_name].time_name = level.zombie_powerups[powerup_name].time_name;
224 client_fields[powerup_name].on_name = level.zombie_powerups[powerup_name].on_name;
227 client_field_keys = GetArrayKeys( client_fields );
235 players = level.players;
238 for( playerIndex = 0; playerIndex < players.size; playerIndex++ )
240 for ( client_field_key_index = 0; client_field_key_index < client_field_keys.size; client_field_key_index++ )
242 player = players[playerIndex];
245 if (isdefined(level.powerup_player_valid))
247 if ( ! [[level.powerup_player_valid]]( player ))
251 client_field_name = client_fields[client_field_keys[client_field_key_index]].client_field_name;
252 time_name = client_fields[client_field_keys[client_field_key_index]].time_name;
253 on_name = client_fields[client_field_keys[client_field_key_index]].on_name;
254 powerup_timer = undefined;
255 powerup_on = undefined;
258 if ( client_fields[client_field_keys[client_field_key_index]].only_affects_grabber )
260 if( IsDefined( player._show_solo_hud ) && player._show_solo_hud ==
true )
262 powerup_timer = player.zombie_vars[time_name];
263 powerup_on = player.zombie_vars[on_name];
266 else if ( IsDefined( level.zombie_vars[player.team][time_name] ) )
268 powerup_timer = level.zombie_vars[player.team][time_name];
269 powerup_on = level.zombie_vars[player.team][on_name];
271 else if ( IsDefined( level.zombie_vars[time_name] ) )
273 powerup_timer = level.zombie_vars[time_name];
274 powerup_on = level.zombie_vars[on_name];
277 if ( IsDefined( powerup_timer ) && IsDefined( powerup_on ) )
299 for ( i = flashing_timers.size - 1; i > 0; i-- )
301 if ( powerup_timer < flashing_timers[i] )
303 flashing_value = flashing_values[i];
323 if( !isdefined( level.zombie_powerup_array ) )
325 level.zombie_powerup_array = [];
329 level.zombie_powerup_array = array::randomize( level.zombie_powerup_array );
338 powerup = level.zombie_powerup_array[ level.zombie_powerup_index ];
340 level.zombie_powerup_index++;
341 if( level.zombie_powerup_index >= level.zombie_powerup_array.size )
343 level.zombie_powerup_index = 0;
361 if ( isdefined( level.zombie_powerup_boss ) )
363 i = level.zombie_powerup_boss;
364 level.zombie_powerup_boss = undefined;
365 return level.zombie_powerup_array[ i ];
368 if ( isdefined( level.zombie_powerup_ape ) )
370 powerup = level.zombie_powerup_ape;
371 level.zombie_powerup_ape = undefined;
379 if( ![[level.zombie_powerups[powerup].func_should_drop_with_regular_powerups]]() )
390 players = GetPlayers();
391 for ( i=0; i<players.size; i++ )
393 if( players[i].zombie_vars[
"zombie_powerup_minigun_on" ] ==
true )
403 if( !isdefined( level.solo_lives_given ) || level.solo_lives_given == 0 )
419 level endon(
"unloaded");
424 players = GetPlayers();
425 score_to_drop = ( players.size * level.zombie_vars[
"zombie_score_start_"+players.size+
"p"] ) + level.zombie_vars[
"zombie_powerup_drop_increment"];
431 players = GetPlayers();
433 curr_total_score = 0;
435 for (i = 0; i < players.size; i++)
437 if(isdefined(players[i].score_total))
439 curr_total_score += players[i].score_total;
443 if (curr_total_score > score_to_drop )
445 level.zombie_vars[
"zombie_powerup_drop_increment"] *= 1.14;
446 score_to_drop = curr_total_score + level.zombie_vars[
"zombie_powerup_drop_increment"];
447 level.zombie_vars[
"zombie_drop_item"] = 1;
456 powerup_keys = GetArrayKeys( level.zombie_powerups );
457 powerup_keys = array::randomize( powerup_keys );
458 return powerup_keys[0];
463 powerup_keys = GetArrayKeys( level.zombie_powerups );
464 powerup_keys = array::randomize( powerup_keys );
466 for ( i = 0; i < powerup_keys.size; i++ )
468 if ( [[level.zombie_powerups[powerup_keys[i]].func_should_drop_with_regular_powerups]]() )
470 return powerup_keys[i];
474 return powerup_keys[0];
477 function add_zombie_powerup( powerup_name, model_name, hint, func_should_drop_with_regular_powerups, only_affects_grabber, any_team, zombie_grabbable, fx, client_field_name, time_name, on_name, clientfield_version =
VERSION_SHIP, player_specific =
false )
479 if( IsDefined( level.zombie_include_powerups ) && !
IS_TRUE( level.zombie_include_powerups[powerup_name] ) )
484 if( !IsDefined( level.zombie_powerup_array ) )
486 level.zombie_powerup_array = [];
489 struct = SpawnStruct();
491 if( !IsDefined( level.zombie_powerups ) )
493 level.zombie_powerups = [];
496 struct.powerup_name = powerup_name;
497 struct.model_name = model_name;
498 struct.weapon_classname =
"script_model";
500 struct.func_should_drop_with_regular_powerups = func_should_drop_with_regular_powerups;
501 struct.only_affects_grabber = only_affects_grabber;
502 struct.any_team = any_team;
503 struct.zombie_grabbable = zombie_grabbable;
505 struct.hash_id = HashString(powerup_name);
507 struct.player_specific = player_specific;
509 struct.can_pick_up_in_last_stand =
true;
511 if( IsDefined( fx ) )
516 level.zombie_powerups[powerup_name] =
struct;
517 level.zombie_powerup_array[level.zombie_powerup_array.size] = powerup_name;
520 if( IsDefined( client_field_name ) )
523 struct.client_field_name = client_field_name;
524 struct.time_name = time_name;
525 struct.on_name = on_name;
531 level.zombie_powerups[ powerup_name ].can_pick_up_in_last_stand = b_can_pick_up;
536 level._custom_powerups[ powerup_name ].prevent_pick_up_if_drinking = b_prevent_pick_up;
541 level.zombie_powerups[ powerup_name ].player_specific = b_player_specific;
546 DEFAULT( level.zombie_statless_powerups, [] );
548 level.zombie_statless_powerups[ powerup_name ] =
true;
554 if ( !IsDefined( level.zombie_special_drop_array ) )
556 level.zombie_special_drop_array = [];
559 level.zombie_special_drop_array[ level.zombie_special_drop_array.size ] = powerup_name;
564 if( !IsDefined( level.zombie_include_powerups ) )
566 level.zombie_include_powerups = [];
569 level.zombie_include_powerups[powerup_name] =
true;
575 assert( isdefined( level.zombie_powerups ) );
576 assert( isdefined( level.zombie_powerups[ powerup_name ] ) );
583 level.powerup_drop_count = 0;
588 if( isdefined( level.custom_zombie_powerup_drop ) )
590 b_outcome = [[ level.custom_zombie_powerup_drop ]]( drop_point );
598 if( level.powerup_drop_count >= level.zombie_vars[
"zombie_powerup_drop_max_per_round"] )
603 if( !isDefined(level.zombie_include_powerups) || level.zombie_include_powerups.size == 0 )
609 rand_drop = randomint(100);
613 debug =
"zm_bgb_power_vacuum";
615 else if (rand_drop > 2)
617 if (!level.zombie_vars[
"zombie_drop_item"])
630 playable_area = getentarray(
"player_volume",
"script_noteworthy");
634 level.powerup_drop_count++;
640 for (i = 0; i < playable_area.size; i++)
642 if (powerup istouching(playable_area[i]))
651 if( valid_drop && level.rare_powerups_active )
653 pos = ( drop_point[0], drop_point[1], drop_point[2] + 42 );
656 level.zombie_vars[
"zombie_drop_item"] = 0;
664 level.powerup_drop_count--;
678 level.zombie_vars[
"zombie_drop_item"] = 0;
681 level notify(
"powerup_dropped", powerup);
688 function specific_powerup_drop( powerup_name, drop_spot, powerup_team, powerup_location, pickup_delay, powerup_player, b_stay_forever )
692 level notify(
"powerup_dropped", powerup);
694 if ( IsDefined(powerup) )
696 powerup
powerup_setup( powerup_name,powerup_team, powerup_location, powerup_player );
703 if ( isdefined( pickup_delay ) && pickup_delay > 0 )
728 if( !isDefined(level.zombie_include_powerups) || level.zombie_include_powerups.size == 0 )
733 powerup =
spawn (
"script_model", drop_point + (0,0,40));
736 playable_area = getentarray(
"player_volume",
"script_noteworthy");
739 for (i = 0; i < playable_area.size; i++)
741 if (powerup istouching(playable_area[i]))
759 function powerup_setup( powerup_override,powerup_team, powerup_location, powerup_player, shouldplaysound =
true )
763 if ( !IsDefined( powerup_override ) )
769 powerup = powerup_override;
778 struct = level.zombie_powerups[powerup];
780 if ( IsDefined( level._custom_powerups ) && IsDefined( level._custom_powerups[ powerup ] ) && IsDefined( level._custom_powerups[ powerup ].setup_powerup ) )
782 self [[level._custom_powerups[ powerup ].setup_powerup]]();
786 self SetModel(
struct.model_name );
789 demo::bookmark(
"zm_powerup_dropped", gettime(), undefined, undefined, 1 );
794 playsoundatposition(
"zmb_spawn_powerup",
self.origin);
797 if(isDefined(powerup_team))
799 self.powerup_team = powerup_team;
801 if(isDefined(powerup_location))
803 self.powerup_location = powerup_location;
805 if(isDefined(powerup_player))
808 self.powerup_player = powerup_player;
814 assert( !
IS_TRUE(
struct.player_specific),
"Player specific powerup dropped with no player specified" );
816 self.powerup_name =
struct.powerup_name;
817 self.hint =
struct.hint;
818 self.only_affects_grabber =
struct.only_affects_grabber;
819 self.any_team =
struct.any_team;
820 self.zombie_grabbable =
struct.zombie_grabbable;
821 self.func_should_drop_with_regular_powerups =
struct.func_should_drop_with_regular_powerups;
823 if( IsDefined(
struct.fx ) )
828 if( IsDefined(
struct.can_pick_up_in_last_stand ) )
830 self.can_pick_up_in_last_stand =
struct.can_pick_up_in_last_stand;
833 self PlayLoopSound(
"zmb_spawn_powerup_loop");
835 level.active_powerups[level.active_powerups.size]=
self;
845 if( isdefined( level.powerup_special_drop_override ) )
847 powerup = [[ level.powerup_special_drop_override ]]();
854 if ( isdefined( powerup ) )
856 Playfx( level._effect[
"lightning_dog_spawn"],
self.origin );
857 playsoundatposition(
"zmb_hellhound_prespawn",
self.origin );
859 playsoundatposition(
"zmb_hellhound_bolt",
self.origin );
861 Earthquake( 0.5, 0.75,
self.origin, 1000);
863 playsoundatposition(
"zmb_hellhound_spawn",
self.origin );
886 self endon(
"powerup_timedout" );
887 self endon(
"powerup_grabbed" );
888 self endon(
"hacked" );
891 zombie_grab_trigger enablelinkto();
892 zombie_grab_trigger linkto(
self );
893 zombie_grab_trigger SetTeamForTrigger( level.zombie_team );
897 if(isDefined(level._zombie_grabbable_poi_distance_override))
899 poi_dist = level._zombie_grabbable_poi_distance_override;
903 while ( isdefined(
self ) )
905 zombie_grab_trigger waittill(
"trigger", who );
906 if ( isdefined( level._powerup_grab_check ) )
908 if ( !
self [[level._powerup_grab_check]]( who ) )
920 else if( !isdefined( who ) || !IsAI( who ) )
925 playfx( level._effect[
"powerup_grabbed_red"],
self.origin );
927 if( isdefined( level._custom_powerups ) && isdefined( level._custom_powerups[
self.powerup_name ] ) && isdefined( level._custom_powerups[
self.powerup_name ].grab_powerup ) )
929 b_continue =
self [[ level._custom_powerups[
self.powerup_name ].grab_powerup ]]();
937 if ( IsDefined( level._zombiemode_powerup_zombie_grab ) )
939 level thread [[ level._zombiemode_powerup_zombie_grab ]]( self );
942 if ( IsDefined( level._game_mode_powerup_zombie_grab ) )
944 level thread [[ level._game_mode_powerup_zombie_grab ]](
self,who );
959 playsoundatposition(
"zmb_powerup_grabbed",
self.origin );
960 self stoploopsound();
963 self notify(
"powerup_grabbed" );
969 if ( isdefined(
self ) &&
self.zombie_grabbable )
975 self endon (
"powerup_timedout");
976 self endon (
"powerup_grabbed");
978 range_squared = 64 * 64;
979 while (isdefined(
self))
981 if( IsDefined(
self.powerup_player ) )
984 grabbers[0] =
self.powerup_player;
986 else if( IsDefined(level.powerup_grab_get_players_override) )
988 grabbers = [[level.powerup_grab_get_players_override]]();
992 grabbers = GetPlayers();
995 for (i = 0; i < grabbers.size; i++)
997 grabber = grabbers[i];
998 if ( IsAlive( grabber.owner ) && IsPlayer( grabber.owner ) )
1000 player = grabber.owner;
1002 else if ( IsPlayer( grabber ) )
1008 if (
self.only_affects_grabber && !isdefined( player ) )
1013 if( IsDefined( player.is_drinking ) &&
IS_DRINKING( player.is_drinking ) && IsDefined( level._custom_powerups ) && IsDefined( level._custom_powerups[
self.powerup_name ] ) &&
IS_TRUE( level._custom_powerups[
self.powerup_name ].prevent_pick_up_if_drinking ) )
1020 if ( (
self.powerup_name ==
"minigun" ||
self.powerup_name ==
"tesla" ||
self.powerup_name ==
"random_weapon" ) &&
1021 ( !IsPlayer( grabber ) ||
1035 ignore_range =
false;
1036 if ( grabber.ignore_range_powerup ===
self )
1038 grabber.ignore_range_powerup = undefined;
1039 ignore_range =
true;
1042 if ( DistanceSquared( grabber.origin,
self.origin ) < range_squared || ignore_range )
1044 if ( isdefined( level._powerup_grab_check ) )
1046 if ( !
self [[level._powerup_grab_check]]( player ) )
1059 if( isdefined( level._custom_powerups ) && isdefined( level._custom_powerups[
self.powerup_name ] ) && isdefined( level._custom_powerups[
self.powerup_name ].grab_powerup ) )
1061 b_continue =
self [[ level._custom_powerups[
self.powerup_name ].grab_powerup ]]( player );
1069 switch (
self.powerup_name)
1071 case "teller_withdrawl":
1078 if ( IsDefined( level._zombiemode_powerup_grab ) )
1080 level thread [[ level._zombiemode_powerup_grab ]](
self, player );
1094 if (isDefined(
self.hash_id))
1109 if (
self.only_affects_grabber )
1111 playfx( level._effect[
"powerup_grabbed_solo"],
self.origin );
1113 else if (
self.any_team )
1115 playfx( level._effect[
"powerup_grabbed_caution"],
self.origin );
1119 playfx( level._effect[
"powerup_grabbed"],
self.origin );
1124 level notify(
"monkey_see_monkey_dont_achieved" );
1127 if( IsDefined(
self.grabbed_level_notify ) )
1129 level notify(
self.grabbed_level_notify );
1133 self.claimed =
true;
1134 self.power_up_grab_player = player;
1139 playsoundatposition(
"zmb_powerup_grabbed",
self.origin);
1140 self stoploopsound();
1144 if(
self.powerup_name !=
"fire_sale" )
1146 if( isdefined(
self.power_up_grab_player ) )
1148 if(isDefined(level.powerup_intro_vox))
1150 level thread [[level.powerup_intro_vox]](
self);
1155 if(isDefined(level.powerup_vo_available) )
1157 can_say_vo = [[level.powerup_vo_available]]();
1161 self notify (
"powerup_grabbed");
1169 if(
IS_TRUE(
self.only_affects_grabber ) )
1175 self notify (
"powerup_grabbed");
1184 current_window = undefined;
1185 shortest_distance = undefined;
1186 for( i = 0; i < windows.size; i++ )
1191 if( !IsDefined( current_window ) )
1193 current_window = windows[i];
1194 shortest_distance = DistanceSquared( current_window.origin, origin );
1199 if( DistanceSquared(windows[i].origin, origin) < shortest_distance )
1202 current_window = windows[i];
1203 shortest_distance = DistanceSquared( windows[i].origin, origin );
1210 return current_window;
1218 self endon(
"death");
1219 self endon(
"disconnect");
1221 if( !isPlayer(
self ) )
1224 if(isDefined(level.powerup_vo_available) )
1226 if(![[level.powerup_vo_available]]() )
1232 wait( randomfloatrange(2,2.5) );
1234 if( type ==
"tesla" )
1243 if(isDefined(level.custom_powerup_vo_response))
1245 level [[level.custom_powerup_vo_response]](
self,type);
1251 self endon(
"death" );
1253 if ( !isdefined(
self ) )
1258 if ( isDefined(level.powerup_fx_func) )
1260 self thread [[level.powerup_fx_func]]();
1266 if (
self.only_affects_grabber )
1270 else if (
self.any_team )
1274 else if (
self.zombie_grabbable )
1286 self endon(
"powerup_grabbed" );
1287 self endon(
"powerup_timedout" );
1291 while ( isdefined(
self ) )
1293 waittime = randomfloatrange( 2.5, 5 );
1294 yaw = RandomInt( 360 );
1303 yaw =
self.angles[1] + yaw;
1304 new_angles = (-60 + randomint( 120 ), yaw, -45 + randomint( 90 ));
1305 self rotateto( new_angles, waittime, waittime * 0.5, waittime * 0.5 );
1306 if ( isdefined(
self.worldgundw ) )
1308 self.worldgundw rotateto( new_angles, waittime, waittime * 0.5, waittime * 0.5 );
1310 wait randomfloat( waittime - 0.1 );
1319 if ( isdefined(
self.worldgundw ) )
1321 self.worldgundw ghost();
1327 if ( isdefined(
self.worldgundw ) )
1329 self.worldgundw show();
1331 if(isDefined(
self.powerup_player))
1333 self SetInvisibleToAll();
1334 self SetVisibleToPlayer(
self.powerup_player );
1335 if ( isdefined(
self.worldgundw ) )
1337 self.worldgundw SetInvisibleToAll();
1338 self.worldgundw SetVisibleToPlayer(
self.powerup_player );
1346 if(isDefined(level._powerup_timeout_override)&& !isDefined(
self.powerup_team))
1348 self thread [[level._powerup_timeout_override]]();
1351 self endon(
"powerup_grabbed" );
1352 self endon(
"death" );
1353 self endon(
"powerup_reset");
1358 if (isDefined( level._powerup_timeout_custom_time ) )
1360 time = [[level._powerup_timeout_custom_time]](
self);
1376 for ( i = 0; i < 40; i++ )
1402 self notify(
"powerup_timedout" );
1409 ArrayRemoveValue(level.active_powerups,
self,
false);
1410 if ( isdefined(
self.worldgundw ) )
1412 self.worldgundw
delete();
1419 if (isdefined(time))
1432 return( level.zombie_vars[
self.team][
"zombie_insta_kill"] );
1440 if(isDefined(player) && isAlive(player) && isDefined(level.check_for_instakill_override))
1442 if ( !
self [[level.check_for_instakill_override]](player) )
1447 if(player.use_weapon_type ==
"MOD_MELEE")
1449 player.last_kill_method =
"MOD_MELEE";
1453 player.last_kill_method =
"MOD_UNKNOWN";
1462 self DoDamage(
self.health + 666,
self.origin, player,
self, hit_location, modName );
1463 player notify(
"zombie_killed");
1467 if( IsDefined( player ) && IsAlive( player ) && ( level.zombie_vars[player.team][
"zombie_insta_kill"] ||
IS_TRUE( player.personal_instakill )) )
1474 if ( IsDefined(
self.instakill_func ) )
1476 b_result =
self thread [[
self.instakill_func ]]( player, mod, hit_location );
1483 if(player.use_weapon_type ==
"MOD_MELEE")
1485 player.last_kill_method =
"MOD_MELEE";
1489 player.last_kill_method =
"MOD_UNKNOWN";
1499 self DoDamage(
self.health + 666,
self.origin, player,
self, hit_location, modName );
1500 player notify(
"zombie_killed");
1506 self endon (
"disconnect");
1509 if ( level.zombie_vars[player_team][
"zombie_powerup_double_points_on"] )
1516 level.zombie_vars[player_team][
"zombie_powerup_double_points_on"] =
true;
1538 temp_ent =
spawn(
"script_origin", (0,0,0));
1539 temp_ent playloopsound (
"zmb_double_point_loop");
1542 while ( level.zombie_vars[player_team][
"zombie_powerup_double_points_time"] >= 0)
1545 level.zombie_vars[player_team][
"zombie_powerup_double_points_time"] = level.zombie_vars[player_team][
"zombie_powerup_double_points_time"] - 0.05;
1550 level.zombie_vars[player_team][
"zombie_powerup_double_points_on"] =
false;
1551 players = GetPlayers( player_team );
1552 for (i = 0; i < players.size; i++)
1555 players[i] playsound(
"zmb_points_loop_off");
1557 temp_ent stoploopsound(2);
1588 players = GetPlayers();
1589 for ( i = 0; i < players.size; i++ )
1591 if ( players[i].zombie_vars[
"zombie_powerup_tesla_on" ] )
1611 if(!isdefined(level._additional_carpenter_nodes))
1613 level._additional_carpenter_nodes = [];
1616 node._post_carpenter_callback =
callback;
1618 level._additional_carpenter_nodes[level._additional_carpenter_nodes.size] = node;
1627 if( IsDefined(level.pers_carpenter_boards_active) && (level.pers_carpenter_boards_active ==
true) )
1651 self endon (
"powerup_timedout");
1652 self endon (
"powerup_grabbed");
1657 self waittill(
"move_powerup", moveto, distance);
1658 drag_vector = moveto -
self.origin;
1659 range_squared = LengthSquared(drag_vector);
1660 if ( range_squared > distance * distance )
1662 drag_vector = VectorNormalize( drag_vector );
1663 drag_vector = distance * drag_vector;
1664 moveto =
self.origin + drag_vector;
1666 self.origin = moveto;
1672 self endon (
"powerup_timedout");
1673 self endon (
"powerup_grabbed");
1678 level waittill(
"emp_detonate",origin,radius);
1679 if ( DistanceSquared( origin,
self.origin) < radius * radius )
1681 PlayFX( level._effect[
"powerup_off" ],
self.origin );
1683 self notify(
"powerup_timedout" );
1690 if (isdefined(origin) && isdefined(radius))
1693 foreach( powerup
in level.active_powerups )
1695 if ( DistanceSquared( origin, powerup.origin) < radius * radius )
1697 powerups[powerups.size] = powerup;
1702 return level.active_powerups;
1707 if ( powerup_name ==
"teller_withdrawl" || powerup_name ==
"blue_monkey" || powerup_name ==
"free_perk" || powerup_name ==
"bonus_points_player" )
1712 if ( isdefined( level.zombie_statless_powerups ) && isdefined( level.zombie_statless_powerups[powerup_name] ) && level.zombie_statless_powerups[powerup_name] )
1728 self endon (
"disconnect");
1730 str_index_on =
"zombie_powerup_" + str_powerup +
"_on";
1731 str_index_time =
"zombie_powerup_" + str_powerup +
"_time";
1734 if ( level.zombie_vars[player_team][str_index_on] )
1745 level.zombie_vars[player_team][str_index_on] =
true;
1753 str_index_on =
"zombie_powerup_" + str_powerup +
"_on";
1754 str_index_time =
"zombie_powerup_" + str_powerup +
"_time";
1755 str_sound_loop =
"zmb_" + str_powerup +
"_loop";
1756 str_sound_off =
"zmb_" + str_powerup +
"_loop_off";
1758 temp_ent =
Spawn(
"script_origin", (0,0,0));
1759 temp_ent PlayLoopSound (str_sound_loop);
1767 while ( level.zombie_vars[player_team][str_index_time] >= 0)
1770 level.zombie_vars[player_team][str_index_time] = level.zombie_vars[player_team][str_index_time] - 0.05;
1774 level.zombie_vars[player_team][str_index_on] =
false;
1776 GetPlayers()[0] PlaySoundToTeam(str_sound_off, player_team);
1778 temp_ent StopLoopSound(2);
1791 str_weapon_on =
"zombie_powerup_" + str_weapon +
"_on";
1792 str_weapon_time_over = str_weapon +
"_time_over";
1794 ent_player notify(
"replace_weapon_powerup" );
1795 ent_player._show_solo_hud =
true;
1797 ent_player.has_specific_powerup_weapon[ str_weapon ] =
true;
1798 ent_player.has_powerup_weapon =
true;
1804 ent_player EnableWeaponCycling();
1807 ent_player._zombie_weapon_before_powerup[ str_weapon ] = ent_player GetCurrentWeapon();
1810 ent_player GiveWeapon( level.zombie_powerup_weapon[ str_weapon ] );
1811 ent_player SwitchToWeapon( level.zombie_powerup_weapon[ str_weapon ] );
1813 ent_player.zombie_vars[ str_weapon_on ] =
true;
1822 ent_player endon(
"death" );
1823 ent_player endon(
"disconnect" );
1824 ent_player endon(
"player_downed" );
1825 ent_player endon( str_gun_return_notify );
1826 ent_player endon(
"replace_weapon_powerup" );
1830 ent_player waittill(
"weapon_change", newWeapon, oldWeapon );
1832 if( newWeapon != level.weaponNone && newWeapon != level.zombie_powerup_weapon[ str_weapon ] )
1843 ent_player endon(
"death" );
1844 ent_player endon(
"disconnect" );
1845 ent_player endon(
"player_downed" );
1846 ent_player endon( str_gun_return_notify );
1847 ent_player endon(
"replace_weapon_powerup" );
1849 str_weapon_time =
"zombie_powerup_" + str_weapon +
"_time";
1851 ent_player.zombie_vars[str_weapon_time] = time;
1858 [[level._custom_powerups[ str_weapon ].weapon_countdown]]( ent_player, str_weapon_time );
1865 ent_player endon(
"death" );
1866 ent_player endon(
"disconnect" );
1867 ent_player endon(
"player_downed" );
1868 ent_player endon( str_gun_return_notify );
1870 str_weapon_on =
"zombie_powerup_" + str_weapon +
"_on";
1872 ent_player waittill(
"replace_weapon_powerup" );
1874 ent_player TakeWeapon( level.zombie_powerup_weapon[ str_weapon ] );
1876 ent_player.zombie_vars[ str_weapon_on ] =
false;
1878 ent_player.has_specific_powerup_weapon[ str_weapon ] =
false;
1879 ent_player.has_powerup_weapon =
false;
1886 ent_player endon(
"death" );
1887 ent_player endon(
"player_downed" );
1889 str_weapon_on =
"zombie_powerup_" + str_weapon +
"_on";
1892 ent_player TakeWeapon( level.zombie_powerup_weapon[ str_weapon ] );
1894 ent_player.zombie_vars[ str_weapon_on ] =
false;
1895 ent_player._show_solo_hud =
false;
1897 ent_player.has_specific_powerup_weapon[ str_weapon ] =
false;
1898 ent_player.has_powerup_weapon =
false;
1901 ent_player notify( str_gun_return_notify );
1905 if ( b_switch_back_weapon )
1913 str_notify = str_weapon +
"_time_over";
1914 str_weapon_on =
"zombie_powerup_" + str_weapon +
"_on";
1916 if ( !IsDefined(
self.has_specific_powerup_weapon ) || !
IS_TRUE(
self.has_specific_powerup_weapon[ str_weapon ] ) )
1921 primaryWeapons =
self GetWeaponsListPrimaries();
1923 for( i = 0; i < primaryWeapons.size; i++ )
1925 if( primaryWeapons[i] == level.zombie_powerup_weapon[ str_weapon ] )
1927 self TakeWeapon( level.zombie_powerup_weapon[ str_weapon ] );
1932 self notify( str_notify );
1933 self.zombie_vars[ str_weapon_on ] =
false;
1934 self._show_solo_hud =
false;
1939 self.has_specific_powerup_weapon[ str_weapon ] =
false;
1940 self.has_powerup_weapon =
false;
1958 Assert( IsDefined( str_powerup ),
"str_powerup is a required argument for register_powerup!" );
1962 if ( IsDefined( func_grab_powerup ) )
1964 if ( !IsDefined( level._custom_powerups[ str_powerup ].grab_powerup ) )
1966 level._custom_powerups[ str_powerup ].grab_powerup = func_grab_powerup;
1970 if ( IsDefined( func_setup ) )
1972 if ( !IsDefined( level._custom_powerups[ str_powerup ].setup_powerup ) )
1974 level._custom_powerups[ str_powerup ].setup_powerup = func_setup;
1982 if ( !IsDefined( level._custom_powerups ) )
1984 level._custom_powerups = [];
1987 if ( !IsDefined( level._custom_powerups[ str_powerup ] ) )
1989 level._custom_powerups[ str_powerup ] = SpawnStruct();
2006 Assert( IsDefined( str_powerup ),
"str_powerup is a required argument for register_powerup!" );
2010 if ( IsDefined( func_countdown ) )
2012 if ( !IsDefined( level._custom_powerups[ str_powerup ].weapon_countdown ) )
2014 level._custom_powerups[ str_powerup ].weapon_countdown = func_countdown;