Skip to content
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Donate
Collapse

Plutonium

AlexInVrundefined

AlexInVr

@AlexInVr
About
Posts
83
Topics
14
Shares
0
Groups
0
Followers
26
Following
13

Posts

Recent Best Controversial

  • [ZM][RELEASE] First Box Patch + Timer + Movement Speed Patch for Verruckt
    AlexInVrundefined AlexInVr

    Title says it all, This is a first box patch that will give you the flamethrower and the raygun up until round 20, It also has an integrated timer in it that's synchronized with the game without the need for external software, I can release a version with just the timer and the movement speed if someone would prefer that, just ask me.

    It also patches your backwards and strafe speed movement to console movement, it is 30% slower on pc by default.

    This can be changed using the console if you prefer otherwise

    player_backSpeedScale X (between 0 and 1 default is 0.7 on pc)

    player_strafeSpeedScale X (between 0 and 1 default is 0.7 on pc)

    anyways, add this script into your scripts folder and enjoy πŸ™‚

    #include maps\_utility;
    #include common_scripts\utility;
    #include maps\_zombiemode_utility;
    
    //First Box by twitch.tv/AlexInVR
    
    init()
    {
    	 replacefunc(maps\_zombiemode_weapons::treasure_chest_ChooseRandomWeapon, ::custom_treasure_chest_ChooseRandomWeapon);
    	 replacefunc(maps\_zombiemode_weapons::treasure_chest_weapon_spawn, ::custom_treasure_chest_weapon_spawn);
    	thread onConnect();
       
    }
    
    onConnect()
    {
    	for(;;)
    	{
    		level waittill( "connecting", player );
    		player thread OnPlayerSpawned();
    	}
    }
    
    
    game_timer()
    {	
    	hud = create_simple_hud( self );
    	hud.foreground = true; 
    	hud.sort = 1; 
    	hud.hidewheninmenu = true; 
    	hud.alignX = "left"; 
    	hud.alignY = "top";
    	hud.horzAlign = "user_left"; 
    	hud.vertAlign = "user_top";
    	hud.x = hud.x - -700; 
    	hud.y = hud.y + 35; 
    	hud.alpha = 1;
    	time_text = string(GetTime() / 1000);
    	flag_wait("all_players_spawned");
    	while (1){
    		hud setTimerUp(1);
    		hud setTimer(time_text);
    	}
    	
    }
    
    
    custom_treasure_chest_ChooseRandomWeapon( player )
    {
    	if (level.round_number <= 20){
    		if (!(player HasWeapon("m2_flamethrower_zombie"))){
    			return "m2_flamethrower_zombie";
    		}
    
    		if (!(player HasWeapon("ray_gun"))){
    			return "ray_gun";
    		}
    
    		
    	}
    
    	keys = GetArrayKeys( level.zombie_weapons );
    
    	// Filter out any weapons the player already has
    	filtered = [];
    	for( i = 0; i < keys.size; i++ )
    	{
    		if( player HasWeapon( keys[i] ) )
    		{
    			continue;
    		}
    
    		//chrisP - make sure the chest doesn't give the player a bouncing betty
    		if(keys[i] == "mine_bouncing_betty")
    		{
    			continue;
    		}
    
    		filtered[filtered.size] = keys[i];
    	}
    
    	// Filter out the limited weapons
    	if( IsDefined( level.limited_weapons ) )
    	{
    		keys2 = GetArrayKeys( level.limited_weapons );
    		players = get_players();
    		for( q = 0; q < keys2.size; q++ )
    		{
    			count = 0;
    			for( i = 0; i < players.size; i++ )
    			{
    				if( players[i] HasWeapon( keys2[q] ) )
    				{
    					count++;
    				}
    
    				// check for last stand weapons that might not be on the player at the time
    				if (players[i] maps\_laststand::player_is_in_laststand())
    				{
    					for( m = 0; m < players[i].weaponInventory.size; m++ )
    					{
    						if (players[i].weaponInventory[m] == keys2[q])
    						{
    							count++;
    						}
    					}
    				}
    			}
    
    			if( count == level.limited_weapons[keys2[q]] )
    			{
    				filtered = array_remove( filtered, keys2[q] );
    			}
    		}
    	}
    
    	return filtered[RandomInt( filtered.size )];
    }
    
    custom_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; 
    	for( i = 0; i < 40; 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 ); 
    		}
    
    		rand = custom_treasure_chest_ChooseRandomWeapon( player );
    		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
    	rand = Randomint(100);
    
    
    	//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 < 5)
    		{		
    			chance_of_joker = 0;
    		}
    		else
    		{
    			chance_of_joker = level.chest_accessed + 3;
    		}
    
    		if (rand <= chance_of_joker)
    		{
    			model SetModel("zombie_teddybear");
    		//	model rotateto(level.chests[level.chest_index].angles, 0.01);
    			//wait(1);
    			model.angles = level.chests[level.chest_index].angles;		
    			wait 1;
    			flag_set("moving_chest_now");
    			level.chest_accessed = 0;
    
    			player maps\_zombiemode_score::add_to_player_score( 950 );
    
    		}
    
    	}
    
    	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
    	{
    
    		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();
    	}
    }
    
    
    onPlayerSpawned()
    {
    	self endon( "disconnect" ); 
    
    	for( ;; )
    	{
    		level waittill( "connected", player ); 
                    self thread game_timer();
    		self SetClientDvars( 
    			"player_backSpeedScale", "1", 
    			"player_strafeSpeedScale", "1");
    
    		
    		wait 3;
    
    		self IPrintLnBold("First box by ^1twitch.tv/^2AlexInVR");
    	}
    
    }
    

    Here's what it looks like
    download (2).jpg

    WAW Modding Releases & Resources

  • [ZM][RELEASE] [PLUTO ONLY] First box patch for moon + timer + speed patch
    AlexInVrundefined AlexInVr

    πŸ›°οΈ Moon – First Box Patch (Plutonium only)

    This patch makes the first box hits on Moon always give you the right weapons for early setup.
    It also includes a few small tweaks that you would need as a zombies player.

    🧩 Features

    • Guaranteed Wave Gun, Gersh Device, and (in co-op) Ray Gun from the box up to round 20

    • QEDs added as a third box hit

    • Game timer

    • Round Timer

    • Movement fix – backspeed and strafe speed now match console behavior

    • Juggernog always spawns at No Man’s Land

    • Spawn Cancel fix (my custom implementation)

    • Excavator 11 will breach at round 15

    πŸ“¦ Installation Instructions:

    • Enable file extensions

    • Open any folder and go to:

    Windows 11: View β†’ Show β†’ File name extensions

    Windows 10: View β†’ File name extensions

    • This ensures the file is correctly saved as patch.gsc and not patch.gsc.txt

    • Create the script file

    • Open Notepad (or any text editor).

    • Copy and paste the script code provided below.

    • Save the file as: patch.gsc

    • Create the map folder

    • Press Windows + R

    • Navigate to: %localappdata%/Plutonium/storage/t5/raw/scripts/sp

    Inside the sp folder, create a new folder named: zombie_moon

    Place your patch.gsc file inside this folder.

    Restore the original common file

    Replace your common_zombie_patch.ff with the original game file before launching the map.

    You will get an error screen if you’re using a modified common file unless it was specifically made for moon.

    If you don’t have the original file, download and unzip it here:
    Download patch

    πŸ§ͺ Update Log

    v1.1 – 10/20/2025

    • Added QEDs as third box hit

    • Added Ray Gun (co-op only) as fourth hit

    • Added game timer

    • Juggernog now always spawns at NML

    v1.2 - 10/22/2025

    • Added Spawn cancel fix

    v1.3 - 10/22/2025

    • Set box to spawn at biodome as initial location

    • Perks alternate again after picking up jug for the first time in no man's land

    V1.4 - 10/27/2025

    • Implemented better solution for spawn cancelling fix.

    • Tunnel 11 will breach at round 15 all the time

    πŸ’¬ Notes

    Works only on Plutonium (uses replaceFunc)

    Tested and confirmed working 100%

    Report any gameplay issues if you find them

    #include maps\_utility; 
    #include common_scripts\utility;
    #include maps\_zombiemode_utility;
    
    
    main()
    {
            if ( GetDvar( #"zombiemode" ) == "1" )
            {
                     level thread onPlayerConnect();
                replacefunc(maps\_zombiemode_weapons::treasure_chest_ChooseWeightedRandomWeapon, ::custom_treasure_chest_ChooseWeightedRandomWeapon);
                replacefunc(maps\zombie_moon_wasteland::perk_machine_arrival_update, ::custom_perk_machine_arrival_update);
    			replacefunc(maps\_zombiemode::round_think, ::custom_round_think);
    			replacefunc(maps\_zombiemode_ai_faller::do_zombie_fall, ::custom_do_zombie_fall);
    			replacefunc(maps\_zombiemode_weapons::init_starting_chest_location, ::custom_init_starting_chest_location);
    			level.moon_visits = 0;
            }
    }
    
    
    any_player_has_weapon(weap)
    {	
    	players = get_players();
    	has_weap = false;
    	for(i = 0; players.size > i; i++)
    	{
    		if(players[i] maps\_zombiemode_weapons::has_weapon_or_upgrade(weap))
    			has_weap = true;
    	}
    	return has_weap;
    }
    
    
    game_timer()
    {
    	hud = create_simple_hud( self );
    	hud.foreground = true;
    	hud.sort = 1;
    	hud.hidewheninmenu = true;
    	hud.alignX = "left";
    	hud.alignY = "top";
    	hud.horzAlign = "user_left";
    	hud.vertAlign = "user_top";
    	hud.alpha = 1;
    	//=======================CUSTOM SECTION==============
    	hud.x = hud.x - -700; //This is for the position on X axis, decrease this number to move it further left, and increase it to go right.
    	hud.y = hud.y + 35; //This is for the position on Y axis, decrease this number to move it down, and increase it to go up.
    	hud.fontscale = 1.2; //This is for the font size, increase it by whatever you want and see what you like
    	hud.color =  (255, 255, 255); //This is for the color using RGB, use a website for that
    	//=========================================
    	flag_wait("all_players_spawned");
    	hud setTimerUp(1);
    }
    
    round_timer()
    {
    	timerHud = create_simple_hud( self );
    	timerHud.foreground = true;
    	timerHud.sort = 1;
    	timerHud.hidewheninmenu = true;
    	timerHud.alignX = "left";
    	timerHud.alignY = "top";
    	timerHud.horzAlign = "user_left";
    	timerHud.vertAlign = "user_top";
    	//=======================CUSTOM SECTION==============
    	timerHud.x = timerHud.x - -800; //This is for the position on X axis, decrease this number to move it further left, and increase it to go right.
    	timerHud.y = timerHud.y + 45; //This is for the position on Y axis, decrease this number to move it down, and increase it to go up.
    	timerHud.fontscale = 1.2; //This is for the font size, increase it by whatever you want and see what you like
    	timerHud.color =  (255, 0, 0); //This is for the color using RGB, use a website for that
    	//=========================================
    	timerHud.alpha = 1;
    	flag_wait("all_players_spawned");
    	for (;;){
    		start_time = GetTime() / 1000;
    		timerHud setTimerUp(0);
    		level waittill("end_of_round");
    		end_time = GetTime() / 1000;
    		time = end_time - start_time;
    		set_time_frozen(timerHud, time);
    	}
    }
    
    set_time_frozen(hud, time)
    {
    	level endon("start_of_round");
    	time = time - 0.1;
    	while(1)
    	{
    		hud settimer(time);
    		wait(0.5);
    	}
    }
    
    
    patch_moon()
    {	
    	//WaveGun
    	if(!self maps\_zombiemode_weapons::has_weapon_or_upgrade("microwavegundw_zm") && !any_player_has_weapon("microwavegundw_zm"))
    				return "microwavegundw_zm";
    
    	//Gersh
    	if(!self maps\_zombiemode_weapons::has_weapon_or_upgrade("zombie_black_hole_bomb"))
    				return "zombie_black_hole_bomb";
        
        if(!self maps\_zombiemode_weapons::has_weapon_or_upgrade("zombie_quantum_bomb"))
    				return "zombie_quantum_bomb";
    
        if (get_players().size > 1){
            //RayGun for coop
    	if(!self maps\_zombiemode_weapons::has_weapon_or_upgrade("ray_gun_zm"))
    				return "ray_gun_zm";
        }
    }
    
    
    custom_treasure_chest_ChooseWeightedRandomWeapon( player )
    {
    	//First Box by Crybaby / AlexInVr
    
    	if(level.round_number < 20)
    	{
    		//Moon
    		if (level.script == "zombie_moon")
    			return player patch_moon();
    	}
    
    
    
    	keys = GetArrayKeys( level.zombie_weapons );
    
    	toggle_weapons_in_use = 0;
    	// Filter out any weapons the player already has
    	filtered = [];
    	for( i = 0; i < keys.size; i++ )
    	{
    		if( !maps\_zombiemode_weapons::get_is_in_box( keys[i] ) )
    		{
    			continue;
    		}
    		
    		if( isdefined( player ) && is_player_valid(player) && player maps\_zombiemode_weapons::has_weapon_or_upgrade( keys[i] ) )
    		{
    			if ( maps\_zombiemode_weapons::is_weapon_toggle( keys[i] ) )
    			{
    				toggle_weapons_in_use++;
    			}
    			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] maps\_zombiemode_weapons::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++;
    				}
    			}
    
    			// Check the other boxes so we don't offer something currently being offered during a fire sale
    			for ( chestIndex = 0; chestIndex < level.chests.size; chestIndex++ )
    			{
    				if ( IsDefined( level.chests[chestIndex].chest_origin.weapon_string ) && level.chests[chestIndex].chest_origin.weapon_string == keys2[q] )
    				{
    					count++;
    				}
    			}
    			
    			if ( isdefined( level.random_weapon_powerups ) )
    			{
    				for ( powerupIndex = 0; powerupIndex < level.random_weapon_powerups.size; powerupIndex++ )
    				{
    					if ( IsDefined( level.random_weapon_powerups[powerupIndex] ) && level.random_weapon_powerups[powerupIndex].base_weapon == keys2[q] )
    					{
    						count++;
    					}
    				}
    			}
    
    			if ( maps\_zombiemode_weapons::is_weapon_toggle( keys2[q] ) )
    			{
    				toggle_weapons_in_use += count;
    			}
    
    			if( count >= level.limited_weapons[keys2[q]] )
    			{
    				filtered = array_remove( filtered, keys2[q] );
    			}
    		}
    	}
    	
    	// finally, filter based on toggle mechanic
    	if ( IsDefined( level.zombie_weapon_toggles ) )
    	{
    		keys2 = GetArrayKeys( level.zombie_weapon_toggles );
    		for( q = 0; q < keys2.size; q++ )
    		{
    			if ( level.zombie_weapon_toggles[keys2[q]].active )
    			{
    				if ( toggle_weapons_in_use < level.zombie_weapon_toggle_max_active_count )
    				{
    					continue;
    				}
    			}
    
    			filtered = array_remove( filtered, keys2[q] );
    		}
    	}
    
    	// try to "force" a little more "real randomness" by randomizing the array before randomly picking a slot in it
    	filtered = array_randomize( filtered );
    	return filtered[RandomInt( filtered.size )];
    }
    
    custom_perk_machine_arrival_update()
    {
    	top_height = 1200;		// 700
    	fall_time = 4;
    	num_model_swaps = 20;
    
    	perk_index = randomintrange( 0, 2 );
    
    	// Flash an effect to the perk machines destination
    	ent = level.speed_cola_ents[0];
    	level thread maps\zombie_moon_wasteland::perk_arrive_fx( ent.origin );
    
    	//while( 1 )
    	{
    		// Move the perk machines high in the sky
    		maps\zombie_moon_wasteland::move_perk( top_height, 0.01, 0.001 );
    		wait( 0.3 );
    		maps\zombie_moon_wasteland::perk_machines_hide( 0, 0, true );
    		wait( 1 );
    
    		// Start the machines falling
    		maps\zombie_moon_wasteland::move_perk( top_height*-1, fall_time, 1.5 );
    
    		// Swap visible Perk as we fall
    		wait_step = fall_time / num_model_swaps;
    		for( i=0; i<num_model_swaps; i++ )
    		{
    			maps\zombie_moon_wasteland::perk_machine_show_selected( perk_index, true );
    			wait( wait_step );
    			
    			perk_index++;
    			if( perk_index > 1 )
    			{
    				perk_index = 0;
    			}
    		}
    
    		// Make sure we don't get a perk machine duplicate next time we visit
    		while( perk_index == level.last_perk_index )
    		{
    			perk_index = randomintrange( 0, 2 );
    		}
    		
    		level.last_perk_index = perk_index;
    
    		custom_perk_index = 1; //Default to Jug (0: Cola, 1: Jug)
    		
    
    		if (isDefined(level.ever_been_on_the_moon) && level.ever_been_on_the_moon)
    		{
    			// If we've been on the moon, we already took jug (You should have.... not my problem otherwise)
    			// Switch the perk to SpeedCola (Index 0)
    			level.moon_visits++;
    			if (level.moon_visits >= 2)
    			{
    				custom_perk_index = perk_index;
    			} 
    			else 
    			{
    				custom_perk_index = 0;
    			}
    		}
    
    		maps\zombie_moon_wasteland::perk_machine_show_selected( custom_perk_index, false );
    	}
    }
    
    custom_round_think()
    {
    	for( ;; )
    	{
    		//////////////////////////////////////////
    		//designed by prod DT#36173
    		maxreward = 50 * level.round_number;
    		if ( maxreward > 500 )
    			maxreward = 500;
    		level.zombie_vars["rebuild_barrier_cap_per_round"] = maxreward;
    		//////////////////////////////////////////
    
    		level.pro_tips_start_time = GetTime();
    		level.zombie_last_run_time = GetTime();	// Resets the last time a zombie ran
    
            level thread maps\_zombiemode_audio::change_zombie_music( "round_start" );
    		maps\_zombiemode::chalk_one_up();
    	
    		maps\_zombiemode_powerups::powerup_round_start();
    
    		players = get_players();
    		array_thread( players, maps\_zombiemode_blockers::rebuild_barrier_reward_reset );
    		
    		level thread maps\_zombiemode::award_grenades_for_survivors();
    
    		bbPrint( "zombie_rounds: round %d player_count %d", level.round_number, players.size );
    
    		level.round_start_time = GetTime();
    		level thread [[level.round_spawn_func]]();
    
    		level notify( "start_of_round" );
    
    		[[level.round_wait_func]]();
    
    		level.first_round = false;
    		level notify( "end_of_round" );
    
    		level thread maps\_zombiemode_audio::change_zombie_music( "round_end" );
    
    		UploadStats();
    
    		if ( 1 != players.size )
    		{
    			level thread maps\_zombiemode::spectators_respawn();
    		}
    
    		level maps\_zombiemode::chalk_round_over();
    
    		// here's the difficulty increase over time area
    		timer = level.zombie_vars["zombie_spawn_delay"];
    		if ( timer > 0.08 )
    		{
    			level.zombie_vars["zombie_spawn_delay"] = timer * 0.95;
    		}
    		else if ( timer < 0.08 )
    		{
    			level.zombie_vars["zombie_spawn_delay"] = 0.08;
    		}
    
    		// Increase the zombie move speed
    		level.zombie_move_speed = level.round_number * level.zombie_vars["zombie_move_speed_multiplier"];
    
    		level.round_number++;
    
    		level notify( "between_round_over" );
    	}
    }
    
    custom_do_zombie_fall()
    {
    	self endon("death");
    
    	self thread maps\_zombiemode_ai_faller::setup_deathfunc();
    
    	// don't drop powerups until we are on the ground
    	self.no_powerups = true;
    	self.in_the_ceiling = true;
    
    	self.anchor = spawn("script_origin", self.origin);
    	self.anchor.angles = self.angles;
    	self linkto(self.anchor);
    
    
    	if ( !IsDefined( self.zone_name ) )
    	{
    		self.zone_name = self get_current_zone();
    	}
    
    	spots = maps\_zombiemode_ai_faller::get_available_fall_locations();
    
    	if( spots.size < 1 )
    	{
    		self unlink();
    		self.anchor delete();
    		//IPrintLnBold("deleting zombie faller - no available fall locations");
    		//can't delete if we're in the middle of spawning, so wait a frame
    		self Hide();//hide so we're not visible for one frame while waiting to delete
    		self delayThread( 0.1, maps\_zombiemode_ai_faller::zombie_faller_delete );
    		return;
    	}
    	else if ( GetDvarInt(#"zombie_fall_test") )
    	{
    		// use the spot closest to the first player always
    		player = GetPlayers()[0];
    		spot = undefined; 
    		bestDist = 0.0;
    		for ( i = 0; i < spots.size; i++ )
    		{
    			checkDist = DistanceSquared(spots[i].origin, player.origin);
    			if ( !IsDefined(spot) || checkDist < bestDist )
    			{
    				spot = spots[i];
    				bestDist = checkDist;
    			}
    		}
    	}
    	else
    	{
    		spot = random(spots);
    	}
    	self.zombie_faller_location = spot;
    	//NOTE: multiple zombie fallers could be waiting in the same spot now, need to have spawners detect this 
    	//		and not use the spot again until the previous zombie has died or dropped down
    	self.zombie_faller_location.is_enabled = false;
    	self thread maps\_zombiemode_ai_faller::zombie_faller_death_wait();
    	self.zombie_faller_location maps\_zombiemode_ai_faller::parse_script_parameters();
    
    	// Start a monitor that will ensure the spot gets re-enabled if this zombie dies early or gets stuck.
    	// This is defensive: it will re-enable on death or after a timeout.
    	self thread zombie_faller_spot_monitor(self, spot);
    
    	if( !isDefined( spot.angles ) )
    	{
    		spot.angles = (0, 0, 0);
    	}
    
    	//Patch begin
    	anim_org = spot.origin;
    	anim_ang = spot.angles;
    	
    
    	self Hide();
    	self.anchor moveto(anim_org, .05);
    	self.anchor waittill("movedone");
    
    	// face goal
    	target_org = maps\_zombiemode_spawner::get_desired_origin();
    	if (IsDefined(target_org))
    	{
    		anim_ang = VectorToAngles(target_org - self.origin);
    		current_pos = self.anchor.origin;
    		
    		// Instantly rotate the anchor instead of waiting for RotateTo
    		self.anchor ForceTeleport(current_pos, (0, anim_ang[1], 0), false, false);
    	}
    
    	self unlink();
    	self.anchor delete();
    
    	self thread maps\_zombiemode_ai_faller::hide_pop();	// hack to hide the pop when the zombie gets to the start position before the anim starts
    
    	level thread maps\_zombiemode_ai_faller::zombie_fall_death(self, spot);
    	spot thread maps\_zombiemode_ai_faller::zombie_fall_fx(self);
    
    	self thread maps\_zombiemode_ai_faller::zombie_faller_death_wait();
    
    	//need to thread off the rest because we're apparently still in the middle of our init!
    	self thread maps\_zombiemode_ai_faller::zombie_faller_do_fall();
    }
    
    zombie_faller_spot_monitor(zombie, spot)
    {
        // sanity
        if ( !IsDefined(spot) )
            return;
    
        // If the zombie dies cleanly, we re-enable the spot immediately.
        zombie waittill("death");
    
        // At this point the zombie is dead (or the entity has been freed).
        if ( IsDefined(spot) )
        {
            spot.is_enabled = true;
        }
    
        // Safety: also ensure we don't leave the spot disabled in pathological cases.
        wait(0.25);
        if ( IsDefined(spot) )
            spot.is_enabled = true;
    }
    
    custom_init_starting_chest_location()
    {
    	level.chest_index = 0;
    	start_chest_found = false;
    	for( i = 0; i < level.chests.size; i++ )
    	{
    		if(level.script == "zombie_theater")
    		{
    			if(IsSubStr(level.chests[i].script_noteworthy,  "crematorium_chest" ))
    			{
    				level.chest_index = i;
    				level.chests[level.chest_index] maps\_zombiemode_weapons::hide_rubble();
    				level.chests[level.chest_index].hidden = false;
    			}
    			else
    			{
    			level.chests[i] maps\_zombiemode_weapons::hide_chest();
    			}
    		}
    
    		else if(level.script == "zombie_pentagon")
    		{
    			if(level.chests[i].script_noteworthy == "start_chest")
    			//if(IsSubStr(level.chests[i].script_noteworthy,  "start_chest" ))
    			{
    				level.chest_index = i;
    				level.chests[level.chest_index] maps\_zombiemode_weapons::hide_rubble();
    				level.chests[level.chest_index].hidden = false;
    			}
    			else
    			{
    				level.chests[i] maps\_zombiemode_weapons::hide_chest();
    			}
    		}
    
    		else if(level.script == "zombie_coast")
            {
            if(IsSubStr(level.chests[i].script_noteworthy, "start_chest" )) //residence_chest = flopper
                {
                    level.chest_index = i;
                    level.chests[level.chest_index] maps\_zombiemode_weapons::hide_rubble();
                    level.chests[level.chest_index].hidden = false;
                }
                else
                {
                    level.chests[i] maps\_zombiemode_weapons::hide_chest();
                }
            }
    
            else if(level.script == "zombie_temple")
            {
                if(IsSubStr(level.chests[i].script_noteworthy, "bridge_chest" ))
                {
                    level.chest_index = i;
                    level.chests[level.chest_index] maps\_zombiemode_weapons::hide_rubble();
                    level.chests[level.chest_index].hidden = false;
                }
                else
                {
                    level.chests[i] maps\_zombiemode_weapons::hide_chest();
                }
            }
    
    		else if(level.script == "zombie_moon")
            {
                if(IsSubStr(level.chests[i].script_noteworthy, "forest_chest" ))
                {
                    level.chest_index = i;
                    level.chests[level.chest_index] maps\_zombiemode_weapons::hide_rubble();
                    level.chests[level.chest_index].hidden = false;
                }
                else
                {
                    level.chests[i] maps\_zombiemode_weapons::hide_chest();
                }
            }
    
    		else if( isdefined( level.random_pandora_box_start ) && level.random_pandora_box_start == true )
    		{
    			if ( start_chest_found || (IsDefined( level.chests[i].start_exclude ) && level.chests[i].start_exclude == 1) )
    			{
    				level.chests[i] maps\_zombiemode_weapons::hide_chest();
    			}
    			else
    			{
    				level.chest_index = i;
    				level.chests[level.chest_index] maps\_zombiemode_weapons::hide_rubble();
    				level.chests[level.chest_index].hidden = false;
    				start_chest_found = true;
    			}
    
    		}
    		else
    		{
    			// Semi-random implementation (not completely random).  The list is randomized
    			//	prior to getting here.
    			// Pick from any box marked as the "start_chest"
    			if ( start_chest_found || !IsDefined(level.chests[i].script_noteworthy ) || ( !IsSubStr( level.chests[i].script_noteworthy, "start_chest" ) ) )
    			{
    				level.chests[i] maps\_zombiemode_weapons::hide_chest();
    			}
    			else
    			{
    				level.chest_index = i;
    				level.chests[level.chest_index] maps\_zombiemode_weapons::hide_rubble();
    				level.chests[level.chest_index].hidden = false;
    				start_chest_found = true;
    			}
    		}
    	}
    
    	// Show the beacon
    	if( !isDefined( level.pandora_show_func ) )
    	{
    		level.pandora_show_func = maps\_zombiemode_weapons::default_pandora_show_func;
    	}
    
    	level.chests[level.chest_index] thread [[ level.pandora_show_func ]]();
    }
    
    activate_tunnel_11()
    {
        level endon("game_ended");
    
        for (;;)
        {
            wait 1;
    
            // Wait until round 15+
            if (level.round_number < 15)
                continue;
    
            // Only run once
            if (level flag_exists("start_hangar_digger") && !flag("start_hangar_digger"))
            {
                maps\zombie_moon_digger::digger_activate("hangar");
            }
    
            break;
        }
    }
    
    
    
    onPlayerConnect()
    {
    	for(;;)
    	{
    		level waittill ("connecting", player);
    
    		player thread onPlayerSpawned();
    	}
    }
    
    onPlayerSpawned()
    {
    	for(;;)
    	{
    		self waittill("spawned_player");
    		self thread game_timer();
    		self thread round_timer();
                    level thread activate_tunnel_11();
    
    
    		self SetClientDvars( 
    			"player_backSpeedScale", "1", 
    			"player_strafeSpeedScale", "1",
    			"cg_fov", "100");
    		
    		wait 3;
    
    		self IPrintLn("First box by ^1twitch.tv/^2AlexInZombies");
    	}
    }
    
    
    BO1 Modding Releases & Resources

  • [ZM] [RELEASE] First Box patch + timer + movement speed patch NACHT DER UNTOTEN
    AlexInVrundefined AlexInVr

    3 out of 4 maps completed, I will release a patch soon for Der Riese

    Timer, basckpeed and strafe speed

    first box up until 20, (flamethrower and raygun)

    Installation:

    • Create a folder named nazi_zombie_prototype in
    %localappdata%/Plutonium/Storage/t4/raw/scripts/sp
    
    • Drop the script inside

    • enjoy

    #include maps\_utility;
    #include common_scripts\utility;
    #include maps\_zombiemode_utility;
    
    //First Box by twitch.tv/AlexInVR
    
    init()
    {
    	 replacefunc(maps\_zombiemode_weapons::treasure_chest_ChooseRandomWeapon, ::custom_treasure_chest_ChooseRandomWeapon);
    	 replacefunc(maps\_zombiemode_weapons::treasure_chest_weapon_spawn, ::custom_treasure_chest_weapon_spawn);
    	thread onConnect();
       
    }
    
    onConnect()
    {
    	for(;;)
    	{
    		level waittill( "connecting", player );
    		player thread OnPlayerSpawned();
    	}
    }
    
    
    game_timer()
    {	
    	hud = create_simple_hud( self );
    	hud.foreground = true; 
    	hud.sort = 1; 
    	hud.hidewheninmenu = true; 
    	hud.alignX = "left"; 
    	hud.alignY = "top";
    	hud.horzAlign = "user_left"; 
    	hud.vertAlign = "user_top";
    	hud.x = hud.x - -700; 
    	hud.y = hud.y + 35; 
    	hud.alpha = 1;
    	time_text = string(GetTime() / 1000);
    	flag_wait("all_players_spawned");
    	while (1){
    		hud setTimerUp(1);
    		hud setTimer(time_text);
    	}
    	
    }
    
    
    custom_treasure_chest_ChooseRandomWeapon( player )
    {
    	if (level.round_number <= 20){
    		if (!(player HasWeapon("m2_flamethrower_zombie"))){
    			return "m2_flamethrower_zombie";
    		}
    
    		if (!(player HasWeapon("ray_gun"))){
    			return "ray_gun";
    		}
    
    		
    	}
    
    	keys = GetArrayKeys( level.zombie_weapons );
    
    	// Filter out any weapons the player already has
    	filtered = [];
    	for( i = 0; i < keys.size; i++ )
    	{
    		if( player HasWeapon( keys[i] ) )
    		{
    			continue;
    		}
    
    		//chrisP - make sure the chest doesn't give the player a bouncing betty
    		if(keys[i] == "mine_bouncing_betty")
    		{
    			continue;
    		}
    
    		filtered[filtered.size] = keys[i];
    	}
    
    	// Filter out the limited weapons
    	if( IsDefined( level.limited_weapons ) )
    	{
    		keys2 = GetArrayKeys( level.limited_weapons );
    		players = get_players();
    		for( q = 0; q < keys2.size; q++ )
    		{
    			count = 0;
    			for( i = 0; i < players.size; i++ )
    			{
    				if( players[i] HasWeapon( keys2[q] ) )
    				{
    					count++;
    				}
    
    				// check for last stand weapons that might not be on the player at the time
    				if (players[i] maps\_laststand::player_is_in_laststand())
    				{
    					for( m = 0; m < players[i].weaponInventory.size; m++ )
    					{
    						if (players[i].weaponInventory[m] == keys2[q])
    						{
    							count++;
    						}
    					}
    				}
    			}
    
    			if( count == level.limited_weapons[keys2[q]] )
    			{
    				filtered = array_remove( filtered, keys2[q] );
    			}
    		}
    	}
    
    	return filtered[RandomInt( filtered.size )];
    }
    
    custom_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; 
    	for( i = 0; i < 40; 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 ); 
    		}
    
    		rand = custom_treasure_chest_ChooseRandomWeapon( player );
    		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
    	rand = Randomint(100);
    
    
    	//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 < 5)
    		{		
    			chance_of_joker = 0;
    		}
    		else
    		{
    			chance_of_joker = level.chest_accessed + 3;
    		}
    
    		if (rand <= chance_of_joker)
    		{
    			model SetModel("zombie_teddybear");
    		//	model rotateto(level.chests[level.chest_index].angles, 0.01);
    			//wait(1);
    			model.angles = level.chests[level.chest_index].angles;		
    			wait 1;
    			flag_set("moving_chest_now");
    			level.chest_accessed = 0;
    
    			player maps\_zombiemode_score::add_to_player_score( 950 );
    
    		}
    
    	}
    
    	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
    	{
    
    		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();
    	}
    }
    
    
    onPlayerSpawned()
    {
    	self endon( "disconnect" ); 
    
    	for( ;; )
    	{
    		
    		level waittill( "connected", player ); 
    		self thread game_timer();
    		self SetClientDvars( 
    			"player_backSpeedScale", "1", 
    			"player_strafeSpeedScale", "1");
    
    		
    		wait 3;
    
    		self IPrintLnBold("First box by ^1twitch.tv/^2AlexInVR");
    	}
    	level waittill( "connected", player ); 
    	
    }
    
    
    WAW Modding Releases & Resources

  • [RESOURCE] Boilerplate GSC code for your first script
    AlexInVrundefined AlexInVr

    I was going around the forums and stuff, and realized there isn't too much resources for newbies to learn GSC, and one fantastic thing in the world of programming are boilerplates, which save you alot of time,

    so thought I would share a boilerplate for anyone who wants to start a script

    #include maps\_utility;
    #include common_scripts\utility;
    #include maps\_zombiemode_utility;
    
    init()
    {
    	 thread onPlayerConnect();
    }
    
    onPlayerConnect()
    {
    	for(;;)
    	{
    		level waittill( "connecting", player );
    		player thread onPlayerSpawned();
    	}
    }
    
    onPlayerSpawned()
    {
    	self endon( "disconnect" ); 
    
    	for( ;; )
    	{
    		level waittill( "connected", player );
    	}
    	
    	
    }
    
    
    
    
    BO1 Modding Releases & Resources

  • [ZM][RELEASE] Shi no numa first box + timer + movement speed patch
    AlexInVrundefined AlexInVr

    Again, another First box patch by your fav waw modder πŸ˜„

    This release adds a timer synchronized with the game without the need for external software

    it also fixes the movement speed to be the same as console

    #include maps\_utility;
    #include common_scripts\utility;
    #include maps\_zombiemode_utility;
    
    //First Box by twitch.tv/AlexInVR
    
    init()
    {
    	 replacefunc(maps\_zombiemode_weapons::treasure_chest_ChooseRandomWeapon, ::custom_treasure_chest_ChooseRandomWeapon);
    	 replacefunc(maps\_zombiemode_weapons::treasure_chest_weapon_spawn, ::custom_treasure_chest_weapon_spawn);
    	 replacefunc(maps\_zombiemode_weapons_sumpf::treasure_chest_ChooseRandomWeapon, ::custom_treasure_chest_ChooseRandomWeapon);
    	 replacefunc(maps\_zombiemode_weapons_sumpf::treasure_chest_weapon_spawn, ::custom_treasure_chest_weapon_spawn);
    	replacefunc(maps\_zombiemode::round_think, ::custom_round_think);
    	thread onConnect();
       
    }
    
    onConnect()
    {
    	for(;;)
    	{
    		level waittill( "connecting", player );
    		player thread onPlayerSpawned();
    	}
    }
    
    
    custom_round_think()
    {
    	for( ;; )
    	{
    		level.round_spawn_func = maps\_zombiemode::round_spawning;
    		//////////////////////////////////////////
    		//designed by prod DT#36173
    		maxreward = 50 * level.round_number;
    		if ( maxreward > 500 )
    			maxreward = 500;
    		level.zombie_vars["rebuild_barrier_cap_per_round"] = maxreward;
    		//////////////////////////////////////////
    
    		level.round_timer = level.zombie_vars["zombie_round_time"]; 
    		
    		add_later_round_spawners();
    
    		maps\_zombiemode::chalk_one_up();
    		//		round_text( &"ZOMBIE_ROUND_BEGIN" );
    
    		maps\_zombiemode_powerups::powerup_round_start();
    
    		players = get_players();
    		array_thread( players, maps\_zombiemode_blockers::rebuild_barrier_reward_reset );
    
    		level thread maps\_zombiemode::award_grenades_for_survivors();
    
    		level.round_start_time = getTime();
    		level thread [[level.round_spawn_func]]();
    		level notify("start_of_round");
    
    		maps\_zombiemode::round_wait(); 
    		level.first_round = false;
    		level notify("end_of_round");
    
    		level thread maps\_zombiemode::spectators_respawn();
    
    		//		round_text( &"ZOMBIE_ROUND_END" );
    		level thread maps\_zombiemode::chalk_round_hint();
    
    		wait( level.zombie_vars["zombie_between_round_time"] ); 
    
    		// here's the difficulty increase over time area
    		timer = level.zombie_vars["zombie_spawn_delay"];
    
    		if( timer < 0.08 )
    		{
    			timer = 0.08; 
    		}	
    
    		level.zombie_vars["zombie_spawn_delay"] = timer * 0.95;
    
    		// Increase the zombie move speed
    		level.zombie_move_speed = level.round_number * 8;
    
    		level.round_number++;
    
    		level notify( "between_round_over" );
    	}
    }
    
    custom_treasure_chest_ChooseRandomWeapon(player)
    {
        	if (level.round_number <= 15){
    			if (!(player HasWeapon("tesla_gun"))){
    				return "tesla_gun";
    			}
    
    			if (!(player HasWeapon("zombie_ppsh"))){
    				return "zombie_ppsh";
    			}
    		} else {
    			keys = GetArrayKeys( level.zombie_weapons );
    
    	// Filter out any weapons the player already has
    	filtered = [];
    	for( i = 0; i < keys.size; i++ )
    	{
    		if( player HasWeapon( keys[i] ) )
    		{
    			continue;
    		}
    				
    		//chrisP - make sure the chest doesn't give the player a bouncing betty
    		if(keys[i] == "mine_bouncing_betty")
    		{
    			continue;
    		}
    
    		// PI_CHANGE_BEGIN
    		if( isDefined(level.script) && level.script == "nazi_zombie_sumpf")
    		{
    			//make sure box moves once before allowing ray gun to be accessed.
    			if( level.box_moved == false )
    			{
    				if( keys[i] == "ray_gun" )
    				{
    					continue;
    				}
    			}
    		}
    		// PI_CHANGE_END
    		
    		if( !IsDefined( keys[i] ) )
    			continue;
    
    		filtered[filtered.size] = keys[i];
    	}
    	
    	// PI_CHANGE_BEGIN - adjusting the percentages of the ray gun and tesla gun showing up 
    	if( isDefined(level.script) && level.script == "nazi_zombie_sumpf" )
    	{	
    		if( level.box_moved == true )
    		{	
    			if( !(player HasWeapon( "ray_gun" )) )
    			{
    				// 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 )
    					{
    						// calculate the number of times we have to add it to the array to get the desired percent
    						number_to_add = .15 * filtered.size;
    						for(i=1; i<number_to_add; i++)
    						{
    							filtered[filtered.size] = "ray_gun";
    						}				
    					}			
    					// after 8 pulls the Ray Gun percentage increases to 10%
    					else if( level.pulls_since_last_ray_gun > 7 )
    					{
    						// calculate the number of times we have to add it to the array to get the desired percent
    						number_to_add = .1 * filtered.size;
    						for(i=1; i<number_to_add; i++)
    						{
    							filtered[filtered.size] = "ray_gun";
    						}				
    					}				
    				}
    			}
    		}
    			
    		// increase the percentage of tesla gun
    		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 )
    			{						
    				// calculate the number of times we have to add it to the array to get the desired percent
    				number_to_add = .2 * filtered.size;
    				for(i=1; i<number_to_add; i++)
    				{
    					filtered[filtered.size] = "tesla_gun";
    				}				
    			}
    			
    			// 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 )
    				{
    					// calculate the number of times we have to add it to the array to get the desired percent
    					number_to_add = .2 * filtered.size;
    					for(i=1; i<number_to_add; i++)
    					{
    						filtered[filtered.size] = "tesla_gun";
    					}				
    				}		
    				// 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
    					number_to_add = .15 * filtered.size;
    					for(i=1; i<number_to_add; i++)
    					{
    						filtered[filtered.size] = "tesla_gun";
    					}				
    				}						
    			}
    		}
    	}
    	// PI_CHANGE_END	
    
    	// Filter out the limited weapons
    	if( IsDefined( level.limited_weapons ) )
    	{
    		keys2 = GetArrayKeys( level.limited_weapons );
    		players = get_players();
    		for( q = 0; q < keys2.size; q++ )
    		{
    			count = 0;
    			for( i = 0; i < players.size; i++ )
    			{
    				if( players[i] HasWeapon( keys2[q] ) )
    				{
    					count++;
    				}
    
    				// check for last stand weapons that might not be on the player at the time
    				if (players[i] maps\_laststand::player_is_in_laststand())
    				{
    					for( m = 0; m < players[i].weaponInventory.size; m++ )
    					{
    						if (players[i].weaponInventory[m] == keys2[q])
    						{
    							count++;
    						}
    					}
    				}
    			}
    
    			if( count == level.limited_weapons[keys2[q]] )
    			{
    				filtered = array_remove( filtered, keys2[q] );
    			}
    		}
    	}
    
    	return filtered[RandomInt( filtered.size )];
    		}
    }
    
    custom_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; 
    	for( i = 0; i < 40; 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 ); 
    		}
    
    		rand = custom_treasure_chest_ChooseRandomWeapon( 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);
    
    
    	//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 < 4)
    		{		
    			// 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;
    			
    			// PI_CHANGE_BEGIN - JMA 
    			if( isDefined(level.script) && level.script == "nazi_zombie_sumpf" )
    			{
    				// make sure teddy bear appears on the 8th pull if it hasn't moved from the attic
    				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;
    						}
    					}
    				}
    			}					
    			// PI_CHANGE_END
    		}
    
    		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");
    			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.script ) && level.script == "nazi_zombie_sumpf" )
    			{
    				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();
    	}
    }
    
    game_timer()
    {	
    	hud = create_simple_hud( self );
    	hud.foreground = true; 
    	hud.sort = 1; 
    	hud.hidewheninmenu = true; 
    	hud.alignX = "left"; 
    	hud.alignY = "top";
    	hud.horzAlign = "user_left"; 
    	hud.vertAlign = "user_top";
    	hud.x = hud.x - -700; 
    	hud.y = hud.y + 35; 
    	hud.alpha = 1;
    	flag_wait("all_players_spawned");
    	hud setTimerUp(1);
    }
    
    round_timer()
    {	
    	timerHud = create_simple_hud( self );
    	timerHud.foreground = true; 
    	timerHud.sort = 1; 
    	timerHud.hidewheninmenu = true; 
    	timerHud.alignX = "left"; 
    	timerHud.alignY = "top";
    	timerHud.horzAlign = "user_left"; 
    	timerHud.vertAlign = "user_top";
    	timerHud.x = timerHud.x - -700; 
    	timerHud.y = timerHud.y + 45;
    	timerHud.color =  (1, 0, 0);
    	timerHud.alpha = 1;
    	flag_wait("all_players_spawned");
    	for (;;){
    		start_time = GetTime() / 1000;
    		timerHud setTimerUp(0);
    		level waittill("end_of_round");
    		end_time = GetTime() / 1000;
    		time = end_time - start_time;
    		set_time_frozen(timerHud, time); 
    	}
    	
    }
    
    set_time_frozen(hud, time)
    {
    	level endon("start_of_round");
    	time = time - 0.1;
    	while(1)
    	{
    		hud settimer(time);
    		wait(0.5);
    	}
    }
    
    onPlayerSpawned()
    {
    	self endon( "disconnect" ); 
    
    	for( ;; )
    	{
    		
    		level waittill( "connected", player ); 
    		self thread game_timer();
    		self thread round_timer();
    		self SetClientDvars( 
    			"player_backSpeedScale", "1", 
    			"player_strafeSpeedScale", "1");
    		
    		wait 3;
    
    		self IPrintLnBold("First box patch by ^1twitch.tv/^2AlexInVR");
    	}
    	level waittill( "connected", player ); 
    	
    }  
    

    pic of what it looks like upon spawning in the game.

    download (9).jpg
    download (3).jpg

    download (4).jpg

    download (5).jpg

    WAW Modding Releases & Resources

  • [ZM][RELEASE] First box patch + timer + movement speed for ALL maps except moon
    AlexInVrundefined AlexInVr

    This is my personal first box patch for all maps except Moon since this one is not working using this method of common_zombie_patch.ff

    if you are interested in Moon first box see this

    Features:

    • Synchronized Timer

    • Round timer

    • SPH Counter (Ported from bo2, Credits to Mowen for original code)

    • Starting box location changed on maps that require it

    • Movement Speed patch

    • First box also accounting for coop games

    • First box working up until round 20

    • Perks patch with monkeys on Ascension, and shang

      • order is: Jugg, speed cola, stamin up, (assuming you get all the other perks from the machines, otherwise missing perks will be given to you via the monkeys)

    Installation Instructions:

    • Download

    • take the common_zombie_patch.ff

    • move it to %localappdata%/Plutonium/storage/t5/zone or yourGameFolder/zone/common if you are using steam or Bgamer

    • Enjoy


    Weapon order:

    • Kino:

      • Raygun, Tgun, monkeys, Crossbow

    • Five:

      • Raygun, monkeys, crossbow

    • Ascension:

      • Raygun, Tgun, gersh, crossbow

    • Call of the dead:

      • Scavenger, Vr-11, Raygun (in coop), Russian dolls, Crossbow (in coop)

    • Shangri la:

      • Babygun, raygun, monkeys, crossbow

    • Nacht:

      • Tgun, raygun, monkeys

    • Verruckt:

      • Raygun, monkeys, crossbow

    • Shi no numa:

      • Raygun, waffe, monkeys

    • Der Riese:

      • Raygun once the box moved atleast once, waffe, monkeys, crossbow

    Have fun and if I helped you please leave a comment showing your gratitude or just an upvote, I appreciate it alot πŸ™‚

    BO1 Modding Releases & Resources

  • [ZM][RELEASE] First box patch + timer + electric trap timer + movement speed for Der Riese
    AlexInVrundefined AlexInVr

    There is, the final First box patch for WAW, all 4 maps are now patched.

    Installation

    • Create a folder named nazi_zombie_factory inside %localappdata%/Plutonium/storage/t4/raw/scripts/sp

    • Create a file with the name of your choice, that ends with the file extension GSC, so for example, file.gsc

    • Paste the code inside this file

    • save it

    • you now have a script

    • Drop the script inside

    • Enjoy

    
    
    #include maps\_utility;
    #include common_scripts\utility;
    #include maps\_zombiemode_utility;
    
    //First Box by twitch.tv/AlexInVR
    
    init()
    {
    	 replacefunc(maps\_zombiemode::round_think, ::custom_round_think);
    	 replacefunc(maps\_zombiemode_weapons::treasure_chest_ChooseRandomWeapon, ::custom_treasure_chest_ChooseRandomWeapon);
         replacefunc(maps\_zombiemode_weapons::treasure_chest_ChooseWeightedRandomWeapon, ::custom_treasure_chest_ChooseWeightedRandomWeapon);
    	 replacefunc(maps\nazi_zombie_factory::electric_trap_think, ::custom_electric_trap_think);
    	thread onConnect();
    
    }
    
    onConnect()
    {
    	for(;;)
    	{
    		level waittill( "connecting", player );
    		player thread OnPlayerSpawned();
    	}
    }
    
    
    game_timer()
    {
    	hud = create_simple_hud( self );
    	hud.foreground = true;
    	hud.sort = 1;
    	hud.hidewheninmenu = true;
    	hud.alignX = "left";
    	hud.alignY = "top";
    	hud.horzAlign = "user_left";
    	hud.vertAlign = "user_top";
    	hud.x = hud.x - -720;
    	hud.y = hud.y + 35;
    	hud.alpha = 1;
    	flag_wait("all_players_spawned");
    	hud setTimerUp(1);
    }
    
    round_timer()
    {
    	timerHud = create_simple_hud( self );
    	timerHud.foreground = true;
    	timerHud.sort = 1;
    	timerHud.hidewheninmenu = true;
    	timerHud.alignX = "left";
    	timerHud.alignY = "top";
    	timerHud.horzAlign = "user_left";
    	timerHud.vertAlign = "user_top";
    	timerHud.x = timerHud.x - -720;
    	timerHud.y = timerHud.y + 45;
    	timerHud.color =  (1, 0, 0);
    	timerHud.alpha = 1;
    	flag_wait("all_players_spawned");
    	for (;;){
    		start_time = GetTime() / 1000;
    		timerHud setTimerUp(0);
    		level waittill("end_of_round");
    		end_time = GetTime() / 1000;
    		time = end_time - start_time;
    		set_time_frozen(timerHud, time);
    	}
    
    }
    
    set_time_frozen(hud, time)
    {
    	level endon("start_of_round");
    	time = time - 0.1;
    	while(1)
    	{
    		hud settimer(time);
    		wait(0.5);
    	}
    }
    
    trap_timer()
    {
    	TtimerHud = create_simple_hud( self );
    	TtimerHud.foreground = true;
    	TtimerHud.sort = 1;
    	TtimerHud.hidewheninmenu = true;
    	TtimerHud.alignX = "left";
    	TtimerHud.alignY = "top";
    	TtimerHud.horzAlign = "user_left";
    	TtimerHud.vertAlign = "user_top";
    	TtimerHud.x = TtimerHud.x - -720;
    	TtimerHud.y = TtimerHud.y + 25;
    	TtimerHud.color =  (1, 1, 0);
    	TtimerHud.alpha = 1;
    	flag_wait("all_players_spawned");
    	for (;;){
    		level waittill("electric_trap_start");
    		start_time = 50;
    		TtimerHud settimer(start_time);
    	}
    }
    
    
    
    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();
    	}
    }
    
    
    custom_electric_trap_think( enable_flag )
    {
    	self sethintstring(&"ZOMBIE_FLAMES_UNAVAILABLE");
    	self.zombie_cost = 1000;
    
    	self thread maps\nazi_zombie_factory::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();
    
    		maps\nazi_zombie_factory::zapper_light_red( light_name );
    		flag_wait( enable_flag );
    
    		self trigger_on();
    	}
    
    	// Open for business!
    	maps\nazi_zombie_factory::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 maps\nazi_zombie_factory::electric_trap_move_switch(self);
    					//need to play a 'woosh' sound here, like a gas furnace starting up
    					self waittill("switch_activated");
    					level notify( "electric_trap_start" );
    					//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 maps\nazi_zombie_factory::activate_electric_trap();
    
    					//wait until done and then re-enable the valve for purchase again
    					self waittill("elec_done");
    
    					clientnotify(self.script_string +"off");
    					level notify( "electric_trap_end" );
    
    					//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 = getstruct("loudspeaker", "targetname");
    					//playsoundatposition("warning", speakera.origin);
    					self notify("available");
    
    					self.zombie_dmg_trig.in_use = 0;
    				}
    			}
    		}
    	}
    }
    
    custom_round_think()
    {
    	for( ;; )
    	{
    		level.round_spawn_func = maps\_zombiemode::round_spawning;
    		//////////////////////////////////////////
    		//designed by prod DT#36173
    		maxreward = 50 * level.round_number;
    		if ( maxreward > 500 )
    			maxreward = 500;
    		level.zombie_vars["rebuild_barrier_cap_per_round"] = maxreward;
    		//////////////////////////////////////////
    
    		level.round_timer = level.zombie_vars["zombie_round_time"];
    
    		add_later_round_spawners();
    
    		maps\_zombiemode::chalk_one_up();
    		//		round_text( &"ZOMBIE_ROUND_BEGIN" );
    
    		maps\_zombiemode_powerups::powerup_round_start();
    
    		players = get_players();
    		array_thread( players, maps\_zombiemode_blockers::rebuild_barrier_reward_reset );
    
    		level thread maps\_zombiemode::award_grenades_for_survivors();
    
    		level.round_start_time = getTime();
    		level thread [[level.round_spawn_func]]();
    		level notify("start_of_round");
    
    		maps\_zombiemode::round_wait();
    		level.first_round = false;
    		level notify("end_of_round");
    
    		level thread maps\_zombiemode::spectators_respawn();
    
    		//		round_text( &"ZOMBIE_ROUND_END" );
    		level thread maps\_zombiemode::chalk_round_hint();
    
    		wait( level.zombie_vars["zombie_between_round_time"] );
    
    		// here's the difficulty increase over time area
    		timer = level.zombie_vars["zombie_spawn_delay"];
    
    		if( timer < 0.08 )
    		{
    			timer = 0.08;
    		}
    
    		level.zombie_vars["zombie_spawn_delay"] = timer * 0.95;
    
    		// Increase the zombie move speed
    		level.zombie_move_speed = level.round_number * 8;
    
    		level.round_number++;
    
    		level notify( "between_round_over" );
    	}
    }
    
    
    
    
    
    
    custom_treasure_chest_ChooseRandomWeapon( player )
    {
    	if (level.round_number <= 20){
    		if (!(player HasWeapon("tesla_gun"))){
    			return "tesla_gun";
    		}
    
    		if (!(player HasWeapon("zombie_cymbal_monkey"))){
    			return "zombie_cymbal_monkey";
    		}
    
    		if (!(player HasWeapon("ray_gun"))){
    			return "ray_gun";
    		}
    
    
    	}
    
    	keys = GetArrayKeys( level.zombie_weapons );
    
    	// Filter out any weapons the player already has
    	filtered = [];
    	for( i = 0; i < keys.size; i++ )
    	{
    		if( !maps\_zombiemode_weapons::get_is_in_box( keys[i] ) )
    		{
    			continue;
    		}
    
    		if( player maps\_zombiemode_weapons::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] maps\_zombiemode_weapons::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 )];
    }
    
    custom_treasure_chest_ChooseWeightedRandomWeapon( player )
    {
    
    	if (level.round_number <= 20){
    		if (!(player HasWeapon("tesla_gun"))){
    			return "tesla_gun";
    		}
    
    		if (!(player HasWeapon("zombie_cymbal_monkey"))){
    			return "zombie_cymbal_monkey";
    		}
    
    		if (!(player HasWeapon("ray_gun"))){
    			return "ray_gun";
    		}
    
    
    	}
    
    	keys = GetArrayKeys( level.zombie_weapons );
    
    	// Filter out any weapons the player already has
    	filtered = [];
    	for( i = 0; i < keys.size; i++ )
    	{
    		if( !maps\_zombiemode_weapons::get_is_in_box( keys[i] ) )
    		{
    			continue;
    		}
    
    		if( player maps\_zombiemode_weapons::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] maps\_zombiemode_weapons::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 )];
    }
    
    weapon_give_custom( weapon, is_upgrade )
    {
    	primaryWeapons = self GetWeaponsListPrimaries();
    	current_weapon = undefined;
    
    	//if is not an upgraded perk purchase
    
    	self play_sound_on_ent( "purchase" );
    	self GiveWeapon( weapon, 0 );
    	self GiveMaxAmmo( weapon );
    	self SwitchToWeapon( weapon );
    
    	maps\_zombiemode_weapons::play_weapon_vo(weapon);
    }
    
    power_electric_switch_custom()
    {
    	trig = getent("use_power_switch","targetname");
    	master_switch = getent("power_switch","targetname");
    	master_switch notsolid();
    	//master_switch rotatepitch(90,1);
    	trig sethintstring(&"ZOMBIE_ELECTRIC_SWITCH");
    
    	//turn off the buyable door triggers for electric doors
    // 	door_trigs = getentarray("electric_door","script_noteworthy");
    // 	array_thread(door_trigs,::set_door_unusable);
    // 	array_thread(door_trigs,::play_door_dialog);
    
    	cheat = false;
    
    /#
    	if( GetDvarInt( "zombie_cheat" ) >= 3 )
    	{
    		wait( 5 );
    		cheat = true;
    	}
    #/
    
    	user = undefined;
    
    	// MM - turning on the power powers the entire map
    // 	if ( IsDefined(user) )	// only send a notify if we weren't originally triggered through script
    // 	{
    // 		other_trig = getent("use_warehouse_switch","targetname");
    // 		other_trig notify( "trigger", undefined );
    //
    // 		wuen_trig = getent("use_wuen_switch", "targetname" );
    // 		wuen_trig notify( "trigger", undefined );
    // 	}
    
    	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");
    	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( "power_on" );
    	ClientNotify( "pl1" );	// power lights on
    	exploder(600);
    
    	trig delete();
    
    	playfx(level._effect["switch_sparks"] ,getstruct("power_switch_fx","targetname").origin);
    
    	// 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 );
    }
    
    
    onPlayerSpawned()
    {
    	self endon( "disconnect" );
    
    	for( ;; )
    	{
    
    		level waittill( "connected", player );
    		self thread round_timer();
    		self thread game_timer();
    		self thread trap_timer();
    		self SetClientDvars(
    			"player_backSpeedScale", "1",
    			"player_strafeSpeedScale", "1");
    
    
    		wait 1.5;
    
    		self IPrintLnBold("First box by ^1twitch.tv/^2AlexInZombies");
    	}
    
    }
    
    
    WAW Modding Releases & Resources

  • [ZM][RELEASE][PLUTO SCRIPT] Backspeed + game and round timer patch
    AlexInVrundefined AlexInVr

    After a request on Discord, I decided to release the script for everyone to use, because a lot of patches are being gatekept or not a lot of patchers release their stuff.

    It's a pluto only version but I have a steam version also that I can release, it's just harder to customize if you don't know what you are doing:

    Install instructions:

    • Turn on file extensions in your windows explorer, see this link if you don't know how

    • Press windows + r, a dialog box will open

    • Inside it type in %LOCALAPPDATA%\Plutonium\storage\t5\scripts\sp

    • Create a folder with the name of the map you want to play

    • Kino: zombie_theater

    • Asc: zombie_cosmodrome

    • Shang: zombie_temple

    • Moon: zombie_moon

    • Cotd: zombie_coast

    Waw maps:

    • Nacht: zombie_cod5_prototype

    • Verruckt: zombie_cod5_asylum

    • Shi no: zombie_cod5_sumpf

    • Der riese: zombie_cod5_factory

    • Create a new file with the name of your choice, and make its file extension .gsc (example: patch.gsc)

    • copy and paste the code inside your gsc file

    launch your game and enjoy !

    I did not include the splash texts as some people don't like that, and I can understand, I'd just appreciate if you could leave a like on the post if my patch helped you πŸ™‚

    #include maps\_utility;
    #include common_scripts\utility;
    #include maps\_zombiemode_utility;
    
    
    init()
    {
            if ( GetDvar( #"zombiemode" ) == "1" )
            {
    			replacefunc(maps\_zombiemode::round_think, ::custom_round_think);
                level thread onPlayerConnect();
            }
    
    }
    
    
    custom_round_think()
    {
    	for( ;; )
    	{
    		//////////////////////////////////////////
    		//designed by prod DT#36173
    		maxreward = 50 * level.round_number;
    		if ( maxreward > 500 )
    			maxreward = 500;
    		level.zombie_vars["rebuild_barrier_cap_per_round"] = maxreward;
    		//////////////////////////////////////////
    
    		level.pro_tips_start_time = GetTime();
    		level.zombie_last_run_time = GetTime();	// Resets the last time a zombie ran
    
            level thread maps\_zombiemode_audio::change_zombie_music( "round_start" );
    		maps\_zombiemode::chalk_one_up();
    		//		round_text( &"ZOMBIE_ROUND_BEGIN" );
    
    		maps\_zombiemode_powerups::powerup_round_start();
    
    		players = get_players();
    		array_thread( players, maps\_zombiemode_blockers::rebuild_barrier_reward_reset );
    
    		//array_thread( players, maps\_zombiemode_ability::giveHardpointItems );
    
    		level thread maps\_zombiemode::award_grenades_for_survivors();
    
    		bbPrint( "zombie_rounds: round %d player_count %d", level.round_number, players.size );
    
    		level.round_start_time = GetTime();
    		level thread [[level.round_spawn_func]]();
    
    		level notify( "start_of_round" );
    
    		[[level.round_wait_func]]();
    
    		level.first_round = false;
    		level notify( "end_of_round" );
    
    		level thread maps\_zombiemode_audio::change_zombie_music( "round_end" );
    
    		UploadStats();
    
    		if ( 1 != players.size )
    		{
    			level thread maps\_zombiemode::spectators_respawn();
    			//level thread last_stand_revive();
    		}
    
    		//		round_text( &"ZOMBIE_ROUND_END" );
    		level maps\_zombiemode::chalk_round_over();
    
    		// here's the difficulty increase over time area
    		timer = level.zombie_vars["zombie_spawn_delay"];
    		if ( timer > 0.08 )
    		{
    			level.zombie_vars["zombie_spawn_delay"] = timer * 0.95;
    		}
    		else if ( timer < 0.08 )
    		{
    			level.zombie_vars["zombie_spawn_delay"] = 0.08;
    		}
    
    		//
    		// Increase the zombie move speed
    		level.zombie_move_speed = level.round_number * level.zombie_vars["zombie_move_speed_multiplier"];
    
    		level.round_number++;
    
    		level notify( "between_round_over" );
    	}
    }
    
    
    
    game_timer()
    {
    	hud = create_simple_hud( self );
    	hud.foreground = true;
    	hud.sort = 1;
    	hud.hidewheninmenu = true;
    	hud.alignX = "left";
    	hud.alignY = "top";
    	hud.horzAlign = "user_left";
    	hud.vertAlign = "user_top";
    	hud.alpha = 1;
    	//=======================CUSTOM SECTION==============
    	hud.x = hud.x - -720; //This is for the position on X axis, decrease this number to move it further left, and increase it to go right.
    	hud.y = hud.y + 35; //This is for the position on Y axis, decrease this number to move it down, and increase it to go up.
    	hud.fontscale = 1.2; //This is for the font size, increase it by whatever you want and see what you like
    	hud.color =  (255, 255, 255); //This is for the color using RGB, use a website for that
    	//=========================================
    	time_text = string(GetTime() / 1000);
    	flag_wait("all_players_spawned");
    	while (1){
    		hud setTimerUp(1);
    		hud setTimer(time_text);
    	}
    
    }
    
    round_timer()
    {
    	timerHud = create_simple_hud( self );
    	timerHud.foreground = true;
    	timerHud.sort = 1;
    	timerHud.hidewheninmenu = true;
    	timerHud.alignX = "left";
    	timerHud.alignY = "top";
    	timerHud.horzAlign = "user_left";
    	timerHud.vertAlign = "user_top";
    	//=======================CUSTOM SECTION==============
    	timerHud.x = timerHud.x - -720; //This is for the position on X axis, decrease this number to move it further left, and increase it to go right.
    	timerHud.y = timerHud.y + 45; //This is for the position on Y axis, decrease this number to move it down, and increase it to go up.
    	timerHud.fontscale = 1.2; //This is for the font size, increase it by whatever you want and see what you like
    	timerHud.color =  (255, 0, 0); //This is for the color using RGB, use a website for that
    	//=========================================
    	timerHud.alpha = 1;
    	flag_wait("all_players_spawned");
    	for (;;){
    		start_time = GetTime() / 1000;
    		timerHud setTimerUp(0);
    		level waittill("end_of_round");
    		end_time = GetTime() / 1000;
    		time = end_time - start_time;
    		set_time_frozen(timerHud, time);
    	}
    
    }
    
    set_time_frozen(hud, time)
    {
    	level endon("start_of_round");
    	time = time - 0.1;
    	while(1)
    	{
    		hud settimer(time);
    		wait(0.5);
    	}
    }
    
    onPlayerConnect()
    {
    	for(;;)
    	{
    		level waittill ("connecting", player);
    		player thread onPlayerSpawned();
    	}
    }
    
    onPlayerSpawned()
    {
    	for(;;)
    	{
    		self waittill("spawned_player");
    		self thread game_timer(); //Thread the global timer
    		self thread round_timer(); //Thread the round timer
    		self SetClientDvars("player_backSpeedScale", "1", "player_strafeSpeedScale", "1"); //Patch speed to be same as console
    	}
    }
    
    BO1 Modding Releases & Resources

  • [PAYING] WTB SCRIPT FOR FORCE ROUND 100
    AlexInVrundefined AlexInVr
    #include maps\_utility; 
    #include common_scripts\utility;
    #include maps\_zombiemode_utility;
    
    
    main()
    {
            if ( GetDvar( #"zombiemode" ) == "1" )
            {
            	level thread onPlayerConnect();
            }
                
    }
    
    onPlayerConnect()
    {
    	for(;;)
    	{
    		level waittill ("connecting", player);
    
    		player thread onPlayerSpawned();
    	}
    }
    
    onPlayerSpawned()
    {
    	for(;;)
    	{
    		self waittill("spawned_player");
    		level.round_number = 100;
    	}
    }
    

    Have fun lol

    BO1 Modding Support & Discussion

  • [ZM][FIX] Temporary fix for CZ crash
    AlexInVrundefined AlexInVr

    ~~This is a patch that disables the weapon in the game, I simply commented out the line that includes the weapon in the zombie mode and also disables the checks for dual wield. Should stop you from accidentally picking them up I guess

    Google drive link~~

    EDIT: use BoneCrusher's stuff in the comments, my fix is a very crude and amateur fix, intended just to literally prevent the crash entirely by removing the gun. this is not a proper fix. Bonecrusher has the right fix

    BO1 Modding Releases & Resources

  • [ZM] [Black Ops 1] Neon Perk Icons
    AlexInVrundefined AlexInVr

    Sick !!

    BO1 Modding Releases & Resources

  • [ZM][RELEASE][PLUTO SCRIPT] Backspeed + game and round timer patch
    AlexInVrundefined AlexInVr

    @Hulkster So basically the custom round think is just so I could add in the notifiers for the round timer, I basically copy pasted the regular method, and added 2 notifiers lmao

    BO1 Modding Releases & Resources

  • [ZM][RELEASE][PLUTO SCRIPT] Backspeed + game and round timer patch
    AlexInVrundefined AlexInVr

    @Hulkster you're welcome man, enjoy !

    BO1 Modding Releases & Resources

  • [ZM][RELEASE] First box patch + timer + movement speed for ALL maps except moon
    AlexInVrundefined AlexInVr

    UPDATE 9/11/2025: Added SPH counter

    BO1 Modding Releases & Resources
  • 1 / 1
  • Login

  • Don't have an account? Register

  • Login or register to search.
  • First post
    Last post
0
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Donate