chuyito9154 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

AlexInVr
Posts
-
[ZM] [RELEASE] First Box patch + timer + movement speed patch NACHT DER UNTOTEN -
[ZM][RELEASE] First box patch + timer + movement speed for ALL maps except moonscotlords 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 moonscotlords 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
-
Starting box location changed on maps that require it (Looking at you kino) - Credit goes to idk who for this part of the code, I took it from another patch I was given, Idk who the author is, if you were the one who did it, just comment and I'll give ya credits
-
Movement Speed patch
-
First box also accounting for coop games 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)
* No dual wield cz's since they crash plutonium on regular maps
(Removed because I don't play pluto t5 anymore due to it not being considered legit for Records)
Installation Instructions:
- Download Compiled + Source Code
- unzip the file
- take common_zombie_patch.ff from the folder
- move it to
%localappdata%/Plutonium/storage/t5/zone
oryourGameFolder/zone/common
if you are using steam or Bgamer - Enjoy
Building from source instructions
-
you need a valid copy of black ops 1 on steam or have a copy of the mod tools somewhere, they can be downloaded through steam, otherwise, you are on your own, I will not provide support for cracked mod tools, sorry
-
Open steam, and enable Tools on your library
-
Navigate to Black ops mod tools (BETA) and download it, the download might be slow as fuck, this is normal, it's probably how they did the compression on steam
-
Once you have the modtools opened, make sure you have a folder named mods in your main game folder
-
Copy and paste the folder you unzipped inside the mods folder
- Inside the tool, select the mod in the dropdown menu, and tick the Link Fastfile option down below
- click on build mod
-
Click on View Mod
-
Next you will be inside the mod's folder, you will have a file named mod.ff congratulations ! you compiled your first mod, we're almost done
-
Rename mod.ff to common_zombie_patch.ff
-
Follow instructions on how to install compiled version above
Weapon order:
-
Kino:
- Raygun, Tgun, monkeys, Crossbow
-
Five:
- Raygun, monkeys, crossbow
-
Ascension:
- Raygun, Tgun, gersh, crossbow
-
Call of the dead:
- Scavenger, Raygun, Russian dolls, Crossbow
-
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
-
-
[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 patchSo I made a box patch for moon, but it only works on Plutonium due to the use of replacefunc, it will give you the wavegun, gersh and raygun for coop up until round 20, it also has a timer like my waw mods, and a speed patch to make your backspeed and strafe speed the same as on console,
INSTALL INSTRUCTIONS:
-
REPLACE YOUR COMMON_ZOMBIE_PATCH.FF WITH THE ORIGINAL GAME FILE WHILE YOU PLAY THE MAP OR ELSE IT WILL NOT LOAD !! Please don't comment that the script is not working if you did not follow the instructions, I tested it before and it's working 100%
-
Create a folder named zombie_moon in your %localappdata%/Plutonium/Storage/t5/scripts/sp and place the file in it
-
Launch the map and enjoy
-
If you don't have the original common_zombie_patch.ff here it is, just unzip the file
download
if you find any issues in the gameplay please advise me, I am not a moon player so idk if it will do something to the gameplay, as far as I tested, everything works.
#include maps\_utility; #include common_scripts\utility; #include maps\_zombiemode_utility; init() { if ( GetDvar( #"zombiemode" ) == "1" ) { level thread onPlayerConnect(); replacefunc(maps\_zombiemode_weapons::treasure_chest_ChooseWeightedRandomWeapon, ::custom_treasure_chest_ChooseWeightedRandomWeapon); } } 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.x = hud.x - -820; 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); } } 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"; //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 )]; } onPlayerConnect() { for(;;) { level waittill ("connecting", player); player thread onPlayerSpawned(); } } onPlayerSpawned() { for(;;) { self waittill("spawned_player"); self thread game_timer(); self SetClientDvars( "player_backSpeedScale", "1", "player_strafeSpeedScale", "1"); wait 3; self IPrintLnBold("First box by ^1twitch.tv/^2AlexInVR"); } }
PICS:
-
-
[Release] [Mod Tools] Apothicon ServantLerrycapetime if you extract the map_name.ff you should have a file _zombiemode.gsc that contains the functions that includes the weapons in the map, if not, look in the map_name_patch.ff
-
[RELEASE] [ZOMBIES] First box patch for shi no numa -
[ZM][RELEASE] Shi no numa first box + timer + movement speed patchAgain, 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.