UGX-Mods Login

or login with an authentication provider below
Sign In with Google
Sign In with Twitter
Sign In with Discord
Sign In with Steam
Sign In with Facebook
Sign In with Twitch

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Messages - Dareedevokl

I remember seeing a script like this for WaW and I was wondering if it's possible to do such a thing with BO3's engine?
8 years ago
Important to run sde.exe as an administrator when you're doing this. If you don't, it seems to exit out once you try to open it. Otherwise, thank you for this, this literally saved my custom mapping on BO3!
8 years ago
You can stay building your map until you get a new one, I have something that may help that will be up soon. :P

:o
8 years ago
Thanks, I guess I won't be able to make custom maps until I get a new cpu.  :D
8 years ago
CPU: AMD Phenom II X965
GPU: EVGA GeForce GTX 970
RAM: 24.0GB Dual-Channel DDR3 @ 669MHz (9-9-9-24)
8 years ago
Hi all, when I go to click the lightning bolt to build lighting, Radiant crashes. The same also happens when I try to build lighting from mod tools launcher, Radiant crashes. Any solution?

EDIT: Also there seems to be an issue with the linker as well. It doesn't respond either.
8 years ago
So, the invisible starting pistol is because Harry's perks is kinda glitchy, so just don't restart. The colt will ALWAYS be in the game, unless you remove it from dlc3.csv. To have only one starting pistol, go to _zombiemode_perks.gsc in your mod>maps and find zombie_colt and replace it with your starting pistol. Do the same thing in _loadout.gsc. I hope this helps  ;D

I already replaced the zombie_colt with my starting pistol and it still does it.  ???
8 years ago
I'm having a bit of an issue with the starting pistol in my map. It appears to be giving me a zombie_colt even though I took it out of the map.

Images
Spoiler: click to open...

Also, when I press "Restart Game", I spawn in without a weapon.

Image
Spoiler: click to open...

dlc3_code
Spoiler: click to open...
Code Snippet
Plaintext
// 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\ugx_modder_help;

#include maps\_utility;
#include common_scripts\utility;
#include maps\_zombiemode_utility;
#include maps\_music;

// 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[i] = newHudElem();
level.intro_hud[i].x = 0;
level.intro_hud[i].y = 0;
level.intro_hud[i].alignX = "left";
level.intro_hud[i].alignY = "bottom";
level.intro_hud[i].horzAlign = "left";
level.intro_hud[i].vertAlign = "bottom";
level.intro_hud[i].foreground = true;

if ( level.splitscreen && !level.hidef )
{
level.intro_hud[i].fontScale = 2.75;
}
else
{
level.intro_hud[i].fontScale = 1.75;
}
level.intro_hud[i].alpha = 0.0;
level.intro_hud[i].color = (1, 1, 1);
level.intro_hud[i].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[i] FadeOverTime( 3.5 );
level.intro_hud[i].alpha = 1;
wait(1.5);
}
wait(1.5);
for(i = 0 ; i < 3; i++)
{
level.intro_hud[i] FadeOverTime( 3.5 );
level.intro_hud[i].alpha = 0;
wait(1.5);
}
//wait(1.5);
for(i = 0 ; i < 3; i++)
{
level.intro_hud[i] 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( "bo1_m1911" );
include_weapon( "bo1_m1911_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( "m14" );
include_weapon( "m14_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["dog_eye_glow"] = loadfx("maps/zombie/fx_zombie_dog_eyes");
level._effect["dog_gib"] = loadfx( "maps/zombie/fx_zombie_dog_explosion" );
level._effect["dog_trail_fire"] = loadfx("maps/zombie/fx_zombie_dog_fire_trail");
level._effect["dog_trail_ash"] = loadfx("maps/zombie/fx_zombie_dog_ash_trail");
level._effect["dog_breath"] = Loadfx("maps/zombie/fx_zombie_dog_breath");

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_room_on"] = loadfx("fx_zombie_light_elec_room_on");
level._effect["elec_md"] = loadfx("env/electrical/fx_elec_player_md");
level._effect["elec_sm"] = loadfx("env/electrical/fx_elec_player_sm");
level._effect["elec_torso"] = loadfx("env/electrical/fx_elec_player_torso");

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["transporter_beam"]           = loadfx("maps/zombie/fx_transporter_beam");
level._effect["transporter_pad_start"]     = loadfx("maps/zombie/fx_transporter_pad_start");
level._effect["transporter_start"]         = loadfx("maps/zombie/fx_transporter_start");
level._effect["transporter_ambient"]       = loadfx("maps/zombie/fx_transporter_ambient");
level._effect["zombie_mainframe_link_all"] = loadfx("maps/zombie/fx_zombie_mainframe_link_all");
level._effect["zombie_mainframe_link_single"] = loadfx("maps/zombie/fx_zombie_mainframe_link_single");
level._effect["zombie_mainframe_linked"]       = loadfx("maps/zombie/fx_zombie_mainframe_linked");
level._effect["zombie_mainframe_beam"]       = loadfx("maps/zombie/fx_zombie_mainframe_beam");
level._effect["zombie_mainframe_flat"]       = loadfx("maps/zombie/fx_zombie_mainframe_flat");
level._effect["zombie_mainframe_flat_start"]   = loadfx("maps/zombie/fx_zombie_mainframe_flat_start");
level._effect["zombie_mainframe_beam_start"]   = loadfx("maps/zombie/fx_zombie_mainframe_beam_start");
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["zombie_elec_gen_idle"]       = loadfx("misc/fx_zombie_elec_gen_idle");
level._effect["zombie_moon_eclipse"]           = loadfx("maps/zombie/fx_zombie_moon_eclipse");
level._effect["zombie_clock_hand"]             = loadfx("maps/zombie/fx_zombie_clock_hand");
level._effect["zombie_elec_pole_terminal"]     = loadfx("maps/zombie/fx_zombie_elec_pole_terminal");
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[i].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[i]);
plr = "plr_" + index + "_";
//players[i] 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[i] 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[i] setmodel("zombie_zapper_cagelight_red");

if(isDefined(zapper_lights[i].fx))
{
zapper_lights[i].fx delete();
}

zapper_lights[i].fx = maps\_zombiemode_net::network_safe_spawn( "trap_light_red", 2, "script_model", zapper_lights[i].origin );
zapper_lights[i].fx setmodel("tag_origin");
zapper_lights[i].fx.angles = zapper_lights[i].angles+(-90,0,0);
playfxontag(level._effect["zapper_light_notready"],zapper_lights[i].fx,"tag_origin");
}
}

zapper_light_green( lightname )
{
zapper_lights = getentarray( lightname, "targetname");
for(i=0;i<zapper_lights.size;i++)
{
zapper_lights[i] setmodel("zombie_zapper_cagelight_green");

if(isDefined(zapper_lights[i].fx))
{
zapper_lights[i].fx delete();
}

zapper_lights[i].fx = maps\_zombiemode_net::network_safe_spawn( "trap_light_green", 2, "script_model", zapper_lights[i].origin );
zapper_lights[i].fx setmodel("tag_origin");
zapper_lights[i].fx.angles = zapper_lights[i].angles+(-90,0,0);
playfxontag(level._effect["zapper_light_ready"],zapper_lights[i].fx,"tag_origin");
}
}

electroctute_death_fx()
{
self endon( "death" );

if (isdefined(self.is_electrocuted) && self.is_electrocuted )
{
return;
}

self.is_electrocuted = true;

self thread electrocute_timeout();

// JamesS - this will darken the burning body
self StartTanning();

if(self.team == "axis")
{
level.bcOnFireTime = gettime();
level.bcOnFireOrg = self.origin;
}

PlayFxOnTag( level._effect["elec_torso"], self, "J_SpineLower" );
self playsound ("elec_jib_zombie");
wait 1;

tagArray = [];
tagArray[0] = "J_Elbow_LE";
tagArray[1] = "J_Elbow_RI";
tagArray[2] = "J_Knee_RI";
tagArray[3] = "J_Knee_LE";
tagArray = array_randomize( tagArray );

PlayFxOnTag( level._effect["elec_md"], self, tagArray[0] );
self playsound ("elec_jib_zombie");

wait 1;
self playsound ("elec_jib_zombie");

tagArray[0] = "J_Wrist_RI";
tagArray[1] = "J_Wrist_LE";
if( !IsDefined( self.a.gib_ref ) || self.a.gib_ref != "no_legs" )
{
tagArray[2] = "J_Ankle_RI";
tagArray[3] = "J_Ankle_LE";
}
tagArray = array_randomize( tagArray );

PlayFxOnTag( level._effect["elec_sm"], self, tagArray[0] );
PlayFxOnTag( level._effect["elec_sm"], self, tagArray[1] );
}

electrocute_timeout()
{
self endon ("death");
self playloopsound("fire_manager_0");
// about the length of the flame fx
wait 12;
self stoploopsound();
if (isdefined(self) && isalive(self))
{
self.is_electrocuted = false;
self notify ("stop_flame_damage");
}
}

/***********************************************************************
    ELECTRIC SWITCH STUFF
***********************************************************************/

power_electric_switch()
{
trig = getent("use_power_switch","targetname");
master_switch = getent("power_switch","targetname");
master_switch notsolid();
trig sethintstring(&"ZOMBIE_ELECTRIC_SWITCH");

cheat = false;

/#
if( GetDvarInt( "zombie_cheat" ) >= 3 )
{
wait( 5 );
cheat = true;
}
#/

user = undefined;
if ( cheat != true )
{
trig waittill("trigger",user);
}

master_switch rotateroll(-90,.3);

//TO DO (TUEY) - kick off a 'switch' on client script here that operates similiarly to Berlin2 subway.
master_switch playsound("switch_flip");

power_electric_switch_on();

playfx(level._effect["switch_sparks"] ,getstruct("power_switch_fx","targetname").origin);

trig delete();
}

power_electric_switch_on()
{
flag_set( "electricity_on" );
wait_network_frame();
clientnotify( "revive_on" );
wait_network_frame();
clientnotify( "fast_reload_on" );
wait_network_frame();
clientnotify( "doubletap_on" );
wait_network_frame();
clientnotify( "jugger_on" );
wait_network_frame();
level notify( "sleight_on" );
wait_network_frame();
level notify( "revive_on" );
wait_network_frame();
level notify( "doubletap_on" );
wait_network_frame();
level notify( "juggernog_on" );
wait_network_frame();
level notify( "Pack_A_Punch_on" );
wait_network_frame();
level notify( "specialty_armorvest_power_on" );
wait_network_frame();
level notify( "specialty_rof_power_on" );
wait_network_frame();
level notify( "specialty_quickrevive_power_on" );
wait_network_frame();
level notify( "specialty_fastreload_power_on" );
wait_network_frame();

ClientNotify( "pl1" ); // power lights on
exploder(600);

// Don't want east or west to spawn when in south zone, but vice versa is okay
//maps\_zombiemode_zone_manager::connect_zones( "outside_east_zone", "outside_south_zone" );
//maps\_zombiemode_zone_manager::connect_zones( "outside_west_zone", "outside_south_zone", true );
}

/***********************************************************************
    BRIDGE STUFF
***********************************************************************/

bridge_init()
{
flag_init( "bridge_down" );
// raise bridge
wnuen_bridge = getent( "wnuen_bridge", "targetname" );
wnuen_bridge_coils = GetEntArray( "wnuen_bridge_coils", "targetname" );
for ( i=0; i<wnuen_bridge_coils.size; i++ )
{
wnuen_bridge_coils[i] LinkTo( wnuen_bridge );
}
wnuen_bridge rotatepitch( 90, 1, .5, .5 );

warehouse_bridge = getent( "warehouse_bridge", "targetname" );
warehouse_bridge_coils = GetEntArray( "warehouse_bridge_coils", "targetname" );
for ( i=0; i<warehouse_bridge_coils.size; i++ )
{
warehouse_bridge_coils[i] LinkTo( warehouse_bridge );
}
warehouse_bridge rotatepitch( -90, 1, .5, .5 );

bridge_audio = getent( "bridge_audio", "targetname" );

// wait for power
flag_wait( "electricity_on" );

// lower bridge
wnuen_bridge rotatepitch( -90, 4, .5, 1.5 );
warehouse_bridge rotatepitch( 90, 4, .5, 1.5 );

if(isdefined( bridge_audio ) )
playsoundatposition( "bridge_lower", bridge_audio.origin );

wnuen_bridge connectpaths();
warehouse_bridge connectpaths();

exploder( 500 );

// wait until the bridges are down.
wnuen_bridge waittill( "rotatedone" );

flag_set( "bridge_down" );
if(isdefined( bridge_audio ) )
playsoundatposition( "bridge_hit", bridge_audio.origin );

wnuen_bridge_clip = getent( "wnuen_bridge_clip", "targetname" );
wnuen_bridge_clip delete();

warehouse_bridge_clip = getent( "warehouse_bridge_clip", "targetname" );
warehouse_bridge_clip delete();

//maps\_zombiemode_zone_manager::connect_zones( "wnuen_bridge_zone", "bridge_zone" );
//maps\_zombiemode_zone_manager::connect_zones( "warehouse_top_zone", "bridge_zone" );
}

jump_from_bridge()
{
trig = GetEnt( "trig_outside_south_zone", "targetname" );

if( isDefined( trig ) )
{
trig waittill( "trigger" );
}

//maps\_zombiemode_zone_manager::connect_zones( "outside_south_zone", "bridge_zone", true );
//maps\_zombiemode_zone_manager::connect_zones( "outside_south_zone", "wnuen_bridge_zone", true );
}

/***********************************************************************
    AUDIO STUFF
***********************************************************************/

perkMachineRattles()
{
// Check under the machines for change
trigs = GetEntArray( "audio_bump_trigger", "targetname" );

for ( i=0; i<trigs.size; i++ )
{
if ( IsDefined(trigs[i].script_sound) && trigs[i].script_sound == "perks_rattle" )
{
trigs[i] thread check_for_change();
}
}
}

mapStartAudio()
{
players = get_players();

for( i = 0; i < players.size; i++ )
{
players[i] thread player_killstreak_timer();
players[i] thread player_zombie_awareness();
}

players[randomint(players.size)] thread level_start_vox(); //Plays a "Power's Out" Message from a random player at start
}

player_zombie_awareness()
{
self endon("disconnect");
self endon("death");
players = getplayers();
index = maps\_zombiemode_weapons::get_player_index(self);
while(1)
{
wait(1);
//zombie = get_closest_ai(self.origin,"axis");

zombs = getaiarray("axis");
for(i=0;i<zombs.size;i++)
{
if(DistanceSquared(zombs[i].origin, self.origin) < 200 * 200)
{
if(!isDefined(zombs[i]))
{
continue;
}

dist = 200;
switch(zombs[i].zombie_move_speed)
{
case "walk": dist = 200;break;
case "run": dist = 250; break;
case "sprint": dist = 275;break;
}
if(distance2d(zombs[i].origin,self.origin) < dist)
{
yaw = self animscripts\utility::GetYawToSpot(zombs[i].origin );
//check to see if he's actually behind the player
if(yaw < -95 || yaw > 95)
{
zombs[i] playsound ("behind_vocals");
}
}
}
}
if(players.size > 1)
{
//Plays 'teamwork' style dialog if there are more than 1 player...
close_zombs = 0;
for(i=0;i<zombs.size;i++)
{
if(DistanceSquared(zombs[i].origin, self.origin) < 250 * 250)
{
close_zombs ++;
}
}
if(close_zombs > 4)
{
if(randomintrange(0,20) < 5)
{
plr = "plr_" + index + "_";
self thread create_and_play_dialog( plr, "vox_oh_shit", .25, "resp_ohshit" );
}
}
}
}
}

level_start_vox()
{
index = maps\_zombiemode_weapons::get_player_index( self );
plr = "plr_" + index + "_";
wait( 6 );
self thread create_and_play_dialog( plr, "vox_level_start", 0.25 );
}

check_for_change()
{
while (1)
{
self waittill( "trigger", player );

if ( player GetStance() == "prone" )
{
player maps\_zombiemode_score::add_to_player_score( 25 );
play_sound_at_pos( "purchase", player.origin );
break;
}
}
}

/***********************************************************************
    WEAPON STUFF
***********************************************************************/



magic_box_init()
{
level.open_chest_location = [];

for( x = 0 ; x < level.DLC3.PandoraBoxes.size ; x++ )
{
level.open_chest_location[ x ] = level.DLC3.PandoraBoxes[ x ];
}
}

factory_ray_gun_weighting_func()
{
if( level.box_moved == true )
{
num_to_add = 1;
// increase the percentage of ray gun
if( isDefined( level.pulls_since_last_ray_gun ) )
{
// after 12 pulls the ray gun percentage increases to 15%
if( level.pulls_since_last_ray_gun > 11 )
{
num_to_add += int(level.zombie_include_weapons.size*0.1);
}
// after 8 pulls the Ray Gun percentage increases to 10%
else if( level.pulls_since_last_ray_gun > 7 )
{
num_to_add += int(.05 * level.zombie_include_weapons.size);
}
}
return num_to_add;
}
else
{
return 0;
}
}

factory_cymbal_monkey_weighting_func()
{
players = get_players();
count = 0;
for( i = 0; i < players.size; i++ )
{
if( players[i] maps\_zombiemode_weapons::has_weapon_or_upgrade( "zombie_cymbal_monkey" ) )
{
count++;
}
}
if ( count > 0 )
{
return 1;
}
else
{
if( level.round_number < 10 )
{
return 3;
}
else
{
return 5;
}
}
}

/***********************************************************************
    ZOMBIE STUFF
***********************************************************************/

#using_animtree( "zombie_factory" );
script_anims_init()
{
level.scr_anim[ "half_gate" ] = %o_zombie_lattice_gate_half;
level.scr_anim[ "full_gate" ] = %o_zombie_lattice_gate_full;
level.scr_anim[ "difference_engine" ] = %o_zombie_difference_engine_ani;

level.blocker_anim_func = ::factory_playanim;
}

factory_playanim( animname )
{
self UseAnimTree(#animtree);
self animscripted("door_anim", self.origin, self.angles, level.scr_anim[animname] );
}

lock_additional_player_spawner()
{

spawn_points = getentarray("player_respawn_point", "targetname");
for( i = 0; i < spawn_points.size; i++ )
{

spawn_points[i].locked = true;
}
}

#using_animtree( "generic_human" );
anim_override_func()
{
level._zombie_melee[0] = %ai_zombie_attack_forward_v1;
level._zombie_melee[1] = %ai_zombie_attack_forward_v2;
level._zombie_melee[2] = %ai_zombie_attack_v1;
level._zombie_melee[3] = %ai_zombie_attack_v2;
level._zombie_melee[4] = %ai_zombie_attack_v1;
level._zombie_melee[5] = %ai_zombie_attack_v4;
level._zombie_melee[6] = %ai_zombie_attack_v6;

level._zombie_run_melee[0] = %ai_zombie_run_attack_v1;
level._zombie_run_melee[1] = %ai_zombie_run_attack_v2;
level._zombie_run_melee[2] = %ai_zombie_run_attack_v3;

level.scr_anim["zombie"]["run4"] = %ai_zombie_run_v2;
level.scr_anim["zombie"]["run5"] = %ai_zombie_run_v4;
level.scr_anim["zombie"]["run6"] = %ai_zombie_run_v3;

level.scr_anim["zombie"]["walk5"] = %ai_zombie_walk_v6;
level.scr_anim["zombie"]["walk6"] = %ai_zombie_walk_v7;
level.scr_anim["zombie"]["walk7"] = %ai_zombie_walk_v8;
level.scr_anim["zombie"]["walk8"] = %ai_zombie_walk_v9;
}

/***********************************************************************
    HELP CENTER STUFF
***********************************************************************/

//UGX Notes: Moved to an external file.

/***********************************************************************
    MISC STUFF
***********************************************************************/

player_Snow()
{
players = get_players();
array_thread( players, ::_player_Snow );
}

_player_Snow()
{
self endon("death");
self endon("disconnect");

for (;;)
{
playfx ( level._effect["snow_thick"], self.origin + (0,0,0));
wait (0.2);
}
}

extra_events()
{
self UseTriggerRequireLookAt();
self SetCursorHint( "HINT_NOICON" );
self waittill( "trigger" );

targ = GetEnt( self.target, "targetname" );
if ( IsDefined(targ) )
{
targ MoveZ( -10, 5 );
}
}

#using_animtree( "generic_human" );
force_zombie_crawler()
{
if( !IsDefined( self ) )
{
return;
}

if( !self.gibbed )
{
refs = [];

refs[refs.size] = "no_legs";

if( refs.size )
{
self.a.gib_ref = animscripts\death::get_random( refs );

// Don't stand if a leg is gone
self.has_legs = false;
self AllowedStances( "crouch" );

which_anim = RandomInt( 5 );

if( which_anim == 0 )
{
self.deathanim = %ai_zombie_crawl_death_v1;
self set_run_anim( "death3" );
self.run_combatanim = level.scr_anim["zombie"]["crawl1"];
self.crouchRunAnim = level.scr_anim["zombie"]["crawl1"];
self.crouchrun_combatanim = level.scr_anim["zombie"]["crawl1"];
}
else if( which_anim == 1 )
{
self.deathanim = %ai_zombie_crawl_death_v2;
self set_run_anim( "death4" );
self.run_combatanim = level.scr_anim["zombie"]["crawl2"];
self.crouchRunAnim = level.scr_anim["zombie"]["crawl2"];
self.crouchrun_combatanim = level.scr_anim["zombie"]["crawl2"];
}
else if( which_anim == 2 )
{
self.deathanim = %ai_zombie_crawl_death_v1;
self set_run_anim( "death3" );
self.run_combatanim = level.scr_anim["zombie"]["crawl3"];
self.crouchRunAnim = level.scr_anim["zombie"]["crawl3"];
self.crouchrun_combatanim = level.scr_anim["zombie"]["crawl3"];
}
else if( which_anim == 3 )
{
self.deathanim = %ai_zombie_crawl_death_v2;
self set_run_anim( "death4" );
self.run_combatanim = level.scr_anim["zombie"]["crawl4"];
self.crouchRunAnim = level.scr_anim["zombie"]["crawl4"];
self.crouchrun_combatanim = level.scr_anim["zombie"]["crawl4"];
}
else if( which_anim == 4 )
{
self.deathanim = %ai_zombie_crawl_death_v1;
self set_run_anim( "death3" );
self.run_combatanim = level.scr_anim["zombie"]["crawl5"];
self.crouchRunAnim = level.scr_anim["zombie"]["crawl5"];
self.crouchrun_combatanim = level.scr_anim["zombie"]["crawl5"];
}
}

if( self.health > 50 )
{
self.health = 50;

// force gibbing if the zombie is still alive
self thread animscripts\death::do_gib();
}
}
}

_zombiemode_weapons
Spoiler: click to open...
Code Snippet
Plaintext
#include maps\_utility; 
#include common_scripts\utility;
#include maps\_zombiemode_utility;
#include maps\_harrybo21_utilities;

init()
{
init_weapons();
init_weapon_upgrade();
init_pay_turret();
init_weapon_cabinet();
treasure_chest_init();
level thread add_limited_tesla_gun();
level.box_moved = false;
}

add_zombie_weapon( weapon_name, hint, cost, weaponVO, variation_count, ammo_cost  )
{
if( IsDefined( level.zombie_include_weapons ) && !IsDefined( level.zombie_include_weapons[weapon_name] ) )
{
return;
}

add_weapon_to_sound_array(weaponVO,variation_count);

// Check the table first
table = "mp/zombiemode.csv";
table_cost = TableLookUp( table, 0, weapon_name, 1 );
table_ammo_cost = TableLookUp( table, 0, weapon_name, 2 );

if( IsDefined( table_cost ) && table_cost != "" )
{
cost = round_up_to_ten( int( table_cost ) );
}

if( IsDefined( table_ammo_cost ) && table_ammo_cost != "" )
{
ammo_cost = round_up_to_ten( int( table_ammo_cost ) );
}

PrecacheItem( weapon_name );
PrecacheString( hint );

struct = SpawnStruct();

if( !IsDefined( level.zombie_weapons ) )
{
level.zombie_weapons = [];
}

struct.weapon_name = weapon_name;
struct.weapon_classname = "weapon_" + weapon_name;
struct.hint = hint;
struct.cost = cost;
struct.sound = weaponVO;
struct.variation_count = variation_count;
struct.is_in_box = level.zombie_include_weapons[weapon_name];

if( !IsDefined( ammo_cost ) )
{
ammo_cost = round_up_to_ten( int( cost * 0.5 ) );
}

struct.ammo_cost = ammo_cost;

level.zombie_weapons[weapon_name] = struct;
}

default_weighting_func()
{
return 1;
}

default_tesla_weighting_func()
{
num_to_add = 1;
if( isDefined( level.pulls_since_last_tesla_gun ) )
{
// player has dropped the tesla for another weapon, so we set all future polls to 20%
if( isDefined(level.player_drops_tesla_gun) && level.player_drops_tesla_gun == true )
{
num_to_add += int(.2 * level.zombie_include_weapons.size);
}

// player has not seen tesla gun in late rounds
if( !isDefined(level.player_seen_tesla_gun) || level.player_seen_tesla_gun == false )
{
// after round 10 the Tesla gun percentage increases to 20%
if( level.round_number > 10 )
{
num_to_add += int(.2 * level.zombie_include_weapons.size);
}
// after round 5 the Tesla gun percentage increases to 15%
else if( level.round_number > 5 )
{
// calculate the number of times we have to add it to the array to get the desired percent
num_to_add += int(.15 * level.zombie_include_weapons.size);
}
}
}
return num_to_add;
}

default_ray_gun_weighting_func()
{
if( level.box_moved == true )
{
num_to_add = 1;
// increase the percentage of ray gun
if( isDefined( level.pulls_since_last_ray_gun ) )
{
// after 12 pulls the ray gun percentage increases to 15%
if( level.pulls_since_last_ray_gun > 11 )
{
num_to_add += int(level.zombie_include_weapons.size*0.15);
}
// after 8 pulls the Ray Gun percentage increases to 10%
else if( level.pulls_since_last_ray_gun > 7 )
{
num_to_add += int(.1 * level.zombie_include_weapons.size);
}
}
return num_to_add;
}
else
{
return 0;
}
}


//
// Slightly elevate the chance to get it until someone has it, then make it even
default_cymbal_monkey_weighting_func()
{
players = get_players();
count = 0;
for( i = 0; i < players.size; i++ )
{
if( players[i] has_weapon_or_upgrade( "zombie_cymbal_monkey" ) )
{
count++;
}
}
if ( count > 0 )
{
return 1;
}
else
{
if( level.round_number < 10 )
{
return 3;
}
else
{
return 5;
}
}
}


include_zombie_weapon( weapon_name, in_box, weighting_func )
{
if( !IsDefined( level.zombie_include_weapons ) )
{
level.zombie_include_weapons = [];
}
if( !isDefined( in_box ) )
{
in_box = true;
}

level.zombie_include_weapons[weapon_name] = in_box;

if( !isDefined( weighting_func ) )
{
level.weapon_weighting_funcs[weapon_name] = maps\_zombiemode_weapons::default_weighting_func;
}
else
{
level.weapon_weighting_funcs[weapon_name] = weighting_func;
}
}

init_weapons()
{
// Zombify
PrecacheItem( "zombie_melee" );


// Pistols
add_zombie_weapon( "colt", &"ZOMBIE_WEAPON_COLT_50", 50, "vox_crappy", 8 );
add_zombie_weapon( "colt_dirty_harry", &"ZOMBIE_WEAPON_COLT_DH_100", 100, "vox_357", 5 );
add_zombie_weapon( "nambu", &"ZOMBIE_WEAPON_NAMBU_50", 50, "vox_crappy", 8 );
add_zombie_weapon( "sw_357", &"ZOMBIE_WEAPON_SW357_100", 100, "vox_357", 5 );
add_zombie_weapon( "zombie_sw_357", &"ZOMBIE_WEAPON_SW357_100", 100, "vox_357", 5 );
add_zombie_weapon( "zombie_sw_357_upgraded", &"ZOMBIE_WEAPON_SW357_100", 100, "vox_357", 5 );
add_zombie_weapon( "tokarev", &"ZOMBIE_WEAPON_TOKAREV_50", 50, "vox_crappy", 8 );
add_zombie_weapon( "walther", &"ZOMBIE_WEAPON_WALTHER_50", 50, "vox_crappy", 8 );
add_zombie_weapon( "bo1_m1911", &"ZOMBIE_WEAPON_M1911_25", 25, "vox_crappy", 8 );
add_zombie_weapon( "bo1_m1911_upgraded", &"ZOMBIE_WEAPON_M1911_25", 25, "vox_crappy", 8 );

// Bolt Action                                     
add_zombie_weapon( "kar98k", &"ZOMBIE_WEAPON_KAR98K_200", 200, "", 0);
add_zombie_weapon( "zombie_kar98k", &"ZOMBIE_WEAPON_KAR98K_200", 200, "", 0);
add_zombie_weapon( "zombie_kar98k_upgraded", &"ZOMBIE_WEAPON_KAR98K_200", 200, "", 0);
add_zombie_weapon( "kar98k_bayonet", &"ZOMBIE_WEAPON_KAR98K_B_200", 200, "", 0);
add_zombie_weapon( "mosin_rifle", &"ZOMBIE_WEAPON_MOSIN_200", 200, "", 0);
add_zombie_weapon( "mosin_rifle_bayonet", &"ZOMBIE_WEAPON_MOSIN_B_200", 200, "", 0 );
add_zombie_weapon( "springfield", &"ZOMBIE_WEAPON_SPRINGFIELD_200", 200, "", 0 );
add_zombie_weapon( "zombie_springfield", &"ZOMBIE_WEAPON_SPRINGFIELD_200", 200, "", 0 );
add_zombie_weapon( "springfield_bayonet", &"ZOMBIE_WEAPON_SPRINGFIELD_B_200", 200, "", 0 );
add_zombie_weapon( "zombie_type99_rifle", &"ZOMBIE_WEAPON_TYPE99_200", 200, "", 0 );
add_zombie_weapon( "zombie_type99_rifle_upgraded", &"ZOMBIE_WEAPON_TYPE99_200", 200, "", 0 );
add_zombie_weapon( "type99_rifle_bayonet", &"ZOMBIE_WEAPON_TYPE99_B_200", 200, "", 0 );

// Semi Auto                                       
add_zombie_weapon( "zombie_gewehr43", &"ZOMBIE_WEAPON_GEWEHR43_600", 600, "" , 0 );
add_zombie_weapon( "zombie_gewehr43_upgraded", &"ZOMBIE_WEAPON_GEWEHR43_600", 600, "" , 0 );
add_zombie_weapon( "zombie_m1carbine", &"ZOMBIE_WEAPON_M1CARBINE_600", 600, "" , 0 );
add_zombie_weapon( "zombie_m1carbine_upgraded", &"ZOMBIE_WEAPON_M1CARBINE_600", 600, "" , 0 );
add_zombie_weapon( "m1carbine_bayonet", &"ZOMBIE_WEAPON_M1CARBINE_B_600", 600, "" , 0 );
add_zombie_weapon( "zombie_m1garand", &"ZOMBIE_WEAPON_M1GARAND_600", 600, "" , 0 );
add_zombie_weapon( "zombie_m1garand_upgraded", &"ZOMBIE_WEAPON_M1GARAND_600", 600, "" , 0 );
add_zombie_weapon( "m14", &"Hold &&1 For M14 [Cost: 500]", 500, "" , 0 );
add_zombie_weapon( "m14_upgraded", &"Hold &&1 For M14 [Cost: 500]", 500, "" , 0 );
add_zombie_weapon( "m1garand_bayonet", &"ZOMBIE_WEAPON_M1GARAND_B_600", 600, "" , 0 );
add_zombie_weapon( "svt40", &"ZOMBIE_WEAPON_SVT40_600", 600, "" , 0 );

// Grenades                                         
add_zombie_weapon( "fraggrenade", &"ZOMBIE_WEAPON_FRAGGRENADE_250", 250, "" , 0 );
add_zombie_weapon( "molotov", &"ZOMBIE_WEAPON_MOLOTOV_200", 200, "vox_crappy", 8 );
add_zombie_weapon( "molotov_zombie", &"ZOMBIE_WEAPON_MOLOTOV_200", 200, "vox_crappy", 8 );
add_zombie_weapon( "stick_grenade", &"ZOMBIE_WEAPON_STICKGRENADE_250", 250, "" , 0 );
add_zombie_weapon( "stielhandgranate", &"ZOMBIE_WEAPON_STIELHANDGRANATE_250", 250, "" , 0, 250 );
add_zombie_weapon( "type97_frag", &"ZOMBIE_WEAPON_TYPE97FRAG_250", 250, "" , 0 );

// Scoped
add_zombie_weapon( "kar98k_scoped_zombie", &"ZOMBIE_WEAPON_KAR98K_S_750", 750, "vox_ppsh", 5);
add_zombie_weapon( "kar98k_scoped_bayonet_zombie", &"ZOMBIE_WEAPON_KAR98K_S_B_750", 750, "vox_ppsh", 5);
add_zombie_weapon( "mosin_rifle_scoped_zombie", &"ZOMBIE_WEAPON_MOSIN_S_750", 750, "vox_ppsh", 5);
add_zombie_weapon( "mosin_rifle_scoped_bayonet_zombie", &"ZOMBIE_WEAPON_MOSIN_S_B_750", 750, "vox_ppsh", 5);
add_zombie_weapon( "ptrs41_zombie", &"ZOMBIE_WEAPON_PTRS41_750", 750, "vox_ppsh", 5);
add_zombie_weapon( "ptrs41_zombie_upgraded", &"ZOMBIE_WEAPON_PTRS41_750", 750, "vox_ppsh", 5);
add_zombie_weapon( "springfield_scoped_zombie", &"ZOMBIE_WEAPON_SPRINGFIELD_S_750", 750, "vox_ppsh", 5);
add_zombie_weapon( "springfield_scoped_bayonet_zombie", &"ZOMBIE_WEAPON_SPRINGFIELD_S_B_750", 750, "vox_ppsh", 5);
add_zombie_weapon( "type99_rifle_scoped_zombie", &"ZOMBIE_WEAPON_TYPE99_S_750", 750, "vox_ppsh", 5);
add_zombie_weapon( "type99_rifle_scoped_bayonet_zombie", &"ZOMBIE_WEAPON_TYPE99_S_B_750", 750, "vox_ppsh", 5);

// Full Auto                                                                               
add_zombie_weapon( "zombie_mp40", &"ZOMBIE_WEAPON_MP40_1000", 1000, "vox_mp40", 2 );
add_zombie_weapon( "zombie_mp40_upgraded", &"ZOMBIE_WEAPON_MP40_1000", 1000, "vox_mp40", 2 );
add_zombie_weapon( "zombie_ppsh", &"ZOMBIE_WEAPON_PPSH_2000", 2000, "vox_ppsh", 5 );
add_zombie_weapon( "zombie_ppsh_upgraded", &"ZOMBIE_WEAPON_PPSH_2000", 2000, "vox_ppsh", 5 );
add_zombie_weapon( "zombie_stg44", &"ZOMBIE_WEAPON_STG44_1200", 1200, "vox_mg", 9 );
add_zombie_weapon( "zombie_stg44_upgraded", &"ZOMBIE_WEAPON_STG44_1200", 1200, "vox_mg", 9 );
add_zombie_weapon( "zombie_thompson", &"ZOMBIE_WEAPON_THOMPSON_1200", 1200, "", 0 );
add_zombie_weapon( "zombie_thompson_upgraded", &"ZOMBIE_WEAPON_THOMPSON_1200", 1200, "", 0 );
add_zombie_weapon( "zombie_type100_smg", &"ZOMBIE_WEAPON_TYPE100_1000", 1000, "", 0 );
add_zombie_weapon( "zombie_type100_smg_upgraded", &"ZOMBIE_WEAPON_TYPE100_1000", 1000, "", 0 );

// Shotguns                                         
add_zombie_weapon( "zombie_doublebarrel", &"ZOMBIE_WEAPON_DOUBLEBARREL_1200", 1200, "vox_shotgun", 6);
add_zombie_weapon( "zombie_doublebarrel_upgraded", &"ZOMBIE_WEAPON_DOUBLEBARREL_1200", 1200, "vox_shotgun", 6);
add_zombie_weapon( "zombie_doublebarrel_sawed", &"ZOMBIE_WEAPON_DOUBLEBARREL_SAWED_1200", 1200, "vox_shotgun", 6);
add_zombie_weapon( "zombie_doublebarrel_sawed_upgraded", &"ZOMBIE_WEAPON_DOUBLEBARREL_SAWED_1200", 1200, "vox_shotgun", 6);
add_zombie_weapon( "zombie_shotgun", &"ZOMBIE_WEAPON_SHOTGUN_1500", 1500, "vox_shotgun", 6);
add_zombie_weapon( "zombie_shotgun_upgraded", &"ZOMBIE_WEAPON_SHOTGUN_1500", 1500, "vox_shotgun", 6);

// Heavy Machineguns                               
add_zombie_weapon( "zombie_30cal", &"ZOMBIE_WEAPON_30CAL_3000", 3000, "vox_mg", 9 );
add_zombie_weapon( "zombie_30cal_upgraded", &"ZOMBIE_WEAPON_30CAL_3000", 3000, "vox_mg", 9 );
add_zombie_weapon( "zombie_bar", &"ZOMBIE_WEAPON_BAR_1800", 1800, "vox_bar", 5 );
add_zombie_weapon( "zombie_bar_upgraded", &"ZOMBIE_WEAPON_BAR_1800", 1800, "vox_bar", 5 );
add_zombie_weapon( "dp28", &"ZOMBIE_WEAPON_DP28_2250", 2250, "vox_mg" , 9 );
add_zombie_weapon( "zombie_fg42", &"ZOMBIE_WEAPON_FG42_1500", 1500, "vox_mg" , 9 );
add_zombie_weapon( "zombie_fg42_upgraded", &"ZOMBIE_WEAPON_FG42_1500", 1500, "vox_mg" , 9 );
add_zombie_weapon( "fg42_scoped", &"ZOMBIE_WEAPON_FG42_S_1500", 1500, "vox_mg" , 9 );
add_zombie_weapon( "zombie_mg42", &"ZOMBIE_WEAPON_MG42_3000", 3000, "vox_mg" , 9 );
add_zombie_weapon( "zombie_mg42_upgraded", &"ZOMBIE_WEAPON_MG42_3000", 3000, "vox_mg" , 9 );
add_zombie_weapon( "type99_lmg", &"ZOMBIE_WEAPON_TYPE99_LMG_1750", 1750, "vox_mg" , 9 );

// Grenade Launcher                                 
add_zombie_weapon( "m1garand_gl_zombie", &"ZOMBIE_WEAPON_M1GARAND_GL_1500", 1500, "", 0 );
add_zombie_weapon( "m1garand_gl_zombie_upgraded", &"ZOMBIE_WEAPON_M1GARAND_GL_1500", 1500, "", 0 );
add_zombie_weapon( "mosin_launcher_zombie", &"ZOMBIE_WEAPON_MOSIN_GL_1200", 1200, "", 0 );

// Bipods                               
add_zombie_weapon( "30cal_bipod", &"ZOMBIE_WEAPON_30CAL_BIPOD_3500", 3500, "vox_mg", 5 );
add_zombie_weapon( "bar_bipod", &"ZOMBIE_WEAPON_BAR_BIPOD_2500", 2500, "vox_bar", 5 );
add_zombie_weapon( "dp28_bipod", &"ZOMBIE_WEAPON_DP28_BIPOD_2500", 2500, "vox_mg", 5 );
add_zombie_weapon( "fg42_bipod", &"ZOMBIE_WEAPON_FG42_BIPOD_2000", 2000, "vox_mg", 5 );
add_zombie_weapon( "mg42_bipod", &"ZOMBIE_WEAPON_MG42_BIPOD_3250", 3250, "vox_mg", 5 );
add_zombie_weapon( "type99_lmg_bipod", &"ZOMBIE_WEAPON_TYPE99_LMG_BIPOD_2250", 2250, "vox_mg", 5 );

// Rocket Launchers
add_zombie_weapon( "bazooka", &"ZOMBIE_WEAPON_BAZOOKA_2000", 2000, "", 0 );
add_zombie_weapon( "panzerschrek_zombie", &"ZOMBIE_WEAPON_PANZERSCHREK_2000", 2000, "vox_panzer", 5 );
add_zombie_weapon( "panzerschrek_zombie_upgraded", &"ZOMBIE_WEAPON_PANZERSCHREK_2000", 2000, "vox_panzer", 5 );

// Flamethrower                                     
add_zombie_weapon( "m2_flamethrower_zombie", &"ZOMBIE_WEAPON_M2_FLAMETHROWER_3000", 3000, "vox_flame", 7);
add_zombie_weapon( "m2_flamethrower_zombie_upgraded", &"ZOMBIE_WEAPON_M2_FLAMETHROWER_3000", 3000, "vox_flame", 7);

// Special                                         
add_zombie_weapon( "mine_bouncing_betty", &"ZOMBIE_WEAPON_SATCHEL_2000", 2000, "" );
add_zombie_weapon( "mortar_round", &"ZOMBIE_WEAPON_MORTARROUND_2000", 2000, "" );
add_zombie_weapon( "satchel_charge", &"ZOMBIE_WEAPON_SATCHEL_2000", 2000, "vox_monkey", 3 );
add_zombie_weapon( "zombie_cymbal_monkey", &"ZOMBIE_WEAPON_SATCHEL_2000", 2000, "vox_monkey", 3 );
add_zombie_weapon( "ray_gun", &"ZOMBIE_WEAPON_RAYGUN_10000", 10000, "vox_raygun", 6 );
add_zombie_weapon( "ray_gun_upgraded", &"ZOMBIE_WEAPON_RAYGUN_10000", 10000, "vox_raygun", 6 );
add_zombie_weapon( "tesla_gun", &"ZOMBIE_BUY_TESLA", 10, "vox_tesla", 5 );
add_zombie_weapon( "tesla_gun_upgraded", &"ZOMBIE_BUY_TESLA", 10, "vox_tesla", 5 );

if(level.script != "nazi_zombie_prototype")
{
Precachemodel("zombie_teddybear");
}
// ONLY 1 OF THE BELOW SHOULD BE ALLOWED
add_limited_weapon( "m2_flamethrower_zombie", 1 );
add_limited_weapon( "tesla_gun", 1);
}   

//remove this function and whenever it's call for production. this is only for testing purpose.
add_limited_tesla_gun()
{

weapon_spawns = GetEntArray( "weapon_upgrade", "targetname" );

for( i = 0; i < weapon_spawns.size; i++ )
{
hint_string = weapon_spawns[i].zombie_weapon_upgrade;
if(hint_string == "tesla_gun")
{
weapon_spawns[i] waittill("trigger");
weapon_spawns[i] trigger_off();
break;

}

}

}


add_limited_weapon( weapon_name, amount )
{
if( !IsDefined( level.limited_weapons ) )
{
level.limited_weapons = [];
}

level.limited_weapons[weapon_name] = amount;
}                                         

// For pay turrets
init_pay_turret()
{
pay_turrets = [];
pay_turrets = GetEntArray( "pay_turret", "targetname" );

for( i = 0; i < pay_turrets.size; i++ )
{
cost = level.pay_turret_cost;
if( !isDefined( cost ) )
{
cost = 1000;
}
pay_turrets[i] SetHintString( &"ZOMBIE_PAY_TURRET", cost );
pay_turrets[i] SetCursorHint( "HINT_NOICON" );
pay_turrets[i] UseTriggerRequireLookAt();

pay_turrets[i] thread pay_turret_think( cost );
}
}

// For buying weapon upgrades in the environment
init_weapon_upgrade()
{
weapon_spawns = [];
weapon_spawns = GetEntArray( "weapon_upgrade", "targetname" );

for( i = 0; i < weapon_spawns.size; i++ )
{
hint_string = get_weapon_hint( weapon_spawns[i].zombie_weapon_upgrade );

weapon_spawns[i] SetHintString( hint_string );
weapon_spawns[i] setCursorHint( "HINT_NOICON" );
weapon_spawns[i] UseTriggerRequireLookAt();

weapon_spawns[i] thread weapon_spawn_think();
model = getent( weapon_spawns[i].target, "targetname" );
model hide();
}
}

// weapon cabinets which open on use
init_weapon_cabinet()
{
// the triggers which are targeted at doors
weapon_cabs = GetEntArray( "weapon_cabinet_use", "targetname" );

for( i = 0; i < weapon_cabs.size; i++ )
{

weapon_cabs[i] SetHintString( &"ZOMBIE_CABINET_OPEN_1500" );
weapon_cabs[i] setCursorHint( "HINT_NOICON" );
weapon_cabs[i] UseTriggerRequireLookAt();
}

array_thread( weapon_cabs, ::weapon_cabinet_think );
}

// returns the trigger hint string for the given weapon
get_weapon_hint( weapon_name )
{
AssertEx( IsDefined( level.zombie_weapons[weapon_name] ), weapon_name + " was not included or is not part of the zombie weapon list." );

return level.zombie_weapons[weapon_name].hint;
}

get_weapon_cost( weapon_name )
{
AssertEx( IsDefined( level.zombie_weapons[weapon_name] ), weapon_name + " was not included or is not part of the zombie weapon list." );

return level.zombie_weapons[weapon_name].cost;
}

get_ammo_cost( weapon_name )
{
AssertEx( IsDefined( level.zombie_weapons[weapon_name] ), weapon_name + " was not included or is not part of the zombie weapon list." );

return level.zombie_weapons[weapon_name].ammo_cost;
}

get_is_in_box( weapon_name )
{
AssertEx( IsDefined( level.zombie_weapons[weapon_name] ), weapon_name + " was not included or is not part of the zombie weapon list." );

return level.zombie_weapons[weapon_name].is_in_box;
}

is_weapon_upgraded( weaponname )
{
if( !isdefined( weaponname ) )
{
return false;
}

weaponname = ToLower( weaponname );

upgraded = issubstr( weaponname, "_upgraded" );

return upgraded;

}

has_upgrade( weaponname )
{
has_upgrade = false;
if( IsDefined( level.zombie_include_weapons[weaponname+"_upgraded"] ) )
{
has_upgrade = self HasWeapon( weaponname+"_upgraded" );
}
return has_upgrade;
}

has_weapon_or_upgrade( weaponname )
{
has_weapon = false;
if (self maps\_laststand::player_is_in_laststand())
{
for( m = 0; m < self.weaponInventory.size; m++ )
{
if (self.weaponInventory[m] == weaponname || self.weaponInventory[m] == weaponname+"_upgraded" )
{
has_weapon = true;
}
}
}
else
{
// If the weapon you're checking doesn't exist, it will return undefined
if( IsDefined( level.zombie_include_weapons[weaponname] ) )
{
has_weapon = self HasWeapon( weaponname );
}

if( !has_weapon && isdefined( level.zombie_include_weapons[weaponname+"_upgraded"] ) )
{
has_weapon = self HasWeapon( weaponname+"_upgraded" );
}
}

return has_weapon;
}

using_weapon_or_upgrade( weaponname )
{
if( self GetCurrentWeapon() == weaponname || self GetCurrentWeapon() == weaponname+"_upgraded" )
{
return true;
}
return false;
}

// for the random weapon chest
treasure_chest_init()
{
flag_init("moving_chest_enabled");
flag_init("moving_chest_now");


level.chests = GetEntArray( "treasure_chest_use", "targetname" );

if (level.chests.size > 1)
{

flag_set("moving_chest_enabled");

while ( 1 )
{
level.chests = array_randomize(level.chests);

if( isdefined( level.random_pandora_box_start ) )
break;
   
if ( !IsDefined( level.chests[0].script_noteworthy ) || ( level.chests[0].script_noteworthy != "start_chest" ) )
{
break;
}

}

level.chest_index = 0;

while(level.chest_index < level.chests.size)
{

if( isdefined( level.random_pandora_box_start ) )
break;

            if(level.chests[level.chest_index].script_noteworthy == "start_chest")
            {
                 break;
            }
           
            level.chest_index++;     
      }

//init time chest accessed amount.

if(level.script != "nazi_zombie_prototype")
{
level.chest_accessed = 0;
}

if(isDefined(level.DLC3.usePandoraBoxLight) && level.DLC3.usePandoraBoxLight)
{
// Anchor target will grab the weapon spawn point inside the box, so the fx will be centered on it too
anchor = GetEnt(level.chests[level.chest_index].target, "targetname");
anchorTarget = GetEnt(anchor.target, "targetname");

level.pandora_light = Spawn( "script_model", anchorTarget.origin );
level.pandora_light.angles = anchorTarget.angles + (-90, 0, 0);
//temp_fx_origin rotateto((-90, (box_origin.angles[1] * -1), 0), 0.05);
level.pandora_light SetModel( "tag_origin" );
playfxontag(level._effect["lght_marker"], level.pandora_light, "tag_origin");
}
// DCS: we need a smaller light in the catacombs for paris, the generic one fills the area under the tower.
else if(level.script == "nazi_zombie_paris")
{
// Anchor target will grab the weapon spawn point inside the box, so the fx will be centered on it too
anchor = GetEnt(level.chests[level.chest_index].target, "targetname");
anchorTarget = GetEnt(anchor.target, "targetname");

level.pandora_light = Spawn( "script_model", anchorTarget.origin );
level.pandora_light.angles = (-90, 0, 0);
level.pandora_light SetModel( "tag_origin" );
//playfxontag(level._effect["lght_marker"], level.pandora_light, "tag_origin");
}

//determine magic box starting location at random or normal
init_starting_chest_location();

}

array_thread( level.chests, ::treasure_chest_think );

}

init_starting_chest_location()
{

for( i = 0; i < level.chests.size; i++ )
{

if( isdefined( level.random_pandora_box_start ) && level.random_pandora_box_start == true )
{
if( i != 0 )
{
level.chests[i] hide_chest();
}
else
{
level.chest_index = i;
unhide_magic_box( i );
}

}
else
{
if ( !IsDefined(level.chests[i].script_noteworthy ) || ( level.chests[i].script_noteworthy != "start_chest" ) )
{
level.chests[i] hide_chest();
}
else
{
level.chest_index = i;
unhide_magic_box( i );
}
}
}


}

unhide_magic_box( index )
{

//PI CHANGE - altered to allow for more than one piece of rubble
rubble = getentarray( level.chests[index].script_noteworthy + "_rubble", "script_noteworthy" );
if ( IsDefined( rubble ) )
{
for ( x = 0; x < rubble.size; x++ )
{
rubble[x] hide();
}
//END PI CHANGE
}
else
{
println( "^3Warning: No rubble found for magic box" );
}
}

set_treasure_chest_cost( cost )
{
level.zombie_treasure_chest_cost = cost;
}

hide_chest()
{
pieces = self get_chest_pieces();

for(i=0;i<pieces.size;i++)
{
pieces[i] disable_trigger();
pieces[i] hide();
}
}

get_chest_pieces()
{
// self = trigger

lid = GetEnt(self.target, "targetname");
org = GetEnt(lid.target, "targetname");
box = GetEnt(org.target, "targetname");

pieces = [];
pieces[pieces.size] = self;
pieces[pieces.size] = lid;
pieces[pieces.size] = org;
pieces[pieces.size] = box;

return pieces;
}

play_crazi_sound()
{
self playlocalsound("laugh_child");
}

show_magic_box()
{
pieces = self get_chest_pieces();
for(i=0;i<pieces.size;i++)
{
pieces[i] enable_trigger();
}

// PI_CHANGE_BEGIN - JMA - we want to play another effect on swamp
anchor = GetEnt(self.target, "targetname");
anchorTarget = GetEnt(anchor.target, "targetname");

if(isDefined(level.DLC3.usePandoraBoxLight) && level.DLC3.usePandoraBoxLight != true )
{
playfx( level._effect["poltergeist"],pieces[0].origin);
}
else
{
level.pandora_light.angles = (-90, anchorTarget.angles[1] + 180, 0);
level.pandora_light moveto(anchorTarget.origin, 0.05);
wait(1);
playfx( level._effect["lght_marker_flare"],level.pandora_light.origin );
// playfxontag(level._effect["lght_marker_flare"], level.pandora_light, "tag_origin");
}
// PI_CHANGE_END

playsoundatposition( "box_poof", pieces[0].origin );
wait(.5);
for(i=0;i<pieces.size;i++)
{
if( pieces[i].classname != "trigger_use" )
{
pieces[i] show();
}
}
pieces[0] playsound ( "box_poof_land" );
pieces[0] playsound( "couch_slam" );
}

treasure_chest_think()
{
cost = 950;
if( IsDefined( level.zombie_treasure_chest_cost ) )
{
cost = level.zombie_treasure_chest_cost;
}
else
{
cost = self.zombie_cost;
}

self set_hint_string( self, "default_treasure_chest_" + cost );
self setCursorHint( "HINT_NOICON" );

//self thread decide_hide_show_chest_hint( "move_imminent" );

// waittill someuses uses this
user = undefined;
while( 1 )
{
self waittill( "trigger", user );

if( user in_revive_trigger() )
{
wait( 0.1 );
continue;
}

// make sure the user is a player, and that they can afford it
if( is_player_valid( user ) && user.score >= cost )
{
user maps\_zombiemode_score::minus_to_player_score( cost );
break;
}
else if ( user.score < cost )
{
user thread maps\_zombiemode_perks::play_no_money_perk_dialog();
continue;
}

wait 0.05;
}

// trigger_use->script_brushmodel lid->script_origin in radiant
lid = getent( self.target, "targetname" );
weapon_spawn_org = getent( lid.target, "targetname" );

//open the lid
lid thread treasure_chest_lid_open();

// SRS 9/3/2008: added to help other functions know if we timed out on grabbing the item
self.timedOut = false;

// mario kart style weapon spawning
weapon_spawn_org thread treasure_chest_weapon_spawn( self, user );

// the glowfx
weapon_spawn_org thread treasure_chest_glowfx();

// take away usability until model is done randomizing
self disable_trigger();

weapon_spawn_org waittill( "randomization_done" );

if (flag("moving_chest_now"))
{
user thread treasure_chest_move_vo();
self treasure_chest_move(lid);

}
else
{
// Let the player grab the weapon and re-enable the box //
self.grab_weapon_hint = true;
self.chest_user = user;
self sethintstring( &"ZOMBIE_TRADE_WEAPONS" );
self setCursorHint( "HINT_NOICON" );
self setvisibletoplayer( user );

// Limit its visibility to the player who bought the box
self enable_trigger();
self thread treasure_chest_timeout();

// make sure the guy that spent the money gets the item
// SRS 9/3/2008: ...or item goes back into the box if we time out
while( 1 )
{
self waittill( "trigger", grabber );

if( grabber == user || grabber == level )
{


if( grabber == user && is_player_valid( user ) && user GetCurrentWeapon() != "mine_bouncing_betty" )
{
bbPrint( "zombie_uses: playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type magic_accept",
user.playername, user.score, level.round_number, cost, weapon_spawn_org.weapon_string, self.origin );
self notify( "user_grabbed_weapon" );
user thread harrybo21_give_gun( weapon_spawn_org.weapon_string);
break;
}
else if( grabber == level )
{
// it timed out
self.timedOut = true;
bbPrint( "zombie_uses: playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type magic_reject",
user.playername, user.score, level.round_number, cost, weapon_spawn_org.weapon_string, self.origin );
break;
}
}

wait 0.05;
}

self.grab_weapon_hint = false;
self.chest_user = undefined;

weapon_spawn_org notify( "weapon_grabbed" );

//increase counter of amount of time weapon grabbed.
if(level.script != "nazi_zombie_prototype")
{
level.chest_accessed += 1;

// PI_CHANGE_BEGIN
// JMA - we only update counters when it's available
if( isDefined(level.DLC3.useChestPulls) && level.DLC3.useChestPulls )
{
level.pulls_since_last_ray_gun += 1;
}

if( isDefined(level.DLC3.useChestPulls) && level.DLC3.useChestPulls )
{
level.pulls_since_last_tesla_gun += 1;
}
// PI_CHANGE_END
}
self disable_trigger();

// spend cash here...
// give weapon here...
lid thread treasure_chest_lid_close( self.timedOut );

//Chris_P
//magic box dissapears and moves to a new spot after a predetermined number of uses

wait 3;
self enable_trigger();
self setvisibletoall();
}

flag_clear("moving_chest_now");
self thread treasure_chest_think();
}


//
// Disable trigger if can't buy weapon and also if someone else is using the chest
decide_hide_show_chest_hint( endon_notify )
{
if( isDefined( endon_notify ) )
{
self endon( endon_notify );
}

while( true )
{
players = get_players();
for( i = 0; i < players.size; i++ )
{
// chest_user defined if someone bought a weapon spin, false when chest closed
if ( (IsDefined(self.chest_user) && players[i] != self.chest_user ) ||
!players[i] can_buy_weapon() )
{
self SetInvisibleToPlayer( players[i], true );
}
else
{
self SetInvisibleToPlayer( players[i], false );
}
}
wait( 0.1 );
}
}

decide_hide_show_hint( endon_notify )
{
if( isDefined( endon_notify ) )
{
self endon( endon_notify );
}

while( true )
{
players = get_players();
for( i = 0; i < players.size; i++ )
{
if( players[i] can_buy_weapon() )
{
self SetInvisibleToPlayer( players[i], false );
}
else
{
self SetInvisibleToPlayer( players[i], true );
}
}
wait( 0.1 );
}
}

can_buy_weapon()
{
if( isDefined( self.is_drinking ) && self.is_drinking )
{
return false;
}
if( self GetCurrentWeapon() == "mine_bouncing_betty" )
{
return false;
}
if( self in_revive_trigger() )
{
return false;
}

return true;
}

treasure_chest_move_vo()
{

self endon("disconnect");

index = maps\_zombiemode_weapons::get_player_index(self);
sound = undefined;

if(!isdefined (level.player_is_speaking))
{
level.player_is_speaking = 0;
}
variation_count = 5;
sound = "plr_" + index + "_vox_box_move" + "_" + randomintrange(0, variation_count);


//This keeps multiple voice overs from playing on the same player (both killstreaks and headshots).
if (level.player_is_speaking != 1 && isDefined(sound))
{
level.player_is_speaking = 1;
self playsound(sound, "sound_done");
self waittill("sound_done");
level.player_is_speaking = 0;
}

}


treasure_chest_move(lid)
{
level waittill("weapon_fly_away_start");

players = get_players();

array_thread(players, ::play_crazi_sound);

level waittill("weapon_fly_away_end");

lid thread treasure_chest_lid_close(false);
self setvisibletoall();

fake_pieces = [];
pieces = self get_chest_pieces();

for(i=0;i<pieces.size;i++)
{
if(pieces[i].classname == "script_model")
{
fake_pieces[fake_pieces.size] = spawn("script_model",pieces[i].origin);
fake_pieces[fake_pieces.size - 1].angles = pieces[i].angles;
fake_pieces[fake_pieces.size - 1] setmodel(pieces[i].model);
pieces[i] disable_trigger();
pieces[i] hide();
}
else
{
pieces[i] disable_trigger();
pieces[i] hide();
}
}

anchor = spawn("script_origin",fake_pieces[0].origin);
soundpoint = spawn("script_origin", anchor.origin);
    playfx( level._effect["poltergeist"],anchor.origin);

anchor playsound("box_move");
for(i=0;i<fake_pieces.size;i++)
{
fake_pieces[i] linkto(anchor);
}

playsoundatposition ("whoosh", soundpoint.origin );
playsoundatposition ("ann_vox_magicbox", soundpoint.origin );


anchor moveto(anchor.origin + (0,0,50),5);
//anchor rotateyaw(360 * 10,5,5);
if(level.chests[level.chest_index].script_noteworthy == "magic_box_south" || level.chests[level.chest_index].script_noteworthy == "magic_box_bathroom" || level.chests[level.chest_index].script_noteworthy == "magic_box_hallway")
{
anchor Vibrate( (50, 0, 0), 10, 0.5, 5 );
}
else if(level.script != "nazi_zombie_sumpf")
{
anchor Vibrate( (0, 50, 0), 10, 0.5, 5 );
}
else
{
   //Get the normal of the box using the positional data of the box and lid
   direction = pieces[3].origin - pieces[1].origin;
   direction = (direction[1], direction[0], 0);
   
   if(direction[1] < 0 || (direction[0] > 0 && direction[1] > 0))
   {
            direction = (direction[0], direction[1] * -1, 0);
       }
       else if(direction[0] < 0)
       {
            direction = (direction[0] * -1, direction[1], 0);
       }
   
        anchor Vibrate( direction, 10, 0.5, 5);
}

//anchor thread rotateroll_box();
anchor waittill("movedone");
//players = get_players();
//array_thread(players, ::play_crazi_sound);
//wait(3.9);

playfx(level._effect["poltergeist"], anchor.origin);

//TUEY - Play the 'disappear' sound
playsoundatposition ("box_poof", soundpoint.origin);
for(i=0;i<fake_pieces.size;i++)
{
fake_pieces[i] delete();
}


//gzheng-Show the rubble
//PI CHANGE - allow for more than one object of rubble per box
rubble = getentarray(self.script_noteworthy + "_rubble", "script_noteworthy");

if ( IsDefined( rubble ) )
{
for (i = 0; i < rubble.size; i++)
{
rubble[i] show();
}
}
else
{
println( "^3Warning: No rubble found for magic box" );
}

wait(0.1);
anchor delete();
soundpoint delete();

old_chest_index = level.chest_index;

wait(5);

//chest moving logic
//PI CHANGE - for sumpf, this doesn't work because chest_index is always incremented twice (here and line 724) - while this would work with an odd number of chests,
//      with an even number it skips half of the chest locations in the map

level.verify_chest = false;
//wait(3);
//make sure level is asylum, factory, or sumpf and make magic box only appear in location player have open, it's off by default
//also make sure box doesn't respawn in old location.
//PI WJB: removed check on "magic_box_explore_only" dvar because it is only ever used here and when it is set in _zombiemode.gsc line 446
// where it is declared and set to 0, causing this while loop to never happen because the check was to see if it was equal to 1
if( isDefined(level.DLC3.useChestMoves) && level.DLC3.useChestMoves)
{
level.chest_index++;

/* while(level.chests[level.chest_index].origin == level.chests[old_chest_index].origin)
{
level.chest_index++;
}*/

if (level.chest_index >= level.chests.size)
{
//PI CHANGE - this way the chests won't move in the same order the second time around
temp_chest_name = level.chests[level.chest_index - 1].script_noteworthy;
level.chest_index = 0;
level.chests = array_randomize(level.chests);
//in case it happens to randomize in such a way that the chest_index now points to the same location
// JMA - want to avoid an infinite loop, so we use an if statement
if (temp_chest_name == level.chests[level.chest_index].script_noteworthy)
{
level.chest_index++;
}
//END PI CHANGE
}

//verify_chest_is_open();
wait(0.01);

}
level.chests[level.chest_index] show_magic_box();

//turn off magic box light.
level notify("magic_box_light_switch");
//PI CHANGE - altered to allow for more than one object of rubble per box
unhide_magic_box( level.chest_index );

}

rotateroll_box()
{
angles = 40;
angles2 = 0;
//self endon("movedone");
while(isdefined(self))
{
self RotateRoll(angles + angles2, 0.5);
wait(0.7);
angles2 = 40;
self RotateRoll(angles * -2, 0.5);
wait(0.7);
}



}
//verify if that magic box is open to players or not.
verify_chest_is_open()
{

//for(i = 0; i < 5; i++)
//PI CHANGE - altered so that there can be more than 5 valid chest locations
for (i = 0; i < level.open_chest_location.size; i++)
{
if(isdefined(level.open_chest_location[i]))
{
if(level.open_chest_location[i] == level.chests[level.chest_index].script_noteworthy)
{
level.verify_chest = true;
return;
}
}

}

level.verify_chest = false;


}


treasure_chest_timeout()
{
self endon( "user_grabbed_weapon" );

wait( 12 );
self notify( "trigger", level );
}

treasure_chest_lid_open()
{
openRoll = 105;
openTime = 0.5;

self RotateRoll( 105, openTime, ( openTime * 0.5 ) );

play_sound_at_pos( "open_chest", self.origin );
play_sound_at_pos( "music_chest", self.origin );
}

treasure_chest_lid_close( timedOut )
{
closeRoll = -105;
closeTime = 0.5;

self RotateRoll( closeRoll, closeTime, ( closeTime * 0.5 ) );
play_sound_at_pos( "close_chest", self.origin );
}

treasure_chest_ChooseRandomWeapon( player )
{

keys = GetArrayKeys( level.zombie_weapons );

// Filter out any weapons the player already has
filtered = [];
for( i = 0; i < keys.size; i++ )
{
if( !get_is_in_box( keys[i] ) )
{
continue;
}

if( player has_weapon_or_upgrade( keys[i] ) )
{
continue;
}

if( !IsDefined( keys[i] ) )
{
continue;
}

filtered[filtered.size] = keys[i];
}

// Filter out the limited weapons
if( IsDefined( level.limited_weapons ) )
{
keys2 = GetArrayKeys( level.limited_weapons );
players = get_players();
pap_triggers = GetEntArray("zombie_vending_upgrade", "targetname");
for( q = 0; q < keys2.size; q++ )
{
count = 0;
for( i = 0; i < players.size; i++ )
{
if( players[i] has_weapon_or_upgrade( keys2[q] ) )
{
count++;
}
}

// Check the pack a punch machines to see if they are holding what we're looking for
for ( k=0; k<pap_triggers.size; k++ )
{
if ( IsDefined(pap_triggers[k].current_weapon) && pap_triggers[k].current_weapon == keys2[q] )
{
count++;
}
}

if( count >= level.limited_weapons[keys2[q]] )
{
filtered = array_remove( filtered, keys2[q] );
}
}
}

return filtered[RandomInt( filtered.size )];
}

treasure_chest_ChooseWeightedRandomWeapon( player )
{

keys = GetArrayKeys( level.zombie_weapons );

// Filter out any weapons the player already has
filtered = [];
for( i = 0; i < keys.size; i++ )
{
if( !get_is_in_box( keys[i] ) )
{
continue;
}

if( player has_weapon_or_upgrade( keys[i] ) )
{
continue;
}

if( !IsDefined( keys[i] ) )
{
continue;
}

num_entries = [[ level.weapon_weighting_funcs[keys[i]] ]]();

for( j = 0; j < num_entries; j++ )
{
filtered[filtered.size] = keys[i];
}
}

// Filter out the limited weapons
if( IsDefined( level.limited_weapons ) )
{
keys2 = GetArrayKeys( level.limited_weapons );
players = get_players();
pap_triggers = GetEntArray("zombie_vending_upgrade", "targetname");
for( q = 0; q < keys2.size; q++ )
{
count = 0;
for( i = 0; i < players.size; i++ )
{
if( players[i] has_weapon_or_upgrade( keys2[q] ) )
{
count++;
}
}

// Check the pack a punch machines to see if they are holding what we're looking for
for ( k=0; k<pap_triggers.size; k++ )
{
if ( IsDefined(pap_triggers[k].current_weapon) && pap_triggers[k].current_weapon == keys2[q] )
{
count++;
}
}

if( count >= level.limited_weapons[keys2[q]] )
{
filtered = array_remove( filtered, keys2[q] );
}
}
}

return filtered[RandomInt( filtered.size )];
}

treasure_chest_weapon_spawn( chest, player )
{
assert(IsDefined(player));
// spawn the model
model = spawn( "script_model", self.origin );
model.angles = self.angles +( 0, 90, 0 );

floatHeight = 40;

//move it up
model moveto( model.origin +( 0, 0, floatHeight ), 3, 2, 0.9 );

// rotation would go here

// make with the mario kart
modelname = undefined;
rand = undefined;
number_cycles = 40;
for( i = 0; i < number_cycles; i++ )
{

if( i < 20 )
{
wait( 0.05 );
}
else if( i < 30 )
{
wait( 0.1 );
}
else if( i < 35 )
{
wait( 0.2 );
}
else if( i < 38 )
{
wait( 0.3 );
}

if( i+1 < number_cycles )
{
rand = treasure_chest_ChooseRandomWeapon( player );
}
else
{
rand = treasure_chest_ChooseWeightedRandomWeapon( player );
}

/#
if( maps\_zombiemode_tesla::tesla_gun_exists() )
{
if ( i == 39 && GetDvar( "scr_spawn_tesla" ) != "" )
{
SetDvar( "scr_spawn_tesla", "" );
rand = "tesla_gun";
}
}
#/

modelname = GetWeaponModel( rand );
model setmodel( modelname );


}

self.weapon_string = rand; // here's where the org get it's weapon type for the give function

// random change of getting the joker that moves the box
random = Randomint(100);

if( !isdefined( level.chest_min_move_usage ) )
{
level.chest_min_move_usage = 4;
}

//increase the chance of joker appearing from 0-100 based on amount of the time chest has been opened.
if(level.script != "nazi_zombie_prototype" && getdvar("magic_chest_movable") == "1")
{

if(level.chest_accessed < level.chest_min_move_usage)
{
// PI_CHANGE_BEGIN - JMA - RandomInt(100) can return a number between 0-99.  If it's zero and chance_of_joker is zero
// we can possibly have a teddy bear one after another.
chance_of_joker = -1;
// PI_CHANGE_END
}
else
{
chance_of_joker = level.chest_accessed + 20;

// make sure teddy bear appears on the 8th pull if it hasn't moved from the initial spot
if( (!isDefined(level.magic_box_first_move) || level.magic_box_first_move == false ) && level.chest_accessed >= 8)
{
chance_of_joker = 100;
}

// pulls 4 thru 8, there is a 15% chance of getting the teddy bear
// NOTE:  this happens in all cases
if( level.chest_accessed >= 4 && level.chest_accessed < 8 )
{
if( random < 15 )
{
chance_of_joker = 100;
}
else
{
chance_of_joker = -1;
}
}

// after the first magic box move the teddy bear percentages changes
if( isDefined(level.magic_box_first_move) && level.magic_box_first_move == true )
{
// between pulls 8 thru 12, the teddy bear percent is 30%
if( level.chest_accessed >= 8 && level.chest_accessed < 13 )
{
if( random < 30 )
{
chance_of_joker = 100;
}
else
{
chance_of_joker = -1;
}
}

// after 12th pull, the teddy bear percent is 50%
if( level.chest_accessed >= 13 )
{
if( random < 50 )
{
chance_of_joker = 100;
}
else
{
chance_of_joker = -1;
}
}
}
}

if (random <= chance_of_joker)
{
model SetModel("zombie_teddybear");
// model rotateto(level.chests[level.chest_index].angles, 0.01);
//wait(1);
model.angles = self.angles;
wait 1;
flag_set("moving_chest_now");
self notify( "move_imminent" );
level.chest_accessed = 0;

player maps\_zombiemode_score::add_to_player_score( 950 );

//allow power weapon to be accessed.
level.box_moved = true;
}
}

self notify( "randomization_done" );

if (flag("moving_chest_now"))
{
wait .5; // we need a wait here before this notify
level notify("weapon_fly_away_start");
wait 2;
model MoveZ(500, 4, 3);
model waittill("movedone");
model delete();
self notify( "box_moving" );
level notify("weapon_fly_away_end");
}
else
{

//turn off power weapon, since player just got one
if( rand == "tesla_gun" || rand == "ray_gun" )
{
// PI_CHANGE_BEGIN - JMA - reset the counters for tesla gun and ray gun pulls
if(isDefined(level.DLC3.useWeaponSpawn) && level.DLC3.useWeaponSpawn )
{
if( rand == "ray_gun" )
{
level.box_moved = false;
level.pulls_since_last_ray_gun = 0;
}

if( rand == "tesla_gun" )
{
level.pulls_since_last_tesla_gun = 0;
level.player_seen_tesla_gun = true;
}
}
else
{
level.box_moved = false;
}
// PI_CHANGE_END
}

model thread timer_til_despawn(floatHeight);
self waittill( "weapon_grabbed" );

if( !chest.timedOut )
{
model Delete();
}


}
}
timer_til_despawn(floatHeight)
{


// SRS 9/3/2008: if we timed out, move the weapon back into the box instead of deleting it
putBackTime = 12;
self MoveTo( self.origin - ( 0, 0, floatHeight ), putBackTime, ( putBackTime * 0.5 ) );
wait( putBackTime );

if(isdefined(self))
{
self Delete();
}
}

treasure_chest_glowfx()
{
fxObj = spawn( "script_model", self.origin +( 0, 0, 0 ) );
fxobj setmodel( "tag_origin" );
fxobj.angles = self.angles +( 90, 0, 0 );

playfxontag( level._effect["chest_light"], fxObj, "tag_origin"  );

self waittill_any( "weapon_grabbed", "box_moving" );

fxobj delete();
}

// self is the player string comes from the randomization function
treasure_chest_give_weapon( weapon_string )
{
primaryWeapons = self GetWeaponsListPrimaries();
current_weapon = undefined;

if( self HasWeapon( weapon_string ) )
{
self GiveMaxAmmo( weapon_string );
self SwitchToWeapon( weapon_string );
return;
}

// This should never be true for the first time.
if( primaryWeapons.size >= 2 ) // he has two weapons
{
current_weapon = self getCurrentWeapon(); // get hiss current weapon

if ( current_weapon == "mine_bouncing_betty" )
{
current_weapon = undefined;
}

if( isdefined( current_weapon ) )
{
if( !( weapon_string == "fraggrenade" || weapon_string == "stielhandgranate" || weapon_string == "molotov" || weapon_string == "zombie_cymbal_monkey" ) )
{
// PI_CHANGE_BEGIN
// JMA - player dropped the tesla gun
if( isDefined(level.DLC3.useGiveWeapon) && level.DLC3.useGiveWeapon)
{
if( current_weapon == "tesla_gun" )
{
level.player_drops_tesla_gun = true;
}
}
// PI_CHANGE_END

self TakeWeapon( current_weapon );
}
}
}

if( IsDefined( primaryWeapons ) && !isDefined( current_weapon ) )
{
for( i = 0; i < primaryWeapons.size; i++ )
{
if( primaryWeapons[i] == "zombie_colt" )
{
continue;
}

if( weapon_string != "fraggrenade" && weapon_string != "stielhandgranate" && weapon_string != "molotov" && weapon_string != "zombie_cymbal_monkey" )
{
// PI_CHANGE_BEGIN
// JMA - player dropped the tesla gun
if( isDefined(level.DLC3.useGiveWeapon) && level.DLC3.useGiveWeapon )
{
if( primaryWeapons[i] == "tesla_gun" )
{
level.player_drops_tesla_gun = true;
}
}
// PI_CHANGE_END

self TakeWeapon( primaryWeapons[i] );
}
}
}

self play_sound_on_ent( "purchase" );

if( weapon_string == "molotov" || weapon_string == "molotov_zombie" )
{
// PI_CHANGE_BEGIN
// JMA 051409 sanity check to see if we have the weapon before we remove it
has_weapon = self HasWeapon( "zombie_cymbal_monkey" );
if( isDefined(has_weapon) && has_weapon )
{
self TakeWeapon( "zombie_cymbal_monkey" );
}
// PI_CHANGE_END
}
if( weapon_string == "zombie_cymbal_monkey" )
{
// PI_CHANGE_BEGIN
// JMA 051409 sanity check to see if we have the weapon before we remove it
has_weapon = self HasWeapon( "molotov" );
if( isDefined(has_weapon) && has_weapon )
{
self TakeWeapon( "molotov" );
}

if( isDefined(level.zombie_weapons) && isDefined(level.zombie_weapons["molotov_zombie"]) )
{
has_weapon = self HasWeapon( "molotov_zombie" );
if( isDefined(has_weapon) && has_weapon )
{
self TakeWeapon( "molotov_zombie" );
}
}
// PI_CHANGE_END

self maps\_zombiemode_cymbal_monkey::player_give_cymbal_monkey();
play_weapon_vo(weapon_string);
return;
}

self GiveWeapon( weapon_string, 0 );
self GiveMaxAmmo( weapon_string );
self SwitchToWeapon( weapon_string );

play_weapon_vo(weapon_string);

// self playsound (level.zombie_weapons[weapon_string].sound);
}

weapon_cabinet_think()
{
weapons = getentarray( "cabinet_weapon", "targetname" );

doors = getentarray( self.target, "targetname" );
for( i = 0; i < doors.size; i++ )
{
doors[i] NotSolid();
}

self.has_been_used_once = false;

self decide_hide_show_hint();

while( 1 )
{
self waittill( "trigger", player );

if( !player can_buy_weapon() )
{
wait( 0.1 );
continue;
}

cost = 1500;
if( self.has_been_used_once )
{
cost = get_weapon_cost( self.zombie_weapon_upgrade );
}
else
{
if( IsDefined( self.zombie_cost ) )
{
cost = self.zombie_cost;
}
}

ammo_cost = get_ammo_cost( self.zombie_weapon_upgrade );

if( !is_player_valid( player ) )
{
player thread ignore_triggers( 0.5 );
continue;
}

if( self.has_been_used_once )
{
player_has_weapon = player has_weapon_or_upgrade( self.zombie_weapon_upgrade );
/*
player_has_weapon = false;
weapons = player GetWeaponsList();
if( IsDefined( weapons ) )
{
for( i = 0; i < weapons.size; i++ )
{
if( weapons[i] == self.zombie_weapon_upgrade )
{
player_has_weapon = true;
}
}
}
*/

if( !player_has_weapon )
{
if( player.score >= cost )
{
self play_sound_on_ent( "purchase" );
player maps\_zombiemode_score::minus_to_player_score( cost );
player thread harrybo21_give_gun( self.zombie_weapon_upgrade );
}
else // not enough money
{
play_sound_on_ent( "no_purchase" );
player thread maps\_zombiemode_perks::play_no_money_perk_dialog();
}
}
else if ( player.score >= ammo_cost )
{
ammo_given = player ammo_give( self.zombie_weapon_upgrade );
if( ammo_given )
{
self play_sound_on_ent( "purchase" );
player maps\_zombiemode_score::minus_to_player_score( ammo_cost ); // this give him ammo to early
}
}
else // not enough money
{
play_sound_on_ent( "no_purchase" );
player thread maps\_zombiemode_perks::play_no_money_perk_dialog();
}
}
else if( player.score >= cost ) // First time the player opens the cabinet
{
self.has_been_used_once = true;

self play_sound_on_ent( "purchase" );

self SetHintString( &"ZOMBIE_WEAPONCOSTAMMO", cost, ammo_cost );
// self SetHintString( get_weapon_hint( self.zombie_weapon_upgrade ) );
self setCursorHint( "HINT_NOICON" );
player maps\_zombiemode_score::minus_to_player_score( self.zombie_cost );

doors = getentarray( self.target, "targetname" );

for( i = 0; i < doors.size; i++ )
{
if( doors[i].model == "dest_test_cabinet_ldoor_dmg0" )
{
doors[i] thread weapon_cabinet_door_open( "left" );
}
else if( doors[i].model == "dest_test_cabinet_rdoor_dmg0" )
{
doors[i] thread weapon_cabinet_door_open( "right" );
}
}

player_has_weapon = player has_weapon_or_upgrade( self.zombie_weapon_upgrade );
/*
player_has_weapon = false;
weapons = player GetWeaponsList();
if( IsDefined( weapons ) )
{
for( i = 0; i < weapons.size; i++ )
{
if( weapons[i] == self.zombie_weapon_upgrade )
{
player_has_weapon = true;
}
}
}
*/

if( !player_has_weapon )
{
player thread harrybo21_give_gun( self.zombie_weapon_upgrade );
}
else
{
if( player has_upgrade( self.zombie_weapon_upgrade ) )
{
player ammo_give( self.zombie_weapon_upgrade+"_upgraded" );
}
else
{
player ammo_give( self.zombie_weapon_upgrade );
}
}
}
else // not enough money
{
play_sound_on_ent( "no_purchase" );
player thread maps\_zombiemode_perks::play_no_money_perk_dialog();
}
}
}

pay_turret_think( cost )
{
if( !isDefined( self.target ) )
{
return;
}
turret = GetEnt( self.target, "targetname" );

if( !isDefined( turret ) )
{
return;
}

turret makeTurretUnusable();

while( true )
{
self waittill( "trigger", player );

if( !is_player_valid( player ) )
{
player thread ignore_triggers( 0.5 );
continue;
}

if( player in_revive_trigger() )
{
wait( 0.1 );
continue;
}

if(isdefined(player.is_drinking))
{
wait(0.1);
continue;
}

if( player.score >= cost )
{
player maps\_zombiemode_score::minus_to_player_score( cost );
turret makeTurretUsable();
turret UseBy( player );
self disable_trigger();

player.curr_pay_turret = turret;

turret thread watch_for_laststand( player );
turret thread watch_for_fake_death( player );
if( isDefined( level.turret_timer ) )
{
turret thread watch_for_timeout( player, level.turret_timer );
}

while( isDefined( turret getTurretOwner() ) && turret getTurretOwner() == player )
{
wait( 0.05 );
}

turret notify( "stop watching" );

player.curr_pay_turret = undefined;

turret makeTurretUnusable();
self enable_trigger();
}
else // not enough money
{
play_sound_on_ent( "no_purchase" );
player thread maps\_zombiemode_perks::play_no_money_perk_dialog();
}
}
}

watch_for_laststand( player )
{
self endon( "stop watching" );

while( !player maps\_laststand::player_is_in_laststand() )
{
if( isDefined( level.intermission ) && level.intermission )
{
intermission = true;
}
wait( 0.05 );
}

if( isDefined( self getTurretOwner() ) && self getTurretOwner() == player )
{
self UseBy( player );
}
}

watch_for_fake_death( player )
{
self endon( "stop watching" );

player waittill( "fake_death" );

if( isDefined( self getTurretOwner() ) && self getTurretOwner() == player )
{
self UseBy( player );
}
}

watch_for_timeout( player, time )
{
self endon( "stop watching" );

self thread cancel_timer_on_end( player );

player thread maps\_zombiemode_timer::start_timer( time, "stop watching" );

wait( time );

if( isDefined( self getTurretOwner() ) && self getTurretOwner() == player )
{
self UseBy( player );
}
}

cancel_timer_on_end( player )
{
self waittill( "stop watching" );
player notify( "stop watching" );
}

weapon_cabinet_door_open( left_or_right )
{
if( left_or_right == "left" )
{
self rotateyaw( 120, 0.3, 0.2, 0.1 );
}
else if( left_or_right == "right" )
{
self rotateyaw( -120, 0.3, 0.2, 0.1 );
}
}

weapon_spawn_think()
{
cost = get_weapon_cost( self.zombie_weapon_upgrade );
ammo_cost = get_ammo_cost( self.zombie_weapon_upgrade );
is_grenade = (WeaponType( self.zombie_weapon_upgrade ) == "grenade");
if(is_grenade)
{
ammo_cost = cost;
}

self thread decide_hide_show_hint();

self.first_time_triggered = false;
for( ;; )
{
self waittill( "trigger", player );
// if not first time and they have the weapon give ammo

if( !is_player_valid( player ) )
{
player thread ignore_triggers( 0.5 );
continue;
}

if( !player can_buy_weapon() )
{
wait( 0.1 );
continue;
}

// Allow people to get ammo off the wall for upgraded weapons
player_has_weapon = player has_weapon_or_upgrade( self.zombie_weapon_upgrade );
/*
player_has_weapon = false;
weapons = player GetWeaponsList();
if( IsDefined( weapons ) )
{
for( i = 0; i < weapons.size; i++ )
{
if( weapons[i] == self.zombie_weapon_upgrade )
{
player_has_weapon = true;
}
}
}
*/

if( !player_has_weapon )
{
// else make the weapon show and give it
if( player.score >= cost )
{
if( self.first_time_triggered == false )
{
model = getent( self.target, "targetname" );
// model show();
model thread weapon_show( player );
self.first_time_triggered = true;

if(!is_grenade)
{
self SetHintString( &"ZOMBIE_WEAPONCOSTAMMO", cost, ammo_cost );
}
}

player maps\_zombiemode_score::minus_to_player_score( cost );

bbPrint( "zombie_uses: playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type weapon",
player.playername, player.score, level.round_number, cost, self.zombie_weapon_upgrade, self.origin );

player thread harrybo21_give_gun( self.zombie_weapon_upgrade );
}
else
{
play_sound_on_ent( "no_purchase" );
player thread maps\nazi_zombie_sumpf_blockers::play_no_money_purchase_dialog();

}
}
else
{
// MM - need to check and see if the player has an upgraded weapon.  If so, the ammo cost is much higher
if ( player has_upgrade( self.zombie_weapon_upgrade ) )
{
ammo_cost = 4500;
}
else
{
ammo_cost = get_ammo_cost( self.zombie_weapon_upgrade );
}

// if the player does have this then give him ammo.
if( player.score >= ammo_cost )
{
if( self.first_time_triggered == false )
{
model = getent( self.target, "targetname" );
// model show();
model thread weapon_show( player );
self.first_time_triggered = true;
if(!is_grenade)
{
self SetHintString( &"ZOMBIE_WEAPONCOSTAMMO", cost, get_ammo_cost( self.zombie_weapon_upgrade ) );
}
}

if( player HasWeapon( self.zombie_weapon_upgrade ) && player has_upgrade( self.zombie_weapon_upgrade ) )
{
ammo_given = player ammo_give( self.zombie_weapon_upgrade, true );
}
else if( player has_upgrade( self.zombie_weapon_upgrade ) )
{
ammo_given = player ammo_give( self.zombie_weapon_upgrade+"_upgraded" );
}
else
{
ammo_given = player ammo_give( self.zombie_weapon_upgrade );
}

if( ammo_given )
{
player maps\_zombiemode_score::minus_to_player_score( ammo_cost ); // this give him ammo to early

bbPrint( "zombie_uses: playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type ammo",
player.playername, player.score, level.round_number, ammo_cost, self.zombie_weapon_upgrade, self.origin );
}
}
else
{
play_sound_on_ent( "no_purchase" );
}
}
}
}

weapon_show( player )
{
player_angles = VectorToAngles( player.origin - self.origin );

player_yaw = player_angles[1];
weapon_yaw = self.angles[1];

yaw_diff = AngleClamp180( player_yaw - weapon_yaw );

if( yaw_diff > 0 )
{
yaw = weapon_yaw - 90;
}
else
{
yaw = weapon_yaw + 90;
}

self.og_origin = self.origin;
self.origin = self.origin +( AnglesToForward( ( 0, yaw, 0 ) ) * 8 );

wait( 0.05 );
self Show();

play_sound_at_pos( "weapon_show", self.origin, self );

time = 1;
self MoveTo( self.og_origin, time );
}

weapon_give( weapon, is_upgrade )
{
primaryWeapons = self GetWeaponsListPrimaries();
current_weapon = undefined;

//if is not an upgraded perk purchase
if( !IsDefined( is_upgrade ) )
{
is_upgrade = false;
}

// This should never be true for the first time.
if( primaryWeapons.size >= 2 ) // he has two weapons
{
current_weapon = self getCurrentWeapon(); // get his current weapon

if ( current_weapon == "mine_bouncing_betty" )
{
current_weapon = undefined;
}

if( isdefined( current_weapon ) )
{
if( !( weapon == "fraggrenade" || weapon == "stielhandgranate" || weapon == "molotov" || weapon == "zombie_cymbal_monkey" ) )
{
self TakeWeapon( current_weapon );
}
}
}

if( weapon == "zombie_cymbal_monkey" )
{
// PI_CHANGE_BEGIN
// JMA 051409 sanity check to see if we have the weapon before we remove it
has_weapon = self HasWeapon( "molotov" );
if( isDefined(has_weapon) && has_weapon )
{
self TakeWeapon( "molotov" );
}

if( isDefined(level.zombie_weapons) && isDefined(level.zombie_weapons["molotov_zombie"]) )
{
has_weapon = self HasWeapon( "molotov_zombie" );
if( isDefined(has_weapon) && has_weapon )
{
self TakeWeapon( "molotov_zombie" );
}
}
// PI_CHANGE_END

self maps\_zombiemode_cymbal_monkey::player_give_cymbal_monkey();
play_weapon_vo( weapon );
return;
}
if( (weapon == "molotov" || weapon == "molotov_zombie") )
{
self TakeWeapon( "zombie_cymbal_monkey" );
}

self play_sound_on_ent( "purchase" );
self GiveWeapon( weapon, 0 );
self GiveMaxAmmo( weapon );
self SwitchToWeapon( weapon );

play_weapon_vo(weapon);
}
play_weapon_vo(weapon)
{
index = get_player_index(self);
if(!IsDefined (level.zombie_weapons[weapon].sound))
{
return;
}

if( level.zombie_weapons[weapon].sound == "vox_monkey" )
{
plr = "plr_" + index + "_";
create_and_play_dialog( plr, "vox_monkey", .25, "resp_monk" );
return;
}
// iprintlnbold (index);
if( level.zombie_weapons[weapon].sound != "" )
{
weap = level.zombie_weapons[weapon].sound;
// iprintlnbold("Play_Weap_VO_" + weap);
switch(weap)
{
case "vox_crappy":
if (level.vox_crappy_available.size < 1 )
{
level.vox_crappy_available = level.vox_crappy;
}
sound_to_play = random(level.vox_crappy_available);
level.vox_crappy_available = array_remove(level.vox_crappy_available,sound_to_play);
break;

case "vox_mg":
if (level.vox_mg_available.size < 1 )
{
level.vox_mg_available = level.vox_mg;
}
sound_to_play = random(level.vox_mg_available);
level.vox_mg_available = array_remove(level.vox_mg_available,sound_to_play);
break;
case "vox_shotgun":
if (level.vox_shotgun_available.size < 1 )
{
level.vox_shotgun_available = level.vox_shotgun;
}
sound_to_play = random(level.vox_shotgun_available);
level.vox_shotgun_available = array_remove(level.vox_shotgun_available,sound_to_play);
break;
case "vox_357":
if (level.vox_357_available.size < 1 )
{
level.vox_357_available = level.vox_357;
}
sound_to_play = random(level.vox_357_available);
level.vox_357_available = array_remove(level.vox_357_available,sound_to_play);
break;
case "vox_bar":
if (level.vox_bar_available.size < 1 )
{
level.vox_bar_available = level.vox_bar;
}
sound_to_play = random(level.vox_bar_available);
level.vox_bar_available = array_remove(level.vox_bar_available,sound_to_play);
break;
case "vox_flame":
if (level.vox_flame_available.size < 1 )
{
level.vox_flame_available = level.vox_flame;
}
sound_to_play = random(level.vox_flame_available);
level.vox_flame_available = array_remove(level.vox_flame_available,sound_to_play);
break;
case "vox_raygun":
if (level.vox_raygun_available.size < 1 )
{
level.vox_raygun_available = level.vox_raygun;
}
sound_to_play = random(level.vox_raygun_available);
level.vox_raygun_available = array_remove(level.vox_raygun_available,sound_to_play);
break;
case "vox_tesla":
if (level.vox_tesla_available.size < 1 )
{
level.vox_tesla_available = level.vox_tesla;
}
sound_to_play = random(level.vox_tesla_available);
level.vox_tesla_available = array_remove(level.vox_tesla_available,sound_to_play);
break;
case "vox_sticky":
if (level.vox_sticky_available.size < 1 )
{
level.vox_sticky_available = level.vox_sticky;
}
sound_to_play = random(level.vox_sticky_available);
level.vox_sticky_available = array_remove(level.vox_sticky_available,sound_to_play);
break;
case "vox_ppsh":
if (level.vox_ppsh_available.size < 1 )
{
level.vox_ppsh_available = level.vox_ppsh;
}
sound_to_play = random(level.vox_ppsh_available);
level.vox_ppsh_available = array_remove(level.vox_ppsh_available,sound_to_play);
break;
case "vox_mp40":
if (level.vox_mp40_available.size < 1 )
{
level.vox_mp40_available = level.vox_mp40;
}
sound_to_play = random(level.vox_mp40_available);
level.vox_mp40_available = array_remove(level.vox_mp40_available,sound_to_play);
break;

default:
sound_var = randomintrange(0, level.zombie_weapons[weapon].variation_count);
sound_to_play = level.zombie_weapons[weapon].sound + "_" + sound_var;

}

plr = "plr_" + index + "_";
//self playsound ("plr_" + index + "_" + sound_to_play);
//iprintlnbold (sound_to_play);

//thread setup_response_line( self, index, "monk" );
self maps\_zombiemode_spawner::do_player_playdialog(plr, sound_to_play, 0.05);
}
}
do_player_weap_dialog(player_index, sound_to_play, waittime)
{
if(!IsDefined (level.player_is_speaking))
{
level.player_is_speaking = 0;
}
if(level.player_is_speaking != 1)
{
level.player_is_speaking = 1;
self playsound(player_index + sound_to_play, "sound_done" + sound_to_play);
self waittill("sound_done" + sound_to_play);
wait(waittime);
level.player_is_speaking = 0;
}

}
get_player_index(player)
{
assert( IsPlayer( player ) );
assert( IsDefined( player.entity_num ) );
/#
// used for testing to switch player's VO in-game from devgui
if( player.entity_num == 0 && GetDVar( "zombie_player_vo_overwrite" ) != "" )
{
new_vo_index = GetDVarInt( "zombie_player_vo_overwrite" );
return new_vo_index;
}
#/
return player.entity_num;
}

ammo_give( weapon, also_has_upgrade )
{
// We assume before calling this function we already checked to see if the player has this weapon...

if( !isDefined( also_has_upgrade ) )
{
also_has_upgrade = false;
}

// Should we give ammo to the player
give_ammo = false;

// Check to see if ammo belongs to a primary weapon
if( weapon != "fraggrenade" && weapon != "stielhandgranate" && weapon != "molotov" )
{
if( isdefined( weapon ) ) 
{
// get the max allowed ammo on the current weapon
stockMax = WeaponMaxAmmo( weapon );
if( also_has_upgrade )
{
stockMax += WeaponMaxAmmo( weapon+"_upgraded" );
}

// Get the current weapon clip count
clipCount = self GetWeaponAmmoClip( weapon );

currStock = self GetAmmoCount( weapon );

// compare it with the ammo player actually has, if more or equal just dont give the ammo, else do
if( ( currStock - clipcount ) >= stockMax )
{
give_ammo = false;
}
else
{
give_ammo = true; // give the ammo to the player
}
}
}
else
{
// Ammo belongs to secondary weapon
if( self has_weapon_or_upgrade( weapon ) )
{
// Check if the player has less than max stock, if no give ammo
if( self getammocount( weapon ) < WeaponMaxAmmo( weapon ) )
{
// give the ammo to the player
give_ammo = true;
}
}
}

if( give_ammo )
{
self playsound( "cha_ching" );
self GivemaxAmmo( weapon );
if( also_has_upgrade )
{
self GiveMaxAmmo( weapon+"_upgraded" );
}
return true;
}

if( !give_ammo )
{
return false;
}
}
add_weapon_to_sound_array(vo,num)
{
if(!isDefined(vo))
{
return;
}
player = getplayers();
for(i=0;i<player.size;i++)
{
index = maps\_zombiemode_weapons::get_player_index(player);
player_index = "plr_" + index + "_";
num = maps\_zombiemode_spawner::get_number_variants(player_index + vo);
}
// iprintlnbold(vo);

switch(vo)
{
case "vox_crappy":
if(!isDefined(level.vox_crappy))
{
level.vox_crappy = [];
for(i=0;i<num;i++)
{
level.vox_crappy[level.vox_crappy.size] = "vox_crappy_" + i;
}
}
level.vox_crappy_available = level.vox_crappy;
break;

case "vox_mg":
if(!isDefined(level.vox_mg))
{
level.vox_mg = [];
for(i=0;i<num;i++)
{
level.vox_mg[level.vox_mg.size] = "vox_mg_" + i;
}
}
level.vox_mg_available = level.vox_mg;
break;
case "vox_shotgun":
if(!isDefined(level.vox_shotgun))
{
level.vox_shotgun = [];
for(i=0;i<num;i++)
{
level.vox_shotgun[level.vox_shotgun.size] = "vox_shotgun_" + i;
}
}
level.vox_shotgun_available = level.vox_shotgun;
break;
case "vox_357":
if(!isDefined(level.vox_357))
{
level.vox_357 = [];
for(i=0;i<num;i++)
{
level.vox_357[level.vox_357.size] = "vox_357_" + i;
}
}
level.vox_357_available = level.vox_357;
break;
case "vox_bar":
if(!isDefined(level.vox_bar))
{
level.vox_bar = [];
for(i=0;i<num;i++)
{
level.vox_bar[level.vox_bar.size] = "vox_bar_" + i;
}
}
level.vox_bar_available = level.vox_bar;
break;
case "vox_flame":
if(!isDefined(level.vox_flame))
{
level.vox_flame = [];
for(i=0;i<num;i++)
{
level.vox_flame[level.vox_flame.size] = "vox_flame_" + i;
}
}
level.vox_flame_available = level.vox_flame;
break;

case "vox_raygun":
if(!isDefined(level.vox_raygun))
{
level.vox_raygun = [];
for(i=0;i<num;i++)
{
level.vox_raygun[level.vox_raygun.size] = "vox_raygun_" + i;
}
}
level.vox_raygun_available = level.vox_raygun;
break;
case "vox_tesla":
if(!isDefined(level.vox_tesla))
{
level.vox_tesla = [];
for(i=0;i<num;i++)
{
level.vox_tesla[level.vox_tesla.size] = "vox_tesla_" + i;
}
}
level.vox_tesla_available = level.vox_tesla;
break;
case "vox_sticky":
if(!isDefined(level.vox_sticky))
{
level.vox_sticky = [];
for(i=0;i<num;i++)
{
level.vox_sticky[level.vox_sticky.size] = "vox_sticky_" + i;
}
}
level.vox_sticky_available = level.vox_sticky;
break;
case "vox_ppsh":
if(!isDefined(level.vox_ppsh))
{
level.vox_ppsh = [];
for(i=0;i<num;i++)
{
level.vox_ppsh[level.vox_ppsh.size] = "vox_ppsh_" + i;
}
}
level.vox_ppsh_available = level.vox_ppsh;
break;
case "vox_mp40":
if(!isDefined(level.vox_mp40))
{
level.vox_mp40 = [];
for(i=0;i<num;i++)
{
level.vox_mp40[level.vox_mp40.size] = "vox_mp40_" + i;
}
}
level.vox_mp40_available = level.vox_mp40;
break;
case "vox_monkey":
if(!isDefined(level.vox_monkey))
{
level.vox_monkey = [];
for(i=0;i<num;i++)
{
level.vox_monkey[level.vox_monkey.size] = "vox_monkey_" + i;
}
}
level.vox_monkey_available = level.vox_monkey;
break;
}

}



[code][spoiler]
8 years ago
Is there a surface/texture that allows a brush to hinder fall damage in WaW?
8 years ago
Is it possible to do? I want to do it for a method to get out of a PaP room.
8 years ago
Putting this project on hold for the time being, due to figuring out new tools.
8 years ago
I'm working on a remake of the map "Christmas Special" from Nazi Zombies Portable into WaW!
This was a map that I enjoyed while playing NZP, so I decided to remake it!

Features
Spoiler: click to open...
HarryBo21's Origins HUD and Perks

Features to be added.
Custom Guns
Custom Sounds
Custom BO3 Chalk
Radio/Jukebox

Dev Vlog of the map so far
:(
We're sorry.
The embdedded media couldn't be retrieved.
View reason
The response was empty.
View media in new tab
8 years ago
I have a question, is there anyway to add more weapons and have them all show up in the 'give all' command. I tried to port a lot of weapons and when I type 'give all', not all of the weapons show up. Is there a way to get that cap removed?
8 years ago
+1, no need to lash out so fast dude. Lighten up a bit.

Thanks for these, at a standpoint I am really stuck between bo2 round chalk and bo3. I have bo2 right now but something different might be good. Gotta think about it

Glad you like them!
8 years ago
Hello, I need a little bit of help with something. I want to completely change the round font (Round 11 and up) to images of the numbers from BO3. I have them already chopped and converted into iwi's. Any way to do this or is it impossible to do?
8 years ago
Loading ...