[ZM][RELEASE] [PLUTO ONLY] First box patch for moon + timer + speed patch
-
οΈ 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
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/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.
The patch will not load 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- Launch the map and play
Load up Moon in Plutonium and the patch will apply automatically.
π§ͺ 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
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); } } 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 - -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 //========================================= 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 - -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); } } 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; maps\zombie_moon_wasteland::perk_machine_show_selected( 1, 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" ); } } onPlayerConnect() { for(;;) { level waittill ("connecting", player); player thread onPlayerSpawned(); } } onPlayerSpawned() { for(;;) { self waittill("spawned_player"); self thread game_timer(); self thread round_timer(); self SetClientDvars( "player_backSpeedScale", "1", "player_strafeSpeedScale", "1"); wait 3; self IPrintLn("First box by ^1twitch.tv/^2AlexInZombies"); } }
PICS:
-
-
nice!
-
nice!
hindercanrun thx man ! Appreciate it, been trying to find a way to patch this map for a while now
-
what file do i play zombie_moon in? i dont understand
-
f0rbiddin press windows + r on your keyboard
inside the window that pops up, type in %LOCALAPPDATA%
go to the folder plutonium/Storage/t5/scripts/sp
create a new folder name zombie_moon
drop the script inside it,
(Create a new text file, and name it whatever you want, copy the code in the thread, paste it inside, then rename the extension to .gsc)
-
undefined bhfff referenced this topic on
-
Please add the QED's in
-
undefined AlexInVr referenced this topic on
-
how can i change it to give qeds third hit instead of raygun?
-
_Tome What's your discord
-
Glitchy99 Will do right away
-
AlexInVr enma663
-
UPDATE 10/20/2025:
-
Added QED's as third hit
-
Added a condition so raygun only shows up for coop games as 4th hit of the box
-
Added round timer
-
Jug is always the perk that spawns at NML
-
-
Glitchy99 QED's have been added