#include maps/mp/zombies/_zm_unitrigger; #include maps/mp/zombies/_zm_spawner; #include maps/mp/zombies/_zm_laststand; #include maps/mp/zombies/_zm_zonemgr; #include maps/mp/zombies/_zm_audio; #include maps/mp/zombies/_zm_stats; #include maps/mp/_demo; #include maps/mp/zombies/_zm_score; #include maps/mp/zombies/_zm_pers_upgrades_functions; #include maps/mp/zombies/_zm_weapons; #include maps/mp/zombies/_zm_utility; #include maps/mp/zombies/_zm_net; #include maps/mp/_utility; #include common_scripts/utility; init() //checked matches cerberus output { init_blockers(); if ( isDefined( level.quantum_bomb_register_result_func ) ) { [[ level.quantum_bomb_register_result_func ]]( "open_nearest_door", ::quantum_bomb_open_nearest_door_result, 35, ::quantum_bomb_open_nearest_door_validation ); } } init_blockers() //checked matches cerberus output { level.exterior_goals = getstructarray( "exterior_goal", "targetname" ); array_thread( level.exterior_goals, ::blocker_init ); zombie_doors = getentarray( "zombie_door", "targetname" ); if ( isDefined( zombie_doors ) ) { flag_init( "door_can_close" ); array_thread( zombie_doors, ::door_init ); } zombie_debris = getentarray( "zombie_debris", "targetname" ); array_thread( zombie_debris, ::debris_init ); flag_blockers = getentarray( "flag_blocker", "targetname" ); array_thread( flag_blockers, ::flag_blocker ); } door_init() //checked changed to match cerberus output { self.type = undefined; self.purchaser = undefined; self._door_open = 0; targets = getentarray( self.target, "targetname" ); if ( isDefined( self.script_flag ) && !isDefined( level.flag[ self.script_flag ] ) ) { if ( isDefined( self.script_flag ) ) { tokens = strtok( self.script_flag, "," ); for ( i = 0; i < tokens.size; i++ ) { flag_init( self.script_flag ); } } } if ( !isDefined( self.script_noteworthy ) ) { self.script_noteworthy = "default"; } self.doors = []; for ( i = 0; i < targets.size; i++ ) { targets[ i ] door_classify( self ); if ( !isDefined( targets[ i ].og_origin ) ) { targets[ i ].og_origin = targets[ i ].origin; targets[ i ].og_angles = targets[ i ].angles; } } cost = 1000; if ( isDefined( self.zombie_cost ) ) { cost = self.zombie_cost; } self setcursorhint( "HINT_NOICON" ); self thread door_think(); if ( isDefined( self.script_noteworthy ) ) { if ( self.script_noteworthy == "electric_door" || self.script_noteworthy == "electric_buyable_door" ) { if ( getDvar( "ui_gametype" ) == "zgrief" ) { self setinvisibletoall(); return; } self sethintstring( &"ZOMBIE_NEED_POWER" ); if ( isDefined( level.door_dialog_function ) ) { self thread [[ level.door_dialog_function ]](); } return; } else if ( self.script_noteworthy == "local_electric_door" ) { if ( getDvar( "ui_gametype" ) == "zgrief" ) { self setinvisibletoall(); return; } self sethintstring( &"ZOMBIE_NEED_LOCAL_POWER" ); if ( isDefined( level.door_dialog_function ) ) { self thread [[ level.door_dialog_function ]](); } return; } else if ( self.script_noteworthy == "kill_counter_door" ) { self sethintstring( &"ZOMBIE_DOOR_ACTIVATE_COUNTER", cost ); return; } } self set_hint_string( self, "default_buy_door", cost ); } door_classify( parent_trig ) //checked changed to match cerberus output { if ( isDefined( self.script_noteworthy ) && self.script_noteworthy == "clip" ) { parent_trig.clip = self; parent_trig.script_string = "clip"; break; } if ( !isDefined( self.script_string ) ) { if ( isDefined( self.script_angles ) ) { self.script_string = "rotate"; } else if ( isDefined( self.script_vector ) ) { self.script_string = "move"; } } if ( !isDefined( self.script_string ) ) { self.script_string = ""; } switch( self.script_string ) { case "anim": /* /# assert( isDefined( self.script_animname ), "Blocker_init: You must specify a script_animname for " + self.targetname ); #/ /# assert( isDefined( level.scr_anim[ self.script_animname ] ), "Blocker_init: You must define a level.scr_anim for script_anim -> " + self.script_animname ); #/ /# assert( isDefined( level.blocker_anim_func ), "Blocker_init: You must define a level.blocker_anim_func" ); #/ */ break; case "counter_1s": parent_trig.counter_1s = self; return; case "counter_10s": parent_trig.counter_10s = self; return; case "counter_100s": parent_trig.counter_100s = self; return; case "explosives": if ( !isDefined( parent_trig.explosives ) ) { parent_trig.explosives = []; } parent_trig.explosives[ parent_trig.explosives.size ] = self; return; } if ( self.classname == "script_brushmodel" ) { self disconnectpaths(); } parent_trig.doors[ parent_trig.doors.size ] = self; } door_buy() //checked matches cerberus output { self waittill( "trigger", who, force ); if ( isDefined( level.custom_door_buy_check ) ) { if ( !who [[ level.custom_door_buy_check ]]( self ) ) { return 0; } } if ( getDvarInt( "zombie_unlock_all" ) > 0 || isDefined( force ) && force ) { return 1; } if ( !who usebuttonpressed() ) { return 0; } if ( who maps/mp/zombies/_zm_utility::in_revive_trigger() ) { return 0; } if ( maps/mp/zombies/_zm_utility::is_player_valid( who ) ) { players = get_players(); cost = self.zombie_cost; if ( who maps/mp/zombies/_zm_pers_upgrades_functions::is_pers_double_points_active() ) { cost = who maps/mp/zombies/_zm_pers_upgrades_functions::pers_upgrade_double_points_cost( cost ); } if ( self._door_open == 1 ) { self.purchaser = undefined; } else if ( who.score >= cost ) { who maps/mp/zombies/_zm_score::minus_to_player_score( cost, 1 ); maps/mp/_demo::bookmark( "zm_player_door", getTime(), who ); who maps/mp/zombies/_zm_stats::increment_client_stat( "doors_purchased" ); who maps/mp/zombies/_zm_stats::increment_player_stat( "doors_purchased" ); self.purchaser = who; } else { play_sound_at_pos( "no_purchase", self.doors[ 0 ].origin ); if ( isDefined( level.custom_generic_deny_vo_func ) ) { who thread [[ level.custom_generic_deny_vo_func ]]( 1 ); } else { who maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "door_deny" ); } return 0; } } if ( isDefined( level._door_open_rumble_func ) ) { who thread [[ level._door_open_rumble_func ]](); } return 1; } door_delay() //checked changed to match cerberus output { if ( isDefined( self.explosives ) ) { for ( i = 0; i < self.explosives.size; i++ ) { self.explosives[ i ] show(); } } if ( !isDefined( self.script_int ) ) { self.script_int = 5; } all_trigs = getentarray( self.target, "target" ); for ( i = 0; i < all_trigs.size; i++ ) { all_trigs[ i ] trigger_off(); } wait self.script_int; for ( i = 0; i < self.script_int; i++ ) { /* /# iprintln( self.script_int - i ); #/ */ wait 1; } if ( isDefined( self.explosives ) ) { for ( i = 0; i < self.explosives.size; i++ ) { playfx( level._effect[ "def_explosion" ], self.explosives[ i ].origin, anglesToForward( self.explosives[ i ].angles ) ); self.explosives[ i ] hide(); } } } door_activate( time, open, quick, use_blocker_clip_for_pathing ) //checked matches cerberus output { if ( !isDefined( open ) ) { open = 1; } if ( !isDefined( time ) ) { time = 1; if ( isDefined( self.script_transition_time ) ) { time = self.script_transition_time; } } if ( isDefined( self.door_moving ) ) { if ( isDefined( self.script_noteworthy ) && self.script_noteworthy == "clip" || isDefined( self.script_string ) && self.script_string == "clip" ) { if ( !is_true( use_blocker_clip_for_pathing ) ) { if ( !open ) { return; } } } else { return; } } self.door_moving = 1; if ( open || isDefined( quick ) && !quick ) { self notsolid(); } if ( self.classname == "script_brushmodel" ) { if ( open ) { self connectpaths(); } } if ( isDefined( self.script_noteworthy ) && self.script_noteworthy == "clip" || isDefined( self.script_string ) && self.script_string == "clip" ) { if ( !open ) { self delay_thread( time, ::self_disconnectpaths ); wait 0.1; self solid(); } return; } if ( isDefined( self.script_sound ) ) { if ( open ) { playsoundatposition( self.script_sound, self.origin ); } else { playsoundatposition( self.script_sound + "_close", self.origin ); } } else { play_sound_at_pos( "door_slide_open", self.origin ); } scale = 1; if ( !open ) { scale = -1; } switch( self.script_string ) { case "rotate": if ( isDefined( self.script_angles ) ) { rot_angle = self.script_angles; if ( !open ) { rot_angle = self.og_angles; } self rotateto( rot_angle, time, 0, 0 ); self thread door_solid_thread(); if ( !open ) { self thread disconnect_paths_when_done(); } } wait randomfloat( 0.15 ); break; case "move": case "slide_apart": if ( isDefined( self.script_vector ) ) { vector = vectorScale( self.script_vector, scale ); if ( time >= 0.5 ) { self moveto( self.origin + vector, time, time * 0.25, time * 0.25 ); } else { self moveto( self.origin + vector, time ); } self thread door_solid_thread(); if ( !open ) { self thread disconnect_paths_when_done(); } } wait randomfloat( 0.15 ); break; case "anim": self [[ level.blocker_anim_func ]]( self.script_animname ); self thread door_solid_thread_anim(); wait randomfloat( 0.15 ); break; case "physics": self thread physics_launch_door( self ); wait 0.1; break; } if ( isDefined( self.script_firefx ) ) { playfx( level._effect[ self.script_firefx ], self.origin ); } } kill_trapped_zombies( trigger ) //checked partially changed to match cerberus output //did not change while loop to for loop to prevent infinite loop continue bug { zombies = getaiarray( level.zombie_team ); if ( !isDefined( zombies ) ) { return; } i = 0; while ( i < zombies.size ) { if ( !isDefined( zombies[ i ] ) ) { i++; continue; } else if ( zombies[ i ] istouching( trigger ) ) { zombies[ i ].marked_for_recycle = 1; zombies[ i ] dodamage( zombies[ i ].health + 666, trigger.origin, self ); wait randomfloat( 0.15 ); i++; continue; } if ( isDefined( level.custom_trapped_zombies ) ) { zombies[ i ] thread [[ level.custom_trapped_zombies ]](); wait randomfloat( 0.15 ); } i++; } } any_player_touching( trigger ) //checked changed to match cerberus output { foreach ( player in get_players() ) { if ( player istouching( trigger ) ) { return 1; } wait 0.01; } return 0; } any_player_touching_any( trigger, more_triggers ) //checked changed to match cerberus output { foreach ( player in get_players() ) { while ( is_player_valid( player, 0, 1 ) ) { if ( isDefined( trigger ) && player istouching( trigger ) ) { return 1; } if ( isDefined( more_triggers ) && more_triggers.size > 0 ) { foreach ( trig in more_triggers ) { if ( isDefined( trig ) && player istouching( trig ) ) { return 1; } } } } } return 0; } any_zombie_touching_any( trigger, more_triggers ) //checked changed to match cerberus output { zombies = getaiarray( level.zombie_team ); foreach ( zombie in zombies ) { if ( isDefined( trigger ) && zombie istouching( trigger ) ) { return 1; } if ( isDefined( more_triggers ) && more_triggers.size > 0 ) { foreach ( trig in more_triggers ) { if ( isDefined( trig ) && zombie istouching( trig ) ) { return 1; } } } } return 0; } wait_trigger_clear( trigger, more_triggers, end_on ) //checked matches cerberus output { self endon( end_on ); while ( any_player_touching_any( trigger, more_triggers ) || any_zombie_touching_any( trigger, more_triggers ) ) { wait 1; } /* /# println( "ZM BLOCKER local door trigger clear\n" ); #/ */ self notify( "trigger_clear" ); } waittill_door_trigger_clear_local_power_off( trigger, all_trigs ) //checked matches cerberus output { self endon( "trigger_clear" ); while ( 1 ) { if ( isDefined( self.local_power_on ) && self.local_power_on ) { self waittill( "local_power_off" ); } /* /# println( "ZM BLOCKER local door power off\n" ); #/ */ self wait_trigger_clear( trigger, all_trigs, "local_power_on" ); } } waittill_door_trigger_clear_global_power_off( trigger, all_trigs ) //checked matches cerberus output { self endon( "trigger_clear" ); while ( 1 ) { if ( isDefined( self.power_on ) && self.power_on ) { self waittill( "power_off" ); } /* /# println( "ZM BLOCKER global door power off\n" ); #/ */ self wait_trigger_clear( trigger, all_trigs, "power_on" ); } } waittill_door_can_close() //checked changed to match cerberus output { trigger = undefined; if ( isDefined( self.door_hold_trigger ) ) { trigger = getent( self.door_hold_trigger, "targetname" ); } all_trigs = getentarray( self.target, "target" ); switch ( self.script_noteworthy ) { case "local_electric_door": if ( isDefined( trigger ) || isDefined( all_trigs ) ) { self waittill_door_trigger_clear_local_power_off( trigger, all_trigs ); self thread kill_trapped_zombies( trigger ); } else if ( isDefined( self.local_power_on ) && self.local_power_on ) { self waittill( "local_power_off" ); } return; case "electric_door": if ( isDefined( trigger ) || isDefined( all_trigs ) ) { self waittill_door_trigger_clear_global_power_off( trigger, all_trigs ); if ( isDefined( trigger ) ) { self thread kill_trapped_zombies( trigger ); } } else if ( isDefined( self.power_on ) && self.power_on ) { self waittill( "power_off" ); } return; } } door_think() //checked changed to match cerberus output { self endon( "kill_door_think" ); cost = 1000; if ( isDefined( self.zombie_cost ) ) { cost = self.zombie_cost; } self sethintlowpriority( 1 ); while ( 1 ) { switch ( self.script_noteworthy ) { case "local_electric_door": if ( isDefined( self.local_power_on ) && !self.local_power_on ) { self waittill( "local_power_on" ); } if ( isDefined( self._door_open ) && !self._door_open ) { /* /# println( "ZM BLOCKER local door opened\n" ); #/ */ self door_opened( cost, 1 ); if ( !isDefined( self.power_cost ) ) { self.power_cost = 0; } self.power_cost += 200; } self sethintstring( "" ); if ( isDefined( level.local_doors_stay_open ) && level.local_doors_stay_open ) { return; } wait 3; self waittill_door_can_close(); self door_block(); if ( isDefined( self._door_open ) && self._door_open ) { /* /# println( "ZM BLOCKER local door closed\n" ); #/ */ self door_opened( cost, 1 ); } self sethintstring( &"ZOMBIE_NEED_LOCAL_POWER" ); wait 3; continue; case "electric_door": if ( isDefined( self.power_on ) && !self.power_on ) { self waittill( "power_on" ); } if ( isDefined( self._door_open ) && !self._door_open ) { /* /# println( "ZM BLOCKER global door opened\n" ); #/ */ self door_opened( cost, 1 ); if ( !isDefined( self.power_cost ) ) { self.power_cost = 0; } self.power_cost += 200; } self sethintstring( "" ); if ( isDefined( level.local_doors_stay_open ) && level.local_doors_stay_open ) { return; } wait 3; self waittill_door_can_close(); self door_block(); if ( isDefined( self._door_open ) && self._door_open ) { /* /# println( "ZM BLOCKER global door closed\n" ); #/ */ self door_opened( cost, 1 ); } self sethintstring( &"ZOMBIE_NEED_POWER" ); wait 3; continue; case "electric_buyable_door": flag_wait( "power_on" ); self set_hint_string( self, "default_buy_door", cost ); if ( !self door_buy() ) { continue; } break; case "delay_door": if ( !self door_buy() ) { continue; } self door_delay(); break; default: if ( isDefined( level._default_door_custom_logic ) ) { self [[ level._default_door_custom_logic ]](); break; } if ( !self door_buy() ) { continue; } break; } self door_opened( cost ); if ( !flag( "door_can_close" ) ) { break; } } } self_and_flag_wait( msg ) //checked matches cerberus output { self endon( msg ); if ( isDefined( self.power_door_ignore_flag_wait ) && self.power_door_ignore_flag_wait ) { level waittill( "forever" ); } else { flag_wait( msg ); } } door_block() //checked changed to match cerberus output { if ( isDefined( self.doors ) ) { for ( i = 0; i < self.doors.size; i++ ) { if ( isDefined( self.doors[ i ].script_noteworthy ) && self.doors[ i ].script_noteworthy == "clip" || isDefined( self.doors[ i ].script_string ) && self.doors[ i ].script_string == "clip" ) { self.doors[ i ] solid(); } } } } door_opened( cost, quick_close ) //checked partially changed to match cerberus output //did not foreach to prevent infinite loop with continues { if ( isDefined( self.door_is_moving ) && self.door_is_moving ) { return; } self.has_been_opened = 1; all_trigs = getentarray( self.target, "target" ); self.door_is_moving = 1; j = 0; while ( j < all_trigs.size ) { all_trigs[ j ].door_is_moving = 1; all_trigs[ j ] trigger_off(); all_trigs[ j ].has_been_opened = 1; if ( !isDefined( all_trigs[ j ]._door_open ) || all_trigs[ j ]._door_open == 0 ) { all_trigs[ j ]._door_open = 1; all_trigs[ j ] notify( "door_opened" ); level thread maps/mp/zombies/_zm_audio::sndmusicstingerevent( "door_open" ); } else { all_trigs[ j ]._door_open = 0; } if ( isDefined( all_trigs[ j ].script_flag ) && all_trigs[ j ]._door_open == 1 ) { tokens = strtok( all_trigs[ j ].script_flag, "," ); for ( i = 0; i < tokens.size; i++ ) { flag_set( tokens[ i ] ); } break; } if ( isDefined( all_trigs[ j ].script_flag ) && all_trigs[ j ]._door_open == 0 ) { tokens = strtok( all_trigs[ j ].script_flag, "," ); for ( i = 0; i < tokens.size; i++ ) { flag_clear( tokens[ i ] ); } } else if ( isDefined( quick_close ) && quick_close ) { all_trigs[ j ] set_hint_string( all_trigs[ j ], "" ); j++; continue; } if ( all_trigs[ j ]._door_open == 1 && flag( "door_can_close" ) ) { all_trigs[ j ] set_hint_string( all_trigs[ j ], "default_buy_door_close" ); j++; continue; } if ( all_trigs[ j ]._door_open == 0 ) { all_trigs[ j ] set_hint_string( all_trigs[ j ], "default_buy_door", cost ); } j++; } level notify( "door_opened" ); if ( isDefined( self.doors ) ) { is_script_model_door = 0; have_moving_clip_for_door = 0; use_blocker_clip_for_pathing = 0; i = 0; while ( i < self.doors.size ) { if ( is_true( door.ignore_use_blocker_clip_for_pathing_check ) ) { i++; continue; } if ( door.classname == "script_model" ) { is_script_model_door = 1; } if ( door.classname == "script_brushmodel" && isDefined( door.script_noteworthy ) && door.script_noteworthy != "clip" || !isDefined( door.script_string ) && door.script_string != "clip" ) { have_moving_clip_for_door = 1; } i++; } if ( is_script_model_door && !have_moving_clip_for_door ) { use_blocker_clip_for_pathing = 1; } for ( i = 0; i < self.doors.size; i++ ) { self.doors[ i ] thread door_activate( self.doors[ i ].script_transition_time, self._door_open, quick_close, use_blocker_clip_for_pathing ); } if ( self.doors.size ) { play_sound_at_pos( "purchase", self.doors[ 0 ].origin ); } } level.active_zone_names = maps/mp/zombies/_zm_zonemgr::get_active_zone_names(); wait 1; self.door_is_moving = 0; foreach ( trig in all_trigs ) { trig.door_is_moving = 0; } if ( isDefined( quick_close ) && quick_close ) { for ( i = 0; i < all_trigs.size; i++ ) { all_trigs[ i ] trigger_on(); } return; } if ( flag( "door_can_close" ) ) { wait 2; for ( i = 0; i < all_trigs.size; i++ ) { all_trigs[ i ] trigger_on(); } } } physics_launch_door( door_trig ) //checked matches cerberus output { vec = vectorScale( vectornormalize( self.script_vector ), 10 ); self rotateroll( 5, 0.05 ); wait 0.05; self moveto( self.origin + vec, 0.1 ); self waittill( "movedone" ); self physicslaunch( self.origin, self.script_vector * 300 ); wait 60; self delete(); } door_solid_thread() //checked changed to match cerberus output { self waittill_either( "rotatedone", "movedone" ); self.door_moving = undefined; while ( 1 ) { players = get_players(); player_touching = 0; for ( i = 0; i < players.size; i++ ) { if ( players[ i ] istouching( self ) ) { player_touching = 1; break; } } if ( !player_touching ) { self solid(); return; } wait 1; } } door_solid_thread_anim() //checked changed to match cerberus output { self waittillmatch( "door_anim" ); return "end"; self.door_moving = undefined; while ( 1 ) { players = get_players(); player_touching = 0; for ( i = 0; i < players.size; i++ ) { if ( players[ i ] istouching( self ) ) { player_touching = 1; break; } } if ( !player_touching ) { self solid(); return; } wait 1; } } disconnect_paths_when_done() //checked matches cerberus output { self waittill_either( "rotatedone", "movedone" ); self disconnectpaths(); } self_disconnectpaths() //checked matches cerberus output { self disconnectpaths(); } debris_init() //checked matches cerberus output { cost = 1000; if ( isDefined( self.zombie_cost ) ) { cost = self.zombie_cost; } self set_hint_string( self, "default_buy_debris", cost ); self setcursorhint( "HINT_NOICON" ); if ( isDefined( self.script_flag ) && !isDefined( level.flag[ self.script_flag ] ) ) { flag_init( self.script_flag ); } self thread debris_think(); } debris_think() //partially changed to match cerberus output //did not change while loop to for loop to prevent infinite loop bug due to continue { if ( isDefined( level.custom_debris_function ) ) { self [[ level.custom_debris_function ]](); } while ( 1 ) { self waittill( "trigger", who, force ); if ( getDvarInt( "zombie_unlock_all" ) > 0 || isDefined( force ) && force ) { } else if ( !who usebuttonpressed() ) { continue; } if ( who maps/mp/zombies/_zm_utility::in_revive_trigger() ) { continue; } if ( maps/mp/zombies/_zm_utility::is_player_valid( who ) ) { players = get_players(); if ( getDvarInt( "zombie_unlock_all" ) > 0 ) { } else if ( who.score >= self.zombie_cost ) { who maps/mp/zombies/_zm_score::minus_to_player_score( self.zombie_cost ); maps/mp/_demo::bookmark( "zm_player_door", getTime(), who ); who maps/mp/zombies/_zm_stats::increment_client_stat( "doors_purchased" ); who maps/mp/zombies/_zm_stats::increment_player_stat( "doors_purchased" ); } else { play_sound_at_pos( "no_purchase", self.origin ); who maps/mp/zombies/_zm_audio::create_and_play_dialog( "general", "door_deny" ); continue; } bbprint( "zombie_uses", "playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type %s", who.name, who.score, level.round_number, self.zombie_cost, self.script_flag, self.origin, "door" ); junk = getentarray( self.target, "targetname" ); while ( isDefined( self.script_flag ) ) { tokens = strtok( self.script_flag, "," ); for ( i = 0; i < tokens.size; i++ ) { flag_set( tokens[ i ] ); } } play_sound_at_pos( "purchase", self.origin ); level notify( "junk purchased" ); move_ent = undefined; clip = undefined; i = 0; while ( i < junk.size ) { junk[ i ] connectpaths(); if ( isDefined( junk[ i ].script_noteworthy ) ) { if ( junk[ i ].script_noteworthy == "clip" ) { clip = junk[ i ]; i++; continue; } } struct = undefined; if ( isDefined( junk[ i ].script_linkto ) ) { struct = getstruct( junk[ i ].script_linkto, "script_linkname" ); if ( isDefined( struct ) ) { move_ent = junk[ i ]; junk[ i ] thread debris_move( struct ); } else { junk[ i ] delete(); } i++; continue; } junk[ i ] delete(); i++; } all_trigs = getentarray( self.target, "target" ); for ( i = 0; i < all_trigs.size; i++ ) { all_trigs[ i ] delete(); } if ( isDefined( clip ) ) { if ( isDefined( move_ent ) ) { move_ent waittill( "movedone" ); } clip delete(); } break; } } } debris_move( struct ) //checked changed to match cerberus output { self script_delay(); self notsolid(); self play_sound_on_ent( "debris_move" ); playsoundatposition( "zmb_lightning_l", self.origin ); if ( isDefined( self.script_firefx ) ) { playfx( level._effect[ self.script_firefx ], self.origin ); } if ( isDefined( self.script_noteworthy ) ) { if ( self.script_noteworthy == "jiggle" ) { num = randomintrange( 3, 5 ); og_angles = self.angles; for ( i = 0; i < num; i++ ) { angles = og_angles + ( -5 + randomfloat( 10 ), -5 + randomfloat( 10 ), -5 + randomfloat( 10 ) ); time = randomfloatrange( 0.1, 0.4 ); self rotateto( angles, time ); wait ( time - 0.05 ); } } } time = 0.5; if ( isDefined( self.script_transition_time ) ) { time = self.script_transition_time; } self moveto( struct.origin, time, time * 0.5 ); self rotateto( struct.angles, time * 0.75 ); self waittill( "movedone" ); if ( isDefined( self.script_fxid ) ) { playfx( level._effect[ self.script_fxid ], self.origin ); playsoundatposition( "zmb_zombie_spawn", self.origin ); } self delete(); } blocker_disconnect_paths( start_node, end_node, two_way ) //checked matches cerberus output { } blocker_connect_paths( start_node, end_node, two_way ) //checked matches cerberus output { } blocker_init() //checked partially changed to match cerberus output //did not change while loop to for loop to prevent infinite loop caused by continue { if ( !isDefined( self.target ) ) { return; } targets = getentarray( self.target, "targetname" ); self.barrier_chunks = []; j = 0; while ( j < targets.size ) { if ( targets[ j ] iszbarrier() ) { if ( isDefined( level.zbarrier_override ) ) { self thread [[ level.zbarrier_override ]]( targets[ j ] ); j++; continue; } self.zbarrier = targets[ j ]; if ( isDefined( level.zbarrier_script_string_sets_collision ) && level.zbarrier_script_string_sets_collision ) { m_collision = "p6_anim_zm_barricade_board_collision"; } else { m_collision = "p6_anim_zm_barricade_board_collision"; } precachemodel( m_collision ); self.zbarrier setzbarriercolmodel( m_collision ); self.zbarrier.chunk_health = []; for ( i = 0; i < self.zbarrier getnumzbarrierpieces(); i++ ) { self.zbarrier.chunk_health[ i ] = 0; } } if ( isDefined( targets[ j ].script_string ) && targets[ j ].script_string == "rock" ) { targets[ j ].material = "rock"; } if ( isDefined( targets[ j ].script_parameters ) ) { if ( targets[ j ].script_parameters == "grate" ) { if ( isDefined( targets[ j ].script_noteworthy ) ) { if ( targets[ j ].script_noteworthy == "2" || targets[ j ].script_noteworthy == "3" || targets[ j ].script_noteworthy == "4" || targets[ j ].script_noteworthy == "5" || targets[ j ].script_noteworthy == "6" ) { targets[ j ] hide(); /* /# iprintlnbold( " Hide " ); #/ */ } } } else if ( targets[ j ].script_parameters == "repair_board" ) { targets[ j ].unbroken_section = getent( targets[ j ].target, "targetname" ); if ( isDefined( targets[ j ].unbroken_section ) ) { targets[ j ].unbroken_section linkto( targets[ j ] ); targets[ j ] hide(); targets[ j ] notsolid(); targets[ j ].unbroken = 1; if ( isDefined( targets[ j ].unbroken_section.script_noteworthy ) && targets[ j ].unbroken_section.script_noteworthy == "glass" ) { targets[ j ].material = "glass"; targets[ j ] thread destructible_glass_barricade( targets[ j ].unbroken_section, self ); } else if ( isDefined( targets[ j ].unbroken_section.script_noteworthy ) && targets[ j ].unbroken_section.script_noteworthy == "metal" ) { targets[ j ].material = "metal"; } } } else if ( targets[ j ].script_parameters == "barricade_vents" ) { targets[ j ].material = "metal_vent"; } } if ( isDefined( targets[ j ].targetname ) ) { if ( targets[ j ].targetname == "auto2" ) { } } targets[ j ] update_states( "repaired" ); targets[ j ].destroyed = 0; targets[ j ] show(); targets[ j ].claimed = 0; targets[ j ].anim_grate_index = 0; targets[ j ].og_origin = targets[ j ].origin; targets[ j ].og_angles = targets[ j ].angles; self.barrier_chunks[ self.barrier_chunks.size ] = targets[ j ]; j++; } target_nodes = getnodearray( self.target, "targetname" ); for ( j = 0; j < target_nodes.size; j++ ) { if ( target_nodes[ j ].type == "Begin" ) { self.neg_start = target_nodes[ j ]; if ( isDefined( self.neg_start.target ) ) { self.neg_end = getnode( self.neg_start.target, "targetname" ); } blocker_disconnect_paths( self.neg_start, self.neg_end ); } } if ( isDefined( self.zbarrier ) ) { if ( isDefined( self.barrier_chunks ) ) { for ( i = 0; i < self.barrier_chunks.size; i++ ) { self.barrier_chunks[ i ] delete(); } self.barrier_chunks = []; } } if ( isDefined( self.zbarrier ) && should_delete_zbarriers() ) { self.zbarrier delete(); self.zbarrier = undefined; return; } self blocker_attack_spots(); self.trigger_location = getstruct( self.target, "targetname" ); self thread blocker_think(); } should_delete_zbarriers() //checked matches cerberus output { gametype = getDvar( "ui_gametype" ); if ( !maps/mp/zombies/_zm_utility::is_classic() && !maps/mp/zombies/_zm_utility::is_standard() && gametype != "zgrief" ) { return 1; } return 0; } destructible_glass_barricade( unbroken_section, node ) //checked matches cerberus output { unbroken_section setcandamage( 1 ); unbroken_section.health = 99999; unbroken_section waittill( "damage", amount, who ); if ( maps/mp/zombies/_zm_utility::is_player_valid( who ) || who maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) { self thread maps/mp/zombies/_zm_spawner::zombie_boardtear_offset_fx_horizontle( self, node ); level thread remove_chunk( self, node, 1 ); self update_states( "destroyed" ); self notify( "destroyed" ); self.unbroken = 0; } } blocker_attack_spots() //checked changed to match cerberus output //may need to review order of operations { spots = []; numslots = self.zbarrier getzbarriernumattackslots(); numslots = int( max( numslots, 1 ) ); if ( numslots % 2 ) { spots[ spots.size ] = groundpos_ignore_water_new( self.zbarrier.origin + vectorScale( ( 0, 0, 1 ), 60 ) ); } if ( numslots > 1 ) { reps = floor( numslots / 2 ); slot = 1; for ( i = 0; i < reps; i++ ) { offset = self.zbarrier getzbarrierattackslothorzoffset() * ( i + 1 ); spots[ spots.size ] = groundpos_ignore_water_new( spots[ 0 ] + ( anglesToRight( self.angles ) * offset ) + vectorScale( ( 0, 0, 1 ), 60 ) ); slot++; if ( slot < numslots ) { spots[ spots.size ] = groundpos_ignore_water_new( spots[ 0 ] + ( anglesToRight( self.angles ) * ( offset * -1 ) ) + vectorScale( ( 0, 0, 1 ), 60 ) ); slot++; } } } taken = []; for ( i = 0; i < spots.size; i++ ) { taken[ i ] = 0; } self.attack_spots_taken = taken; self.attack_spots = spots; /* /# self thread debug_attack_spots_taken(); #/ */ } blocker_choke() //checked matches cerberus output { level._blocker_choke = 0; level endon( "stop_blocker_think" ); while ( 1 ) { wait 0.05; level._blocker_choke = 0; } } blocker_think() //checked changed to match cerberus output { level endon( "stop_blocker_think" ); if ( !isDefined( level._blocker_choke ) ) { level thread blocker_choke(); } use_choke = 0; if ( isDefined( level._use_choke_blockers ) && level._use_choke_blockers == 1 ) { use_choke = 1; } while ( 1 ) { wait 0.5; if ( use_choke ) { if ( level._blocker_choke > 3 ) { wait 0.05; } } level._blocker_choke++; if ( all_chunks_intact( self, self.barrier_chunks ) ) { continue; } if ( no_valid_repairable_boards( self, self.barrier_chunks ) ) { continue; } self blocker_trigger_think(); } } player_fails_blocker_repair_trigger_preamble( player, players, trigger, hold_required ) //checked matches cerberus output { if ( !isDefined( trigger ) ) { return 1; } if ( !maps/mp/zombies/_zm_utility::is_player_valid( player ) ) { return 1; } if ( players.size == 1 && isDefined( players[ 0 ].intermission ) && players[ 0 ].intermission == 1 ) { return 1; } if ( hold_required && !player usebuttonpressed() ) { return 1; } if ( !hold_required && !player use_button_held() ) { return 1; } if ( player maps/mp/zombies/_zm_utility::in_revive_trigger() ) { return 1; } return 0; } has_blocker_affecting_perk() //checked matches cerberus output { has_perk = undefined; if ( self hasperk( "specialty_fastreload" ) ) { has_perk = "specialty_fastreload"; } return has_perk; } do_post_chunk_repair_delay( has_perk ) //checked matches cerberus output { if ( !self script_delay() ) { wait 1; } } handle_post_board_repair_rewards( cost, zbarrier ) //checked matches cerberus output { self maps/mp/zombies/_zm_stats::increment_client_stat( "boards" ); self maps/mp/zombies/_zm_stats::increment_player_stat( "boards" ); if ( isDefined( self.pers[ "boards" ] ) && ( self.pers[ "boards" ] % 10 ) == 0 ) { self thread do_player_general_vox( "general", "reboard", 90 ); } self maps/mp/zombies/_zm_pers_upgrades_functions::pers_boards_updated( zbarrier ); self.rebuild_barrier_reward += cost; if ( self.rebuild_barrier_reward < level.zombie_vars[ "rebuild_barrier_cap_per_round" ] ) { self maps/mp/zombies/_zm_score::player_add_points( "rebuild_board", cost ); self play_sound_on_ent( "purchase" ); } if ( isDefined( self.board_repair ) ) { self.board_repair += 1; } } blocker_unitrigger_think() //checked matches cerberus output { self endon( "kill_trigger" ); while ( 1 ) { self waittill( "trigger", player ); self.stub.trigger_target notify( "trigger", player ); } } blocker_trigger_think() //checked changed to match cerberus output { self endon( "blocker_hacked" ); if ( isDefined( level.no_board_repair ) && level.no_board_repair ) { return; } /* /# println( "ZM >> TRIGGER blocker_trigger_think " ); #/ */ level endon( "stop_blocker_think" ); cost = 10; if ( isDefined( self.zombie_cost ) ) { cost = self.zombie_cost; } original_cost = cost; if ( !isDefined( self.unitrigger_stub ) ) { radius = 94.21; height = 94.21; if ( isDefined( self.trigger_location ) ) { trigger_location = self.trigger_location; } else { trigger_location = self; } if ( isDefined( trigger_location.radius ) ) { radius = trigger_location.radius; } if ( isDefined( trigger_location.height ) ) { height = trigger_location.height; } trigger_pos = groundpos( trigger_location.origin ) + vectorScale( ( 0, 0, 1 ), 4 ); self.unitrigger_stub = spawnstruct(); self.unitrigger_stub.origin = trigger_pos; self.unitrigger_stub.radius = radius; self.unitrigger_stub.height = height; self.unitrigger_stub.script_unitrigger_type = "unitrigger_radius"; self.unitrigger_stub.hint_string = get_hint_string( self, "default_reward_barrier_piece" ); self.unitrigger_stub.cursor_hint = "HINT_NOICON"; self.unitrigger_stub.trigger_target = self; maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( self.unitrigger_stub, ::blocker_unitrigger_think ); maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.unitrigger_stub ); if ( !isDefined( trigger_location.angles ) ) { trigger_location.angles = ( 0, 0, 0 ); } self.unitrigger_stub.origin = ( groundpos( trigger_location.origin ) + vectorScale( ( 0, 0, 1 ), 4 ) ) + ( anglesToForward( trigger_location.angles ) * -11 ); } self thread trigger_delete_on_repair(); thread maps/mp/zombies/_zm_unitrigger::register_static_unitrigger( self.unitrigger_stub, ::blocker_unitrigger_think ); /* /# if ( getDvarInt( "zombie_debug" ) > 0 ) { thread debug_blocker( trigger_pos, radius, height ); #/ } */ while ( 1 ) { self waittill( "trigger", player ); has_perk = player has_blocker_affecting_perk(); if ( all_chunks_intact( self, self.barrier_chunks ) ) { self notify( "all_boards_repaired" ); return; } if ( no_valid_repairable_boards( self, self.barrier_chunks ) ) { self notify( "no valid boards" ); return; } if ( isDefined( level._zm_blocker_trigger_think_return_override ) ) { if ( self [[ level._zm_blocker_trigger_think_return_override ]]( player ) ) { return; } } while ( 1 ) { players = get_players(); if ( player_fails_blocker_repair_trigger_preamble( player, players, self.unitrigger_stub.trigger, 0 ) ) { break; } if ( isDefined( self.zbarrier ) ) { chunk = get_random_destroyed_chunk( self, self.barrier_chunks ); if ( isDefined( player.pers_upgrades_awarded[ "board" ] ) ) { self thread replace_chunk( self, chunk, has_perk, player.pers_upgrades_awarded[ "board" ] ); } } else { chunk = get_random_destroyed_chunk( self, self.barrier_chunks ); if ( isDefined( chunk.script_parameter ) || chunk.script_parameters == "repair_board" && chunk.script_parameters == "barricade_vents" ) { if ( isDefined( chunk.unbroken_section ) ) { chunk show(); chunk solid(); chunk.unbroken_section self_delete(); } } else { chunk show(); } if ( isDefined( chunk.script_parameters ) && chunk.script_parameters != "board" || chunk.script_parameters == "repair_board" && chunk.script_parameters == "barricade_vents" ) { if ( isDefined( level.use_clientside_board_fx ) && !level.use_clientside_board_fx ) { if ( !isDefined( chunk.material ) || isDefined( chunk.material ) && chunk.material != "rock" ) { chunk play_sound_on_ent( "rebuild_barrier_piece" ); } playsoundatposition( "zmb_cha_ching", ( 0, 0, 0 ) ); } } if ( chunk.script_parameters == "bar" ) { chunk play_sound_on_ent( "rebuild_barrier_piece" ); playsoundatposition( "zmb_cha_ching", ( 0, 0, 0 ) ); } if ( isDefined( chunk.script_parameters ) ) { if ( chunk.script_parameters == "bar" ) { if ( isDefined( chunk.script_noteworthy ) ) { if ( chunk.script_noteworthy == "5" ) { chunk hide(); break; } else if ( chunk.script_noteworthy == "3" ) { chunk hide(); } } } } if ( isDefined( player.pers_upgrades_awarded[ "board" ] ) ) { self thread replace_chunk( self, chunk, has_perk, player.pers_upgrades_awarded[ "board" ] ); } } if ( isDefined( self.clip ) ) { self.clip enable_trigger(); self.clip disconnectpaths(); } else { blocker_disconnect_paths( self.neg_start, self.neg_end ); } bbprint( "zombie_uses", "playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type %s", player.name, player.score, level.round_number, original_cost, self.target, self.origin, "repair" ); self do_post_chunk_repair_delay( has_perk ); if ( !is_player_valid( player ) ) { break; } player handle_post_board_repair_rewards( cost, self ); if ( all_chunks_intact( self, self.barrier_chunks ) ) { self notify( "all_boards_repaired" ); return; } if ( no_valid_repairable_boards( self, self.barrier_chunks ) ) { self notify( "no valid boards" ); return; } } } } random_destroyed_chunk_show() //checked matches cerberus output { wait 0.5; self show(); } door_repaired_rumble_n_sound() //checked changed to match cerberus output { players = get_players(); for ( i = 0; i < players.size; i++ ) { if ( distance( players[ i ].origin, self.origin ) < 150 ) { if ( isalive( players[ i ] ) ) { players[ i ] thread board_completion(); } } } } board_completion() //checked matches cerberus output { self endon( "disconnect" ); } trigger_delete_on_repair() //checked changed to match cerberus output { while ( 1 ) { self waittill_either( "all_boards_repaired", "no valid boards" ); maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.unitrigger_stub ); break; } } rebuild_barrier_reward_reset() //checked matches cerberus output { self.rebuild_barrier_reward = 0; } remove_chunk( chunk, node, destroy_immediately, zomb ) //checked changed to match cerberus output { chunk update_states( "mid_tear" ); if ( isDefined( chunk.script_parameters ) ) { if ( chunk.script_parameters != "board" || chunk.script_parameters == "repair_board" || chunk.script_parameters == "barricade_vents" ) { chunk thread zombie_boardtear_audio_offset( chunk ); } } if ( isDefined( chunk.script_parameters ) ) { if ( chunk.script_parameters == "bar" ) { chunk thread zombie_bartear_audio_offset( chunk ); } } chunk notsolid(); fx = "wood_chunk_destory"; if ( isDefined( self.script_fxid ) ) { fx = self.script_fxid; } if ( isDefined( chunk.script_moveoverride ) && chunk.script_moveoverride ) { chunk hide(); } if ( isDefined( chunk.script_parameters ) && chunk.script_parameters == "bar" ) { if ( isDefined( chunk.script_noteworthy ) && chunk.script_noteworthy == "4" ) { ent = spawn( "script_origin", chunk.origin ); ent.angles = node.angles + vectorScale( ( 0, 1, 0 ), 180 ); dist = 100; if ( isDefined( chunk.script_move_dist ) ) { dist_max = chunk.script_move_dist - 100; dist = 100 + randomint( dist_max ); } else { dist = 100 + randomint( 100 ); } dest = ent.origin + ( anglesToForward( ent.angles ) * dist ); trace = bullettrace( dest + vectorScale( ( 0, 0, 1 ), 16 ), dest + vectorScale( ( 0, 0, -1 ), 200 ), 0, undefined ); if ( trace[ "fraction" ] == 1 ) { dest += vectorScale( ( 0, 0, -1 ), 200 ); } else { dest = trace[ "position" ]; } chunk linkto( ent ); time = ent fake_physicslaunch( dest, 300 + randomint( 100 ) ); if ( randomint( 100 ) > 40 ) { ent rotatepitch( 180, time * 0.5 ); } else { ent rotatepitch( 90, time, time * 0.5 ); } wait time; chunk hide(); wait 0.1; ent delete(); } else { ent = spawn( "script_origin", chunk.origin ); ent.angles = node.angles + vectorScale( ( 0, 1, 0 ), 180 ); dist = 100; if ( isDefined( chunk.script_move_dist ) ) { dist_max = chunk.script_move_dist - 100; dist = 100 + randomint( dist_max ); } else { dist = 100 + randomint( 100 ); } dest = ent.origin + ( anglesToForward( ent.angles ) * dist ); trace = bullettrace( dest + vectorScale( ( 0, 0, 1 ), 16 ), dest + vectorScale( ( 0, 0, -1 ), 200 ), 0, undefined ); if ( trace[ "fraction" ] == 1 ) { dest += vectorScale( ( 0, 0, -1 ), 200 ); } else { dest = trace[ "position" ]; } chunk linkto( ent ); time = ent fake_physicslaunch( dest, 260 + randomint( 100 ) ); if ( randomint( 100 ) > 40 ) { ent rotatepitch( 180, time * 0,5 ); } else { ent rotatepitch( 90, time, time * 0,5 ); } wait time; chunk hide(); wait 0.1; ent delete(); } chunk update_states( "destroyed" ); chunk notify( "destroyed" ); } if ( isDefined( chunk.script_parameters ) && chunk.script_parameters != "board" || chunk.script_parameters == "repair_board" || chunk.script_parameters == "barricade_vents" ) { ent = spawn( "script_origin", chunk.origin ); ent.angles = node.angles + vectorScale( ( 0, 1, 0 ), 180 ); dist = 100; if ( isDefined( chunk.script_move_dist ) ) { dist_max = chunk.script_move_dist - 100; dist = 100 + randomint( dist_max ); } else { dist = 100 + randomint( 100 ); } dest = ent.origin + ( anglesToForward( ent.angles ) * dist ); trace = bullettrace( dest + vectorScale( ( 0, 0, 1 ), 16 ), dest + vectorScale( ( 0, 0, -1 ), 200 ), 0, undefined ); if ( trace[ "fraction" ] == 1 ) { dest += vectorScale( ( 0, 0, -1 ), 200 ); } else { dest = trace[ "position" ]; } chunk linkto( ent ); time = ent fake_physicslaunch( dest, 200 + randomint( 100 ) ); if ( isDefined( chunk.unbroken_section ) ) { if ( !isDefined( chunk.material ) || chunk.material != "metal" ) { chunk.unbroken_section self_delete(); } } if ( randomint( 100 ) > 40 ) { ent rotatepitch( 180, time * 0.5 ); } else { ent rotatepitch( 90, time, time * 0.5 ); } wait time; if ( isDefined( chunk.unbroken_section ) ) { if ( isDefined( chunk.material ) && chunk.material == "metal" ) { chunk.unbroken_section self_delete(); } } chunk hide(); wait 0.1; ent delete(); chunk update_states( "destroyed" ); chunk notify( "destroyed" ); } if ( isDefined( chunk.script_parameters ) && chunk.script_parameters == "grate" ) { if ( isDefined( chunk.script_noteworthy ) && chunk.script_noteworthy == "6" ) { ent = spawn( "script_origin", chunk.origin ); ent.angles = node.angles + vectorScale( ( 0, 1, 0 ), 180 ); dist = 100 + randomint( 100 ); dest = ent.origin + ( anglesToForward( ent.angles ) * dist ); trace = bullettrace( dest + vectorScale( ( 0, 0, 1 ), 16 ), dest + vectorScale( ( 0, 0, -1 ), 200 ), 0, undefined ); if ( trace[ "fraction" ] == 1 ) { dest += vectorScale( ( 0, 0, -1 ), 200 ); } else { dest = trace[ "position" ]; } chunk linkto( ent ); time = ent fake_physicslaunch( dest, 200 + randomint( 100 ) ); if ( randomint( 100 ) > 40 ) { ent rotatepitch( 180, time * 0.5 ); } else { ent rotatepitch( 90, time, time * 0.5 ); } wait time; chunk hide(); ent delete(); chunk update_states( "destroyed" ); chunk notify( "destroyed" ); return; } else { chunk hide(); chunk update_states( "destroyed" ); chunk notify( "destroyed" ); } } } remove_chunk_rotate_grate( chunk ) //checked changed to match cerberus output { if ( isDefined( chunk.script_parameters ) && chunk.script_parameters == "grate" ) { chunk vibrate( vectorScale( ( 0, 1, 0 ), 270 ), 0.2, 0.4, 0.4 ); return; } } zombie_boardtear_audio_offset( chunk ) //checked changed to match cerberus output { if ( isDefined( chunk.material ) && !isDefined( chunk.already_broken ) ) { chunk.already_broken = 0; } if ( isDefined( chunk.material ) && chunk.material == "glass" && chunk.already_broken == 0 ) { chunk playsound( "zmb_break_glass_barrier" ); wait randomfloatrange( 0.3, 0.6 ); chunk playsound( "zmb_break_glass_barrier" ); chunk.already_broken = 1; } else if ( isDefined( chunk.material ) && chunk.material == "metal" && chunk.already_broken == 0 ) { chunk playsound( "grab_metal_bar" ); wait randomfloatrange( 0.3, 0.6 ); chunk playsound( "break_metal_bar" ); chunk.already_broken = 1; } else if ( isDefined( chunk.material ) && chunk.material == "rock" ) { if ( isDefined( level.use_clientside_rock_tearin_fx ) && !level.use_clientside_rock_tearin_fx ) { chunk playsound( "zmb_break_rock_barrier" ); wait randomfloatrange( 0.3, 0.6 ); chunk playsound( "zmb_break_rock_barrier" ); } chunk.already_broken = 1; } else if ( isDefined( chunk.material ) && chunk.material == "metal_vent" ) { if ( isDefined( level.use_clientside_board_fx ) && !level.use_clientside_board_fx ) { chunk playsound( "evt_vent_slat_remove" ); } } else if ( isDefined( level.use_clientside_board_fx ) && !level.use_clientside_board_fx ) { chunk play_sound_on_ent( "break_barrier_piece" ); wait randomfloatrange( 0.3, 0.6 ); chunk play_sound_on_ent( "break_barrier_piece" ); } chunk.already_broken = 1; } zombie_bartear_audio_offset( chunk ) //checked matches cerberus output { chunk play_sound_on_ent( "grab_metal_bar" ); wait randomfloatrange( 0.3, 0.6 ); chunk play_sound_on_ent( "break_metal_bar" ); wait randomfloatrange( 1, 1.3 ); chunk play_sound_on_ent( "drop_metal_bar" ); } ensure_chunk_is_back_to_origin( chunk ) //checked matches cerberus output { if ( chunk.origin != chunk.og_origin ) { chunk notsolid(); chunk waittill( "movedone" ); } } replace_chunk( barrier, chunk, perk, upgrade, via_powerup ) //checked changed to match cerberus output { if ( !isDefined( barrier.zbarrier ) ) { chunk update_states( "mid_repair" ); /* /# assert( isDefined( chunk.og_origin ) ); #/ /# assert( isDefined( chunk.og_angles ) ); #/ */ sound = "rebuild_barrier_hover"; if ( isDefined( chunk.script_presound ) ) { sound = chunk.script_presound; } } has_perk = 0; if ( isDefined( perk ) ) { has_perk = 1; } if ( !isDefined( via_powerup ) && isDefined( sound ) ) { play_sound_at_pos( sound, chunk.origin ); } if ( upgrade ) { barrier.zbarrier zbarrierpieceuseupgradedmodel( chunk ); barrier.zbarrier.chunk_health[ chunk ] = barrier.zbarrier getupgradedpiecenumlives( chunk ); } else { barrier.zbarrier zbarrierpieceusedefaultmodel( chunk ); barrier.zbarrier.chunk_health[ chunk ] = 0; } scalar = 1; if ( has_perk ) { if ( perk == "speciality_fastreload" ) { scalar = 0.31; } else if ( perk == "speciality_fastreload_upgrade" ) { scalar = 0.2112; } } barrier.zbarrier showzbarrierpiece( chunk ); barrier.zbarrier setzbarrierpiecestate( chunk, "closing", scalar ); waitduration = barrier.zbarrier getzbarrierpieceanimlengthforstate( chunk, "closing", scalar ); wait waitduration; } open_all_zbarriers() //checked partially changed to match cerberus output //did not change while loop to for loop because of infinite continue loop bug { i = 0; while ( i < level.exterior_goals.size ) { if ( isDefined( level.exterior_goals[ i ].zbarrier ) ) { for ( x = 0; x < level.exterior_goals[ i ].zbarrier getnumzbarrierpieces(); x++ ) { level.exterior_goals[ i ].zbarrier setzbarrierpiecestate( x, "opening" ); } } else if ( isDefined( level.exterior_goals[ i ].clip ) ) { level.exterior_goals[ i ].clip disable_trigger(); level.exterior_goals[ i ].clip connectpaths(); continue; } blocker_connect_paths( level.exterior_goals[ i ].neg_start, level.exterior_goals[ i ].neg_end ); } } zombie_boardtear_audio_plus_fx_offset_repair_horizontal( chunk ) //checked changed to match cerberus output { if ( isDefined( chunk.material ) && chunk.material == "rock" ) { if ( isDefined( level.use_clientside_rock_tearin_fx ) && level.use_clientside_rock_tearin_fx ) { chunk clearclientflag( level._zombie_scriptmover_flag_rock_fx ); } else { earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( 0, 0, 1 ), 30 ) ); wait randomfloatrange( 0.3, 0.6 ); chunk play_sound_on_ent( "break_barrier_piece" ); playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( 0, 0, -1 ), 30 ) ); } } else if ( isDefined( level.use_clientside_board_fx ) && level.use_clientside_board_fx ) { chunk clearclientflag( level._zombie_scriptmover_flag_board_horizontal_fx ); } else { earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( 0, 0, 1 ), 30 ) ); wait randomfloatrange( 0.3, 0.6 ); chunk play_sound_on_ent( "break_barrier_piece" ); playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( 0, 0, -1 ), 30 ) ); } } zombie_boardtear_audio_plus_fx_offset_repair_verticle( chunk ) //checked changed to match cerberus output { if ( isDefined( chunk.material ) && chunk.material == "rock" ) { if ( isDefined( level.use_clientside_rock_tearin_fx ) && level.use_clientside_rock_tearin_fx ) { chunk clearclientflag( level._zombie_scriptmover_flag_rock_fx ); } else { earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( 1, 0, 0 ), 30 ) ); wait randomfloatrange( 0.3, 0.6 ); chunk play_sound_on_ent( "break_barrier_piece" ); playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); } } else if ( isDefined( level.use_clientside_board_fx ) && level.use_clientside_board_fx ) { chunk clearclientflag( level._zombie_scriptmover_flag_board_vertical_fx ); } else { earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( 1, 0, 0 ), 30 ) ); wait randomfloatrange( 0.3, 0.6 ); chunk play_sound_on_ent( "break_barrier_piece" ); playfx( level._effect[ "wood_chunk_destory" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); } } zombie_gratetear_audio_plus_fx_offset_repair_horizontal( chunk ) //checked matches cerberus output { earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); chunk play_sound_on_ent( "bar_rebuild_slam" ); switch( randomint( 9 ) ) { case 0: playfx( level._effect[ "fx_zombie_bar_break" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); wait randomfloatrange( 0, 0.3 ); playfx( level._effect[ "fx_zombie_bar_break_lite" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); break; case 1: playfx( level._effect[ "fx_zombie_bar_break" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); wait randomfloatrange( 0, 0.3 ); playfx( level._effect[ "fx_zombie_bar_break" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); break; case 2: playfx( level._effect[ "fx_zombie_bar_break_lite" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); wait randomfloatrange( 0, 0.3 ); playfx( level._effect[ "fx_zombie_bar_break" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); break; case 3: playfx( level._effect[ "fx_zombie_bar_break" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); wait randomfloatrange( 0, 0.3 ); playfx( level._effect[ "fx_zombie_bar_break_lite" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); break; case 4: playfx( level._effect[ "fx_zombie_bar_break_lite" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); wait randomfloatrange( 0, 0.3 ); playfx( level._effect[ "fx_zombie_bar_break_lite" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); break; case 5: playfx( level._effect[ "fx_zombie_bar_break_lite" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); break; case 6: playfx( level._effect[ "fx_zombie_bar_break_lite" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); break; case 7: playfx( level._effect[ "fx_zombie_bar_break" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); break; case 8: playfx( level._effect[ "fx_zombie_bar_break" ], chunk.origin + vectorScale( ( -1, 0, 0 ), 30 ) ); break; } } zombie_bartear_audio_plus_fx_offset_repair_horizontal( chunk ) //checked matches cerberus output { earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); chunk play_sound_on_ent( "bar_rebuild_slam" ); switch( randomint( 9 ) ) { case 0: playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_left" ); wait randomfloatrange( 0, 0.3 ); playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_right" ); break; case 1: playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_left" ); wait randomfloatrange( 0, 0.3 ); playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_right" ); break; case 2: playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_left" ); wait randomfloatrange( 0, 0.3 ); playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_right" ); break; case 3: playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_left" ); wait randomfloatrange( 0, 0.3 ); playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_right" ); break; case 4: playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_left" ); wait randomfloatrange( 0, 0.3 ); playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_right" ); break; case 5: playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_left" ); break; case 6: playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_right" ); break; case 7: playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_left" ); break; case 8: playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_right" ); break; } } zombie_bartear_audio_plus_fx_offset_repair_verticle( chunk ) //checked matches cerberus output { earthquake( randomfloatrange( 0.3, 0.4 ), randomfloatrange( 0.2, 0.4 ), chunk.origin, 150 ); chunk play_sound_on_ent( "bar_rebuild_slam" ); switch( randomint( 9 ) ) { case 0: playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_top" ); wait randomfloatrange( 0, 0.3 ); playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_bottom" ); break; case 1: playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_top" ); wait randomfloatrange( 0, 0.3 ); playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_bottom" ); break; case 2: playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_top" ); wait randomfloatrange( 0, 0.3 ); playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_bottom" ); break; case 3: playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_top" ); wait randomfloatrange( 0, 0.3 ); playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_bottom" ); break; case 4: playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_top" ); wait randomfloatrange( 0, 0.3 ); playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_bottom" ); break; case 5: playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_top" ); break; case 6: playfxontag( level._effect[ "fx_zombie_bar_break_lite" ], chunk, "Tag_fx_bottom" ); break; case 7: playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_top" ); break; case 8: playfxontag( level._effect[ "fx_zombie_bar_break" ], chunk, "Tag_fx_bottom" ); break; } } add_new_zombie_spawners() //checked changed to match cerberus output { if ( isDefined( self.target ) ) { self.possible_spawners = getentarray( self.target, "targetname" ); } if ( isDefined( self.script_string ) ) { spawners = getentarray( self.script_string, "targetname" ); self.possible_spawners = arraycombine( self.possible_spawners, spawners, 1, 0 ); } if ( !isDefined( self.possible_spawners ) ) { return; } zombies_to_add = self.possible_spawners; for ( i = 0; i < self.possible_spawners.size; i++ ) { self.possible_spawners[ i ].is_enabled = 1; add_spawner( self.possible_spawners[ i ] ); } } flag_blocker() //checked matches cerberus output { if ( !isDefined( self.script_flag_wait ) ) { /* /# assertmsg( "Flag Blocker at " + self.origin + " does not have a script_flag_wait key value pair" ); #/ */ return; } if ( !isDefined( level.flag[ self.script_flag_wait ] ) ) { flag_init( self.script_flag_wait ); } type = "connectpaths"; if ( isDefined( self.script_noteworthy ) ) { type = self.script_noteworthy; } flag_wait( self.script_flag_wait ); self script_delay(); if ( type == "connectpaths" ) { self connectpaths(); self disable_trigger(); return; } if ( type == "disconnectpaths" ) { self disconnectpaths(); self disable_trigger(); return; } /* /# assertmsg( "flag blocker at " + self.origin + ", the type "" + type + "" is not recognized" ); #/ */ } update_states( states ) //checked matches cerberus output { /* /# assert( isDefined( states ) ); #/ */ self.state = states; } quantum_bomb_open_nearest_door_validation( position ) //checked changed to match cerberus output { range_squared = 32400; zombie_doors = getentarray( "zombie_door", "targetname" ); for ( i = 0; i < zombie_doors.size; i++ ) { if ( distancesquared( zombie_doors[ i ].origin, position ) < range_squared ) { return 1; } } zombie_airlock_doors = getentarray( "zombie_airlock_buy", "targetname" ); for ( i = 0; i < zombie_airlock_doors.size; i++ ) { if ( distancesquared( zombie_airlock_doors[ i ].origin, position ) < range_squared ) { return 1; } } zombie_debris = getentarray( "zombie_debris", "targetname" ); for ( i = 0; i < zombie_debris.size; i++ ) { if ( distancesquared( zombie_debris[ i ].origin, position ) < range_squared ) { return 1; } } return 0; } quantum_bomb_open_nearest_door_result( position ) //checked changed to match cerberus output { range_squared = 32400; zombie_doors = getentarray( "zombie_door", "targetname" ); for ( i = 0; i < zombie_doors.size; i++ ) { if ( distancesquared( zombie_doors[ i ].origin, position ) < range_squared ) { self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "quant_good" ); zombie_doors[ i ] notify( "trigger", self, 1 ); [[ level.quantum_bomb_play_area_effect_func ]]( position ); return; } } zombie_airlock_doors = getentarray( "zombie_airlock_buy", "targetname" ); for ( i = 0; i < zombie_airlock_doors.size; i++ ) { if ( distancesquared( zombie_airlock_doors[ i ].origin, position ) < range_squared ) { self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "quant_good" ); zombie_airlock_doors[ i ] notify( "trigger", self, 1 ); [[ level.quantum_bomb_play_area_effect_func ]]( position ); return; } } zombie_debris = getentarray( "zombie_debris", "targetname" ); for ( i = 0; i < zombie_debris.size; i++ ) { if ( distancesquared( zombie_debris[ i ].origin, position ) < range_squared ) { self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "quant_good" ); zombie_debris[ i ] notify( "trigger", self, 1 ); [[ level.quantum_bomb_play_area_effect_func ]]( position ); return; } } }