FlixSZN For sure, will take a look at this, it's supposed to be in there might have missed it, and yeah this is an issue with my mod where up until 19 you don't get any other box weapons that I also plan to fix, it is due to how I wrote my code, I never really had the issue since usually once you box you're good up until the trades where the patch isn't active anymore
AlexInVr
Posts
-
[ZM][RELEASE] First box patch + timer + movement speed for ALL maps except moon -
[ZM][RELEASE] First box patch + timer + movement speed for ALL maps except moonNucleye So I looked at my crossbow thingy, and the reason why the crossbow is there is that it's a required weapon for the High round strat, either in solo or coop, If you didn't know, pack a punching the crossbow makes it so every arrow is a monkey bomb
-
[ZM][RELEASE] First box patch + timer + movement speed for ALL maps except moon@scotlords Yeah so for the raygun you need to move the box atleast once

-
[ZM] [RELEASE] First Box patch + timer + movement speed patch NACHT DER UNTOTENchuyito9154 I'm sorry bro I don't speak spanish, using google translate your comment asks what does this mod do, without offense, I wrote everything in the title and the description of the post my guy, idk what to tell you more

-
[ZM][RELEASE] First box patch + timer + movement speed for ALL maps except moon@scotlords Did you make sure to move the box atleast once ? you need to move it atleast once for the raygun to appear, this is in the original game code and wasn't too sure if it would be legit without it so I added it. I will also double check that I did add the raygun in coop

-
[ZM][RELEASE] First box patch + timer + movement speed for ALL maps except moon@scotlords you gotta press the arrow in the upper right corner

-
[ZM] [RELEASE] First Box patch + timer + movement speed patch NACHT DER UNTOTENMrConfetti Welcome my friend !

-
[ZM][RELEASE] First box patch + timer + movement speed for ALL maps except moonNucleye I will work on fixing that and release an update soon, probably tommorow as I got stuff to do tonight
-
[ZM] [RELEASE] First Box patch + timer + movement speed patch NACHT DER UNTOTENMrConfetti For sure,
#include maps\_utility; #include common_scripts\utility; #include maps\_zombiemode_utility; //First Box by twitch.tv/AlexInVR init() { thread OnPlayerConnect(); } OnPlayerConnect() { 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); } } 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("Timer and speed patch by ^1twitch.tv/^2AlexInVR"); } level waittill( "connected", player ); } -
[ZM][RELEASE] First box patch + timer + movement speed for ALL maps except moonNucleye Yes but the crossbow isn't the first weapon, the crossbow is there for coop games, until round 19 it will give you the crossbow as last weapon in the box since it's there for coop games for maps that require it, if the first or second weapon in the box is a crossbow that means that it's a weapon required for the high round strategy
-
[ZM][RELEASE] First box patch + timer + movement speed for ALL maps except moonNucleye which map ? I can update it for sure
-
[RESOURCE] Boilerplate GSC code for your first scriptResxt I agree with that definitly !
-
[RESOURCE] Boilerplate GSC code for your first scriptResxt Thx ! I am still learning gsc myself as I just recently got to it more seriously other than writing just simple box patch functions, these will be useful, I'll make sure to update my post too
!As for the syntax yeah this is a bad habit I developed while working on multiple programming projects and languages, Unity is one such example where they love capitals lol
-
[RESOURCE] Boilerplate GSC code for your first scriptI 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 ); } } -
[ZM][RELEASE] First box patch + timer + movement speed for ALL maps except moonThis 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:
-
take the common_zombie_patch.ff
-
move it to
%localappdata%/Plutonium/storage/t5/zoneoryourGameFolder/zone/commonif you are using Steam or Bgamer -
Enjoy
Have fun and if I helped you please leave a comment showing your gratitude or just an upvote, I appreciate it alot

-
-
[ZM][RELEASE] First box patch + timer + electric trap timer + movement speed for Der RieseThere 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"); } } -
-
[ZM] [RELEASE] First Box patch + timer + movement speed patch NACHT DER UNTOTEN3 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 ); } -
[ZM][RELEASE] [PLUTO ONLY] First box patch for moon + timer + speed patchhindercanrun thx man ! Appreciate it, been trying to find a way to patch this map for a while now
-
[Release] [Zombies] Black Ops 1 Shared mystery boxif you want to load the script without closing the game etc.... another solution is to make a folder with the name of the map you want in SP
like
scripts/sp/zombie_theater/yourscript.gsc
and it will load it when you load this map
-
[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
-
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
-
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.
You can do so by either replacing it from your game directory (Steam or Bgamer for example) or by putting it inside Plutonium's Zone folder, which will overwrite your original file without replacing it in the original game files, the file in the zone folder will load instead of the one inside your game
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
V1.5 - 12/26/2025
- Implemented a fix to prevent other excavators from powering up on round 15 other than tunnel 11
NotesWorks 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 - -1100; //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 - -1100; //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; if (level flag_exists("start_teleporter_digger") && flag("start_teleporter_digger")){ flag_clear("start_teleporter_digger"); } if (level flag_exists("start_biodome_digger") && flag("start_biodome_digger")){ flag_clear("start_biodome_digger"); } // 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", "sv_cheats", "1"); wait 3; self IPrintLn("First box by ^1twitch.tv/^2AlexInZombies"); } } -