I didn't use teleporters
also I have added
#include maps\ugx_modder_help;
before I added panzer in dlc3_code and dlc3_teleport
this is dlc3_teleport file
// Keep in mind this file is just a copy of nazi_zombie_factory_teleporter.gsc. It has .been adapted for general use (isDefined checks and so on) #include common_scripts\utility; #include maps\_utility; #include maps\_zombiemode_utility; #include maps\dlc3_code; #include maps\ugx_modder_help; //------------------------------------------------------------------------------- // setup and kick off think functions //------------------------------------------------------------------------------- teleporter_init() { level.teleport = []; level.active_links = 0; level.countdown = 0; level.teleport_delay = 2; level.teleport_cost = 1500; level.teleport_cooldown = 5; level.is_cooldown = false; level.active_timer = -1; level.teleport_time = 0; flag_init( "teleporter_pad_link_1" ); flag_init( "teleporter_pad_link_2" ); flag_init( "teleporter_pad_link_3" ); wait_for_all_players(); // Get the Pad triggers for ( i=0; i<3; i++ ) { trig = GetEnt( "trigger_teleport_pad_" + i, "targetname"); if ( IsDefined(trig) ) { level.teleporter_pad_trig[i] = trig; } } thread teleport_pad_think( 0 ); thread teleport_pad_think( 1 ); thread teleport_pad_think( 2 ); thread teleport_core_think(); thread start_black_room_fx(); thread init_pack_door(); SetDvar( "factoryAftereffectOverride", "-1" ); packapunch_see = getent( "packapunch_see", "targetname" ); if(isdefined( packapunch_see ) ) { packapunch_see thread play_packa_see_vox(); } level.teleport_ae_funcs = []; if( !IsSplitscreen() ) { level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\dlc3_teleporter::teleport_aftereffect_fov; } level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\dlc3_teleporter::teleport_aftereffect_shellshock; level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\dlc3_teleporter::teleport_aftereffect_shellshock_electric; level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\dlc3_teleporter::teleport_aftereffect_bw_vision; level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\dlc3_teleporter::teleport_aftereffect_red_vision; level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\dlc3_teleporter::teleport_aftereffect_flashy_vision; level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\dlc3_teleporter::teleport_aftereffect_flare_vision; } //------------------------------------------------------------------------------- // sets up up the pack a punch door //------------------------------------------------------------------------------- init_pack_door() { door = getent( "pack_door", "targetname" ); if(modderHelp( door, "Missing Pack a Punch door with Targetname KVP 'pack_door'." )) return; door movez( -50, 0.05, 0 ); wait(1.0); flag_wait( "all_players_connected" ); door movez( 50, 1.5, 0 ); door playsound( "packa_door_1" ); // Open slightly the first two times flag_wait( "teleporter_pad_link_1" ); door movez( -35, 1.5, 1 ); door playsound( "packa_door_2" ); door thread packa_door_reminder(); wait(2); // Second link flag_wait( "teleporter_pad_link_2" ); door movez( -25, 1.5, 1 ); door playsound( "packa_door_2" ); wait(2); // Final Link flag_wait( "teleporter_pad_link_3" ); door movez( -60, 1.5, 1 ); door playsound( "packa_door_2" ); clip = getentarray( "pack_door_clip", "targetname" ); for ( i = 0; i < clip.size; i++ ) { clip[i] connectpaths(); clip[i] delete(); } } //------------------------------------------------------------------------------- // handles activating and deactivating pads for cool down //------------------------------------------------------------------------------- pad_manager() { for ( i = 0; i < level.teleporter_pad_trig.size; i++ ) { // shut off the pads level.teleporter_pad_trig[i] sethintstring( &"ZOMBIE_TELEPORT_COOLDOWN" ); level.teleporter_pad_trig[i] teleport_trigger_invisible( false ); } level.is_cooldown = true; wait( level.teleport_cooldown ); level.is_cooldown = false; for ( i = 0; i < level.teleporter_pad_trig.size; i++ ) { if ( level.teleporter_pad_trig[i].teleport_active ) { level.teleporter_pad_trig[i] sethintstring( &"ZOMBIE_TELEPORT_TO_CORE" ); } else { level.teleporter_pad_trig[i] sethintstring( &"ZOMBIE_LINK_TPAD" ); } // level.teleporter_pad_trig[i] teleport_trigger_invisible( false ); } } //------------------------------------------------------------------------------- // staggers the black room fx //------------------------------------------------------------------------------- start_black_room_fx() { for ( i = 901; i <= 904; i++ ) { wait( 1 ); exploder( i ); } } //------------------------------------------------------------------------------- // handles turning on the pad and waiting for link //------------------------------------------------------------------------------- teleport_pad_think( index ) { if(!isDefined(level.teleporter_pad_trig)) return; //UGX - no teleporters on map, stop if(!isDefined(level.teleporter_pad_trig[index])) return; // UGX - teleporter doesn't exist, stop tele_help = getent( "tele_help_" + index, "targetname" ); if(isdefined( tele_help ) ) { tele_help thread play_tele_help_vox(); } active = false; // init the pad level.teleport[index] = "waiting"; trigger = level.teleporter_pad_trig[ index ]; trigger setcursorhint( "HINT_NOICON" ); trigger sethintstring( &"ZOMBIE_FLAMES_UNAVAILABLE" ); flag_wait( "electricity_on" ); trigger sethintstring( &"ZOMBIE_POWER_UP_TPAD" ); trigger.teleport_active = false; if ( isdefined( trigger ) ) { while ( !active ) { trigger waittill( "trigger" ); if ( level.active_links < 3 ) { trigger_core = getent( "trigger_teleport_core", "targetname" ); if( modderHelp( trigger_core, "Missing mainframe trigger with Targetname KVP 'trigger_teleport_core'." ) ) { trigger_core teleport_trigger_invisible( false ); } } // when one starts the others disabled for ( i=0; i<level.teleporter_pad_trig.size; i++ ) { level.teleporter_pad_trig[ i ] teleport_trigger_invisible( true ); } level.teleport[index] = "timer_on"; // start the countdown back to the core trigger thread teleport_pad_countdown( index, 30 ); teleporter_vo( "countdown", trigger ); // wait for the countdown while ( level.teleport[index] == "timer_on" ) { wait( .05 ); } // core was activated in time if ( level.teleport[index] == "active" ) { active = true; ClientNotify( "pw" + index ); // pad wire # //AUDIO ClientNotify( "tp" + index ); // Teleporter # // MM - Auto teleport the first time teleporter_wire_wait( index ); // trigger teleport_trigger_invisible( true ); trigger thread player_teleporting( index ); } else { // Reenable triggers for ( i=0; i<level.teleporter_pad_trig.size; i++ ) { level.teleporter_pad_trig[ i ] teleport_trigger_invisible( false ); } } wait( .05 ); } if ( level.is_cooldown ) { // shut off the pads trigger sethintstring( &"ZOMBIE_TELEPORT_COOLDOWN" ); trigger teleport_trigger_invisible( false ); trigger.teleport_active = true; } else { trigger thread teleport_pad_active_think( index ); } } } //------------------------------------------------------------------------------- // updates the teleport pad timer //------------------------------------------------------------------------------- teleport_pad_countdown( index, time ) { self endon( "stop_countdown" ); // iprintlnbold( &"ZOMBIE_START_TPAD" ); if ( level.active_timer < 0 ) { level.active_timer = index; } level.countdown++; //AUDIO ClientNotify( "pac" + index ); ClientNotify( "TRf" ); // Teleporter receiver map light flash // start timer for all players // Add a second for VO sync players = get_players(); for( i = 0; i < players.size; i++ ) { players[i] thread maps\_zombiemode_timer::start_timer( time+1, "stop_countdown" ); } wait( time+1 ); if ( level.active_timer == index ) { level.active_timer = -1; } // ran out of time to activate teleporter level.teleport[index] = "timer_off"; // iprintlnbold( "out of time" ); ClientNotify( "TRs" ); // Stop flashing the receiver map light level.countdown--; } //------------------------------------------------------------------------------- // handles teleporting players when triggered //------------------------------------------------------------------------------- teleport_pad_active_think( index ) { // self endon( "player_teleported" ); // link established, can be used to teleport self setcursorhint( "HINT_NOICON" ); self.teleport_active = true; user = undefined; // self sethintstring( &"ZOMBIE_TELEPORT_TO_CORE" ); // self teleport_trigger_invisible( false ); while ( 1 ) { self waittill( "trigger", user ); if ( is_player_valid( user ) && user.score >= level.teleport_cost && !level.is_cooldown ) { for ( i = 0; i < level.teleporter_pad_trig.size; i++ ) { level.teleporter_pad_trig[i] teleport_trigger_invisible( true ); } user maps\_zombiemode_score::minus_to_player_score( level.teleport_cost ); // Non-threaded so the trigger doesn't activate before the cooldown self player_teleporting( index ); } } } //------------------------------------------------------------------------------- // handles moving the players and fx, etc...moved out so it can be threaded //------------------------------------------------------------------------------- player_teleporting( index ) { time_since_last_teleport = GetTime() - level.teleport_time; // begin the teleport // add 3rd person fx teleport_pad_start_exploder( index ); // play startup fx at the core exploder( 105 ); //AUDIO ClientNotify( "tpw" + index ); // start fps fx self thread teleport_pad_player_fx( level.teleport_delay ); //AUDIO self thread teleport_2d_audio(); // Activate the TP zombie kill effect self thread teleport_nuke( 20, 300); // Max 20 zombies and range 300 // wait a bit wait( level.teleport_delay ); // end fps fx self notify( "fx_done" ); // add 3rd person beam fx teleport_pad_end_exploder( index ); // teleport the players self teleport_players(); //AUDIO ClientNotify( "tpc" + index ); // only need this if it's not cooling down if ( level.is_cooldown == false ) { thread pad_manager(); } // Now spawn a powerup goodie after a few seconds wait( 2.0 ); ss = getstruct( "teleporter_powerup", "targetname" ); if ( IsDefined( ss ) ) { ss thread maps\_zombiemode_powerups::special_powerup_drop(ss.origin); } else { modderHelp( undefined, "Missing struct with Targetname KVP 'teleporter_powerup'." ); } // Special for teleporting too much. The Dogs attack! if ( time_since_last_teleport < 60000 && level.active_links == 3 && level.round_number > 20 ) { dog_spawners = GetEntArray( "special_dog_spawner", "targetname" ); if( modderHelp( dog_spawners, "Missing power up dog with Targetname KVP 'special_dog_spawner'." ) ) { maps\_zombiemode_dogs::special_dog_spawn( undefined, 4 ); } //iprintlnbold( "Samantha Sez: No Powerup For You!" ); thread play_sound_2d( "sam_nospawn" ); } level.teleport_time = GetTime(); } //------------------------------------------------------------------------------- // pad fx for the start of the teleport //------------------------------------------------------------------------------- teleport_pad_start_exploder( index ) { switch ( index ) { case 0: exploder( 202 ); break; case 1: exploder( 302 ); break; case 2: exploder( 402 ); break; } } //------------------------------------------------------------------------------- // pad fx for the end of the teleport //------------------------------------------------------------------------------- teleport_pad_end_exploder( index ) { switch ( index ) { case 0: exploder( 201 ); break; case 1: exploder( 301 ); break; case 2: exploder( 401 ); break; } } //------------------------------------------------------------------------------- // used to enable / disable the pad use trigger for players //------------------------------------------------------------------------------- teleport_trigger_invisible( enable ) { players = getplayers(); for ( i = 0; i < players.size; i++ ) { if ( isdefined( players[i] ) ) { self SetInvisibleToPlayer( players[i], enable ); } } } //------------------------------------------------------------------------------- // checks if player is within radius of the teleport pad //------------------------------------------------------------------------------- player_is_near_pad( player ) { radius = 88; scale_factor = 2; dist = Distance2D( player.origin, self.origin ); dist_touching = radius * scale_factor; if ( dist < dist_touching ) { return true; } return false; } //------------------------------------------------------------------------------- // this is the 1st person effect seen when touching the teleport pad //------------------------------------------------------------------------------- teleport_pad_player_fx( delay ) { self endon( "fx_done" ); while ( 1 ) { players = getplayers(); for ( i = 0; i < players.size; i++ ) { if ( isdefined( players[i] ) ) { if ( self player_is_near_pad( players[i] ) ) { players[i] SetTransported( delay ); } else { players[i] SetTransported( 0 ); } } } wait ( .05 ); } } //------------------------------------------------------------------------------- // send players back to the core //------------------------------------------------------------------------------- teleport_players() { player_radius = 16; players = getplayers(); core_pos = []; occupied = []; image_room = []; players_touching = []; // the players that will actually be teleported player_idx = 0; prone_offset = (0, 0, 49); crouch_offset = (0, 0, 20); stand_offset = (0, 0, 0); // send players to a black room to flash images for a few seconds for ( i = 0; i < 4; i++ ) { core_pos[i] = getent( "origin_teleport_player_" + i, "targetname" ); modderHelp( core_pos[i], "Missing teleport destination script origin with Targetname KVP 'origin_teleport_player_" + i + "'." ); occupied[i] = false; image_room[i] = getent( "teleport_room_" + i, "targetname" ); modderHelp( image_room[i], "Missing teleport room script origin with Targetname KVP 'teleport_room_" + i + "'." ); if ( isdefined( players[i] ) ) { players[i] settransported( 0 ); if ( self player_is_near_pad( players[i] ) ) { players_touching[player_idx] = i; player_idx++; if ( isdefined( image_room[i] ) && !players[i] maps\_laststand::player_is_in_laststand() ) { players[i] disableOffhandWeapons(); players[i] disableweapons(); if( players[i] getstance() == "prone" ) { desired_origin = image_room[i].origin + prone_offset; } else if( players[i] getstance() == "crouch" ) { desired_origin = image_room[i].origin + crouch_offset; } else { desired_origin = image_room[i].origin + stand_offset; } players[i].teleport_origin = spawn( "script_origin", players[i].origin ); players[i].teleport_origin.angles = players[i].angles; players[i] linkto( players[i].teleport_origin ); players[i].teleport_origin.origin = desired_origin; players[i] FreezeControls( true ); wait_network_frame(); if( IsDefined( players[i] ) ) { setClientSysState( "levelNotify", "black_box_start", players[i] ); players[i].teleport_origin.angles = image_room[i].angles; } } } } } wait( 2 ); // Nuke anything at the core core = GetEnt( "trigger_teleport_core", "targetname" ); modderHelp( core, "Missing mainframe trigger with Targetname KVP 'trigger_teleport_core'." ); core thread teleport_nuke( undefined, 300); // Max any zombies at the pad range 300 // check if any players are standing on top of core teleport positions for ( i = 0; i < players.size; i++ ) { if ( isdefined( players[i] ) ) { for ( j = 0; j < 4; j++ ) { if ( !occupied[j] ) { dist = Distance2D( core_pos[j].origin, players[i].origin ); if ( dist < player_radius ) { occupied[j] = true; } } } setClientSysState( "levelNotify", "black_box_end", players[i] ); } } wait_network_frame(); // move players to the core for ( i = 0; i < players_touching.size; i++ ) { player_idx = players_touching[i]; player = players[player_idx]; if ( !IsDefined( player ) ) { continue; } // find a free space at the core slot = i; start = 0; while ( occupied[slot] && start < 4 ) { start++; slot++; if ( slot >= 4 ) { slot = 0; } } occupied[slot] = true; pos_name = "origin_teleport_player_" + slot; teleport_core_pos = getent( pos_name, "targetname" ); modderHelp( teleport_core_pos, "Missing teleport core position with Targetname KVP " + pos_name + "." ); player unlink(); assert( IsDefined( player.teleport_origin ) ); player.teleport_origin delete(); player.teleport_origin = undefined; player enableweapons(); player enableoffhandweapons(); player setorigin( core_pos[slot].origin ); player setplayerangles( core_pos[slot].angles ); player FreezeControls( false ); player thread teleport_aftereffects(); vox_rand = randomintrange(1,100); //RARE: Sets up rare post-teleport line if( vox_rand <= 2 ) { //player teleporter_vo( "vox_tele_sick_rare" ); //iprintlnbold( "Hey, this is the random teleport sickness line!" ); } else { player teleporter_vo( "vox_tele_sick" ); } player achievement_notify( "DLC3_ZOMBIE_FIVE_TELEPORTS" ); } // play beam fx at the core exploder( 106 ); } //------------------------------------------------------------------------------- // updates the hint string when countdown is started and expired //------------------------------------------------------------------------------- teleport_core_hint_update() { self setcursorhint( "HINT_NOICON" ); while ( 1 ) { // can't use teleporters until power is on if ( !flag( "electricity_on" ) ) { self sethintstring( &"ZOMBIE_FLAMES_UNAVAILABLE" ); } else if ( teleport_pads_are_active() ) { self sethintstring( &"ZOMBIE_LINK_TPAD" ); } else if ( level.active_links == 0 ) { self sethintstring( &"ZOMBIE_INACTIVE_TPAD" ); } else { self sethintstring( "" ); } wait( .05 ); } } //------------------------------------------------------------------------------- // establishes the link between teleporter pads and the core //------------------------------------------------------------------------------- teleport_core_think() { trigger = getent( "trigger_teleport_core", "targetname" ); if ( isdefined( trigger ) ) { trigger thread teleport_core_hint_update(); // disable teleporters to power is turned on flag_wait( "electricity_on" ); while ( 1 ) { if ( teleport_pads_are_active() ) { trigger waittill( "trigger" ); // trigger teleport_trigger_invisible( true ); // iprintlnbold( &"ZOMBIE_LINK_ACTIVE" ); // link the activated pads for ( i = 0; i < level.teleport.size; i++ ) { if ( isdefined( level.teleport[i] ) ) { if ( level.teleport[i] == "timer_on" ) { level.teleport[i] = "active"; level.active_links++; flag_set( "teleporter_pad_link_"+level.active_links ); //AUDIO ClientNotify( "scd" + i ); teleport_core_start_exploder( i ); // check for all teleporters active if ( level.active_links == 3 ) { exploder( 101 ); ClientNotify( "pap1" ); // Pack-A-Punch door on teleporter_vo( "linkall", trigger ); if( level.round_number <= 7 ) { achievement_notify( "DLC3_ZOMBIE_FAST_LINK" ); } Earthquake( 0.3, 2.0, trigger.origin, 3700 ); } // stop the countdown for the teleport pad pad = "trigger_teleport_pad_" + i; trigger_pad = getent( pad, "targetname" ); trigger_pad stop_countdown(); ClientNotify( "TRs" ); // Stop flashing the receiver map light level.active_timer = -1; } } } } wait( .05 ); } } else { modderHelp( undefined, "Missing mainframe trigger with Targetname KVP 'trigger_teleport_core'." ); } } stop_countdown() { self notify( "stop_countdown" ); players = get_players(); for( i = 0; i < players.size; i++ ) { players[i] notify( "stop_countdown" ); } } //------------------------------------------------------------------------------- // checks if any of the teleporter pads are counting down //------------------------------------------------------------------------------- teleport_pads_are_active() { // have any pads started? if ( isdefined( level.teleport ) ) { for ( i = 0; i < level.teleport.size; i++ ) { if ( isdefined( level.teleport[i] ) ) { if ( level.teleport[i] == "timer_on" ) { return true; } } } } return false; } //------------------------------------------------------------------------------- // starts the exploder for the teleport pad fx //------------------------------------------------------------------------------- teleport_core_start_exploder( index ) { switch ( index ) { case 0: exploder( 102 ); break; case 1: exploder( 103 ); break; case 2: exploder( 104 ); break; } } teleport_2d_audio() { self endon( "fx_done" ); while ( 1 ) { players = getplayers(); wait(1.7); for ( i = 0; i < players.size; i++ ) { if ( isdefined( players[i] ) ) { if ( self player_is_near_pad( players[i] ) ) { setClientSysState("levelNotify", "t2d", players[i]); } } } } } // kill anything near the pad teleport_nuke( max_zombies, range ) { zombies = getaispeciesarray("axis"); zombies = get_array_of_closest( self.origin, zombies, undefined, max_zombies, range ); for (i = 0; i < zombies.size; i++) { wait (randomfloatrange(0.2, 0.3)); if( !IsDefined( zombies[i] ) ) { continue; } if( is_magic_bullet_shield_enabled( zombies[i] ) ) { continue; } if( !( zombies[i] enemy_is_dog() ) ) { zombies[i] maps\_zombiemode_spawner::zombie_head_gib(); } zombies[i] dodamage( 10000, zombies[i].origin ); playsoundatposition( "nuked", zombies[i].origin ); } } teleporter_vo( tele_vo_type, location ) { if( !isdefined( location )) { self thread teleporter_vo_play( tele_vo_type, 2 ); } else { players = get_players(); for (i = 0; i < players.size; i++) { if (distance (players[i].origin, location.origin) < 64) { switch ( tele_vo_type ) { case "linkall": players[i] thread teleporter_vo_play( "vox_tele_linkall" ); break; case "countdown": players[i] thread teleporter_vo_play( "vox_tele_count", 3 ); break; } } } } } teleporter_vo_play( vox_type, pre_wait ) { if(!isdefined( pre_wait )) { pre_wait = 0; } index = maps\_zombiemode_weapons::get_player_index(self); plr = "plr_" + index + "_"; wait(pre_wait); self create_and_play_dialog( plr, vox_type, 0.25 ); } play_tele_help_vox() { level endon( "tele_help_end" ); while(1) { self waittill("trigger", who); if( flag( "electricity_on" ) ) { who thread teleporter_vo_play( "vox_tele_help" ); level notify( "tele_help_end" ); } while(IsDefined (who) && (who) IsTouching (self)) { wait(0.1); } } } play_packa_see_vox() { wait(10); if( !flag( "teleporter_pad_link_3" ) ) { self waittill("trigger", who); who thread teleporter_vo_play( "vox_perk_packa_see" ); } } // // This should match the perk_wire_fx_client function // waits for the effect to travel along the wire teleporter_wire_wait( index ) { targ = getstruct( "pad_"+index+"_wire" ,"targetname"); if ( !IsDefined( targ ) ) { return; } while(isDefined(targ)) { if(isDefined(targ.target)) { target = getstruct(targ.target,"targetname"); wait( 0.1 ); targ = target; } else { break; } } } // Teleporter Aftereffects teleport_aftereffects() { if( GetDvar( "factoryAftereffectOverride" ) == "-1" ) { self thread [[ level.teleport_ae_funcs[RandomInt(level.teleport_ae_funcs.size)] ]](); } else { self thread [[ level.teleport_ae_funcs[int(GetDvar( "factoryAftereffectOverride" ))] ]](); } } teleport_aftereffect_shellshock() { println( "*** Explosion Aftereffect***\n" ); self shellshock( "explosion", 4 ); } teleport_aftereffect_shellshock_electric() { println( "***Electric Aftereffect***\n" ); self shellshock( "electrocution", 4 ); } // tae indicates to Clientscripts that a teleporter aftereffect should start teleport_aftereffect_fov() { setClientSysState( "levelNotify", "tae", self ); } teleport_aftereffect_bw_vision( localClientNum ) { setClientSysState( "levelNotify", "tae", self ); } teleport_aftereffect_red_vision( localClientNum ) { setClientSysState( "levelNotify", "tae", self ); } teleport_aftereffect_flashy_vision( localClientNum ) { setClientSysState( "levelNotify", "tae", self ); } teleport_aftereffect_flare_vision( localClientNum ) { setClientSysState( "levelNotify", "tae", self ); } packa_door_reminder() { while( !flag( "teleporter_pad_link_3" ) ) { rand = randomintrange(4,16); self playsound( "packa_door_hitch" ); wait(rand); } }
and this dlc3_code file
[code]// Sparks (9/12/2009 3:20:27 PM)
// treminaor (6/03/2013 10:54 AM) - This file is an adaptation of nazi_zombie_factory.gsc. Key functions have been pulled out and put here, adapted for general use.
// - The file was originally created for the Sniperbolt Tutorial but as a result contained a couple bugs. I have gone through and fixed them for this Modtools patch.
#include maps\_utility;
#include common_scripts\utility;
#include maps\_zombiemode_utility;
#include maps\_music;
#include maps\ugx_modder_help;
// DLC3 Utilities
#include maps\dlc3_teleporter;
/***********************************************************************
DLC3 STUFF
***********************************************************************/
initDLC3_Vars()
{
// Alter The Pulls
level.pulls_since_last_ray_gun = 0;
level.pulls_since_last_tesla_gun = 0;
level.player_drops_tesla_gun = false;
// Coop Heroes Loadout
if( isDefined( level.DLC3.useCoopHeroes ) && level.DLC3.useCoopHeroes )
{
level.use_zombie_heroes = level.DLC3.useCoopHeroes;
}
else
{
level.use_zombie_heroes = true;
}
// Bowie Knife Damage
if( isDefined( level.DLC3.perk_altMeleeDamage ) && level.DLC3.perk_altMeleeDamage )
{
SetDvar( "perk_altMeleeDamage", level.DLC3.perk_altMeleeDamage );
}
else
{
SetDvar( "perk_altMeleeDamage", 1000 );
}
// Dogs Enabled
if( isDefined( level.DLC3.useHellHounds ))
{
level.dogs_enabled = level.DLC3.useHellHounds;
}
else
{
level.dogs_enabled = false;
}
// Mixed Crawlers And Dogs
if( isDefined( level.DLC3.useMixedRounds ) )
{
level.mixed_rounds_enabled = level.DLC3.useMixedRounds;
}
else
{
level.mixed_rounds_enabled = false;
}
// Array For Burning Zombies, Traps, and Risers -- Leave These
level.burning_zombies = [];
level.traps = [];
level.zombie_rise_spawners = [];
// Barrier Search Override
if( isDefined( level.DLC3.barrierSearchOverride ) && level.DLC3.barrierSearchOverride )
{
level.max_barrier_search_dist_override = level.DLC3.barrierSearchOverride;
}
else
{
level.max_barrier_search_dist_override = 400;
}
// Pointer Functions -- These Are Stock
level.door_dialog_function = maps\_zombiemode::play_door_dialog;
level.achievement_notify_func = maps\_zombiemode_utility::achievement_notify;
level.dog_spawn_func = maps\_zombiemode_dogs::dog_spawn_factory_logic;
level.zombie_anim_override = maps\dlc3_code::anim_override_func;
}
initDLC3_Vars2()
{
// Special level specific settings
if( isDefined( level.DLC3.powerUpDropMax ) && level.DLC3.powerUpDropMax )
{
set_zombie_var( "zombie_powerup_drop_max_per_round", level.DLC3.powerUpDropMax ); // lower this to make drop happen more often
}
{
set_zombie_var( "zombie_powerup_drop_max_per_round", 3 ); // lower this to make drop happen more often
}
}
DLC3_threadCalls()
{
initDLC3_Vars();
script_anims_init();
level thread maps\_callbacksetup::SetupCallbacks();
precacheDLC3();
}
DLC3_threadCalls2()
{
if( isArray( level.DLC3.initialZones ) && isDefined( level.DLC3.initialZones[ 0 ] ) )
{
level thread maps\_zombiemode_zone_manager::manage_zones( level.DLC3.initialZones );
}
if( isDefined( level.DLC3.useSnow ) && level.DLC3.useSnow )
{
level thread player_Snow();
}
init_sounds();
level thread initDLC3_Vars2();
if( isDefined( level.DLC3.useElectricSwitch ) && level.DLC3.useElectricSwitch )
{
// level thread power_electric_switch();
}
else
{
level thread power_electric_switch_on();
}
level thread magic_box_init();
if( isDefined( level.DLC3.useElectricTraps ) && level.DLC3.useElectricTraps )
{
thread init_elec_trap_trigs();
}
// Need this here because of the createFX hack for teleporter FX
if( !isDefined( level._script_exploders ) )
{
level._script_exploders = [];
}
teleporter_init();
level thread mapStartAudio();
level thread intro_screen();
level thread jump_from_bridge();
level lock_additional_player_spawner();
if( isDefined( level.DLC3.useBridge ) && level.DLC3.useBridge )
{
level thread bridge_init();
}
level thread perkMachineRattles();
}
precacheDLC3()
{
precachestring(&"ZOMBIE_FLAMES_UNAVAILABLE");
precachestring(&"ZOMBIE_ELECTRIC_SWITCH");
precachestring(&"ZOMBIE_POWER_UP_TPAD");
precachestring(&"ZOMBIE_TELEPORT_TO_CORE");
precachestring(&"ZOMBIE_LINK_TPAD");
precachestring(&"ZOMBIE_LINK_ACTIVE");
precachestring(&"ZOMBIE_INACTIVE_TPAD");
precachestring(&"ZOMBIE_START_TPAD");
precacheshellshock("electrocution");
precachemodel("zombie_zapper_cagelight_red");
precachemodel("zombie_zapper_cagelight_green");
precacheModel("lights_indlight_on" );
precacheModel("lights_milit_lamp_single_int_on" );
precacheModel("lights_tinhatlamp_on" );
precacheModel("lights_berlin_subway_hat_0" );
precacheModel("lights_berlin_subway_hat_50" );
precacheModel("lights_berlin_subway_hat_100" );
precachemodel("collision_geo_32x32x128");
precachestring(&"ZOMBIE_BETTY_ALREADY_PURCHASED");
precachestring(&"ZOMBIE_BETTY_HOWTO");
}
intro_screen()
{
flag_wait( "all_players_connected" );
wait(2);
level.intro_hud = [];
for(i = 0; i < 3; i++)
{
level.intro_hud
= newHudElem(); level.intro_hud.x = 0; level.intro_hud.y = 0; level.intro_hud.alignX = "left"; level.intro_hud.alignY = "bottom"; level.intro_hud.horzAlign = "left"; level.intro_hud.vertAlign = "bottom"; level.intro_hud.foreground = true; if ( level.splitscreen && !level.hidef ) { level.intro_hud.fontScale = 2.75; } else { level.intro_hud.fontScale = 1.75; } level.intro_hud.alpha = 0.0; level.intro_hud.color = (1, 1, 1); level.intro_hud.inuse = false; } level.intro_hud[0].y = -110; level.intro_hud[1].y = -90; level.intro_hud[2].y = -70; level.intro_hud[0] settext(level.DLC3.introString); level.intro_hud[1] settext(""); level.intro_hud[2] settext(""); for(i = 0 ; i < 3; i++) { level.intro_hud FadeOverTime( 3.5 ); level.intro_hud.alpha = 1; wait(1.5); } wait(1.5); for(i = 0 ; i < 3; i++) { level.intro_hud FadeOverTime( 3.5 ); level.intro_hud.alpha = 0; wait(1.5); } //wait(1.5); for(i = 0 ; i < 3; i++) { level.intro_hud destroy(); } } init_sounds() { maps\_zombiemode_utility::add_sound( "break_stone", "break_stone" ); maps\_zombiemode_utility::add_sound( "gate_door", "open_door" ); maps\_zombiemode_utility::add_sound( "heavy_door", "open_door" ); } include_weapons() { include_weapon( "zombie_colt" ); include_weapon( "zombie_colt_upgraded", false ); include_weapon( "zombie_sw_357" ); include_weapon( "zombie_sw_357_upgraded", false ); // Bolt Action include_weapon( "zombie_kar98k" ); include_weapon( "zombie_kar98k_upgraded", false ); // Semi Auto include_weapon( "zombie_m1carbine" ); include_weapon( "zombie_m1carbine_upgraded", false ); include_weapon( "zombie_m1garand" ); include_weapon( "zombie_m1garand_upgraded", false ); include_weapon( "zombie_gewehr43" ); include_weapon( "zombie_gewehr43_upgraded", false ); // Full Auto include_weapon( "zombie_stg44" ); include_weapon( "zombie_stg44_upgraded", false ); include_weapon( "zombie_thompson" ); include_weapon( "zombie_thompson_upgraded", false ); include_weapon( "zombie_mp40" ); include_weapon( "zombie_mp40_upgraded", false ); include_weapon( "zombie_type100_smg" ); include_weapon( "zombie_type100_smg_upgraded", false ); // Scoped include_weapon( "ptrs41_zombie" ); include_weapon( "ptrs41_zombie_upgraded", false ); // Grenade include_weapon( "molotov" ); include_weapon( "stielhandgranate" ); // Grenade Launcher include_weapon( "m1garand_gl_zombie" ); include_weapon( "m1garand_gl_zombie_upgraded", false ); include_weapon( "m7_launcher_zombie" ); include_weapon( "m7_launcher_zombie_upgraded", false ); // Flamethrower include_weapon( "m2_flamethrower_zombie" ); include_weapon( "m2_flamethrower_zombie_upgraded", false ); // Shotgun include_weapon( "zombie_doublebarrel" ); include_weapon( "zombie_doublebarrel_upgraded", false ); include_weapon( "zombie_shotgun" ); include_weapon( "zombie_shotgun_upgraded", false ); // Heavy MG include_weapon( "zombie_bar" ); include_weapon( "zombie_bar_upgraded", false ); include_weapon( "zombie_fg42" ); include_weapon( "zombie_fg42_upgraded", false ); include_weapon( "zombie_30cal" ); include_weapon( "zombie_30cal_upgraded", false ); include_weapon( "zombie_mg42" ); include_weapon( "zombie_mg42_upgraded", false ); include_weapon( "zombie_ppsh" ); include_weapon( "zombie_ppsh_upgraded", false ); // Rocket Launcher include_weapon( "panzerschrek_zombie" ); include_weapon( "panzerschrek_zombie_upgraded", false ); // Special include_weapon( "ray_gun", true, ::factory_ray_gun_weighting_func ); include_weapon( "ray_gun_upgraded", false ); include_weapon( "tesla_gun", true ); include_weapon( "tesla_gun_upgraded", false ); include_weapon( "zombie_cymbal_monkey", true, ::factory_cymbal_monkey_weighting_func ); // Bouncing betties include_weapon( "mine_bouncing_betty", false ); // Limited weapons maps\_zombiemode_weapons::add_limited_weapon( "zombie_colt", 0 ); maps\_zombiemode_weapons::add_limited_weapon( "zombie_gewehr43", 0 ); maps\_zombiemode_weapons::add_limited_weapon( "zombie_m1garand", 0 ); } include_powerups() { include_powerup( "nuke" ); include_powerup( "insta_kill" ); include_powerup( "double_points" ); include_powerup( "full_ammo" ); include_powerup( "carpenter" ); } DLC3_FX() { // THESE ARE NEEDED FOR ZOMBIE MODE -- LEAVE THESE // Scripted FX level._effect["large_ceiling_dust"] = LoadFx( "env/dirt/fx_dust_ceiling_impact_lg_mdbrown" ); level._effect["poltergeist"] = LoadFx( "misc/fx_zombie_couch_effect" ); level._effect["gasfire"] = LoadFx("destructibles/fx_dest_fire_vert"); level._effect["switch_sparks"] = loadfx("env/electrical/fx_elec_wire_spark_burst"); level._effect["wire_sparks_oneshot"] = loadfx("env/electrical/fx_elec_wire_spark_dl_oneshot"); level._effect["rise_burst"] = LoadFx("maps/mp_maps/fx_mp_zombie_hand_dirt_burst"); level._effect["rise_billow"] = LoadFx("maps/mp_maps/fx_mp_zombie_body_dirt_billowing"); level._effect["rise_dust"] = LoadFx("maps/mp_maps/fx_mp_zombie_body_dust_falling"); level._effect["lght_marker"] = Loadfx("maps/zombie/fx_zombie_factory_marker"); level._effect["lght_marker_flare"] = Loadfx("maps/zombie/fx_zombie_factory_marker_fl"); level._effect["betty_explode"] = loadfx("weapon/bouncing_betty/fx_explosion_betty_generic"); level._effect["betty_trail"] = loadfx("weapon/bouncing_betty/fx_betty_trail"); level._effect["zapper_fx"] = loadfx("misc/fx_zombie_zapper_powerbox_on"); level._effect["zapper"] = loadfx("misc/fx_zombie_electric_trap"); level._effect["zapper_wall"] = loadfx("misc/fx_zombie_zapper_wall_control_on"); level._effect["zapper_light_ready"] = loadfx("maps/zombie/fx_zombie_light_glow_green"); level._effect["zapper_light_notready"] = loadfx("maps/zombie/fx_zombie_light_glow_red"); level._effect["elec_trail_one_shot"] = loadfx("misc/fx_zombie_elec_trail_oneshot"); level._effect["wire_spark"] = loadfx("maps/zombie/fx_zombie_wire_spark"); level._effect["powerup_on"] = loadfx( "misc/fx_zombie_powerup_on" ); // Create FX if( isDefined( level.DLC3.myFX ) ) { [[level.DLC3.myFX]](); } level._effect["zombie_flashback_american"] = loadfx("maps/zombie/fx_zombie_flashback_american"); level._effect["gasfire2"] = Loadfx("destructibles/fx_dest_fire_vert"); level._effect["mp_light_lamp"] = Loadfx("maps/mp_maps/fx_mp_light_lamp"); level._effect["zombie_difference"] = loadfx("maps/zombie/fx_zombie_difference"); level._effect["zombie_mainframe_steam"] = loadfx("maps/zombie/fx_zombie_mainframe_steam"); level._effect["zombie_heat_sink"] = loadfx("maps/zombie/fx_zombie_heat_sink"); level._effect["mp_smoke_stack"] = loadfx("maps/mp_maps/fx_mp_smoke_stack"); level._effect["mp_elec_spark_fast_random"] = loadfx("maps/mp_maps/fx_mp_elec_spark_fast_random"); level._effect["mp_elec_broken_light_1shot"] = loadfx("maps/mp_maps/fx_mp_elec_broken_light_1shot"); level._effect["mp_light_lamp_no_eo"] = loadfx("maps/mp_maps/fx_mp_light_lamp_no_eo"); level._effect["zombie_packapunch"] = loadfx("maps/zombie/fx_zombie_packapunch"); level._effect["electric_short_oneshot"] = loadfx("env/electrical/fx_elec_short_oneshot"); animscripts\utility::setFootstepEffect( "asphalt", LoadFx( "bio/player/fx_footstep_dust" ) ); animscripts\utility::setFootstepEffect( "brick", LoadFx( "bio/player/fx_footstep_dust" ) ); animscripts\utility::setFootstepEffect( "carpet", LoadFx( "bio/player/fx_footstep_dust" ) ); animscripts\utility::setFootstepEffect( "cloth", LoadFx( "bio/player/fx_footstep_dust" ) ); animscripts\utility::setFootstepEffect( "concrete", LoadFx( "bio/player/fx_footstep_dust" ) ); animscripts\utility::setFootstepEffect( "dirt", LoadFx( "bio/player/fx_footstep_sand" ) ); animscripts\utility::setFootstepEffect( "foliage", LoadFx( "bio/player/fx_footstep_dust" ) ); animscripts\utility::setFootstepEffect( "gravel", LoadFx( "bio/player/fx_footstep_sand" ) ); animscripts\utility::setFootstepEffect( "grass", LoadFx( "bio/player/fx_footstep_sand" ) ); animscripts\utility::setFootstepEffect( "metal", LoadFx( "bio/player/fx_footstep_dust" ) ); animscripts\utility::setFootstepEffect( "mud", LoadFx( "bio/player/fx_footstep_mud" ) ); animscripts\utility::setFootstepEffect( "paper", LoadFx( "bio/player/fx_footstep_dust" ) ); animscripts\utility::setFootstepEffect( "plaster", LoadFx( "bio/player/fx_footstep_dust" ) ); animscripts\utility::setFootstepEffect( "rock", LoadFx( "bio/player/fx_footstep_sand" ) ); animscripts\utility::setFootstepEffect( "sand", LoadFx( "bio/player/fx_footstep_sand" ) ); animscripts\utility::setFootstepEffect( "water", LoadFx( "bio/player/fx_footstep_water" ) ); animscripts\utility::setFootstepEffect( "wood", LoadFx( "bio/player/fx_footstep_dust" ) ); [[level.DLC3.createArt]](); spawnFX(); } spawnFX() { [[level.DLC3.createFX]](); maps\createFX\dlc3_fx::main(); } /*********************************************************************** TRAP STUFF ***********************************************************************/ init_elec_trap_trigs() { array_thread( getStructArray( "dlc3_electric_trap", "targetname"), ::electric_trap_think ); } electric_trap_dialog() { self endon ("warning_dialog"); level endon("switch_flipped"); timer =0; while(1) { wait(0.5); players = get_players(); for(i = 0; i < players.size; i++) { dist = distancesquared(players.origin, self.origin ); if(dist > 70*70) { timer = 0; continue; } if(dist < 70*70 && timer < 3) { wait(0.5); timer ++; } if(dist < 70*70 && timer == 3) { index = maps\_zombiemode_weapons::get_player_index(players); plr = "plr_" + index + "_"; //players create_and_play_dialog( plr, "vox_level_start", 0.25 ); wait(3); self notify ("warning_dialog"); //iprintlnbold("warning_given"); } } } } electric_trap_think() { enable_flag = undefined; if( !isDefined( self.script_string ) ) { return; } else { enable_flag = self.script_string; } self sethintstring(&"ZOMBIE_FLAMES_UNAVAILABLE"); self.zombie_cost = 1000; self thread electric_trap_dialog(); // get a list of all of the other triggers with the same name triggers = getentarray( self.targetname, "targetname" ); flag_wait( "electricity_on" ); // Get the damage trigger. This is the unifying element to let us know it's been activated. self.zombie_dmg_trig = getent(self.target,"targetname"); self.zombie_dmg_trig.in_use = 0; // Set buy string self sethintstring(&"ZOMBIE_BUTTON_NORTH_FLAMES"); // Getting the light that's related is a little esoteric, but there isn't // a better way at the moment. It uses linknames, which are really dodgy. light_name = ""; // scope declaration tswitch = getent(self.script_linkto,"script_linkname"); switch ( tswitch.script_linkname ) { case "10": // wnuen case "11": light_name = "zapper_light_wuen"; break; case "20": // warehouse case "21": light_name = "zapper_light_warehouse"; break; case "30": // Bridge case "31": light_name = "zapper_light_bridge"; break; } // The power is now on, but keep it disabled until a certain condition is met // such as opening the door it is blocking or waiting for the bridge to lower. if ( !flag( enable_flag ) ) { self trigger_off(); zapper_light_red( light_name ); flag_wait( enable_flag ); self trigger_on(); } // Open for business! zapper_light_green( light_name ); while(1) { //valve_trigs = getentarray(self.script_noteworthy ,"script_noteworthy"); //wait until someone uses the valve self waittill("trigger",who); if( who in_revive_trigger() ) { continue; } if( is_player_valid( who ) ) { if( who.score >= self.zombie_cost ) { if(!self.zombie_dmg_trig.in_use) { self.zombie_dmg_trig.in_use = 1; //turn off the valve triggers associated with this trap until available again array_thread (triggers, ::trigger_off); play_sound_at_pos( "purchase", who.origin ); self thread electric_trap_move_switch(self); //need to play a 'woosh' sound here, like a gas furnace starting up self waittill("switch_activated"); //set the score who maps\_zombiemode_score::minus_to_player_score( self.zombie_cost ); //this trigger detects zombies walking thru the flames self.zombie_dmg_trig trigger_on(); //play the flame FX and do the actual damage self thread activate_electric_trap(); //wait until done and then re-enable the valve for purchase again self waittill("elec_done"); clientnotify(self.script_string +"off"); //delete any FX ents if(isDefined(self.fx_org)) { self.fx_org delete(); } if(isDefined(self.zapper_fx_org)) { self.zapper_fx_org delete(); } if(isDefined(self.zapper_fx_switch_org)) { self.zapper_fx_switch_org delete(); } //turn the damage detection trigger off until the flames are used again self.zombie_dmg_trig trigger_off(); wait(25); array_thread (triggers, ::trigger_on); //COLLIN: Play the 'alarm' sound to alert players that the traps are available again (playing on a temp ent in case the PA is already in use. //speakerA = getent("loudspeaker", "targetname"); //playsoundatposition("warning", speakera.origin); self notify("available"); self.zombie_dmg_trig.in_use = 0; } } } } } electric_trap_move_switch(parent) { light_name = ""; // scope declaration tswitch = getent(parent.script_linkto,"script_linkname"); switch ( tswitch.script_linkname ) { case "10": // wnuen case "11": light_name = "zapper_light_wuen"; break; case "20": // warehouse case "21": light_name = "zapper_light_warehouse"; break; case "30": case "31": light_name = "zapper_light_bridge"; break; } //turn the light above the door red zapper_light_red( light_name ); tswitch rotatepitch(180,.5); tswitch playsound("amb_sparks_l_b"); tswitch waittill("rotatedone"); self notify("switch_activated"); self waittill("available"); tswitch rotatepitch(-180,.5); //turn the light back green once the trap is available again zapper_light_green( light_name ); } activate_electric_trap() { if(isDefined(self.script_string) && self.script_string == "warehouse") { clientnotify("warehouse"); } else if(isDefined(self.script_string) && self.script_string == "wuen") { clientnotify("wuen"); } else { clientnotify("bridge"); } clientnotify(self.target); fire_points = getentarray(self.target,"targetname"); for(i=0;i<fire_points.size;i++) { wait_network_frame(); fire_points thread electric_trap_fx(self); } //do the damage self.zombie_dmg_trig thread elec_barrier_damage(); // reset the zapper model level waittill("arc_done"); } electric_trap_fx(notify_ent) { self.tag_origin = spawn("script_model",self.origin); //self.tag_origin setmodel("tag_origin"); //playfxontag(level._effect["zapper"],self.tag_origin,"tag_origin"); self.tag_origin playsound("elec_start"); self.tag_origin playloopsound("elec_loop"); self thread play_electrical_sound(); wait(25); self.tag_origin stoploopsound(); self.tag_origin delete(); notify_ent notify("elec_done"); level notify ("arc_done"); } play_electrical_sound() { level endon ("arc_done"); while(1) { wait(randomfloatrange(0.1, 0.5)); playsoundatposition("elec_arc", self.origin); } } elec_barrier_damage() { while(1) { self waittill("trigger",ent); //player is standing electricity, dumbass if(isplayer(ent) ) { ent thread player_elec_damage(); } else { if(!isDefined(ent.marked_for_death)) { ent.marked_for_death = true; ent thread zombie_elec_death( randomint(100) ); } } } } play_elec_vocals() { if(IsDefined (self)) { org = self.origin; wait(0.15); playsoundatposition("elec_vocals", org); playsoundatposition("zombie_arc", org); playsoundatposition("exp_jib_zombie", org); } } player_elec_damage() { self endon("death"); self endon("disconnect"); if(!IsDefined (level.elec_loop)) { level.elec_loop = 0; } if( !isDefined(self.is_burning) && !self maps\_laststand::player_is_in_laststand() ) { self.is_burning = 1; self setelectrified(1.25); shocktime = 2.5; //Changed Shellshock to Electrocution so we can have different bus volumes. self shellshock("electrocution", shocktime); if(level.elec_loop == 0) { elec_loop = 1; //self playloopsound ("electrocution"); self playsound("zombie_arc"); } if(!self hasperk("specialty_armorvest") || self.health - 100 < 1) { radiusdamage(self.origin,10,self.health + 100,self.health + 100); self.is_burning = undefined; } else { self dodamage(50, self.origin); wait(.1); //self playsound("zombie_arc"); self.is_burning = undefined; } } } zombie_elec_death(flame_chance) { self endon("death"); //10% chance the zombie will burn, a max of 6 burning zombs can be goign at once //otherwise the zombie just gibs and dies if(flame_chance > 90 && level.burning_zombies.size < 6) { level.burning_zombies[level.burning_zombies.size] = self; self thread zombie_flame_watch(); self playsound("ignite"); self thread animscripts\death::flame_death_fx(); wait(randomfloat(1.25)); } else { refs[0] = "guts"; refs[1] = "right_arm"; refs[2] = "left_arm"; refs[3] = "right_leg"; refs[4] = "left_leg"; refs[5] = "no_legs"; refs[6] = "head"; self.a.gib_ref = refs[randomint(refs.size)]; playsoundatposition("zombie_arc", self.origin); if( !self enemy_is_dog() && randomint(100) > 50 ) { self thread electroctute_death_fx(); self thread play_elec_vocals(); } wait(randomfloat(1.25)); self playsound("zombie_arc"); } self dodamage(self.health + 666, self.origin); iprintlnbold("should be damaged"); } zombie_flame_watch() { self waittill("death"); self stoploopsound(); level.burning_zombies = array_remove_nokeys(level.burning_zombies,self); } zapper_light_red( lightname ) { zapper_lights = getentarray( lightname, "targetname"); for(i=0;i<zapper_lights.size;i++) { zapper_lights setmodel("zombie_zapper_cagelight_red"); if(isDefined(zapper_lights.fx)) { zapper_lights.fx delete(); } zapper_lights.fx = maps\_zombiemode_net::network_safe_spawn( "trap_light_red", 2, "script_model", zapper_lights.origin ); zapper_lights.fx setmodel("tag_origin"); zapper_lights.fx.angles = zapper_lights.angles+(-90,0,0); playfxontag(level._effect["zapper_light_notready"],zapper_lights.fx,"tag_origin"); } } zapper_light_green( lightname ) { zapper_lights = getentarray( lightname, "targetname"); for(i=0;i<zapper_lights.size;i++) { zapper_lights setmodel("zombie_zapper_cagelight_green"); if(isDefined(zapper_lights.fx)) { zapper_lights.fx delete(); } zapper_lights.fx = maps\_zombiemode_net::network_safe_spawn( "trap_light_green&qu