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\scoreevents_shared;
9 #using scripts\shared\system_shared;
10 #using scripts\shared\trigger_shared;
11 #using scripts\shared\util_shared;
13 #insert scripts\shared\shared.gsh;
15 #using scripts\zm\_util;
16 #using scripts\zm\_bb;
17 #using scripts\zm\_zm_audio;
18 #using scripts\zm\_zm_daily_challenges;
19 #using scripts\zm\_zm_laststand;
20 #using scripts\zm\_zm_pers_upgrades_functions;
21 #using scripts\zm\_zm_score;
22 #using scripts\zm\_zm_spawner;
23 #using scripts\zm\_zm_stats;
24 #using scripts\zm\_zm_unitrigger;
25 #using scripts\zm\_zm_utility;
26 #using scripts\zm\_zm_zonemgr;
28 #insert scripts\zm\_zm_perks.gsh;
29 #insert scripts\zm\_zm_utility.gsh;
30 #insert scripts\zm\_zm.gsh;
32 #namespace zm_blockers;
36 #define STR_NAV_VOLUME_TRAVERSAL "air_buy_gate" // script_noteworthy on a traversal node. Indicates it's used for nav volume
64 if ( isdefined( level.quantum_bomb_register_result_func ) )
80 zombie_doors = GetEntArray(
"zombie_door",
"targetname" );
81 if(isdefined(zombie_doors))
87 zombie_debris = GetEntArray(
"zombie_debris",
"targetname" );
91 flag_blockers = GetEntArray(
"flag_blocker",
"targetname" );
101 self.type = undefined;
102 self.purchaser = undefined;
103 self._door_open =
false;
107 ent_targets = GetEntArray(
self.target,
"targetname" );
108 node_targets = GetNodeArray(
self.target,
"targetname" );
109 targets = ArrayCombine( ent_targets, node_targets,
false,
true );
112 if( isDefined(
self.script_flag) && !isdefined( level.flag[
self.script_flag] ) )
115 if( isdefined(
self.script_flag ) )
117 tokens = Strtok(
self.script_flag,
"," );
118 for ( i=0; i<tokens.size; i++ )
127 if ( !isdefined(
self.script_noteworthy ) )
129 self.script_noteworthy =
"default";
134 for(i=0;i<targets.size;i++)
138 if(!isDefined(targets[i].og_origin))
140 targets[i].og_origin = targets[i].origin;
141 targets[i].og_angles = targets[i].angles;
147 if( isdefined(
self.zombie_cost ) )
149 cost =
self.zombie_cost;
152 self SetCursorHint(
"HINT_NOICON" );
161 if ( isdefined(
self.script_noteworthy ) )
163 if (
self.script_noteworthy ==
"electric_door" ||
self.script_noteworthy ==
"electric_buyable_door" )
165 if ( GetDvarString(
"ui_gametype" ) ==
"zgrief" )
167 self SetInvisibleToAll();
171 self sethintstring(&
"ZOMBIE_NEED_POWER");
173 if( isDefined( level.door_dialog_function ) )
175 self thread [[ level.door_dialog_function ]]();
179 else if (
self.script_noteworthy ==
"local_electric_door" )
181 if ( GetDvarString(
"ui_gametype" ) ==
"zgrief" )
183 self SetInvisibleToAll();
187 self sethintstring(&
"ZOMBIE_NEED_LOCAL_POWER");
189 if( isDefined( level.door_dialog_function ) )
191 self thread [[ level.door_dialog_function ]]();
195 else if (
self.script_noteworthy ==
"kill_counter_door" )
197 self sethintstring(&
"ZOMBIE_DOOR_ACTIVATE_COUNTER", cost);
214 UnlinkTraversal(
self );
215 parent_trig.doors[parent_trig.doors.size] =
self;
218 if ( isdefined(
self.script_noteworthy) &&
self.script_noteworthy ==
"clip" )
220 parent_trig.clip =
self;
221 parent_trig.script_string =
"clip";
223 else if( !isdefined(
self.script_string ) )
225 if( isdefined(
self.script_angles ) )
227 self.script_string =
"rotate";
229 else if( isdefined(
self.script_vector ) )
231 self.script_string =
"move";
236 if ( !isdefined(
self.script_string ) )
238 self.script_string =
"";
242 switch(
self.script_string )
245 assert( isdefined(
self.script_animname ),
"Blocker_init: You must specify a script_animname for "+
self.targetname );
246 assert( isdefined( level.scr_anim[
self.script_animname ] ),
"Blocker_init: You must define a level.scr_anim for script_anim -> "+
self.script_animname );
247 assert( isdefined( level.blocker_anim_func ),
"Blocker_init: You must define a level.blocker_anim_func" );
251 parent_trig.counter_1s =
self;
255 parent_trig.counter_10s =
self;
259 parent_trig.counter_100s =
self;
263 if ( !isdefined(parent_trig.explosives) )
265 parent_trig.explosives = [];
267 parent_trig.explosives[parent_trig.explosives.size] =
self;
272 if (
self.classname ==
"script_brushmodel" )
274 self DisconnectPaths();
276 parent_trig.doors[parent_trig.doors.size] =
self;
287 self waittill(
"trigger", who, force );
289 if ( isdefined( level.custom_door_buy_check ) )
291 if ( !who [[ level.custom_door_buy_check ]](
self ) )
297 if(GetDvarInt(
"zombie_unlock_all") > 0 ||
IS_TRUE( force ) )
302 if( !who UseButtonPressed() )
320 players = GetPlayers();
323 cost =
self.zombie_cost;
325 if(
self._door_open ==
true)
327 self.purchaser = undefined;
337 self.purchaser = who;
343 if(isDefined(level.custom_door_deny_vo_func))
345 who thread [[level.custom_door_deny_vo_func]]();
347 else if(isDefined(level.custom_generic_deny_vo_func))
349 who thread [[level.custom_generic_deny_vo_func]](
true);
360 if(isdefined(level._door_open_rumble_func))
362 who thread [[ level._door_open_rumble_func ]]();
371 self endon(
"kill_door_think" );
372 self endon(
"kill_debris_prompt_thread" );
373 self endon(
"death" );
379 players = level.players;
380 if( isdefined( players ) )
382 for( i = 0; i < players.size; i++ )
384 if( DistanceSquared( players[i].origin,
self.origin ) < dist )
388 self SetInvisibleToPlayer( players[i],
true );
392 self SetInvisibleToPlayer( players[i],
false );
407 if ( isdefined(
self.explosives ) )
409 for ( i=0; i<
self.explosives.size; i++ )
411 self.explosives[i] Show();
416 if (!isdefined(
self.script_int) )
422 all_trigs = getentarray(
self.target,
"target" );
423 for( i = 0; i < all_trigs.size; i++ )
425 all_trigs[i] TriggerEnable(
false );
428 wait (
self.script_int);
429 for ( i=0; i<
self.script_int; i++ )
436 if ( isdefined(
self.explosives ) )
438 for ( i=0; i<
self.explosives.size; i++ )
440 PlayFX( level._effect[
"def_explosion"],
self.explosives[i].origin, AnglesToForward(
self.explosives[i].angles) );
441 self.explosives[i] Hide();
457 if ( !isdefined(
open ))
467 LinkTraversal(
self );
471 UnlinkTraversal(
self );
476 if ( !isdefined(time) )
479 if( isdefined(
self.script_transition_time ) )
481 time =
self.script_transition_time;
487 if ( isdefined(
self.door_moving) )
489 if ( ( isdefined(
self.script_noteworthy ) &&
self.script_noteworthy ==
"clip" ) ||
490 ( isdefined(
self.script_string ) &&
self.script_string ==
"clip" ) )
492 if ( !
IS_TRUE( use_blocker_clip_for_pathing ) )
503 self.door_moving = 1;
504 level notify(
"sndDoorOpening" );
511 if(
self.classname ==
"script_brushmodel" ||
self.classname ==
"script_model")
519 if ( ( isdefined(
self.script_noteworthy ) &&
self.script_noteworthy ==
"clip" ) ||
520 ( isdefined(
self.script_string ) &&
self.script_string ==
"clip" ) )
531 if( isdefined(
self.script_sound ) )
534 playsoundatposition(
self.script_sound,
self.origin );
536 playsoundatposition(
self.script_sound +
"_close",
self.origin );
552 switch(
self.script_string )
555 if(isDefined(
self.script_angles))
557 rot_angle =
self.script_angles;
560 rot_angle =
self.og_angles;
562 self RotateTo( rot_angle, time, 0, 0 );
570 wait(randomfloat(.15));
574 if(isDefined(
self.script_vector))
576 vector = VectorScale(
self.script_vector, scale );
579 self MoveTo(
self.origin + vector, time, time * 0.25, time * 0.25 );
583 self MoveTo(
self.origin + vector, time );
592 wait(randomfloat(.15));
597 self [[ level.blocker_anim_func ]](
self.script_animname );
599 wait(randomfloat(.15));
611 if( isdefined(
self.script_firefx ) )
613 PlayFX( level._effect[
self.script_firefx],
self.origin );
620 zombies = GetAiTeamArray( level.zombie_team );
621 if ( !isDefined( zombies ) )
626 for (i=0; i<zombies.size; i++)
628 if ( !isdefined( zombies[i] ) )
633 if ( zombies[i] istouching(trigger) )
635 zombies[i].marked_for_recycle = 1;
636 zombies[i] DoDamage( zombies[i].health + 666, trigger.origin,
self );
637 wait RandomFloat(0.15);
639 else if(isdefined(level.custom_trapped_zombies))
641 zombies[i] thread [[level.custom_trapped_zombies]]();
642 wait RandomFloat(0.15);
649 foreach( player
in GetPlayers() )
651 if ( player IsTouching(trigger))
660 foreach( player
in GetPlayers() )
664 if (isdefined(trigger) && player IsTouching(trigger))
666 if (isdefined(more_triggers) && more_triggers.size>0)
667 foreach(trig
in more_triggers)
668 if (isdefined(trig) && player IsTouching(trig))
678 zombies = GetAiTeamArray( level.zombie_team );
679 foreach ( zombie
in zombies )
681 if (isdefined(trigger) && zombie IsTouching(trigger))
683 if (isdefined(more_triggers) && more_triggers.size>0)
684 foreach(trig
in more_triggers)
685 if (isdefined(trig) && zombie IsTouching(trig))
694 self endon( end_on );
699 self notify(
"trigger_clear");
705 self endon(
"trigger_clear");
709 self waittill(
"local_power_off" );
716 self endon(
"trigger_clear");
720 self waittill(
"power_off" );
728 if (isdefined(
self.door_hold_trigger))
730 trigger = GetEnt(
self.door_hold_trigger,
"targetname");
732 all_trigs = getentarray(
self.target,
"target" );
734 switch(
self.script_noteworthy )
736 case "local_electric_door":
737 if (isdefined(trigger) || isdefined(all_trigs) )
745 self waittill(
"local_power_off" );
749 case "electric_door":
750 if (isdefined(trigger) || isdefined(all_trigs) )
753 if (isdefined(trigger))
759 self waittill(
"power_off" );
771 self endon(
"kill_door_think");
779 if( isdefined(
self.zombie_cost ) )
781 cost =
self.zombie_cost;
784 self SetHintLowPriority(
true );
788 switch(
self.script_noteworthy )
790 case "local_electric_door":
792 self waittill(
"local_power_on" );
796 if (!isdefined(
self.power_cost))
798 self.power_cost += 200;
800 self setHintString(
"");
802 if(
IS_TRUE( level.local_doors_stay_open ) )
815 self sethintstring(&
"ZOMBIE_NEED_LOCAL_POWER");
819 case "electric_door":
821 self waittill(
"power_on" );
825 if (!isdefined(
self.power_cost))
827 self.power_cost += 200;
829 self setHintString(
"");
831 if(
IS_TRUE( level.local_doors_stay_open ) )
844 self sethintstring(&
"ZOMBIE_NEED_POWER");
851 case "electric_buyable_door":
853 self waittill(
"power_on" );
874 if(isDefined( level._default_door_custom_logic))
876 self [[level._default_door_custom_logic]]();
898 if (
IS_TRUE(
self.power_door_ignore_flag_wait ) )
900 level waittill(
"forever" );
910 if(isdefined(
self.doors))
913 for(i=0;i<
self.doors.size;i++)
915 if ( ( isdefined(
self.doors[i].script_noteworthy ) &&
self.doors[i].script_noteworthy ==
"clip" ) ||
916 ( isdefined(
self.doors[i].script_string ) &&
self.doors[i].script_string ==
"clip" ) )
917 self.doors[i] Solid();
925 if (
IS_TRUE(
self.door_is_moving ) )
928 self.has_been_opened =
true;
932 all_trigs = getentarray(
self.target,
"target" );
934 self.door_is_moving =
true;
935 foreach ( trig
in all_trigs )
937 trig.door_is_moving =
true;
938 trig TriggerEnable(
false );
940 trig.has_been_opened =
true;
941 if ( !isdefined( trig._door_open ) || (trig._door_open ==
false))
943 trig._door_open =
true;
944 trig notify(
"door_opened");
948 trig._door_open =
false;
952 if( isdefined( trig.script_flag ) && trig._door_open ==
true)
954 tokens = Strtok( trig.script_flag,
"," );
955 for ( i=0; i<tokens.size; i++ )
960 else if(isdefined( trig.script_flag ) && trig._door_open ==
false)
962 tokens = Strtok( trig.script_flag,
"," );
963 for ( i=0; i<tokens.size; i++ )
973 else if(trig._door_open ==
true && level
flag::get(
"door_can_close"))
977 else if(trig._door_open ==
false)
983 level notify(
"door_opened");
985 if(isdefined(
self.doors))
987 is_script_model_door =
false;
988 have_moving_clip_for_door =
false;
989 use_blocker_clip_for_pathing =
false;
991 foreach ( door
in self.doors )
993 if (
IS_TRUE( door.ignore_use_blocker_clip_for_pathing_check ) )
1001 if ( door.classname ==
"script_model" )
1003 is_script_model_door =
true;
1007 if ( door.classname ==
"script_brushmodel" &&
1008 ( !isdefined( door.script_noteworthy ) || door.script_noteworthy !=
"clip" ) &&
1009 ( !isdefined( door.script_string ) || door.script_string !=
"clip" ) )
1011 have_moving_clip_for_door =
true;
1015 use_blocker_clip_for_pathing = is_script_model_door && !have_moving_clip_for_door;
1018 for(i=0;i<
self.doors.size;i++)
1022 self.doors[i] thread Door_Activate(
self.doors[i].script_transition_time,
self._door_open, quick_close, use_blocker_clip_for_pathing);
1025 if(
self.doors.size )
1036 self.door_is_moving =
false;
1037 foreach ( trig
in all_trigs )
1039 trig.door_is_moving =
false;
1044 for( i = 0; i < all_trigs.size; i++ )
1046 all_trigs[i] TriggerEnable(
true );
1057 for( i = 0; i < all_trigs.size; i++ )
1059 all_trigs[i] TriggerEnable(
true );
1071 vec = VectorScale( VectorNormalize(
self.script_vector ), 10 );
1072 self RotateRoll( 5, 0.05 );
1074 self MoveTo(
self.origin + vec, 0.1 );
1075 self waittill(
"movedone" );
1077 self PhysicsLaunch(
self.origin,
self.script_vector *300 );
1097 self.door_moving = undefined;
1100 players = GetPlayers();
1101 player_touching =
false;
1102 for( i = 0; i < players.size; i++ )
1104 if( players[i] IsTouching(
self ) )
1106 player_touching =
true;
1111 if( !player_touching )
1129 self waittillmatch(
"door_anim",
"end" );
1131 self.door_moving = undefined;
1134 players = GetPlayers();
1135 player_touching =
false;
1136 for( i = 0; i < players.size; i++ )
1138 if( players[i] IsTouching(
self ) )
1140 player_touching =
true;
1145 if( !player_touching )
1163 self DisconnectPaths();
1172 self DisconnectPaths();
1182 if( isdefined(
self.zombie_cost ) )
1184 cost =
self.zombie_cost;
1188 self setCursorHint(
"HINT_NOICON" );
1190 if( isdefined (
self.script_flag) && !isdefined( level.flag[
self.script_flag] ) )
1196 if ( isdefined(
self.target ) )
1198 targets = GetEntArray(
self.target,
"targetname" );
1199 foreach( target
in targets )
1201 if ( target IsZBarrier() )
1203 for( i=0; i < target GetNumZBarrierPieces(); i++ )
1205 target SetZBarrierPieceState( i,
"closed" );
1210 a_nd_targets = GetNodeArray(
self.target,
"targetname" );
1211 foreach( nd_target
in a_nd_targets )
1216 UnlinkTraversal( nd_target );
1232 if( isDefined( level.custom_debris_function ) )
1234 self [[ level.custom_debris_function ]]();
1238 junk = getentarray(
self.target,
"targetname" );
1239 for( i = 0; i < junk.size; i++ )
1241 if( isdefined( junk[i].script_noteworthy ) )
1243 if( junk[i].script_noteworthy ==
"clip" )
1245 junk[i] disconnectpaths();
1252 self waittill(
"trigger", who, force );
1254 if(GetDvarInt(
"zombie_unlock_all") > 0 ||
IS_TRUE( force ) )
1260 if( !who UseButtonPressed() )
1279 players = GetPlayers();
1280 if(GetDvarInt(
"zombie_unlock_all") > 0)
1315 self notify(
"kill_debris_prompt_thread" );
1319 junk = getentarray(
self.target,
"targetname" );
1322 if( isdefined(
self.script_flag ) )
1324 tokens = Strtok(
self.script_flag,
"," );
1325 for ( i=0; i<tokens.size; i++ )
1332 level notify (
"junk purchased");
1334 move_ent = undefined;
1336 for( i = 0; i < junk.size; i++ )
1338 junk[i] connectpaths();
1340 if( isdefined( junk[i].script_noteworthy ) )
1342 if( junk[i].script_noteworthy ==
"clip" )
1344 a_clip[ a_clip.size ] = junk[i];
1350 if ( junk[i] IsZBarrier() )
1355 else if( isdefined( junk[i].script_linkTo ) )
1357 struct =
struct::get( junk[i].script_linkTo, "script_linkname" );
1358 if( isdefined(
struct ) )
1368 else if( isdefined( junk[i].target) )
1371 if( isdefined(
struct ) )
1388 a_nd_targets = GetNodeArray(
self.target,
"targetname" );
1389 foreach( nd_target
in a_nd_targets )
1394 LinkTraversal( nd_target );
1400 all_trigs = getentarray(
self.target,
"target" );
1401 for( i = 0; i < all_trigs.size; i++ )
1403 all_trigs[i]
delete();
1406 for( i=0; i<a_clip.size; i++ )
1411 if( isdefined( move_ent ) )
1413 move_ent waittill(
"movedone" );
1423 playsoundatposition (
"zmb_lightning_l",
self.origin);
1424 PlayFX( level._effect[
"poltergeist"],
self.origin );
1426 for( i = 0; i <
self GetNumZBarrierPieces(); i++ )
1436 for( i = 0; i <
self GetNumZBarrierPieces(); i++ )
1444 self SetZBarrierPieceState(index,
"opening");
1445 while(
self GetZBarrierPieceState(index) ==
"opening")
1449 self notify(
"movedone" );
1453 self HideZBarrierPiece( index );
1469 playsoundatposition (
"zmb_lightning_l",
self.origin);
1470 if( isdefined(
self.script_firefx ) )
1472 PlayFX( level._effect[
self.script_firefx],
self.origin );
1476 if( isdefined(
self.script_noteworthy ) )
1478 if(
self.script_noteworthy ==
"jiggle" )
1480 num = RandomIntRange( 3, 5 );
1481 og_angles =
self.angles;
1482 for( i = 0; i < num; i++ )
1484 angles = og_angles + ( -5 + RandomFloat( 10 ), -5 + RandomFloat( 10 ), -5 + RandomFloat( 10 ) );
1485 time = RandomFloatRange( 0.1, 0.4 );
1486 self Rotateto( angles, time );
1487 wait( time - 0.05 );
1493 if( isdefined(
self.script_transition_time ) )
1495 time =
self.script_transition_time;
1498 self MoveTo(
struct.origin, time, time * 0.5 );
1499 self RotateTo(
struct.angles, time * 0.75 );
1501 self waittill(
"movedone" );
1506 if( isdefined(
self.script_fxid ) )
1508 PlayFX( level._effect[
self.script_fxid],
self.origin );
1509 playsoundatposition(
"zmb_zombie_spawn",
self.origin);
1561 if( !isdefined(
self.target ) )
1572 targets = GetEntArray(
self.target,
"targetname" );
1574 self.barrier_chunks = [];
1576 for( j = 0; j < targets.size; j++ )
1578 if(targets[j] IsZBarrier())
1580 if( isdefined( level.zbarrier_override ) )
1582 self thread [[level.zbarrier_override]]( targets[j] );
1586 self.zbarrier = targets[j];
1588 self.zbarrier.chunk_health = [];
1590 for( i = 0; i <
self.zbarrier GetNumZBarrierPieces(); i ++)
1592 self.zbarrier.chunk_health[i] = 0;
1603 if( isdefined( targets[j].script_string ) && targets[j].script_string ==
"rock" )
1605 targets[j].material =
"rock";
1608 if( isdefined( targets[j].script_parameters ) )
1610 if( targets[j].script_parameters ==
"grate" )
1612 if( isdefined( targets[j].script_noteworthy ) )
1614 if( targets[j].script_noteworthy ==
"2" || targets[j].script_noteworthy ==
"3" || targets[j].script_noteworthy ==
"4" ||
1615 targets[j].script_noteworthy ==
"5" || targets[j].script_noteworthy ==
"6")
1624 else if( targets[j].script_parameters ==
"repair_board" )
1626 targets[j].unbroken_section = GetEnt(targets[j].target,
"targetname");
1627 if(isdefined(targets[j].unbroken_section))
1629 targets[j].unbroken_section LinkTo(targets[j]);
1631 targets[j] notSolid();
1632 targets[j].unbroken =
true;
1635 if(isdefined(targets[j].unbroken_section.script_noteworthy) && targets[j].unbroken_section.script_noteworthy ==
"glass")
1637 targets[j].material =
"glass";
1640 else if(isdefined(targets[j].unbroken_section.script_noteworthy) && targets[j].unbroken_section.script_noteworthy ==
"metal")
1642 targets[j].material =
"metal";
1646 else if( targets[j].script_parameters ==
"barricade_vents" )
1648 targets[j].material =
"metal_vent";
1652 if( isdefined ( targets[j].targetname ) )
1654 if( targets[j].targetname ==
"auto2" )
1661 targets[j].destroyed =
false;
1663 targets[j].claimed =
false;
1664 targets[j].anim_grate_index = 0;
1666 targets[j].og_origin = targets[j].origin;
1667 targets[j].og_angles = targets[j].angles;
1668 self.barrier_chunks[
self.barrier_chunks.size] = targets[j];
1672 target_nodes = GetNodeArray(
self.target,
"targetname" );
1674 for( j = 0; j < target_nodes.size; j++ )
1676 if(target_nodes[j].type ==
"Begin")
1678 self.neg_start = target_nodes[j];
1680 if(isdefined(
self.neg_start.target))
1682 self.neg_end = getnode(
self.neg_start.target,
"targetname");
1689 if(isdefined(
self.zbarrier))
1691 if(isdefined(
self.barrier_chunks))
1693 for(i = 0; i <
self.barrier_chunks.size; i ++)
1695 self.barrier_chunks[i]
delete();
1698 self.barrier_chunks = [];
1704 self.zbarrier
delete();
1705 self.zbarrier = undefined;
1712 self.trigger_location =
struct::get(
self.target,
"targetname" );
1719 gametype = GetDvarString(
"ui_gametype" );
1733 unbroken_section SetCanDamage(
true );
1734 unbroken_section.health = 99999;
1735 unbroken_section waittill(
"damage", amount, who);
1741 self notify(
"destroyed");
1742 self.unbroken =
false;
1757 numSlots =
self.zbarrier GetZBarrierNumAttackSlots();
1759 numSlots = int(max(numSlots, 1));
1768 reps = floor(numSlots / 2);
1772 for(i = 0; i < reps; i ++)
1774 offset =
self.zbarrier GetZBarrierAttackSlotHorzOffset() * (i + 1);
1790 for( i = 0; i < spots.size; i++ )
1795 self.attack_spots_taken = taken;
1796 self.attack_spots = spots;
1802 level._blocker_choke = 0;
1803 level endon(
"stop_blocker_think");
1807 level._blocker_choke = 0;
1816 level endon(
"stop_blocker_think");
1817 if(!isdefined(level._blocker_choke))
1824 if(isdefined(level._use_choke_blockers) && level._use_choke_blockers == 1)
1835 if(level._blocker_choke > 3)
1841 level._blocker_choke ++;
1864 if( !isdefined(trigger))
1889 if( hold_required && !player UseButtonPressed() )
1914 has_perk = undefined;
1938 if( isDefined(
self.pers[
"boards"] ) &&
self.pers[
"boards"] %10 == 0 )
1944 self.rebuild_barrier_reward += cost;
1945 if(
self.rebuild_barrier_reward < level.zombie_vars[
"rebuild_barrier_cap_per_round"] )
1952 if(isdefined(
self.board_repair))
1954 self.board_repair += 1;
1960 self endon(
"kill_trigger");
1964 self waittill(
"trigger", player );
1965 self.stub.trigger_target notify(
"trigger", player);
1974 self endon(
"blocker_hacked" );
1976 if(
IS_TRUE(level.no_board_repair))
1982 level endon(
"stop_blocker_think");
1986 if( isdefined(
self.zombie_cost ) )
1988 cost =
self.zombie_cost;
1991 original_cost = cost;
1997 if(!isdefined(
self.unitrigger_stub))
2003 if( isdefined(
self.trigger_location ) )
2005 trigger_location =
self.trigger_location;
2009 trigger_location =
self;
2012 if( isdefined( trigger_location.radius ) )
2014 radius = trigger_location.radius;
2017 if( isdefined( trigger_location.height ) )
2019 height = trigger_location.height;
2025 self.unitrigger_stub = spawnstruct();
2026 self.unitrigger_stub.origin = trigger_pos;
2027 self.unitrigger_stub.radius = radius;
2028 self.unitrigger_stub.height = height;
2029 self.unitrigger_stub.script_unitrigger_type =
"unitrigger_radius";
2031 self.unitrigger_stub.cursor_hint =
"HINT_NOICON";
2032 self.unitrigger_stub.trigger_target =
self;
2039 if(!isdefined(trigger_location.angles))
2041 trigger_location.angles = (0,0,0);
2044 self.unitrigger_stub.origin =
zm_utility::groundpos( trigger_location.origin ) + ( 0, 0, 4 ) + (anglestoforward(trigger_location.angles) * - 11);
2073 self waittill(
"trigger", player );
2081 self notify(
"all_boards_repaired");
2089 self notify(
"no valid boards");
2093 if( isdefined( level._zm_blocker_trigger_think_return_override ) )
2095 if(
self [[ level._zm_blocker_trigger_think_return_override ]]( player ) )
2103 players = GetPlayers();
2113 player notify(
"boarding_window",
self );
2115 if(isdefined(
self.zbarrier))
2128 if(isdefined(chunk.script_parameter) && chunk.script_parameters ==
"repair_board" || chunk.script_parameters ==
"barricade_vents")
2130 if(isdefined(chunk.unbroken_section))
2142 if ( !isDefined( chunk.script_parameters ) || chunk.script_parameters ==
"board" || chunk.script_parameters ==
"repair_board" || chunk.script_parameters ==
"barricade_vents")
2145 if(!
IS_TRUE(level.use_clientside_board_fx))
2148 if( !isdefined( chunk.material ) || ( isdefined( chunk.material ) && chunk.material !=
"rock" ) )
2152 playsoundatposition (
"zmb_cha_ching", (0,0,0));
2155 if ( chunk.script_parameters ==
"bar" )
2158 playsoundatposition (
"zmb_cha_ching", (0,0,0));
2162 if(isdefined(chunk.script_parameters))
2164 if( chunk.script_parameters ==
"bar" )
2166 if(isdefined(chunk.script_noteworthy))
2168 if(chunk.script_noteworthy ==
"5")
2172 else if(chunk.script_noteworthy ==
"3" )
2184 if(isdefined(
self.clip))
2186 self.clip TriggerEnable(
true );
2187 self.clip DisconnectPaths();
2209 self notify(
"all_boards_repaired");
2218 self notify(
"no valid boards");
2230 self incrementplayerstat(
"windowsBoarded", 1);
2239 self setInvisibleToPlayer( player, !can_use );
2240 self SetHintString(
self.stub.hint_string );
2286 players = GetPlayers();
2291 for(i = 0; i < players.size; i++)
2294 if (distance (players[i].origin,
self.origin) < 150)
2297 if(isalive(players[i]))
2310 self endon (
"disconnect");
2363 self.rebuild_barrier_reward = 0;
2372 if(isdefined(chunk.script_parameters))
2374 if( chunk.script_parameters ==
"board" || chunk.script_parameters ==
"repair_board" || chunk.script_parameters ==
"barricade_vents")
2380 if(isdefined(chunk.script_parameters))
2382 if( chunk.script_parameters ==
"bar" )
2397 fx =
"wood_chunk_destory";
2398 if( isdefined(
self.script_fxid ) )
2400 fx =
self.script_fxid;
2405 if ( isdefined( chunk.script_moveoverride ) && chunk.script_moveoverride )
2412 if ( isdefined( chunk.script_parameters ) && ( chunk.script_parameters ==
"bar" ) )
2416 if( isdefined ( chunk.script_noteworthy ) && ( chunk.script_noteworthy ==
"4" ) )
2418 ent =
Spawn(
"script_origin", chunk.origin );
2419 ent.angles = node.angles +( 0, 180, 0 );
2424 if(isdefined(chunk.script_move_dist))
2426 dist_max = chunk.script_move_dist - 100;
2427 dist = 100 + RandomInt(dist_max);
2431 dist = 100 + RandomInt( 100 );
2434 dest = ent.origin + ( AnglesToForward( ent.angles ) * dist );
2435 trace = BulletTrace( dest + ( 0, 0, 16 ), dest + ( 0, 0, -200 ),
false, undefined );
2437 if(
trace[
"fraction"] == 1 )
2439 dest = dest + ( 0, 0, -200 );
2443 dest =
trace[
"position"];
2447 chunk LinkTo( ent );
2453 if( RandomInt( 100 ) > 40 )
2455 ent RotatePitch( 180, time * 0.5 );
2459 ent RotatePitch( 90, time, time * 0.5 );
2474 ent =
Spawn(
"script_origin", chunk.origin );
2475 ent.angles = node.angles +( 0, 180, 0 );
2481 if(isdefined(chunk.script_move_dist))
2483 dist_max = chunk.script_move_dist - 100;
2484 dist = 100 + RandomInt(dist_max);
2488 dist = 100 + RandomInt( 100 );
2491 dest = ent.origin + ( AnglesToForward( ent.angles ) * dist );
2492 trace = BulletTrace( dest + ( 0, 0, 16 ), dest + ( 0, 0, -200 ),
false, undefined );
2494 if(
trace[
"fraction"] == 1 )
2496 dest = dest + ( 0, 0, -200 );
2500 dest =
trace[
"position"];
2504 chunk LinkTo( ent );
2517 if( RandomInt( 100 ) > 40 )
2519 ent RotatePitch( 180, time * 0.5 );
2523 ent RotatePitch( 90, time, time * 0.5 );
2541 chunk notify(
"destroyed" );
2544 if ( isdefined ( chunk.script_parameters ) && chunk.script_parameters ==
"board" || chunk.script_parameters ==
"repair_board" || chunk.script_parameters ==
"barricade_vents" )
2547 ent =
Spawn(
"script_origin", chunk.origin );
2548 ent.angles = node.angles +( 0, 180, 0 );
2553 if(isdefined(chunk.script_move_dist))
2555 dist_max = chunk.script_move_dist - 100;
2556 dist = 100 + RandomInt(dist_max);
2560 dist = 100 + RandomInt( 100 );
2563 dest = ent.origin + ( AnglesToForward( ent.angles ) * dist );
2564 trace = BulletTrace( dest + ( 0, 0, 16 ), dest + ( 0, 0, -200 ),
false, undefined );
2566 if(
trace[
"fraction"] == 1 )
2568 dest = dest + ( 0, 0, -200 );
2572 dest =
trace[
"position"];
2576 chunk LinkTo( ent );
2586 if(isdefined(chunk.unbroken_section))
2588 if(!isdefined(chunk.material) || chunk.material !=
"metal")
2594 if( RandomInt( 100 ) > 40 )
2596 ent RotatePitch( 180, time * 0.5 );
2600 ent RotatePitch( 90, time, time * 0.5 );
2605 if(isdefined(chunk.unbroken_section))
2607 if(isdefined(chunk.material) && chunk.material ==
"metal")
2628 chunk notify(
"destroyed" );
2632 if ( isdefined ( chunk.script_parameters ) && ( chunk.script_parameters ==
"grate" ) )
2635 if( isdefined ( chunk.script_noteworthy ) && ( chunk.script_noteworthy ==
"6" ) )
2641 ent =
Spawn(
"script_origin", chunk.origin );
2642 ent.angles = node.angles +( 0, 180, 0 );
2643 dist = 100 + RandomInt( 100 );
2644 dest = ent.origin + ( AnglesToForward( ent.angles ) * dist );
2645 trace = BulletTrace( dest + ( 0, 0, 16 ), dest + ( 0, 0, -200 ),
false, undefined );
2647 if(
trace[
"fraction"] == 1 )
2649 dest = dest + ( 0, 0, -200 );
2653 dest =
trace[
"position"];
2657 chunk LinkTo( ent );
2665 if( RandomInt( 100 ) > 40 )
2667 ent RotatePitch( 180, time * 0.5 );
2671 ent RotatePitch( 90, time, time * 0.5 );
2679 chunk notify(
"destroyed" );
2687 chunk notify(
"destroyed" );
2732 if( isdefined (chunk.script_parameters) && chunk.script_parameters ==
"grate" )
2734 chunk vibrate(( 0, 270, 0 ), 0.2, 0.4, 0.4);
2744 if( isdefined(chunk.material) && !isdefined( chunk.already_broken ) )
2745 chunk.already_broken =
false;
2747 if( isdefined(chunk.material) && chunk.material ==
"glass" && chunk.already_broken ==
false )
2749 chunk PlaySound(
"zmb_break_glass_barrier" );
2750 wait( randomfloatrange( 0.3, 0.6 ));
2751 chunk PlaySound(
"zmb_break_glass_barrier" );
2752 chunk.already_broken =
true;
2754 else if( isdefined(chunk.material) && chunk.material ==
"metal" && chunk.already_broken ==
false )
2756 chunk PlaySound(
"grab_metal_bar" );
2757 wait( randomfloatrange( 0.3, 0.6 ));
2758 chunk PlaySound(
"break_metal_bar" );
2759 chunk.already_broken =
true;
2761 else if( isdefined(chunk.material) && chunk.material ==
"rock" )
2763 if(!
IS_TRUE(level.use_clientside_rock_tearin_fx))
2765 chunk PlaySound(
"zmb_break_rock_barrier" );
2766 wait( randomfloatrange( 0.3, 0.6 ));
2767 chunk PlaySound(
"zmb_break_rock_barrier" );
2769 chunk.already_broken =
true;
2771 else if( isdefined(chunk.material) && chunk.material ==
"metal_vent")
2773 if(!
IS_TRUE(level.use_clientside_board_fx))
2777 chunk PlaySound(
"evt_vent_slat_remove" );
2782 if(!
IS_TRUE(level.use_clientside_board_fx))
2785 wait( randomfloatrange( 0.3, 0.6 ));
2788 chunk.already_broken =
true;
2796 wait( randomfloatrange( 0.3, 0.6 ));
2798 wait( randomfloatrange( 1.0, 1.3 ));
2804 if ( chunk.origin != chunk.og_origin )
2807 chunk waittill(
"movedone" );
2813 if(!isdefined(barrier.zbarrier))
2816 assert( isdefined( chunk.og_origin ) );
2817 assert( isdefined( chunk.og_angles ) );
2819 sound =
"rebuild_barrier_hover";
2820 if( isdefined( chunk.script_presound ) )
2822 sound = chunk.script_presound;
2829 if( isDefined( perk ) )
2835 if( !isdefined( via_powerup ) && isdefined(sound))
2843 barrier.zbarrier ZBarrierPieceUseUpgradedModel(chunk);
2844 barrier.zbarrier.chunk_health[chunk] = barrier.zbarrier GetUpgradedPieceNumLives(chunk);
2848 barrier.zbarrier ZBarrierPieceUseDefaultModel(chunk);
2849 barrier.zbarrier.chunk_health[chunk] = 0;
2861 barrier.zbarrier ShowZBarrierPiece(chunk);
2863 barrier.zbarrier SetZBarrierPieceState(chunk,
"closing", scalar);
2864 waitDuration = barrier.zbarrier GetZBarrierPieceAnimLengthForState(chunk,
"closing", scalar);
2870 foreach ( barrier
in level.exterior_goals )
2872 if ( isdefined( barrier.zbarrier ) )
2874 for ( x = 0; x < barrier.zbarrier GetNumZBarrierPieces(); x++ )
2876 barrier.zbarrier SetZBarrierPieceState( x,
"opening" );
2880 if ( isdefined( barrier.clip ) )
2882 barrier.clip TriggerEnable(
false );
2883 barrier.clip ConnectPaths();
2898 if(isDefined(chunk.material) && chunk.material ==
"rock" )
2900 if(
IS_TRUE(level.use_clientside_rock_tearin_fx))
2906 EarthQuake( RandomFloatRange( 0.3, 0.4 ), RandomFloatRange(0.2, 0.4), chunk.origin, 150 );
2908 wait( randomfloatrange( 0.3, 0.6 ));
2915 if(
IS_TRUE(level.use_clientside_board_fx))
2921 EarthQuake( RandomFloatRange( 0.3, 0.4 ), RandomFloatRange(0.2, 0.4), chunk.origin, 150 );
2923 wait( randomfloatrange( 0.3, 0.6 ));
2934 if(isDefined(chunk.material) && chunk.material ==
"rock")
2936 if (
IS_TRUE(level.use_clientside_rock_tearin_fx))
2943 EarthQuake( RandomFloatRange( 0.3, 0.4 ), RandomFloatRange(0.2, 0.4), chunk.origin, 150 );
2945 wait( randomfloatrange( 0.3, 0.6 ));
2952 if(
IS_TRUE(level.use_clientside_board_fx))
2958 EarthQuake( RandomFloatRange( 0.3, 0.4 ), RandomFloatRange(0.2, 0.4), chunk.origin, 150 );
2960 wait( randomfloatrange( 0.3, 0.6 ));
2972 EarthQuake( RandomFloatRange( 0.3, 0.4 ), RandomFloatRange(0.2, 0.4), chunk.origin, 150 );
2975 switch( randomInt( 9 ) )
2978 PlayFX( level._effect[
"fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) );
2979 wait( randomfloatrange( 0.0, 0.3 ));
2980 PlayFX( level._effect[
"fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) );
2984 PlayFX( level._effect[
"fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) );
2985 wait( randomfloatrange( 0.0, 0.3 ));
2986 PlayFX( level._effect[
"fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) );
2991 PlayFX( level._effect[
"fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) );
2992 wait( randomfloatrange( 0.0, 0.3 ));
2993 PlayFX( level._effect[
"fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) );
2998 PlayFX( level._effect[
"fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) );
2999 wait( randomfloatrange( 0.0, 0.3 ));
3000 PlayFX( level._effect[
"fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) );
3005 PlayFX( level._effect[
"fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) );
3006 wait( randomfloatrange( 0.0, 0.3 ));
3007 PlayFX( level._effect[
"fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) );
3011 PlayFX( level._effect[
"fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) );
3014 PlayFX( level._effect[
"fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) );
3017 PlayFX( level._effect[
"fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) );
3020 PlayFX( level._effect[
"fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) );
3030 EarthQuake( RandomFloatRange( 0.3, 0.4 ), RandomFloatRange(0.2, 0.4), chunk.origin, 150 );
3034 switch( randomInt( 9 ) )
3037 PlayFXOnTag( level._effect[
"fx_zombie_bar_break_lite"], chunk,
"Tag_fx_left" );
3038 wait( randomfloatrange( 0.0, 0.3 ));
3039 PlayFXOnTag( level._effect[
"fx_zombie_bar_break_lite"], chunk,
"Tag_fx_right" );
3043 PlayFXOnTag( level._effect[
"fx_zombie_bar_break"], chunk,
"Tag_fx_left" );
3044 wait( randomfloatrange( 0.0, 0.3 ));
3045 PlayFXOnTag( level._effect[
"fx_zombie_bar_break"], chunk,
"Tag_fx_right" );
3049 PlayFXOnTag( level._effect[
"fx_zombie_bar_break_lite"], chunk,
"Tag_fx_left" );
3050 wait( randomfloatrange( 0.0, 0.3 ));
3051 PlayFXOnTag( level._effect[
"fx_zombie_bar_break"], chunk,
"Tag_fx_right" );
3055 PlayFXOnTag( level._effect[
"fx_zombie_bar_break"], chunk,
"Tag_fx_left" );
3056 wait( randomfloatrange( 0.0, 0.3 ));
3057 PlayFXOnTag( level._effect[
"fx_zombie_bar_break_lite"], chunk,
"Tag_fx_right" );
3061 PlayFXOnTag( level._effect[
"fx_zombie_bar_break_lite"], chunk,
"Tag_fx_left" );
3062 wait( randomfloatrange( 0.0, 0.3 ));
3063 PlayFXOnTag( level._effect[
"fx_zombie_bar_break_lite"], chunk,
"Tag_fx_right" );
3067 PlayFXOnTag( level._effect[
"fx_zombie_bar_break_lite"], chunk,
"Tag_fx_left" );
3070 PlayFXOnTag( level._effect[
"fx_zombie_bar_break_lite"], chunk,
"Tag_fx_right" );
3073 PlayFXOnTag( level._effect[
"fx_zombie_bar_break"], chunk,
"Tag_fx_left" );
3076 PlayFXOnTag( level._effect[
"fx_zombie_bar_break"], chunk,
"Tag_fx_right" );
3084 EarthQuake( RandomFloatRange( 0.3, 0.4 ), RandomFloatRange(0.2, 0.4), chunk.origin, 150 );
3088 switch( randomInt( 9 ) )
3091 PlayFXOnTag( level._effect[
"fx_zombie_bar_break_lite"], chunk,
"Tag_fx_top" );
3092 wait( randomfloatrange( 0.0, 0.3 ));
3093 PlayFXOnTag( level._effect[
"fx_zombie_bar_break_lite"], chunk,
"Tag_fx_bottom" );
3097 PlayFXOnTag( level._effect[
"fx_zombie_bar_break"], chunk,
"Tag_fx_top" );
3098 wait( randomfloatrange( 0.0, 0.3 ));
3099 PlayFXOnTag( level._effect[
"fx_zombie_bar_break"], chunk,
"Tag_fx_bottom" );
3103 PlayFXOnTag( level._effect[
"fx_zombie_bar_break_lite"], chunk,
"Tag_fx_top" );
3104 wait( randomfloatrange( 0.0, 0.3 ));
3105 PlayFXOnTag( level._effect[
"fx_zombie_bar_break"], chunk,
"Tag_fx_bottom" );
3109 PlayFXOnTag( level._effect[
"fx_zombie_bar_break"], chunk,
"Tag_fx_top" );
3110 wait( randomfloatrange( 0.0, 0.3 ));
3111 PlayFXOnTag( level._effect[
"fx_zombie_bar_break_lite"], chunk,
"Tag_fx_bottom" );
3115 PlayFXOnTag( level._effect[
"fx_zombie_bar_break_lite"], chunk,
"Tag_fx_top" );
3116 wait( randomfloatrange( 0.0, 0.3 ));
3117 PlayFXOnTag( level._effect[
"fx_zombie_bar_break_lite"], chunk,
"Tag_fx_bottom" );
3121 PlayFXOnTag( level._effect[
"fx_zombie_bar_break_lite"], chunk,
"Tag_fx_top" );
3124 PlayFXOnTag( level._effect[
"fx_zombie_bar_break_lite"], chunk,
"Tag_fx_bottom" );
3127 PlayFXOnTag( level._effect[
"fx_zombie_bar_break"], chunk,
"Tag_fx_top" );
3130 PlayFXOnTag( level._effect[
"fx_zombie_bar_break"], chunk,
"Tag_fx_bottom" );
3144 AssertMsg(
"Flag Blocker at " +
self.origin +
" does not have a script_flag_wait key value pair" );
3148 if( !isdefined( level.flag[
self.script_flag_wait] ) )
3153 type =
"connectpaths";
3154 if( isdefined(
self.script_noteworthy ) )
3156 type =
self.script_noteworthy;
3163 if( type ==
"connectpaths" )
3165 self ConnectPaths();
3168 self TriggerEnable(
false );
3172 if( type ==
"disconnectpaths" )
3174 self DisconnectPaths();
3176 self TriggerEnable(
false );
3180 AssertMsg(
"flag blocker at " +
self.origin +
", the type \"" + type +
"\" is not recognized" );
3185 assert( isdefined( states ) );
3187 self.state = states;
3194 range_squared = 180 * 180;
3196 zombie_doors = GetEntArray(
"zombie_door",
"targetname" );
3197 for( i = 0; i < zombie_doors.size; i++ )
3199 if ( DistanceSquared( zombie_doors[i].origin, position ) < range_squared )
3205 zombie_airlock_doors = GetEntArray(
"zombie_airlock_buy",
"targetname" );
3206 for( i = 0; i < zombie_airlock_doors.size; i++ )
3208 if ( DistanceSquared( zombie_airlock_doors[i].origin, position ) < range_squared )
3214 zombie_debris = GetEntArray(
"zombie_debris",
"targetname" );
3215 for( i = 0; i < zombie_debris.size; i++ )
3217 if ( DistanceSquared( zombie_debris[i].origin, position ) < range_squared )
3229 range_squared = 180 * 180;
3231 zombie_doors = GetEntArray(
"zombie_door",
"targetname" );
3232 for( i = 0; i < zombie_doors.size; i++ )
3234 if ( DistanceSquared( zombie_doors[i].origin, position ) < range_squared )
3237 zombie_doors[i] notify(
"trigger",
self,
true );
3238 [[level.quantum_bomb_play_area_effect_func]]( position );
3243 zombie_airlock_doors = GetEntArray(
"zombie_airlock_buy",
"targetname" );
3244 for( i = 0; i < zombie_airlock_doors.size; i++ )
3246 if ( DistanceSquared( zombie_airlock_doors[i].origin, position ) < range_squared )
3249 zombie_airlock_doors[i] notify(
"trigger",
self,
true );
3250 [[level.quantum_bomb_play_area_effect_func]]( position );
3255 zombie_debris = GetEntArray(
"zombie_debris",
"targetname" );
3256 for( i = 0; i < zombie_debris.size; i++ )
3258 if ( DistanceSquared( zombie_debris[i].origin, position ) < range_squared )
3261 zombie_debris[i] notify(
"trigger",
self,
true );
3262 [[level.quantum_bomb_play_area_effect_func]]( position );