Black Ops III Zombies Mapping Guide (by n0x)
1.0 Introduction
Since i struggled getting my first map to work and load up in the game, i decided to make a guide to explain the process.
Not all steps are required in order to be able to have a playable map, if all you want is to create a playable map without having to edit anything (without using the map editor) then all the steps you need to follow are:
This will allow you to play the standard map that comes with the map editor.
Not all steps are required in order to be able to have a playable map, if all you want is to create a playable map without having to edit anything (without using the map editor) then all the steps you need to follow are:
- 1.1 Requirements
- 2.0 Creating the project
- 9.0 Compiling/ building the map
- 9.1 Loading the map into BO3 from the Mod Tools
- 9.2 Playing the map
This will allow you to play the standard map that comes with the map editor.
1.1 Requirements
The following things are required to make a map and play it on your computer:
1. Go to your library and click on the button above the search bar.
2. In the list, tick the box called "Software"
3. Search for Call of Duty: Black Ops III Mod Tools in the list and download it.
- Call of Duty: Black Ops III
- Call of Duty: Black Ops III Zombies DLC
- Call of Duty: Black Ops III Mod Tools
1. Go to your library and click on the button above the search bar.
2. In the list, tick the box called "Software"
3. Search for Call of Duty: Black Ops III Mod Tools in the list and download it.
1.2 Resources
There are certain websites which can be used as a resource for information to help you with mapping, crazy enough, Generative AI isn't that bad to use either when you don't know how to do something but it isn't always helpful.
Black Ops 3 Source Code Explorer Documentation[bo3explorer.zeroy.com] This website is incredibly useful for finding scripts and other files to add to your map that would otherwise need to be manually extracted.
Devraw[www.devraw.net] This website contains assets, models, textures, tools and guides on many things related to Bo3 map editing.
Black Ops 3 Source Code Explorer Documentation[bo3explorer.zeroy.com] This website is incredibly useful for finding scripts and other files to add to your map that would otherwise need to be manually extracted.
Devraw[www.devraw.net] This website contains assets, models, textures, tools and guides on many things related to Bo3 map editing.
2.0 Creating the project
Step 1:
Open the Call of Duty: Black Ops III Mod Tools. A terminal window will open and then a window named "Black Ops III Mod Tools Launcher" will open, the terminal window can be closed when Black Ops III Mod Tools Launcher is opened.
Step 2:
There will already be two maps, they can be edited and used but for the sake of this guide a new map will be made. Click on the "New" button in the top toolbar, give it a name (make sure it starts with "zm_") and from the dropdown list choose "ZM Mod Level", then press "OK"
For this guide i will use the mapname "zm_steamguide".

Step 3:
After pressing "OK" a window will pop up showing the files it has created, the map should now also show up in the map list. The map already comes with some basic features, a player spawn point, zombie spawners, a box and jug. The map is now ready to be edited, or played.
Tip: to find out where your map files are stored, right click on the map and press "Open Map Folder"
Open the Call of Duty: Black Ops III Mod Tools. A terminal window will open and then a window named "Black Ops III Mod Tools Launcher" will open, the terminal window can be closed when Black Ops III Mod Tools Launcher is opened.
Step 2:
There will already be two maps, they can be edited and used but for the sake of this guide a new map will be made. Click on the "New" button in the top toolbar, give it a name (make sure it starts with "zm_") and from the dropdown list choose "ZM Mod Level", then press "OK"
For this guide i will use the mapname "zm_steamguide".
Step 3:
After pressing "OK" a window will pop up showing the files it has created, the map should now also show up in the map list. The map already comes with some basic features, a player spawn point, zombie spawners, a box and jug. The map is now ready to be edited, or played.
Tip: to find out where your map files are stored, right click on the map and press "Open Map Folder"
3.0 Opening the level editor Radiant
Radiant is the map editor that is used to make levels for Call of Duty: Black Ops III: Zombies. It features an asset browser, texture browser, grid views and 3d views of the current level you're working on.
To open radiant follow these steps:
Step 1:
Open Call of Duty: Black Ops III Mod Tools and select your map from the list.
Step 2:
In the top of the screen, press the button with the large "R" labelled "Level Editor"

Step 3:
Radiant should now open with your selected map loaded.
If you've just made a new map, it should already have a few items in it such as a few walls, some perk machines, a power switch, zombie spawners and a info_payer_start entity.
To open radiant follow these steps:
Step 1:
Open Call of Duty: Black Ops III Mod Tools and select your map from the list.
Step 2:
In the top of the screen, press the button with the large "R" labelled "Level Editor"
Step 3:
Radiant should now open with your selected map loaded.
If you've just made a new map, it should already have a few items in it such as a few walls, some perk machines, a power switch, zombie spawners and a info_payer_start entity.
3.1 Navigating around (views)
After the map editor is opened you should see a screen that looks something like this:

Top right:
This is the 2D top down view, useful for moving brushes and entity into their place.
Top left:
This is the 3D view, by holding right mouse button into this view you can look around, by scrolling you can move forwards and backwards.
Bottom:
In the bottom are the Entity info and Entity browser windows, these are used when placing and or configuring entities.
I recommend adding another 2D side view to make it easier to position brushes and entities, to do this go to View > New View Window > New XZ View
Top right:
This is the 2D top down view, useful for moving brushes and entity into their place.
Top left:
This is the 3D view, by holding right mouse button into this view you can look around, by scrolling you can move forwards and backwards.
Bottom:
In the bottom are the Entity info and Entity browser windows, these are used when placing and or configuring entities.
I recommend adding another 2D side view to make it easier to position brushes and entities, to do this go to View > New View Window > New XZ View
4.0 Making a brush
A "brush" is the name for everything that is not an entity or object, when talking about a brush you are talking about walls, floors, windows, water and for example a skybox. To make a brush, follow these steps:
Step 1:
Move your mouse to any of the 2D views and drag the shape you wish to make.
Step 2:
Use different 2D views to control length, height and width. The brush should appear blue.

Step 3:
Once you are happy with the shape, press ESC to create the brush (in this case a wall)
The brush will not be placed but it's invisible, a texture will need to be given to it for it to appear in the world as described in 3.2.1
Step 1:
Move your mouse to any of the 2D views and drag the shape you wish to make.
Step 2:
Use different 2D views to control length, height and width. The brush should appear blue.
Step 3:
Once you are happy with the shape, press ESC to create the brush (in this case a wall)
The brush will not be placed but it's invisible, a texture will need to be given to it for it to appear in the world as described in 3.2.1
4.1 Giving a brush a texture
After a brush is created it might not have a default texture and may appear invisible or see through in game, to apply a texture to a brush follow these steps:
Step 1:
Select your brush by using Shift + Right Click in the 3D view on the brush.
Step 2:
Press T to open the texture browser (bottom of the screen)
Step 3:
To show all textures, make sure to select "All" instead of "All in use" in the top of the texture browser window.
Select the texture you wish to give to your brush and double click to apply it to your brush.
Now when you compile your map and load it into the game, your brush should be there.
Step 1:
Select your brush by using Shift + Right Click in the 3D view on the brush.
Step 2:
Press T to open the texture browser (bottom of the screen)
Step 3:
To show all textures, make sure to select "All" instead of "All in use" in the top of the texture browser window.
Select the texture you wish to give to your brush and double click to apply it to your brush.
Now when you compile your map and load it into the game, your brush should be there.
4.2 Reshaping a brush
Changing the shape of a brush can be useful for making roofs, slopes or other slanted shapes.
Step 1:
Create a brush in your 2D view and make sure you can see it in your 3D view.
Step 2:
Select your brush by pressing Shift + Left click on it and then open the shape properties by pressing E
Step 3:
Blue squares should appear at the ends of the brush which can be dragged around to create the shape you want to make, use the 2D view to make them line up with other meshes.
To make more precise adjustments, you can also use the 2D view to change the shape by moving the blue squares.
Step 1:
Create a brush in your 2D view and make sure you can see it in your 3D view.
Step 2:
Select your brush by pressing Shift + Left click on it and then open the shape properties by pressing E
Step 3:
Blue squares should appear at the ends of the brush which can be dragged around to create the shape you want to make, use the 2D view to make them line up with other meshes.
To make more precise adjustments, you can also use the 2D view to change the shape by moving the blue squares.
4.3 Making an archway
In the section i will go over what needs to be done in order to create an archway, in this example i will create a tunnel.
Note: click on the images to enlarge them!
It will look like this in game:

Step 1:
Create a brush that will be the wall as shown left and right of the archway, make sure it's the full height of the tunnel:

Step 2:
Create a new brush in front of the area where you want the tunnel to be, then select the brush and go to Patch > Primitives > Cylinder
After your brush turned into a cylinder, select it and go to Patch > Primitives > End cap to turn your cylinder into a archway:

Step 3:
Reposition your archway in a way that it covers the entire area where it will be in the end, in my case that means it covers the width of the road and the depth of the tunnel.
You may need to rotate your arch, do this by going to Selection > Rotate > and choosing one of the options to rotate your arch into the right position.

Step 4:
Now select both the arch and the brush you're wishing to make the arch into and press Alt + H to isolate the two brushes from all the other items in your map, you should now only see the two brushes in your view.
Make sure your archway brush is flush with the brush as shown in the image.

Step 5:
Now select only the archway and press the subtract button in the top tool bar in the editor, this should subtract a square shape around your archway in the wall brush.
In the image there is a red square around the subtract button:

Step 6:
With the archway now selected go to Patch > Cap and in the cap dialog choose "Inverted Endcap". This should fill in the empty areas between the archway and the brush.
You may now need to invert the textures to make them show on the inside instead of the outside, do this by pressing Ctrl + I
Your arch should look like this:

Step 7:
To go back to the rest of your map, press Shift + H, with the final result being:
Note: click on the images to enlarge them!
It will look like this in game:
Step 1:
Create a brush that will be the wall as shown left and right of the archway, make sure it's the full height of the tunnel:
Step 2:
Create a new brush in front of the area where you want the tunnel to be, then select the brush and go to Patch > Primitives > Cylinder
After your brush turned into a cylinder, select it and go to Patch > Primitives > End cap to turn your cylinder into a archway:
Step 3:
Reposition your archway in a way that it covers the entire area where it will be in the end, in my case that means it covers the width of the road and the depth of the tunnel.
You may need to rotate your arch, do this by going to Selection > Rotate > and choosing one of the options to rotate your arch into the right position.
Step 4:
Now select both the arch and the brush you're wishing to make the arch into and press Alt + H to isolate the two brushes from all the other items in your map, you should now only see the two brushes in your view.
Make sure your archway brush is flush with the brush as shown in the image.
Step 5:
Now select only the archway and press the subtract button in the top tool bar in the editor, this should subtract a square shape around your archway in the wall brush.
In the image there is a red square around the subtract button:
Step 6:
With the archway now selected go to Patch > Cap and in the cap dialog choose "Inverted Endcap". This should fill in the empty areas between the archway and the brush.
You may now need to invert the textures to make them show on the inside instead of the outside, do this by pressing Ctrl + I
Your arch should look like this:
Step 7:
To go back to the rest of your map, press Shift + H, with the final result being:
5.0 Prefabs
Prefabs are a group of both models and scripts that form a functional and interactive item in the map, examples of prefabs are: Mystery box, Perk machines and the power switch.
These can be placed in the map with relative ease as they are drag and drop prefabs, meaning you need to place them in your world and position them to use them and they often don't require a lot of extra work.
These can be placed in the map with relative ease as they are drag and drop prefabs, meaning you need to place them in your world and position them to use them and they often don't require a lot of extra work.
5.1 Wallbuy prefab
Wallbuys are very simple to add to your map and come in prefabs, this means all you need to do is place the prefab in your map and that's it.
Step 1:
With Radiant open, go to View > Toggle > Prefab Pane to open the prefab menu.
Step 2:
On the right side of the screen, the prefab window will open. In the prefab pane go to zm > zm_core to see a list of placable wallbuys and other prefabs.

Step 3:
Choose which wallbuy you want to place in your map, and simply drag it to either your 2D or 3D view to place it.
Make sure it starts with "spawnable_weapon_"!
Step 4:
Once placed, it should create an entire prefab containing brushes and script_struct bocks (the red squares)

Step 5:
To be able to actually use it, we will need to change it's position in a way that the player can reach it and that the gun is visible on the wall.
To turn the entire prefab 90°, select the prefab by using Shift + Right Click and once selected press Shift + D, with your prefab selected you can also move it around in your 3D and 2D view.
Step 6:
Move your prefab around until the gun is visible and it will look something like this:

As we can see in the 3D view, the gun is visible. Also in the XY view we can see that the brushes (the green line and rectangle) are slightly away from the wall, this makes it easier for the player to reach the wallbuy and makes it float a small distance away from the wall.
The final result will look like this:

It seems as if the weapon is "on the wall" even though it floats away from it by a few pixels.
Step 1:
With Radiant open, go to View > Toggle > Prefab Pane to open the prefab menu.
Step 2:
On the right side of the screen, the prefab window will open. In the prefab pane go to zm > zm_core to see a list of placable wallbuys and other prefabs.
Step 3:
Choose which wallbuy you want to place in your map, and simply drag it to either your 2D or 3D view to place it.
Make sure it starts with "spawnable_weapon_"!
Step 4:
Once placed, it should create an entire prefab containing brushes and script_struct bocks (the red squares)
Step 5:
To be able to actually use it, we will need to change it's position in a way that the player can reach it and that the gun is visible on the wall.
To turn the entire prefab 90°, select the prefab by using Shift + Right Click and once selected press Shift + D, with your prefab selected you can also move it around in your 3D and 2D view.
Step 6:
Move your prefab around until the gun is visible and it will look something like this:
As we can see in the 3D view, the gun is visible. Also in the XY view we can see that the brushes (the green line and rectangle) are slightly away from the wall, this makes it easier for the player to reach the wallbuy and makes it float a small distance away from the wall.
The final result will look like this:
It seems as if the weapon is "on the wall" even though it floats away from it by a few pixels.
5.2 Mystery box prefab
To add the mystery box to the map we first must make a new prefab, then load that prefab in the map editor and add it to the map.
By default (in my experience) there is no buyable mystery box prefab, hence why we will create our own.
Step 1:
Open the prefab folder in your Mod Tools installation, for me this is:
Make a new folder called "mystery_box_locations"
Step 3:
In this folder, make a new file called "magic_box_start.map" Make sure the file extension is .map and not .txt !
Step 4:
Open the file in a text editor and paste the following code:
Step 5:
Restart the map editor to load the new prefab.
Step 6:
Back in the map editor, open the prefab menu by going to View > Toggle > Prefab pane
Step 7:
In the prefab pane, go to zm > mystery_box_locations and drag the "magic_box_start.map" into the map.
Now after compiling the map, moving it into the game folder and loading it up in game, the mystery box should appear and be fully functional.
By default (in my experience) there is no buyable mystery box prefab, hence why we will create our own.
Step 1:
Open the prefab folder in your Mod Tools installation, for me this is:
G:\SteamLibrary\steamapps\common\Call of Duty Black Ops III 455130\map_source\_prefabs\zm
Step 2:Make a new folder called "mystery_box_locations"
Step 3:
In this folder, make a new file called "magic_box_start.map" Make sure the file extension is .map and not .txt !
Step 4:
Open the file in a text editor and paste the following code:
iwmap 4
"script_startingnumber" 0
"000_Global" flags active
"The Map" flags expanded
// entity 0
{
guid "{60CB4D80-6E09-11EA-81CA-402343626235}"
"classname" "worldspawn"
"lightingquality" "1024"
"samplescale" "1"
"skyboxmodel" "skybox_default_day"
"ssi" "default_day"
"vbloom" "mp_freerun_01"
"vcolor" "mp_freerun_01"
"wsi" "default_day"
"fsi" "default"
"gravity" "800"
"lodbias" "default"
"lutmaterial" "luts_t7_default"
"numOmniShadowSlices" "24"
"numSpotShadowSlices" "64"
"sky_intensity_factor0" "1"
"sky_intensity_factor1" "1"
"state_alias_1" "State 1"
"state_alias_2" "State 2"
"state_alias_3" "State 3"
"state_alias_4" "State 4"
// brush 0
{
guid "{2542056D-6CAA-11EA-81CA-402343626235}"
( 8 0 0 ) ( -64 0 0 ) ( -64 -32 0 ) clip 64 64 381.25 0 0 0 lightmap_gray 16384 16384 384 448 0 0
( -66.75 -30 16 ) ( 5.25 -30 16 ) ( 5.25 -30 0 ) clip 64 64 381.25 0 0 0 lightmap_gray 16384 16384 381.25 0 0 0
( 8 0 16 ) ( -64 0 16 ) ( -64 0 0 ) clip 64 64 381.25 0 0 0 lightmap_gray 16384 16384 384 0 0 0
( 7.75 -8 112 ) ( 7.75 0 120 ) ( 39.75 0 120 ) clip_slick 64 64 -1408 424 90 0 lightmap_gray 16384 16384 384 448 0 0
( -48 -16 120 ) ( -48 0 120 ) ( -48 0 152 ) clip 64 64 381.25 0 0 0 lightmap_gray 16384 16384 0 0 0 0
( 48 0 120 ) ( 48 -24 120 ) ( 48 0 152 ) clip 64 64 381.25 0 0 0 lightmap_gray 16384 16384 0 0 0 0
}
}
// entity 1
{
guid "{AEE94CD7-6CA6-11EA-81CA-402343626235}"
"classname" "script_struct"
"angles" "0 180 0"
"origin" "-0.25 -17.5 15"
"script_noteworthy" "start_chest"
"targetname" "treasure_chest_use"
"zombie_cost" "950"
"_color" "1 0 0"
}
// entity 2
{
guid "{AEE94CD8-6CA6-11EA-81CA-402343626235}"
"classname" "zbarrier_zmcore_MagicBox"
"angles" "0 180 0"
"barrieranimtime" "0"
"model" "p7_zm_der_magic_box"
"origin" "-0.25 -17.5 14"
"script_noteworthy" "start_chest_zbarrier"
"showalternatemodel" "0"
"showupgradedmodel" "0"
"type" "zmcore_MagicBox"
"zbarrierboardanim1" "o_zombie_magic_box_fake_idle_twitch_a"
"zbarrierboardanim2" "o_zombie_magic_box_leave"
"zbarrierboardanim3" "o_zombie_magic_box_close"
"zbarrierboardanim4" "o_zombie_magic_box_teddy_rise"
"zbarrierboardanim5" "o_zombie_magic_box_teddy_rise"
"zbarrierboardmodel1" "p6_anim_zm_magic_box_fake"
"zbarrierboardmodel2" "p6_anim_zm_magic_box"
"zbarrierboardmodel3" "p6_anim_zm_magic_box"
"zbarrierboardmodel4" "tag_origin"
"zbarrierboardmodel5" "tag_origin"
"zbarriernumboards" "5"
"zbarriertearanim1" "o_zombie_magic_box_fake_idle_twitch_b"
"zbarriertearanim2" "o_zombie_magic_box_arrive"
"zbarriertearanim3" "o_zombie_magic_box_open"
"zbarriertearanim4" "o_zombie_magic_box_weapon_rise"
"zbarriertearanim5" "o_zombie_magic_box_weapon_dual_rise"
}
// entity 3
{
guid "{B4FED028-6CA8-11EA-81CA-402343626235}"
"classname" "misc_model"
"angles" "0 270 0"
"model" "p7_debris_wood_plywood_2x8_bowed_dirty"
"origin" "0 -17.5 13"
"umbra_target_only" "1"
"lightingstate1" "1"
"lightingstate2" "1"
"lightingstate3" "1"
"lightingstate4" "1"
"modelscale" "1"
"static" "1"
}
// entity 4
{
guid "{B4FED02B-6CA8-11EA-81CA-402343626235}"
"classname" "misc_model"
"angles" "0 291 0"
"model" "p7_cinder_block"
"modelscale" "1.65"
"origin" "-42 -17.75 6.5"
"lightingstate1" "1"
"lightingstate2" "1"
"lightingstate3" "1"
"lightingstate4" "1"
"static" "1"
}
// entity 5
{
guid "{B4FED02E-6CA8-11EA-81CA-402343626235}"
"classname" "misc_model"
"angles" "0 265.2 0"
"model" "p7_cinder_block"
"modelscale" "1.65"
"origin" "-14 -15.75 6.5"
"lightingstate1" "1"
"lightingstate2" "1"
"lightingstate3" "1"
"lightingstate4" "1"
"static" "1"
}
// entity 6
{
guid "{B4FED031-6CA8-11EA-81CA-402343626235}"
"classname" "misc_model"
"angles" "0 297 0"
"model" "p7_cinder_block"
"modelscale" "1.65"
"origin" "11 -16.75 6.5"
"lightingstate1" "1"
"lightingstate2" "1"
"lightingstate3" "1"
"lightingstate4" "1"
"static" "1"
}
// entity 7
{
guid "{B4FED034-6CA8-11EA-81CA-402343626235}"
"classname" "misc_model"
"angles" "0 226.8 0"
"model" "p7_cinder_block"
"modelscale" "1.65"
"origin" "37 -14.75 6.5"
"lightingstate1" "1"
"lightingstate2" "1"
"lightingstate3" "1"
"lightingstate4" "1"
"static" "1"
}
Step 5:
Restart the map editor to load the new prefab.
Step 6:
Back in the map editor, open the prefab menu by going to View > Toggle > Prefab pane
Step 7:
In the prefab pane, go to zm > mystery_box_locations and drag the "magic_box_start.map" into the map.
Now after compiling the map, moving it into the game folder and loading it up in game, the mystery box should appear and be fully functional.
6.0 Powerups
6.1 Adding a disabled power ups (free perk powerup)
The powerup "free_perk" is normally not part of the pool and therefore does not spawn, an easy way to make it spawn is by editing a file named zm_YOURMAPNAME.gsc which can be found in:
The file should look something like this by default:
We can see that #using scripts\zm\_zm_powerup_free_perk; is already imported, this way the game knows what it is and how to use it but it still won't spawn.
To make it spawn you can add a function that waits until a zombie dies, and then a function that rolls a random chance for it to spawn:
Also make sure to call the first function in your main():
Now the free_perk powerup will have a 5 in 100 chance of spawning, which is similar to the other perks.
This frequency can be changed to make it spawn more often or less often by editing:
Also, to change it's spawn position (for example higher in the air or lower to the ground) you can edit:
Changing the last number (15) will adjust how far off the ground it spawns.
G:\SteamLibrary\steamapps\common\Call of Duty Black Ops III 455130\usermaps\zm_steamguide\scripts\zm\zm_steamguide.gsc
The file should look something like this by default:
#using scripts\codescripts\struct;
#using scripts\shared\array_shared;
#using scripts\shared\callbacks_shared;
#using scripts\shared\clientfield_shared;
#using scripts\shared\compass;
#using scripts\shared\exploder_shared;
#using scripts\shared\flag_shared;
#using scripts\shared\laststand_shared;
#using scripts\shared\math_shared;
#using scripts\shared\scene_shared;
#using scripts\shared\util_shared;
#insert scripts\shared\shared.gsh;
#insert scripts\shared\version.gsh;
#insert scripts\zm\_zm_utility.gsh;
#using scripts\zm\_load;
#using scripts\zm\_zm;
#using scripts\zm\_zm_audio;
#using scripts\zm\_zm_powerups;
#using scripts\zm\_zm_utility;
#using scripts\zm\_zm_weapons;
#using scripts\zm\_zm_zonemgr;
#using scripts\shared\ai\zombie_utility;
//Perks
#using scripts\zm\_zm_pack_a_punch;
#using scripts\zm\_zm_pack_a_punch_util;
#using scripts\zm\_zm_perk_additionalprimaryweapon;
#using scripts\zm\_zm_perk_doubletap2;
#using scripts\zm\_zm_perk_deadshot;
#using scripts\zm\_zm_perk_juggernaut;
#using scripts\zm\_zm_perk_quick_revive;
#using scripts\zm\_zm_perk_sleight_of_hand;
#using scripts\zm\_zm_perk_staminup;
//Powerups
#using scripts\zm\_zm_powerup_double_points;
#using scripts\zm\_zm_powerup_carpenter;
#using scripts\zm\_zm_powerup_fire_sale;
#using scripts\zm\_zm_powerup_free_perk;
#using scripts\zm\_zm_powerup_full_ammo;
#using scripts\zm\_zm_powerup_insta_kill;
#using scripts\zm\_zm_powerup_nuke;
//#using scripts\zm\_zm_powerup_weapon_minigun;
//Traps
#using scripts\zm\_zm_trap_electric;
#using scripts\zm\zm_usermap;
//*****************************************************************************
// MAIN
//*****************************************************************************
function main()
{
zm_usermap::main();
level._zombie_custom_add_weapons =&custom_add_weapons;
//Setup the levels Zombie Zone Volumes
level.zones = [];
level.zone_manager_init_func =&usermap_test_zone_init;
init_zones[0] = "start_zone";
level thread zm_zonemgr::manage_zones( init_zones );
level.pathdist_type = PATHDIST_ORIGINAL;
}
function usermap_test_zone_init()
{
level flag::init( "always_on" );
level flag::set( "always_on" );
}
function custom_add_weapons()
{
zm_weapons::load_weapon_spec_from_table("gamedata/weapons/zm/zm_levelcommon_weapons.csv", 1);
}
We can see that #using scripts\zm\_zm_powerup_free_perk; is already imported, this way the game knows what it is and how to use it but it still won't spawn.
To make it spawn you can add a function that waits until a zombie dies, and then a function that rolls a random chance for it to spawn:
function death_drop_listener()
{
self endon( "disconnect" );
self waittill( "death", e_attacker );
// 5% chance
if ( RandomInt(100) < 5 )
{
zm_powerups::specific_powerup_drop(
"free_perk",
self.origin + (0,0,15)
);
}
}
function watch_zombie_spawns()
{
level flag::wait_till( "initial_blackscreen_passed" );
while(1)
{
a_zombies = GetAIArchetypeArray( "zombie" );
foreach( zombie in a_zombies )
{
if( isdefined( zombie ) && !isdefined( zombie.tracking_death_loop ) )
{
zombie.tracking_death_loop = true;
zombie thread death_drop_listener();
}
}
wait(0.2);
}
}
Also make sure to call the first function in your main():
level thread watch_zombie_spawns();
Now the free_perk powerup will have a 5 in 100 chance of spawning, which is similar to the other perks.
This frequency can be changed to make it spawn more often or less often by editing:
if ( RandomInt(100) < 5 )
Also, to change it's spawn position (for example higher in the air or lower to the ground) you can edit:
self.origin + (0,0,15)
Changing the last number (15) will adjust how far off the ground it spawns.
7.0 Entities
Entities can be placed in your map in the shape of either an object (a tree, car or lamp), they are different from a brush as the entity is based on a model, these entities can also have animations.
An entity can also be something the player cannot see, such as a zombie spawner or a timer.
An entity can also be something the player cannot see, such as a zombie spawner or a timer.
7.1 Creating a zombie spawner using script_struct
Zombie spawners are quite easy and are based on a script_struct entity connected to the info_volume. To make a zombie spawner follow these steps:
Step 1:
In Radiant go to View > Toggle > Entity Browser or simply click B on your keyboard
Step 2:
In the entity browser, use the search bar to find script_struct and place it somewhere in your map, keep in mind that if you place it floating in the air, the zombies might spawn in the air.
Step 3:
Shift + Left click on the script_struct you've placed and look in the Entity Info window, if you don't see this window, find it under View > Toggle > Entity Pane or press N
Step 4:
In the script_struct entity info window, there will be a key called "targetname" which is currently empty, to this key we will need to add the value of your info_volume's target (this is a box that should be surrounding the area you're working in right now)
If you do not know what your info_volume's target name is, check the other zombie spawners in that area!
Step 5:
After changing the targetname value to your info_volume's target, a red line should appear which will go from the spawner to your info_volume
No we need to add two KVPs, KVPs can be added using the "Add KVP" button in the entity info window. We will make one with the key "script_noteworthy" and the value "riser_location" and the second with the key "script_string" and the value "find_flesh"

In the image you can see i have selected the script_struct and changed the keys and values as described in the entity info window, you can see that my info_volume's target is called "start_zone_spawners"
Step 1:
In Radiant go to View > Toggle > Entity Browser or simply click B on your keyboard
Step 2:
In the entity browser, use the search bar to find script_struct and place it somewhere in your map, keep in mind that if you place it floating in the air, the zombies might spawn in the air.
Step 3:
Shift + Left click on the script_struct you've placed and look in the Entity Info window, if you don't see this window, find it under View > Toggle > Entity Pane or press N
Step 4:
In the script_struct entity info window, there will be a key called "targetname" which is currently empty, to this key we will need to add the value of your info_volume's target (this is a box that should be surrounding the area you're working in right now)
If you do not know what your info_volume's target name is, check the other zombie spawners in that area!
Step 5:
After changing the targetname value to your info_volume's target, a red line should appear which will go from the spawner to your info_volume
No we need to add two KVPs, KVPs can be added using the "Add KVP" button in the entity info window. We will make one with the key "script_noteworthy" and the value "riser_location" and the second with the key "script_string" and the value "find_flesh"
In the image you can see i have selected the script_struct and changed the keys and values as described in the entity info window, you can see that my info_volume's target is called "start_zone_spawners"
8.0 Miscellaneous
8.1 Disabling the dog round
During testing, i came across several dog rounds that didn't actually spawn any dogs, rather than figuring out why i figured out how to disable it. To disable it in your map follow these steps:
Step 1:
Open your GSC file in any text editor, for me it is located in:
Find your main function which should look something like this:
Within this main function, add the following line:
Make sure it is added before the "zm_usermap::main();" line as shown in the example!
Step 4:
Repeat the same steps for the CSC file which is in the same directory as the GSC file:
Again, make sure it is added before the "zm_usermap::main();" line
Step 5:
Now compile your map and play it until round 6 to make sure they no longer spawn.
Step 1:
Open your GSC file in any text editor, for me it is located in:
G:\SteamLibrary\steamapps\common\Call of Duty Black Ops III 455130\usermaps\zm_steamguide\scripts\zm\steamguide.gsc
Step 2:Find your main function which should look something like this:
function main()
{
zm_usermap::main();
level._zombie_custom_add_weapons =&custom_add_weapons;
//Setup the levels Zombie Zone Volumes
level.zones = [];
level.zone_manager_init_func =&usermap_test_zone_init;
init_zones[0] = "start_zone";
level thread zm_zonemgr::manage_zones( init_zones );
level.pathdist_type = PATHDIST_ORIGINAL;
}
Step 3:Within this main function, add the following line:
level.dog_rounds_allowed = false;
Your main function now will look something like this:function main()
{
level.dog_rounds_allowed = false;
zm_usermap::main();
level._zombie_custom_add_weapons =&custom_add_weapons;
//Setup the levels Zombie Zone Volumes
level.zones = [];
level.zone_manager_init_func =&usermap_test_zone_init;
init_zones[0] = "start_zone";
level thread zm_zonemgr::manage_zones( init_zones );
level.pathdist_type = PATHDIST_ORIGINAL;
}
Make sure it is added before the "zm_usermap::main();" line as shown in the example!
Step 4:
Repeat the same steps for the CSC file which is in the same directory as the GSC file:
G:\SteamLibrary\steamapps\common\Call of Duty Black Ops III 455130\usermaps\zm_steamguide\scripts\zm\steamguide.csc
Again, make sure it is added before the "zm_usermap::main();" line
Step 5:
Now compile your map and play it until round 6 to make sure they no longer spawn.
9.0 Compiling/ building the map
Please following these steps VERY CAREFULLY! otherwise the map will not work.
Step 1:
In the Black Ops III Mod Tools Launcher, select the map you wish to compile and select the compiling options, for the guide i will select all options with "Compile" on "Full" and "Light" on "Full".
To compile the map, press the build button.

Step 2:
After pressing the button the map should start compiling/ building. Read the console to see the process of the compiler, when it is done compiling it should look something like this:
For me personally, selecting the option "Run" in the compiler does not work, to run the actual map it will need to be moved into the games folder as described in 9.1
Step 1:
In the Black Ops III Mod Tools Launcher, select the map you wish to compile and select the compiling options, for the guide i will select all options with "Compile" on "Full" and "Light" on "Full".
To compile the map, press the build button.
Step 2:
After pressing the button the map should start compiling/ building. Read the console to see the process of the compiler, when it is done compiling it should look something like this:
[22:19:10] DEBUG: Total allocations 231642, peak 8917 (size 2 MB 862 kB 207 B)
done: 0m20.74s
Linking "en_zm_steamguide" (usermaps\zm_steamguide stable 3421953 v593):
processing...
done: 0m2.00s
"Linking" in this case is the final stage of the compiler, after this the map is done compiling.For me personally, selecting the option "Run" in the compiler does not work, to run the actual map it will need to be moved into the games folder as described in 9.1
9.1 Loading the map into BO3 from the Mod Tools
To load the map into the game for playtesting it will need to be moved to the game's folder.
Note! this has to be done every time after you've made changes to your map and compiled it!
For me my game is installed at:
Make a new folder in your base game directory named "usermaps"
Move the map folder from your Call of Duty: Black Ops III Mod Tools to the newly created usermaps folder:
To actually play the map a "usermap.info" file will need to be created inside your map folder:
Note! this has to be done every time after you've made changes to your map and compiled it!
For me my game is installed at:
G:\SteamLibrary\steamapps\common\Call of Duty Black Ops III
And my Call of Duty: Black Ops III Mod Tools is installed at:G:\SteamLibrary\steamapps\common\Call of Duty Black Ops III 455130
Step 1:Make a new folder in your base game directory named "usermaps"
G:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\usermaps
Step 2:Move the map folder from your Call of Duty: Black Ops III Mod Tools to the newly created usermaps folder:
Copy
G:\SteamLibrary\steamapps\common\Call of Duty Black Ops III 455130\usermaps\zm_steamguide
To
G:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\usermaps
The final folder should look like:G:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\usermaps\zm_steamguide
Step 3:To actually play the map a "usermap.info" file will need to be created inside your map folder:
G:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\usermaps\zm_steamguide\usermap.info
Open this file with any text editor and add the following text:mapName "zm_steamguide"
title "Test Map"
description "My custom BO3 map."
isZombieMap 1
maxPlayers 4
isModMap 0
Make sure to change it based on your map name and save it as a .info file (not .txt)
9.1.1 Scripting step 9.1
Instead of manually deleting and moving the files around every time a simple Powershell script can also be used, this means all you need to do is run the script and then load up the map after compiling to see the changes you've made.
Step 1:
Create a new files in any directory and call it script.ps1, make sure the extension is ".ps1" and not ".txt" for example.
Step 2:
In this file paste the following code:
Step 3:
Change the variables in the top of the code to match the following:
Dir A: Your game map folder
Dir B: Your Mod Tools map folder
Step 4:
To actually execute the script you may need to change the execution policy on your PC, please google how to do this.
After changing these settings, right click on the script.ps1 file and press "Run with PowerShell"
Step 1:
Create a new files in any directory and call it script.ps1, make sure the extension is ".ps1" and not ".txt" for example.
Step 2:
In this file paste the following code:
# --- Configuration Variables ---
$DirA = "G:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\usermaps\zm_field"
$DirB = "G:\SteamLibrary\steamapps\common\Call of Duty Black Ops III 455130\usermaps\zm_field"
$LogFile = Join-Path $PSScriptRoot "mover.log"
# Function to log both info and errors
function Log-Message ($message) {
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
"[$timestamp] $message" | Out-File -FilePath $LogFile -Append
}
try {
# Initialize the log file
Log-Message "Script started."
# --- STEP 1: Empty Directory A (Or create it if it doesn't exist) ---
if (Test-Path $DirA) {
# Fetch all files and folders inside DirA
$ItemsInA = Get-ChildItem -Path $DirA -Recurse
# Filter out 'usermap.info' so it is completely ignored and safe
foreach ($item in $ItemsInA) {
if ($item.Name -eq "usermap.info") {
continue
}
if (Test-Path $item.FullName) {
try {
# If it's a directory, ensure usermap.info isn't inside it before deleting
if ($item.PSIsContainer) {
$hasProtectedFile = Get-ChildItem -Path $item.FullName -Recurse -Filter "usermap.info"
if ($hasProtectedFile) {
# Contains usermap.info, skip deleting this folder root
continue
}
}
Remove-Item -Path $item.FullName -Recurse -Force -ErrorAction Stop
} catch {
Log-Message "ERROR: Failed to remove $($item.FullName). Details: $_"
}
}
}
} else {
try {
# If Directory A doesn't exist, create it cleanly
Log-Message "Directory A did not exist. Creating directory: $DirA"
New-Item -Path $DirA -ItemType Directory -Force -ErrorAction Stop | Out-Null
} catch {
Log-Message "CRITICAL ERROR: Failed to create Directory A. Details: $_"
Exit
}
}
# --- STEP 2: COPY everything from Directory B to Directory A ---
if (Test-Path $DirB) {
$ItemsInB = Get-ChildItem -Path $DirB
foreach ($item in $ItemsInB) {
try {
# Copy-Item is used here with -Recurse to safely clone everything to DirA
Copy-Item -Path $item.FullName -Destination $DirA -Recurse -Force -ErrorAction Stop
} catch {
Log-Message "ERROR: Failed to copy $($item.FullName) to $DirA. Details: $_"
}
}
Log-Message "Script finished successfully. Files copied from B to A."
} else {
Log-Message "ERROR: Directory B does not exist: $DirB"
}
} catch {
Log-Message "CRITICAL ERROR: $_"
} finally {
# Force the script to close out completely so the window doesn't hang
[Environment]::Exit(0)
}
This code will do the following:- Check if the map folder exists in your game and if not, make one
- Delete existing map files from your game (except usermap.info
- Move new files from your Mod tools into the game
- Log the entire process into a mover.log file
- Close itself
Step 3:
Change the variables in the top of the code to match the following:
Dir A: Your game map folder
Dir B: Your Mod Tools map folder
Step 4:
To actually execute the script you may need to change the execution policy on your PC, please google how to do this.
After changing these settings, right click on the script.ps1 file and press "Run with PowerShell"
9.1.2 Starting the game with the map automatically
If you're repeatedly opening the map after compiling to see the changes you've made it might be annoying having to sit through the loading screen, selecting zombies > solo game > and your map.
An easy solution for this is adding some launch options to your game to skip all of that and load up your map.
Step 1:
Open your steam library and find your game, right click on it and open properties.
Step 2:
Under general, set the launch options to the following parameters:
Make sure to change the "zm_steamguide" to your own map name!
Step 3:
Now you can start your game and it will load your map right up skipping all the intro parts and menus.
You can also add this to your script from section 9.1.1, just ask an AI to edit your script to make it launch the game after it has finished moving the files (or write it yourself, of course)
An easy solution for this is adding some launch options to your game to skip all of that and load up your map.
Step 1:
Open your steam library and find your game, right click on it and open properties.
Step 2:
Under general, set the launch options to the following parameters:
+set ai_disableSpawn 0 +set developer 2 +set logfile 2 +set scr_mod_enable_devblock 0 +set splitscreen 0 +set splitscreen_playerCount 0 +set fs_game zm_steamguide +devmap zm_steamguide
Make sure to change the "zm_steamguide" to your own map name!
Step 3:
Now you can start your game and it will load your map right up skipping all the intro parts and menus.
You can also add this to your script from section 9.1.1, just ask an AI to edit your script to make it launch the game after it has finished moving the files (or write it yourself, of course)
9.2 Playing the map
This is probably the easiest part.
If you've followed all steps so far, you should be able to just load up the game, go to zombies and select your map from the map list.
A mod does not need to be loaded to load your map.
If you've followed all steps so far, you should be able to just load up the game, go to zombies and select your map from the map list.
A mod does not need to be loaded to load your map.
10.0 Publishing to the Steam Workshop
After your map is finally done it can be published to the workshop for others to play.
Step 1:
Open Call of Duty: Black Ops III Mod Tools and select your map.
Step 2:
Press the "Publish" button in the toolbar to open the publishing window. Give your workshop item a title, a description and choose a category (probably "Map"), optionally you can also add a thumbnail.
Step 3:
After it has finished uploading to the workshop a pop up will appear asking if you want to open the workshop page and see your item.
By default your item is hidden, but you can publish it whenever you like.
Step 1:
Open Call of Duty: Black Ops III Mod Tools and select your map.
Step 2:
Press the "Publish" button in the toolbar to open the publishing window. Give your workshop item a title, a description and choose a category (probably "Map"), optionally you can also add a thumbnail.
Step 3:
After it has finished uploading to the workshop a pop up will appear asking if you want to open the workshop page and see your item.
By default your item is hidden, but you can publish it whenever you like.
11.0 Debugging your map
If your map doesn't load up or throws an error when loading up please read the following sections.
11.1 Client field mismatch debugging
In this scenario i was working on some maps and for some reason all of them would compile fine but throw a client field mismatch error when loaded up. To figure out the actual problem i enabled logging and used the log files to find the error.
Step 1:
With your game open, go to Zombies > Solo Game > and select your map from the list
Step 2:
After getting the client field mismatch error, in the menu open the console by pressing the tilda key "~".
Step 3:
In the console type the following command and press enter:
Step 4:
With developer mode on, load up your map again and wait for it to place you back in the main menu with the client field mismatch error.
Step 5:
a log file should be located at in your mods/usermaps folder, which for me is:
Step 6:
Scrolling through this file may give some clues as to why we're getting the error, for example:
Step 1:
With your game open, go to Zombies > Solo Game > and select your map from the list
Step 2:
After getting the client field mismatch error, in the menu open the console by pressing the tilda key "~".
Step 3:
In the console type the following command and press enter:
/developer 2
Step 4:
With developer mode on, load up your map again and wait for it to place you back in the main menu with the client field mismatch error.
Step 5:
a log file should be located at in your mods/usermaps folder, which for me is:
G:\SteamLibrary\steamapps\common\Call of Duty Black Ops III\mods\usermaps
Step 6:
Scrolling through this file may give some clues as to why we're getting the error, for example:
[ 95803][ ] -----------------------------------
[ 95811][ DB] Error: Could not find rawfile "gamedata/constbaselines/zm/bl_little_endian_zm_steamguide_zclassic.bin".
[ 99740][ ] execing gamedata/configs/zm/ragdoll.cfg from fastfile
[ 99741][ BGCACHE] Client: Registering configstring index 3241 with data yȂ
[ 99886][ BGCACHE] Client: Registering configstring index 3241 with data yȂ
[ 99898][ DB] Error: Could not find cgmediatable "cgmedia_zm_steamguide".
[ 99898][ DB] Error: Could not find fx "weapon/fx_trail_rocket_multi_lob".
[ 99902][ DB] Error: Could not find rawfile "vision/zm_steamguide.vision".
[ 99902][ DB] Error: Could not find leaderboarddef "lb_zm_map_steamguide_1player".
[ 99917][ ]
====================================================
Com_ERROR: Server Disconnected - Clientfield Mismatch.
Check host TTY output for client & server clientfield registration details.
====================================================
[ 99929][ ] execing gamedata/configs/zm/ragdoll.cfg from fastfile
[ 99931][ ] ==== ShutdownGame (1) ====
[ 99946][ ] Starting up server with abort_on_error TRUE
[ 99946][ ] Starting up server with developer TRUE
[ 99958][ DB] Unloading assets from fastfile 'zm_steamguide' and creating default assets stubs
[ 99972][ SOUND] SOUND Removing Bank 0 zm_steamguide.all
[ 99990][ DB] Unloading assets from fastfile 'en_zm_steamguide' and creating default assets stubs
[ 99990][ ] Removed xpak file: zm_steamguide
[ 99990][ ] Removed xpak file: en_zm_steamguide
[ 99994][ SOUND] SOUND Removing Bank 1 zm_steamguide.en
12.0 F.A.Q
Do i always need to move the map files from the Call of Duty: Black Ops III Mod Tools to the game folder after i've compiled it?
Yes, without this the new map or changed map can't be loaded by the game.
Yes, without this the new map or changed map can't be loaded by the game.
This guide was created by its original author on the Steam Community. Are you the author and want it removed? Request removal.