Battlezone: Combat Commander

Battlezone: Combat Commander

Not enough ratings
Basic Guide to Creating a Functional Ship (model with textures) and Basic Intro to RV Creation.
By Rocket3497
This guide will show you how to create a basic hovertank with fin and loop animations, I will show you how to make a basic texture and how to make the ship's icon and wireframe files. This is meant to be a simple introduction to modding for BZCC and doesn't go too far in-depth, but is meant to cover a little bit of everything to give you the basics of how to mod BZCC.

I cover a little bit of how to create a Recycler Variant, enough information that will get you started on creating your own RV's.

I will also show you how to upload your finished RV to the Steam Workshop for all to see!

I look forward to seeing YOUR MOD on the Steam Workshop!
   
Award
Favorite
Favorited
Unfavorite
Introduction and Getting Set Up.
I use 3ds max and photoshop, there are other tools you can use, and here's a webpage of bz modders showing what may be needed, I recommend reading this guide first and make the decisions as to what you wish to use later. (or you can follow along if you have the tools ready right now)

https://bzforum.matesfamily.org/viewtopic.php?f=16&t=51

First thing you will need to do is create an 'addon' version to play around in, so that you don't mess up your own version of Battlezone. (bad assets problem in Multiplayer)

Step 1: Getting your 'Mod' version of the game set up so that you can start modding safely.

Go to your BattleZone directory, (where the installation of BZ is located)

Example: C:\Program Files (x86)\Steam\steamapps\common\BZ2R

copy bzone.cfg and put the copy in the same folder that the original resides and rename the copy to whatever you want, example: mymod.cfg

inside mymod.cfg (open with wordpad or whatever text-viewing app you use that will allow you to resave as a .CFG when you hit save) (once you have an app that you like and it will save as a .cfg when you hit the save button, don't be afraid to tell the computer to always use this program to open this type of file, this way you can just double click on a .cfg file next time and you won't get the 'I don't know what to open this with' message)

you will find this code line:

AddDirRecurse("@mydocsdir\addon"); //overrides

copy this line and paste it above itself, it should now look like this:

AddDirRecurse("@mydocsdir\addon"); //overrides
AddDirRecurse("@mydocsdir\addon"); //overrides

now change the top line to read whatever you wish to call the location you are modding:

AddDirRecurse("@mydocsdir\myaddon"); //overrides
AddDirRecurse("@mydocsdir\addon"); //overrides

Now your mod folder will be called myaddon, adding this code line will make your modding version of bz able to use the assets that you create.

Save the file (it must be a .cfg still after you save it)

Now you will need to create the folder where your modding stuff will reside, head to:

C:\Users\YOUR USER\Documents\My Games\Battlezone Combat Commander

and create a new folder there and title it the name of your mod folder that you decided on in the mymod.cfg which is in this case: "myaddon" without the quotes of course.

all of your modding stuff will go into this folder, so for easy access, create a shortcut to this folder on your desktop so that you don't have to dig for it when you wish to place files into it or to change something.

now head back over to your BZCC directory (I keep a shortcut of it on my desktop of this as well)

C:\Program Files (x86)\Steam\steamapps\common\BZ2R

right click on battlezone2.exe and send a new shortcut to the desktop, this shortcut will allow you to use the game with your assets overlayed on top of the stock assets. (this is the reason that we placed myaddon directory ABOVE the addon directory inside the mymod.cfg file, the computer will read the file from top to bottom in order and use YOUR files first, this way whatever you put into your mod folder will override anything that is already in the game.)

if you already have a shortcut of BZCC on your desktop it will simply add number, likely a (2) onto the end of the name of the shortcut. take this shortcut and rename it to whatever you wish to differentiate between it and your regular version of BZCC, as long as you know which BZCC you are going to be clicking on later.

right click on your modded version of the BZ shortcut that you just created and go to properties

go to the box where it states the target of the shortcut, example:

Target: "C:\Program Files (x86)\Steam\steamapps\common\BZ2R\battlezone2.exe"

go to the end of the target we'll add our config file here, example:

"C:\Program Files (x86)\Steam\steamapps\common\BZ2R\battlezone2.exe" /config mymod.cfg

you just go to the end, past the quotes, and hit space and type /config and then space again, and type the name of your config file, in this case, mymod.cfg

Hit the 'Apply' button and hit OK

Congratulations, you have successfully created a version of BZCC that you can mod without affecting your regular installation of BZ and causing yourself asset bugs in Multiplayer.

Now you will be able to get into your modded executable file to access your content ingame. Whenever you go to use your modified version of the shortcut, you will get a dialog on Steam, you MUST click OK on the dialog box, otherwise it won't let you get into the game, it is just a security feature that steam has to prevent your game from being modified without your permission.
Creating your Model (Part 1)
I use 3ds max for my models and photoshop for textures so if you use something else, hopefully the information I have for you will still be helpful to you.

First we will create some geometry, I usually start with a box with several segments.
once you have selected an amount of segments that you think is a good bare minimum starting point, being sure that there is a segment dead center of the geometry lengthwise, this way we can use a symmetry modifier that will allow us to mirror the geometry from one side to the other without having to model both sides, unless you are creating an asymmetrical piece of geometry.

decide which is to be the front of the ship and make it point in the negative Y axis, so green arrow in the bottom left will point behind the ship, red will be left, and blue is up.

right click on the object and convert it to an editable poly

select one side of the 'ship' and delete it, now go to your list of modifiers and select symmetry, (list of modifiers is directly under the name of the object on the right hand side)

Always remember to name your objects, it will make finding them a lot easier when you have more objects in a scene, or even if you don't have very many.

play with the symmetry modifier until you see a full box again.

once you have a full box again (symmetry modifier is working properly) you can now go back to the editable poly and start modeling.

before we go any further, make sure your ship is "zeroed" meaning, the 'center' of your ship is lined up with the center line of your 3d program, this way it will be easier to 'mirror' stuff over and just basically get everything centered so that stuff doesn't get wonky on us.

Use the vertex select, edge select, and polygon select tools to start with, represented with 3 dots for the vertex select, when you have this clicked down, you can manipulate the individual points of a piece of geometry, with the edge tool, you will select two vertices at once and manipulate the edge that lies between them, and the polygon tool will give you control of a polygon face which can consist of multiple edges and vertices. (hover your mouse over a tool to gain additional information or the name of that tool.)

when you have a geometry selection tool activated, use tools inside the edit geometry tab below for all sorts of geometry manipulation.

When you are completely done modeling the ship itself, you can add some additional objects to it, we can create some guns or whatever you want, it's all up to you.

make sure that you do NOT use the scale tool, if you do, battlezone will reset the scale back to where it was at 100% scaling. (if you must scale something, do it in edit poly mode by selecting the entire object's vertices or faces and scaling it to what you want, this will not affect the base scale of the object)


I've placed some fins at the back of my model so that we can get some cool fin animations in there, as well as an idle animation with a rotating gatling gun barrel on the side.


I also modeled out a place for our ingame thrusters so that we get flames at the back of the ship when we put it into BZ.

we have 2 pieces of geometry for our cannons that are separate objects, we will name these recoil_1 and recoil_2, we will use these in our ODF later to make the game recoil our cannons whenever we fire them.

So in order for you to mirror over any objects to the other side of the geometry, it is a bad idea to just use the mirror tool by itself, because, it messes up the scaling of the object, making it have a scale of -100% and when put ingame, bz automatically resets the scale, so the scale is 100 percent again, a workaround for this if you must use the mirror tool is to create a new object and attach the objects that you mirrored to it, this will give them the same scaling as the object they were attached to, now all you have to do is detach them again.

You can view the scale of an object by selecting it and hitting R, you will see three number boxes at the bottom of your screen, these should say 100, if they don't, your scaling for that object is messed up, you can reset the scale of an object by going to the hierarchy tab and selecting 'affect pivot only' and going to the reset > scale button if this doesn't work, use the predescribed method. (watch for -100 and any other numbers that aren't 100)

Now we are going to create our hardpoints, battlezone only allows for five weapon hardpoints, so for our awesome gatling gun tank, we are going to need a gun and two cannons (different I know right) and a special. But, on top of these, we will need our hardpoints for several other things that the game needs for our ship. Here's the hardpoints we will need

hp_com
hp_eyepoint
hp_cannon_1
hp_cannon_2
hp_gun_1
hp_special_1
hp_light_1
hp_light_2
hp_smoke_1
hp_moresmoke_2 (moresmoke starts at 2 and you can also do more all the way up to 9 if you make a huge ship that will need lots of damage effects across it)
hp_dust_1 (placed towards the rear under the ship for the ingame dust effects)

(other hardpoints that you could use are hp_rocket_# hp_mortar_# hp_hand_# and i'm sure there are many more, you can reference .ODF files for bz objects if you wish to find more.)

hp means hardpoint, com refers to communication, the pivot point of the hardpoint geometries is where exactly the game engine will reference, this is very important as it can make the difference between your gun shooting where it's supposed to shoot out of and it shooting out of behind or in front of it, so knowing where the pivot of the hardpoint is, is crucial to proper placement.

hp_eyepoint is where you see from inside the ship, it is also the location of where the snipe light will be located when the ship is to be sniped, so it should be located where the cockpit is.

so for these hardpoints we will need some simple geometry, we will make some small cones with 4 base segments and minimal other segments.


We will now duplicate this object and name each cone with the names of the hardpoints that I already mentioned above, we will have 11 total hardpoints for this ship. (I always change the color of hardpoints to green so they stand out a little bit)

To duplicate, select the object you wish to duplicate and shift-drag the object a little ways, a dialog box will pop up with some additional parameters you can change, just go for copy and select 10, this will create the additional 10 copies we need, making for the total of 11.

smoke is where the game will render the damage effects on the model ingame, moresmoke_2 is just an additional hardpoint for even more damage effects, our tank is super awesome, so we really want lots of smoke for some random reason.

Select all of the hardpoints and rotate them so that they are pointing forward in relation to the ship. (quick tip, you can use angle snapping, 'A' on keyboard to turn on angle snapping, to make your rotations at 5 degree increments to make your life easier)

proceed to place all of the hardpoints in their correct locations, if you have separate geometries such as guns, you can use the align tool at the top of your screen, the icon is two boxes with a red line under them, use this tool to help you get a hardpoint close to where you need it to be, then slide it into position.
Creating your Model (Part 2)
The reason we are using cones with 4 sides is because cones have very little geometry and the pivot point is automatically placed at the base of the object, meaning, wherever the base of the cone is located, that is where the game will spawn anything that is supposed to come from that hardpoint, such as the smoke effect, or guns shooting, or the com line drawn towards the 'center' of the ship. the reason we choose 4 sides is because more sides is a waste of memory, seeing as these objects will not be rendered ingame, and less segments will make it confusing to us when we are trying to place the cones because the pivot doesn't appear to be exactly in the center of the base when we use a 3 sided cone.

What I'm going to do now is create our flames at the back of the ship, to do this, simply select the inside polygon of your thrusters (the thrusters on the back of your ship should indent with a single polygon in the center) and shift-drag it out and set it to detach as an object. we will name this single polygon flame_1__h and get it set between the mouth or ridge of the thruster and the far inside, this plane will represent where the flames are to come out of ingame. once we are happy with the size and shape and location of our plane, we will copy it and name the copy flame_2__h and place it in position where our second thruster will be. (it is not necessary to use a single polygon, it is important however that your flame_#__h geometry is FLAT, otherwise battlezone will flatten it for you.)

now that all of the hardpoints are exactly where we want them, hit 'H' to bring up the Select From Scene window, this window displays all objects in your scene, select all objects except for the main body of the ship and hit OK.

now use the select and link tool in the top left corner of your screen, the icon is two boxes with red rubber bands between them select this tool. Single click on one of the many objects you have selected and drag and drop onto the main body of the ship, you should have first seen a bunch of dashed lines, and then when you let go on the main ship, you should have seen it flash a box around the body of the ship for a second, this means the link was complete, you can double check this when you hit H and you will see all the objects in our scene have lines drawn to our ship's main body meaning they are linked to it. (this means wherever we drag our ship body (parent) that's where it's children will go.)

a quicker way of linking our objects would be to click on the main body of our ship and then when it is selected, hit ctrl-i to invert the selection, then we can use the select and link tool to link everything up.

Now that everything is linked to the main body of the ship, whenever we move the ship, all the components come along with it, this way when we put the ship ingame, everything will be located properly, if something isn't linked up, it will not be located where it is supposed to be. (it should align its pivot with the pivot of the ship's main body, essentially it will be eaten by the ship but will still exist)

You should already have your ship facing the correct direction as described earlier. (Y axis behind, X axis left, Z axis up. a.k.a: green behind, red left, blue up.)

Now we need to get our pivot points rotated to what they should be. Select all objects in your scene that do not have a very special pivot point orientation. What i mean by this, is if you have a fin or other object that has a pivot point that you have carefully placed and orientated that you plan on animating later, don't select those objects now, we are about to reset our pivot points so it will mess up any pivots you have already rotated to what you want them to be. (pivot points are the hinge points of objects that you wish to rotate)

that being said, select all other objects in your scene (if this is your first ship, just select everything, you will understand soon if you don't already) and go to the Hierarchy tab, this is located at the top right area of your screen, above the name of the objects you have selected (so if it says 24 objects selected where the name is normally located, this is still what i'm talking about) you will see several icons: a mouse pointer, a blue rainbow a box with strings to other boxes, a tv screen, and a hammer.

select the box with strings to other boxes icon, this is the Hierarchy Tab.

(have all objects that need pivots reset selected already)

select 'Affect Pivot Only'
hit 'Align to World'

you may or may not see a change (you probably will), in any case we are done resetting the pivot points of our ship's geometries and hardpoints. (without resetting pivot points to what they should be, green back, red left, blue up. the ship and/or its parts may be orientated 'incorrectly')

This scheme of y-axis back x-axis left and z-axis up may be only specific to MAX so if you're using a different program it may be different.

UVW Unwrapping Our Model (Part 1)
now we need to texture our model, to do this, you will need a program that you can create textures in. I like to use Photoshop for all my textures, you can use whatever program you want, but you will need some special tools.

You will also need bz2DXTGEN for your diffuse map and icons amongst other things.

https://bzforum.matesfamily.org/viewtopic.php?f=16&t=51&start=30

BZ2DXTGen_v31 is on this page, posted by GSH. (this is the latest version that i know of)

.dxtbz2 files are simply an image format created for battlezone so that other people can't steal your awesome textures that you spent weeks making, there are no .dxtbz2 file viewers that i know of. (if one existed it would destroy the whole point of converting to .dxtbz2)

Now we are going to UVW Unwrap our model

Be sure that you are happy with everything about your model now before we do this, once you are happy with the way your model looks, proceed.

So first thing we need to do is select our main body geometry and click on the editable poly in the window, with editable poly selected, go into the modifier list and select Unwrap UVW. (make sure that you have done exactly this and do not have the symmetry modifier selected when you select Unwrap UVW, otherwise you will just make unnecessary work for yourself)

and now you're done texturing..... well, i wish it was that easy, but it's not. Texturing is a lot of work, but the best textures are the ones that you spend the most time perfecting, if you put as much detail as you can into both the texture and the geometry, you can make photo realistic objects, we are starting out simple here though, so we'll try not to get too crazy. (as you may already be able to tell with my super simple model)

Before we go any further.... Have you SAVED your work? NEVER forget to save, and also never constantly save over top of another file, if you have saved every time to the same file, and it becomes corrupted, you will lose all your work, which could be any number of hours, days or even weeks of work lost, so be sure to use the + in the save window when you save, this will create incremental saves so that you will not be holding all of your work in a single file that could become corrupted and you lose all of your work.

Ready? hit the big 'Edit...' button in the Unwrap UVW modifier you will get your UVW map 2d viewport on screen, what you will do with this is, select "polygons" in the 'selection modes' menu at the bottom of this window, and then in your regular viewport select the polygons of your model. I'm not going to cover much info here, but i'll give you enough to get by without having to do further research, although if you haven't 3d modeled or textured before, i've probably already left you in the dark awhile back.

I'm going to select polygons using my polygon selector and once i got the top and front areas of my ship selected (specific to what you're working on, totally up to you.) i'm going to hit 'Quick Planar Map' button in the Unwrap UVW map parameters dropdown on the right hand side. this gives me this:


Use middle mouse button to move around and zoom in and out inside the 2d window, and move this piece off to the side away from the other geometry pieces, you will probably need to 'relax' the piece as well, go to the tools dropdown and select 'relax...' you will get the relax tool window, first hit apply with edge angles selected in the window, and then select face angles in the dropdown and relax it that way too, this is what i usually do, if doing either of these messes it up, you will probably have to do whatever 'relaxing' by hand by moving the vertices in the UVW coordinates to where you believe they should be (you can also select smaller portions and relax it bit by bit, you can also turn up or down the relax amount and adjust other settings for the relax tool in it's window).

If this is your first bz ship and it's not complex, the relax tool will probably work just fine without adjustment.

Make sure that whatever you have selected is somewhat all on the same side, as you can see, i selected only the front and top of the ship, these polygons are all very similar in angle to one another, meaning that a 'quick planar map' is going to do a good job, or at least it should.

once you have the UVW coordinates relaxed and have placed that piece of geometry off to the side out of the way, work on all other parts of your ship until the whole thing has been UVW mapped...

now that you've mapped all the parts of your ship, select the dropdown menu in the top right of the 'Edit UVW's' window and select the checker pattern (yes you have to click on it even though it is already selected) it will now display a checker pattern on the ship, circle around and look at it to make sure that all of the checkers are about the same size, this is to help us out when it comes to texturing, we want the pixel density of our texture to be relatively the same all over our ship so that parts of it don't look out-of-place. (you can hit F2 to turn on and off selected-face highlighting for when you are selecting polygons)

select and scale geometry pieces until the checkers are all about the same size across the ship.

Now take all pieces and fit them into the center box in the center of the UVW viewport. (scale as needed, but not too much, all pieces should be close to the size that they should be in relation to the other pieces, remember they are flattened out, so take that into account.)
See how both top and bottom pieces are fit nicely into the center box? this is important as the next step will be rendering this as a UVW template so that we can make our texture. (anything outside this center box will not be rendered in our UVW Template.)

go to the tools dropdown in the window and select 'Render UVW Template' select the width and height that you desire, make sure that it is power size, meaning a multiple of 2, so that means: 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192 and so forth, however, we really don't need such a huge texture, we're going to make it 1024 x 1024 for example purposes, but it's a good idea to make your textures in 2048 square or 4096 square for a battlezone ship and scale it down afterwards, why? well, because if you make a texture small, like 512x512, and later you decide that it is too pixelated, you CAN NOT scale it up, it won't do you any good, you can only scale it down, so it's a good idea to start with a texture size that you're sure is more than big enough (4096 square or 2048 square if your computer isn't new, depending on what it can handle) and scaling it down from there if necessary.

So once you have the width and height that you desire selected, make sure that visible edges is checked, and seam edges is checked.

hit 'Render UV Template' and you'll get a nice image of what it looks like, save this off as a .bmp or your preferred file type that your texturing program will recognize. (use the little floppy disc symbol in top left corner to save)

okay.... So you are ABOUT to save it, do you have on your computer a folder that you will be keeping ALL of your textures, because, believe me, once you start, it will get full quickly, and stuff gets messy quickly if you're not organized. My advice is to start a DESIGNATED folder where you will keep all of your textures forever, and create folders and subfolders for each project, keep your stuff organized so you can find it and make your life easier for yourself. (just don't forget to back up your 3d files and textures you create every couple of months, you don't want to lose them!)
UVW Unwrapping our Model (Part 2)
once you have a location for your file to go into, we'll title it ivmyship_uvw and we'll save it as a .bmp and save it as RGB 24 bit (16.7 Million Colors) now we'll open it up in photoshop or your preferred texture creation program and create our texture using the UVW as a guide.

It is extremely important at this point to SAVE your work (in max), DO NOT attempt to get into editable poly after this point, if you do, do so at your own risk and save before you try, it is very common for max to LOSE your texture coordinates (all the UVW mapping you just did) once you start playing with the model geometry after you've designated your texture coordinates, so let's not do that. If you must modify your model after you've started UVW Unwrapping it, you can 'Collapse To' the Unwrap UVW modifier by right clicking on it and selecting 'Collapse To' which usually works out just fine, just make sure you save before you try collapsing it though.
Creating a Diffuse Texture
What I like to do in photoshop at this point is to create a new series of new layers, please determine how many layers you will need and what sort of appearance each layer will make and where it should be in the hierarchy (which one is above, or painted overtop the other).

we will be doing at least 6 additional layers

at the top we will have our lights
beneath the lights we will have our grime simulator
below the grime is the regular armor
below regular armor is grey armor
below grey armor is cockpit
below cockpit is base black
and of course our UVW is at the bottom

To create a layer hit the little quadruple horizontal line icon to the right of the layers, channels, and paths tabs.

use the [ ] buttons on your keyboard for basic brush sizing, there is also a more complex brush adjustment window accessible in the top left of your screen, using clicking in conjunction with shift will draw straight lines.

so we'll create a new layer and bucket everything in it black, we'll play with the pattern overlay settings (by right clicking on a layer and clicking on blending options and going to pattern overlay)and try to get a pattern that looks like a nice somewhat-bumpy black. (this is what we'll see on any area that doesn't have armor, like the bottom of the ship or whatever)

at this point we'll make sure that the base black layer is completely transparent so that we can see our UVW and any subsequent layers we will turn down the opacity a little so that we can still see the layer we are working on at the time.

now we'll paint the area where we want our cockpit in our cockpit layer and use a gradient overlay in the layer's blending options and play with that until we get a nice cockpit look.

now we'll paint our under-armor in our under-armor layer, this is the equivalent to the grey armor on the ISDF tank, a good way to paint this out is to carefully follow the borders of your UVW and paint wherever you want inside of the green borders. (except when it comes to the seam of the center of the ship, you may wish to go outside the green border for this)

the same goes for the next layer up, our main regular armor, the equivalent of the orange armor on the ISDF tank.

now we will create a grime simulator, go to the 'filter' dropdown and render > clouds... wow amazing right, now select your grime layer's blending mode, located left of the opacity and set it to color dodge, we'll set the opacity at 8% or so. (we'll leave this layer invisible while we work so that it doesn't get in the way.) (to make a layer visible just use the eye icon to the left of it)

so now we'll paint some lights and use the ever powerful outer glow effect in our layer blending options.

and drumroll, tada: (just remember to make all layers visible and set to their individual proper opacity as well before you save your final version for the model) (save as a .bmp for the version to be used on the model, but be sure to save a photoshop version as the .bmp doesn't save your layers or layer styles, just a picture of what the finished product looks like) Save your texture that we're going to see in MAX as ivmyship_d.bmp (we only have one texture, otherwise we would number this ivmyship00_d.bmp and the second diffuse map would be ivmyship01_d.bmp and any support textures that we would create would need to be numbered as well.)


So I've picked green with red lights and everything is shaping up nicely. (please be sure to play around with all things that you can do in blending options so that you know what you're able to do using these tools.)
Applying Textures to our Model
in order to apply our texture to our model we'll start up a standard texture in our materials, hit m on your keyboard when in max. Select the first material (sphere).

change the 'specular' color to 1, 1, 1 in the Red Green Blue (RGB) values and hit okay on the dialog box.

change the specular level to 150 (you can play with this, make it whatever value you want, you will only see the results once the ship is ingame.) (it's up to you how shiny you want things to be.)
change the glossiness to 80. (specular level of 150 and glossiness of 80 seems to work quite well, when you set these values, it will determine the max level of specularity and glossiness that different areas of your ship will use depending on your specular/gloss map that we'll be creating later.)

click the empty square box button to the right of the color swatch for 'Diffuse:' this will bring up a window to select your texture, go to the folder where your .bmp save of your texture is located and select and hit okay.

now we can select this material and drag & drop onto our ship body, or we can select the object to be textured by this material and hit the assign material to selection button (the third button from the left under the material spheres with the icon of a blue sphere with an arrow pointing to a white box)


so now our ship has its main texture applied

So what i'm going to do from here is work on texturing the other pieces without describing it to you... From the information I've given, you should already be able to work the unwrap UVW tool on each of these objects in order to texture them. (although not always necessary depending on the object)

so now everything in our scene should be textured aside from our thrusters, yes, we actually need to texture them, but doing so is very simple, select a new material and make the diffuse color and ambient color unlocked from one another by clicking the sideways U shape to the left of them. Make the ambient color a dark grey and the diffuse color a bright color that you wish to use as the main flame color and put the specular level to 150 and apply the material to the flame_#__h geometries.

your entire model should now be textured.
Animating our Model (Part 1)
now we will set up our animations, first we will need to move any pivot points that are essential for animation to look right, so we'll go into the box-to-box branch off icon in the top right (Hierarchy Tab) and start selecting the objects that are to be animated and selecting 'Affect Pivot Only' and moving our pivots into position for the objects we wish to animate. (for instance: moving the pivot points of the fin objects so that they will pivot from their base so that it looks right when they rotate)

if you have a group of objects that are to rotate around a point in space like our gatling gun, we'll need to attach these objects together or link them to a common object that sits in the center, so i'll select one of the barrels in edit-poly mode and start using the 'attach' tool in the edit poly under the edit geometry tab, i'm going to attach my 3 other barrels and the two rings. (need to re-adjust pivot point after doing so) (you can hit center to object for the pivot if you know that the geometrical center of the object should be its pivot point)

now when we select the barrel and go to rotate it using the local and individual pivot point settings, it rotates exactly the way we want, this is very important.




Now we are ready for animation, down in the bottom right hand corner of your screen you will see our 'Time Configuration' icon, click this to bring up our time configuration window.










adjust end time to 30 and hit OK

now we are going to animate, so be sure that EVERYTHING in your scene is good to go at this point, meaning, you aren't going to make any further changes, all materials have been applied and all pivot points are correctly positioned and orientated, and anything else that you may wish to change.

So if everything is good to go, we'll start animating, first hit 'Auto Key' to the left of the button previously described at the bottom of your screen.

so what we'll do now is start animating our gatling gun, we'll rotate it 1080 degrees when our time slider is at 30 so that we get 3 full rotations in the 30 frames. (bz plays back loop animations at about 15 frames per second I believe.) (so 1/2 speed in Time Configuration window, using NTSC framerate)

now the gatling gun is animated, you can view this animation by moving your time slider around that is above your animation keys, or by hitting the play button. When you hit the play button, you will notice that towards the end of the animation at frame 30, the gatling gun slows to a stop and then picks up speed again, this is because the keyframe animation is using bezier handles, this simply means that max is making our animation 'smooth' for us, which isn't what we want, we want it to be a constant steady rate of motion, so we'll change this, select the object or objects that you've animated for your loop animation.

Move your mouse to the top of the screen and you'll find the Curve Editor (open) button, represented by a curve graph icon, it should be the 6th icon from the right on the top bar, once this is open, you'll see your animation curve isn't a straight line, to fix this, click drag and select your animation keys in this window (you can middle click somewhere and then scroll to zoom out, then left click drag to select your keys)

Once you have your animation keys selected, click the straight line icon that says "Set Tangents to Linear" when you hover your mouse over it. All of your animation keys should be straight lines that go from key frame to key frame, now close this window and play your animation, it should be fixed now.

we will now need to start saving our ship into a new subfolder that is separate from our incremental saves (you have been saving right?)

hit file, save as, and create a new folder inside where you were saving before called 'Animations' and save your new file as ivmyship_skel


Animating our Model (Part 2)
Animating the Fins.

now that you've saved your skeleton version of your animated ship (the main version of the ship that bz will reference, in this case it is the loop animation), we'll need to clear out our animation keys and start animating the fins, to do this, select the gatling gun again and clear out the keys in the animation key display by selecting them and deleting them (Before you do this, be sure that your time slider is at zero, otherwise your gatling gun may be in the wrong position, causing a crash or other problem once you go to put it ingame), you can click drag across all the keys and delete them. (they should be green as they are rotational animation keys)

Now we can start animating our fins, for our fin animations, we will need only a very simple set of keys, it is going to be a lot easier than what we just did, if that makes you feel better.

First we need to understand exactly what positions our fins need to be in when the ship banks left, banks right, is in full thrust forward, or is in reverse.

generally a left turn will make the left fin point down and the right fin point up and when doing a right turn the right fin should point down and left should point up. this is a general rule unless there are thrusters on the bottom of the fin, in which case the directions may be reversed because they aren't providing drag, but thrust to the craft.

once you have the fin positions that you desire locked into your mind or written down, we can proceed with animating.

for our fin animations we will need to create 3 separate files, one including the left and right bank animations while not driving forward or backward, one for the thrust forward (with it's bank animations) and one for reverse (with it's bank animations.), so without any further ado, we will proceed.

First we will make our neutral left and right fin banking animations, select all fins that you are going to be animating and press the giant key button at the bottom of your screen when your time slider is at 1. This will place a Red Green Blue keyframe at time frame 1. (position rotation and scale) This will lock in our neutral position, now go to frame 0, start rotating the fins into the positions they need to be in while the ship is in full bank left, when done, hit the key button again.

now go to frame 2 and move the fins into the position they need to be in for full bank right and hit the key button again.

our Neutral position Left and Right bank animation is done, save it off as ivmyship_sn

now create two more files using a similar method. For the forward animation, frame 1 is neutral position when going forward (not banking either way), frame 0 is forward while banking left, and frame 2 is forward while banking right. the reverse animation is the same structure as the forward animation. (frame 0 bank left while driving whichever way, frame 1 is driving whichever way: Forward Neutral, or Reverse) and frame 3 is banking right while going whichever way.

save the forward animation as ivmyship_sf and the reverse animation as ivmyship_sr.

everything should be converted to editable mesh before you export. (instead of editable poly)
You have the bake tool available to you when you export to .fbx (possibly depending on your version of 3ds max) and this tool could come in handy if your animation doesn't show up right ingame. (i usually bake my animations, but it isn't necessary as far as i know.)

The animation is done! :D

Creating our Other Textures (Part 1)
Now we still need to create our bump and specular/gloss textures for our ship, something very important to do for our ship for it to look photo realistic when put ingame.

depending on what version of photoshop you are using you may need the nvidia normal map plugin for photoshop, but if you are using the newest version of photoshop i don't believe you need this plugin at all, (normal maps can be very hard on your system as they use a lot of RAM, so if you start experiencing problems when creating one, you may need to downsize your texture to a smaller resolution) (I think I may be using the Intel normal map plugin.)

first we will need to save off a new version of our texture, save it as ivmyship_n.psd this is just so we can hit the save key every once in a while so that we don't lose any work in case something goes wrong.

what we want to do is to flatten out our texture (not literally) what i mean is, we will remove any bevel and emboss effects that we've used, if you wish to keep a pattern you've put into bevel and emboss, turn down the depth in bevel & emboss to 1 and then crank up the depth for the texture, this will give you the detail for the texture while removing the general bevel and emboss effect of the area you have painted.

We don't want to see any pretty effects on there either, this map is going to be the brighter the shade of grey the higher that area will be, so we need to get rid of the glow around the lights and any other effects that aren't a raise or lower in height.

please make sure to maintain any patterns or details as these will add a lot to the appearance of your texture ingame. (you can even work to create gradients overtop of things or use the inner glow effect for gradual rises in height, but usually these effects aren't necessary.)


So I've got the patterns still visible and I've removed any fancy effects that aren't supposed to represent height and I've colored everything grey with black as the furthest down and white being the highest up in terms of surface height. Save this as your normal map as a .psd so you preserve your work so you can modify it later if need be.

So now I'm going to go to 'Layer' in the main menu section at the top and go down to 'Flatten Image' this will squash everything down into a flat image, removing all layers completely and putting all that information into a single, flat layer. (before you do this, make sure you have deleted the grime simulator so that we don't get it overlaying itself on our bump/normal texture)

at this point we would downscale our texture if we made it really big, we would go to 'Image' > 'Image Size' and evenly downscale from there, it must be power size, meaning a multiple of 2, as i described earlier when we made our UVW, so if your texture is 2048x2048 and that is too big, scale it down to 1024x1024 and that is probably more than small enough, in fact it may be too small now that we have new graphics in battlezone, a 2048 texture is probably small enough (for something as big as a ship body), I'm just making a ship for example purposes so my texture is just a 1024.

Now I'm going to go to: 'Filter' > '3D' > 'Generate Normal Map' and this will bring up our normal map window.


What i'm going to do here is grab my 3 sliders that will determine the depth and set them at the 3%, 50%, and 100%, this will give us the look we need, i've turned the blur down to 0.5% and the detail scale to 120% I also had to check the 'Invert Height' at the top of the window, Once everything looks the way you want, hit the OK button.

If this didn't give you enough bump, you can adjust further by going to 'Image' > 'Adjustments' > 'Brightness & Contrast' and increase the contrast from there.

Everything is looking good, so now we're ready to save as a .bmp

Choose a racename (yes you can create your own, but that is out of the scope of this tutorial) I'm going to make this vehicle have an ISDF pilot, so I'm going to name my file ivmyship_n

iv means ISDF Vehicle, it tells the game to put an ISDF pilot into the vehicle, you can put 00 at the end of ivmyship which tells the game which texture this is, if you have multiple textures for a single vehicle, you would simply number it (00 01 02 etc.) at the end of the name, but before the final maptype designation and filetype, the _n at the end tells the game that it is a normal map, or height map, and the game will use it accordingly.

make sure that you DON'T choose something that preserves alpha channels (that's why i chose .bmp), as it will will probably mess up your normal texture if you keep alpha channels.

once that is saved, we're going to go back to our bump texture .psd file and modify it to give us our specular and gloss.

first save off a copy of your normal texture as ivmyship_gloss.psd

gloss is what determines how smooth (polished) an object's surface is.

after we are done with the gloss texture we are going to be putting it into the alpha channel of our specular texture, specularity determines how much light bounces back from an object in total, regardless of how smooth it is. (high gloss objects, or objects that have polished surfaces appear 'shiny')

I highly recommend you read this:

https://www.marmoset.co/posts/basic-theory-of-physically-based-rendering/
and this:
https://seblagarde.wordpress.com/2012/04/30/dontnod-specular-and-glossiness-chart/

it will show you what colors we need to use when we create our specular/gloss texture.

now we need to get rid of any 'bumpiness' on our texture as this is a gloss-based texture.

this is what i came up with for our gloss texture:


the white areas are polished (glass) and the grey are bumpy-ish armor and the bottom of the ship is sandpaper quality smoothness.

now we'll save this, and save it again as our specular texture, and we'll start modifying our specular texture.

This is what I came up with for our specular texture:


now we need to have both our specular and gloss textures open and flatten them both by going to layer > flatten image

don't save overtop your .psd files after flattening!

now on both gloss and specular, go to image > mode > and select 'Grayscale' make sure you discard color information.

now select your canvas of the gloss texture, hit CTRL-A and hit CTRL-C and then go to the specular texture and select 'Channels', beside the layers tab on the right. hit the quadruple horizontal lines icon and create a new layer, don't change the name of this, it should read 'Alpha 1' and hit OK, now paste what's in your clipboard to the alpha 1 channel by hitting ctrl-v while it is selected.

now you should have the specularity texture in the 'Grey' Channel, and your gloss texture inside the 'Alpha 1' Channel.

save this file off as a .TIF file as ivmyship_s

the _s at the end means specularity, but it DOES include the gloss as well of course.

make sure that when you save it that you've saved the alpha channel as well (checkbox on pop up window.)

make sure that when exiting your specular and gloss files that you don't overwrite your .psd file in case you need to make an adjustment later.

Take a copy of your ivmyship_d.bmp and convert it to a .dxtbz2 file using the DXTGen application.
Creating our Other Textures (Part 2)
Now I'm going to modify my diffuse and create my ivmyship_e texture, the _e means emission or emit, it tells the game to cause these areas of the texture to glow. (the body lights)

So I'm going to modify my diffuse so that only the lights are visible, along with their outer glow effect, while everything else is black, this will tell bz what needs to glow, how much, and what color.


this is what it should look like.

You can save it off as ivmyship_glow.psd if you want, but it is so easy to create this texture that it's almost not worth the effort and hard drive space.

Now flatten this image and save this off as ivmyship_e.bmp. (convert this to .dxtbz2 before putting ingame) (remember to convert a copy of your normal map to .dxtbz2 as well)

now we have our:

diffuse texture > ivmyship_d.dxtbz2
emissive map > ivmyship_e.dxtbz2
specular/gloss map > ivmyship_s.dxtbz2
normal map > ivmyship_n.dxtbz2

Getting our Ship Ingame (Part 1)
We have already created animations for our model, so from here on out everything should be .odf file work to get our ship into the game, at least for the most part.

now we want to export our loop, sn, sf, and sr animations as .fbx files for battlezone to use to create a .msh file that is native to battlezone.

go to 'file > export' and save it as an autodesk file (*.FBX, *.DAE) this export window will always start in the 3ds max export folder, so if you're smart, you'll create a shortcut to this folder on your desktop for easy access in both ways.

save the loop file as ivmyship_skel.fbx
save the SN file as ivmyship_sn.fbx
save the SF file as ivmyship_sf.fbx
save the SR file as ivmyship_sr.fbx

we want to save any animation, geometry, skins, so we'll make sure that those are checked.





















































hit OK

for future reference, whenever you save a file that doesn't contain an animation, make sure that the animation checkbox is not checked.

now find your files in the shortcut you placed on your desktop of the 3ds max exports folder and copy your ivmyship fbx files.

we'll make a new folder in YOUR addon folder that we created at the start of this guide and we'll name the folder ivmyship and copy the files into there, now also grab your texture (.dxtbz2) files that we made and put a copy of those into the ivmyship folder.

we don't need to copy the .bmp version of the diffuse texture for battlezone, this was only for 3ds max to reference so that it knows the name of the file without the filetype extension. Move the ivmyship_d.dxtbz2 to your ivmyship folder.

now go to your battlezone root folder:

C:\Program Files (x86)\Steam\steamapps\common\BZ2R

and search inside the folder bz2r_res for ivtank.odf

now search inside bz2r_loc > bz2r_en for ivtank.inf

copy these two files and paste them into your ivmyship folder and rename them to:

ivmyship.odf
ivmyship.inf

it isn't necessary to type the .odf or .inf at the end, the file already knows what kind of file it is.

set the automatic program to open the .inf and .odf file to wordpad (or your preferred text file modifier, as long as it can save the file as a .inf or .odf file when you hit save.)

modify the .inf file to describe your ship, keep in mind that you do NOT have unlimited space for this information as the text box that you get whenever you hit 'I' on an object inside battlezone is only so big, so if you put too much info in there, it will get cut off ingame.

now we're going to modify the .odf for your ship.

most of the information inside an .odf file is very simple and self explanatory.

(any lines that are prefixed by // will not be read by battlezone, these two forward slashes can be used to create comments or notes inside the odf)

this is what ivtank.odf looks like:

[GameObjectClass]
baseName = "ivtank"
geometryName = "ivtank00.fbx"
cockpitName= "ivtank_cockpit.fbx"
animCount = 3
animName1 = "forward"
animFile1 = "ivtanksf.fbx"
animName2 = "neutral"
animFile2 = "ivtanksn.fbx"
animName3 = "reverse"
animFile3 = "ivtanksr.fbx"
classLabel = "wingman"
scrapValue = 20
scrapCost = 55
customCost = 65
buildTime = 15.0
customTime = 15.0
maxHealth = 3500
maxAmmo = 2200
addAmmo = 5
unitName = "Tank"
aiName = "TankFriend"
aiName2 = "TankEnemy"
heatSignature = 2.0
imageSignature = 2.5
radarSignature = 0.5
isAssault = 0
armorClass = L

/////// REQUIREMENTS ///////////////
requireCount = 2
requireName1 = "ibfact"
requireText1 = "Build Factory"
requireName2 = "ibcbun"
requireText2 = "Build Relay Bunk"

/////// PROVIDES ///////////////////
provideCount = 3
provideName1 = "ivtank"
provideName2 = "VIRTUAL_CLASS_TANK"
provideName3 = "DefendUnit"

/////// weapons ////////////////////
weaponMask = 11111
weaponHard1 = "HP_CANNON_1"
weaponName1 = "gatstab_c"
recoilName1 = "recoil"
weaponAssault1 = 0
weaponHard2 = "HP_GUN_1"
weaponName2 = "gminigun_c"
weaponAssault2 = 0
weaponHard3 = "HP_GUN_2"
weaponName3 = "gminigun_c"
weaponAssault3 = 0
weaponHard4 = "HP_MORTAR_1"
weaponName4 = "gmortar"
weaponAssault4 = 0
weaponHard5 = "HP_SPECIAL_1"
weaponName5 = ""
weaponAssault5 = 0

/////////LIGHTS AND EFFECTS//////////////////
lightHard1 = "hp_light_1"
lightName1 = "spotblue2"
lightHard2 = "hp_light_2"
lightName2 = ""
//LightsOnlyWhenPiloted = true

effectHard1 = "hp_dust_1"
effectName1 = "dusttrail"
effectMinAltitude1 = 0.0
effectMaxAltitude1 = 5.0
effectMinVelocity1 = 10.0
effectMaxVelocity1 = 500.0

[CraftClass]
rangeScan = 300.0f
periodScan = 5.0f
velocJam = 5.0f
engageRange = 120

attackTask = "MortarBikeAttack" //"AssaultTankAttack"
subAttackTask = "MortarBikeSubAttack" //"SupportSubAttack"
subAttackClass = "ANS"
// subAttackClass uses 3 letters.
// 1st letter is either A or N. A is include Air targets. N is attack ground only.
// 2nd letter is either D or N. D is to deploy before attacking. N for regular attack.
// 3rd letter is either S or N. S is to use Weapon Range. N is use the Engage Range to attack.

braccelFactor = 0.03
velFactor = 0.2
steerFactor = 1.5
omegaFactor = 0.2
strafeFactor = 0.2
avoidSpeed = 20;
topSpeed = 30;

selectWaitMsg = "ivtank05.wav"
selectAttackMsg = "ivtank02.wav"
selectFollowMsg = "ivtank04.wav"
selectGoMsg = "ivtank04.wav"
selectOtherMsg = "ivtank05.wav"
holdMsg = "ivtank12.wav"
goMsg = "ivtank04.wav"
attackMsg = "ivtank06.wav"
followMeMsg = "ivtank08.wav"
followMsg = "ivtank03.wav"
repairMsg = "ivtank09.wav"
reloadMsg = "ivtank09.wav"
rescueMsg = "ivtank10.wav"
recycleMsg = "ivtank11.wav"
otherMsg = "ivtank05.wav"
user1Msg = ""
killedMsg = "ivtank07.wav"
diedMsg = ""

[HoverCraftClass]
velocForward = 28.5 //
velocReverse = 20.0 //
velocStrafe = 16.0 //
accelThrust = 24.0 //acceleration
accelDragStop = 6.0 //how fast it stops once hands are off controls
accelJump = 15.0 //
setAltitude = 1.0 // how high off the ground
alphaTrack = 21.0 //springs speed it rights itself
alphaDamp = 8.0 //shocks
pitchPitch = 0.25 //nose up
pitchThrust = 0.1 //nose down
rollStrafe = 0.08 //rolls while strafing
omegaSpin = 6.0 //spinning in place speed
omegaTurn = 2.3 //turning while moving speed
alphaSteer = 7.0 //how fast it responds to steering
rollSteer = 0.08 //rolls while steering

soundThrust = "itank01e.wav"
soundTurbo = "avtanke3.wav"

[Lod1]
//geometryName = "ivtankL1.fbx" ;geometry for lod1
//distance = 50 ;...distance over this many meters => switch to lod2

[Lod2]
//geometryName = "ivtankL2.fbx" ;geometry for lod2
//distance = 100 ;...distance over this many meters => switch to lod2
Getting our Ship Ingame (Part 2)
This is what we're changing:

I changed the baseName to ivmyship, this will tell bz what files to use, such as the wireframe, the .inf file or the icon image that we're going to make.

I've changed the geometry scale to 0.15, this is something that scales down our ship ingame, if this size doesn't work, we'll try something bigger or smaller depending on what we see.

I've added some code lines in order to get our animations to do what we want them to do, including our loop animation.

I've changed the weapon hardpoints to what we have in our model and assigned some ISDF weapons to them so we can be sure that our geometry works properly.

I've removed the LODs at the end as we don't have any LOD models (lower res models to be displayed at certain distances to make it easier on the computer when viewing a large amount of objects at a time to prevent Frames Per Second (FPS) loss)

I changed the light names to some red lights (the odf used for the headlights) you can create your own if you wish. (find a light file like spotblue2.odf and rename it to something else and modify the settings in it to create a new light if you so require.)

you can modify the attack class and the numbers in HoverCraftClass to get different movement amounts when you drive the craft in the game and you can change the engine sounds. (I'm just leaving them alone because they are self explanatory)

you can modify the requirements that need to be met to build this ship if you want.

i changed the unitName to "World Eater" because that's how cool our ship is.

I added in our geometry names for our cannons to the recoilNames in the weapons section so that we get recoil on those pieces of geometry whenever we fire our cannons. (battlezone does this for us, which can be a blessing and a curse.)

by the way, .odf means Object Definition File, and .inf is short for Information File.

So here it is:

[GameObjectClass]
baseName = "ivmyship"
geometryName = "ivmyship_skel.fbx"
geometryScale = 0.15
animCount = 4
animName1 = "loop"
animFile1 = "ivmyship_skel.fbx"
runAnimation = "loop"
runAnimIsLooped = true
animName2 = "forward"
animFile2 = "ivmyship_sf.fbx"
animName3 = "neutral"
animFile3 = "ivmyship_sn.fbx"
animName4 = "reverse"
animFile4 = "ivmyship_sr.fbx"
cockpitName= "ivmyship_cockpit.fbx"
classLabel = "wingman"
scrapValue = 20
scrapCost = 55
customCost = 65
buildTime = 15.0
customTime = 15.0
maxHealth = 3500
maxAmmo = 2200
addAmmo = 5
unitName = "World Eater"
aiName = "TankFriend"
aiName2 = "TankEnemy"
heatSignature = 2.0
imageSignature = 2.5
radarSignature = 0.5
isAssault = 0
armorClass = L

/////// REQUIREMENTS ///////////////
requireCount = 2
requireName1 = "ibfact"
requireText1 = "Build a Factory"
requireName2 = "ibcbun"
requireText2 = "Build a Relay Bunk"

/////// PROVIDES ///////////////////
provideCount = 3
provideName1 = "ivtank"
provideName2 = "VIRTUAL_CLASS_TANK"
provideName3 = "DefendUnit"

/////// weapons ////////////////////
weaponMask = 11111
weaponHard1 = "HP_CANNON_1"
weaponName1 = "gatstab_c"
recoilName1 = "recoil_1"
weaponAssault1 = 0
weaponHard2 = "HP_CANNON_2"
weaponName2 = "gatstab_c"
recoilName2 = "recoil_2"
weaponAssault2 = 0
weaponHard3 = "HP_GUN_1"
weaponName3 = "gminigun_c"
weaponAssault3 = 0
weaponHard4 = "HP_SPECIAL_1"
weaponName4 = "gphantom"
weaponAssault4 = 0

/////////LIGHTS AND EFFECTS//////////////////
lightHard1 = "hp_light_1"
lightName1 = "spotred"
lightHard2 = "hp_light_2"
lightName2 = "spotred"
//LightsOnlyWhenPiloted = true

effectHard1 = "hp_dust_1"
effectName1 = "dusttrail"
effectMinAltitude1 = 0.0
effectMaxAltitude1 = 5.0
effectMinVelocity1 = 10.0
effectMaxVelocity1 = 500.0

[CraftClass]
rangeScan = 300.0f
periodScan = 5.0f
velocJam = 5.0f
engageRange = 120

attackTask = "MortarBikeAttack" //"AssaultTankAttack"
subAttackTask = "MortarBikeSubAttack" //"SupportSubAttack"
subAttackClass = "ANS"
// subAttackClass uses 3 letters.
// 1st letter is either A or N. A is include Air targets. N is attack ground only.
// 2nd letter is either D or N. D is to deploy before attacking. N for regular attack.
// 3rd letter is either S or N. S is to use Weapon Range. N is use the Engage Range to attack.

braccelFactor = 0.03
velFactor = 0.2
steerFactor = 1.5
omegaFactor = 0.2
strafeFactor = 0.2
avoidSpeed = 20;
topSpeed = 30;

selectWaitMsg = "ivtank05.wav"
selectAttackMsg = "ivtank02.wav"
selectFollowMsg = "ivtank04.wav"
selectGoMsg = "ivtank04.wav"
selectOtherMsg = "ivtank05.wav"
holdMsg = "ivtank12.wav"
goMsg = "ivtank04.wav"
attackMsg = "ivtank06.wav"
followMeMsg = "ivtank08.wav"
followMsg = "ivtank03.wav"
repairMsg = "ivtank09.wav"
reloadMsg = "ivtank09.wav"
rescueMsg = "ivtank10.wav"
recycleMsg = "ivtank11.wav"
otherMsg = "ivtank05.wav"
user1Msg = ""
killedMsg = "ivtank07.wav"
diedMsg = ""

[HoverCraftClass]
velocForward = 28.5 //
velocReverse = 20.0 //
velocStrafe = 16.0 //
accelThrust = 24.0 //acceleration
accelDragStop = 6.0 //how fast it stops once hands are off controls
accelJump = 15.0 //
setAltitude = 1.0 // how high off the ground
alphaTrack = 21.0 //springs speed it rights itself
alphaDamp = 8.0 //shocks
pitchPitch = 0.25 //nose up
pitchThrust = 0.1 //nose down
rollStrafe = 0.08 //rolls while strafing
omegaSpin = 6.0 //spinning in place speed
omegaTurn = 2.3 //turning while moving speed
alphaSteer = 7.0 //how fast it responds to steering
rollSteer = 0.08 //rolls while steering

soundThrust = "itank01e.wav"
soundTurbo = "avtanke3.wav"

I hope you can grasp an understanding of what i just did and why, modifying an .odf file isn't really that hard, once you've done it a few times, it comes really quite easy because a lot of the code lines are self explanatory thankfully.

So, moving on, we should be able to place our ship ingame now.

Get into YOUR version of bz and get into instant action and choose a map, get into the game and press CTRL - ~ to open the command line and type game.cheat bzeditor and hit enter.

The screen will flash and a voice will say that the editor is now enabled.

Get out of the command line and press ctrl - e to get into the editor.

To quick find your vehicle press ctrl - c to center the view to the player, click on 'objects' and type into the config box: ivmyship and hit enter.

It may take up to a minute to build your ship, once it does, you should be able to place it, but make sure you place it on TEAM 1 so that you can command it.

Place your ship. press ctrl - e to get out of the editor and your ship should be fully functional minus icons and cockpit model. (key word here is the word 'Should' as if you have made a mistake you may get some wonky results and need to go back and make changes as necessary.)

So now we need to create an icon and wireframe view of the ship (both are images) the icon image will be displayed in the command HUD (F-Keys) and the wireframe will be displayed in the bottom right hand side of the screen above the vehicle's health, ammo and weapons when you pilot the ship.

First we need to open up a version of our model that we wish to take a picture of, we'll open the loop animation 3d file and delete all of our hardpoints so that we don't see them when we render a photo (be sure to not accidentally hit the save button and overwrite your loop file by accident!)

Once you've deleted or hidden all objects that you don't want to see when you render a photo of it, create a new material, we'll make it a silver blue color and play with the specular level and gloss until we get what we're looking for. (trying to imitate existing icons in bz)

apply the material to all objects in scene.
Getting our Ship Ingame (Part 3)
now click on the little teapot icon at the top that has the message box above it

change the width and height of the render to 128x128 and move your viewport to a view that will show the ship and hit render. You will probably have to move the viewport around after this to get the ship to the bottom of the render where you want it, usually a flat side view is what we want for an icon.

once the image looks the way we want, hit the little floppy disc symbol in the top left corner of the render window. Save the file where you can find it as a .TGA file and we'll name it myshipicon (naming it something OTHER than icon_ivmyship is very important) or you can just name it waegfhoiewhg or whatever you want, as long as you don't put "icon_" at the beginning.

Save the file and select 32 bpp, compress, and be sure that pre-multiplied Alpha is selected.

convert it to a .dxtbz2 file and put it into your ivmyship folder and rename it to icon_ivmyship.dxtbz2

The reason we want to make sure that it wasn't named properly before we converted it to a .dxtbz2 file is because the DXT Generator will DOWNSIZE your file while it converts it. (32x32 pixels) (i'm not sure if there is a new version of DXTGen that works properly with the new battlezone or not, not that we really need it anyway as long as we are aware of this.)

now modify your shiny silver texture in max to be more of a dull grey and change the render size to 256x256 and get a front/side view, a view that exactly what the ship looks like the best to you, make sure that the ship is displayed at the bottom of this render as well, this will be our 'wireframe' of the ship to be displayed in the cockpit of the ship when you drive it.

save this off as a .tga the same as last time naming it something random and convert it to a .dxtbz2 and put the .dxtbz2 into your ivmyship folder and rename the image to wire_ivmyship.dxtbz2

now reset 3ds max's scene, to do this, click file > reset. DO NOT HIT SAVE, we don't want to save our loop animation file like this. hit yes I wish to reset.

Creating a Cockpit:

now we can work on creating a cockpit for our ship, to do this, we need to create a very simple scene, we will need a piece of geometry that will be our cockpit and a single hardpoint that will be called hp_eyepoint. the piece of geometry (and any other pieces) will be linked to the hp_eyepoint hardpoint, make sure that all of your geometry's pivot points are pointing in the right direction. (including the hp_eyepoint as well of course)

it is best to make the cockpit SMALL in 3ds max, as small as you can, or at least, just small, if it is too big, once ingame, the terrain will eat the geometry of the cockpit as battlezone will think that it's big enough to touch the terrain, it can get very ugly if the cockpit is too big.


here's my finished cockpit, as you can see the eyepoint is the little orange thing hovering in the middle looking out between the objects, they are linked to the eyepoint. (you can test what it will look like by positioning a perspective view or camera where your hp_eyepoint is so that you can get a feel for what it looks like)

something important to remember is to give yourself some leeway here, if the camera pans down or up, or side to side, you don't want to see the edge of the cockpit, so make it as big as you deem necessary to prevent this kind of eyesore when the vehicle undergoes some extreme maneuveres ingame.

when you have it all textured and you are happy with it, export it out as an .fbx without the animations checkbox clicked.

put ivmyship_cockpit.fbx into your ivmyship folder. (include any textures you created (as .dxtbz2 filetypes))

Finalizing your Files
now what you'll need to do is get into bz and place the ship, once you are sure that everything looks good and there is nothing more that you wish to change, you will need to go to your ivmyship folder and remove the .fbx files from this folder (you can create a retention folder to stockpile .fbx files or you can delete them, whatever you wish to do.)

go to:

C:\Users\MY USER\Documents\My Games\Battlezone Combat Commander\data\binData

(you can create a shortcut on your desktop of bindata folder for easy access) (also something very handy, whenever you make an adjustment to your model and have to resave it, or you wish to change the geometryScale of the object, remember to delete the files battlezone has created in your bindata folder (providing you are using the .FBX files) before you place the ship again, otherwise you may notice no change as it may still be using the .msh file it previously created, deleting the .msh files in bindata after making a change just helps ensure that battlezone will create the files anew with your changes.)

and ctrl-X all of your ivmyship files out of there (bindata folder) and put it into your ivmyship folder in your addon.

if you had noticed before that bz would take awhile to convert the geometry of your ship whenever you typed ivmyship into the config box in the editor, you will now notice that when you type ivmyship into the config box, your ship will appear right away, this is because bz doesn't have to convert your .fbx files into .MSH files so that it can use your model ingame.

Also, now your 3d model is 'secure' from plagiarism from others as it is in a format that is non-readable by any 3d program.

remember to clean up your export folder and anything else when you were creating your ship, essentially you are done creating the ship, from here you could create some shiny new weapons for it and modify anything else that will affect how the ship plays ingame, including the maxHealth, maxAmmo and so on, anything that you need to change to balance your ship and make it the way that you think it should play ingame.
Turning your mod into a Recycler Variant
Now that we've made an awesome ship and we've got it balanced, how do we add it to the steam workshop? That's what we're going to do now.

First you will need to decide HOW you wish to upload it, is it going to be a stand alone vehicle, or does it integrate with other things, such as being able to be built by the factory?

If you were to make it a stand alone mod, that would mean that in order for others to create your ship they would have to get into the editor to place it, it would be rather easy to upload, however, if you do this, how do you expect others to enjoy your mod in multiplayer or in a situation where they can't use the editor?

that's why we're going to make this vehicle buildable by the ISDF factory as a recycler variant.

to do that, we need to create our own recycler variant, so we're going to need some files. we need the autoreg files that tell bz that this is a Recycler Variant.

you will find the autoreg files here:

C:\Program Files (x86)\Steam\steamapps\common\BZ2R\maps\autoreg

copy ivrecy_m.autoreg

go to your MyAddon folder (the one that has the ivmyship folder directly beneath it) and create a new folder there called MyMod, and place ivmyship inside it, also create another folder inside MyMod called Autoreg

place the copy of ivrecy_m.autoreg in the Autoreg folder and rename the file to ivrecy_mymod (you can put whatever you want after the underscore, as long as it is unique and hints at the name of your recycler variant or abbreviates it, also, leave the base name as ivrecy)

open ivrecy_mymod.autoreg and change all four ODFName = "ivrecy_m" codelines to read
ODFName = "ivrecy_mymod" and change the description to
Description = "My Awesome Variant" (put mod recycler variant name here)

Save the file.

now you need to create the files that will actually be the recycler variant. (please note, usually, recycler variants work with ALL races, so what I'm doing here isn't actually correct for me to create a new ship that only is buildable by the ISDF, (should have an equivalent or similar type addition to scion race) (but with this knowledge you should be able to create your own recycler variant and that's what I'm shooting for.)

first get a hold of ivrecy_m.odf, find it by searching in your bz2 root folder / bz2r_res once you have it, you'll also have to copy ibrecy_m.odf to a new folder inside your MyMod folder and call the new folder Recycler Variant and put these two files into there.

now go back to searching and get a hold of ivcons.odf and ibfact.odf and put them into the Recycler Variant folder as well, rename these 4 .odf files to have _mymod at the end (removing _m on some and putting _mymod there instead)

now go inside these files and make the classLabel refer to the original version of that unit. classLabel usually refers to the type of unit it is, like hovercraftclass or whatever, but in this case we are making a recycler variant, by changing the classLabel to ivrecy (in ivrecy_mymod.odf) it will now reference the original file for all missing information. (don't actually need to do this as it is done for us for ivrecy_mymod.odf already)

Just change the deployName to read = "ibrecy_mymod"

exit and save, now get into ibrecy_mymod and add in the Factory Class:

buildItem5 = "ivcons_mymod"

exit and save (i chose item5 because this is where the constructor is)

now get into ivcons_mymod and change the classLabel to = "ivcons" and erase any irrelevant information, it should look like this when you are done:
_____________________________________________________________

[GameObjectClass]
classLabel = "ivcons"

/////// REQUIREMENTS ///////////////
requireCount = 0

/////// PROVIDES ///////////////////
provideCount = 2
provideName1 = "ivcons"
provideName2 = "VIRTUAL_CLASS_CONSTRUCTIONRIG"

[CraftClass]
TeamTransferrable = false

[HoverCraftClass]

[DeployableClass]

[ConstructionRigClass]
buildItem2 = "ibfact_mymod"
_________________________________________________
buildItem2 references our recycler variant's factory, exit and save now.

get into ibfact_mymod and change it to:
_______________________________________________________________

[GameObjectClass]
classLabel = "ibfact"

/////// REQUIREMENTS ///////////////
requireCount = 1
requireName1 = "ibpgen"
requireText1 = "Build Power"

/////// PROVIDES ///////////////////
provideCount = 2
provideName1 = "ibfact"
provideName2 = "VIRTUAL_CLASS_FACTORY"

////////////////////////////////////

[PoweredBuildingClass]

[BuildingClass]

[FactoryClass]
buildItem9 = "ivmyship"
_______________________________________________________________
Now our factory can build our ship, we can work on uploading our mod, that is, after we make sure that everything we just did actually works.

To test our Recycler Variant, first we need to move our Autoreg folder so that it is directly below MyAddon, now you can get into YOUR Battlezone version and test it by selecting ISDF and selecting "My Awesome Variant".

Once you are sure that everything works properly we should be ready to upload it.

Uploading your Mod to the Steam Workshop
Make a copy of your MyMod folder and your Autoreg folder and place them somewhere else (where you aren't going to modify this new copied version of it by accident) (you could create a folder on your desktop that will contain your mods that are uploaded to steam, as it is a good idea to keep the uploaded version separate from your version.)

Once you have a new location for these two folders, put the Autoreg folder into the MyMod folder (Everything we are doing from here on out will be with the copies).

To upload your mod to the Steam Workshop, you will need to install the BZ:CC Uploader Tool. Open your Steam client and browse to LIBRARY > Tools. Find the BZ:CC Uploader Tool in the list and install it.

go to your copied version of MyMod folder and go inside it and create a new folder called AddonAssets and put everything into it, so now you should have Mymod>AddonAssets> all your mod files, including your Autoreg folder that contains your ivrecy_mymod.autoreg

Next, browse to C:\Program Files (x86)\Steam\steamapps\common\BZ2 Uploader\ExampleConfig

There are four files in this folder:

mod.cfg
mod.dds
mod.des
mod.ini

put a copy of these four files DIRECTLY inside your new copy of your MyMod folder.

Should look like this,

Desktop Folder (or wherever) > MyMod > mod.CFG (and the other 3 mod files) > AddonAssets (this folder contains everything to do with the mod, including Autoreg folder which should be directly beneath AddonAssets folder.)

Note: also please take the time to read the ExampleInstructions.txt document at C:\Program Files (x86)\Steam\steamapps\common\BZ2 Uploader for further information on mod types for future reference.

once you have this set up, we need to go to the mod.cfg file we just put into our MyMod folder.

find the line in mod.cfg that says
//These are local asset folders for this mod
and put beneath this line

AddLocalWorkshopDirRecurse("AddonAssets");

and save the file.

now open mod.des and modify the text within it to describe your mod as it will appear ingame.

open the configuration settings: mod.ini file and change the information displayed in the modName quotation marks to the name of YOUR MOD (keep it short and simple) save the file.

.dds file is 640x640 pixels (not sure if this matters or not.) you can change this image if you wish.

To Upload:

Now open the uploader tool, input a name for your mod and the description to appear in the Workshop.

"workshop name" should be filled in
"workshop description" should be filled in

don't put anything into the workshop ID box

At this point, do you have an image that you wish to use (usually a .bmp or jpeg) as the main photo for your mod in the steam workshop? if not, please make one.

hit the 'Create New Item' button and hit OK on the window that comes up, now browse to the folder that contains your mod, this should be MyMod (doesn't matter what it's called as long as it's the right folder) once you have selected the folder, it will ask you to assign an image, once you have done this, it will immediately start uploading your mod to the steam workshop.

(note, if any error messages come up when it uploaded it, the mod will not work, you will have to troubleshoot at this point and try again.)

at this point, it will be downloadable by others, but please make sure at this point that YOU subscribe to your mod and get into the normal version of bz and try out your mod, remember to get in and out of bz a couple times before you determine that the mod isn't working, as it may not download your mod right away, remember that you have to activate your mod in the mod menu.

to get to your mod quickly (before it completely uploads to the public Workshop page), go to your name at the top of steam (big words) and go to 'Content' and go to 'Workshop Items' and your mod should be there. (you can change your mod to being invisible to other users until you are sure that it works, then make it visible to everyone again.)

Once you have determined that your mod is working, you are done! And this concludes this tutorial on making a generic ship and getting it uploaded to the Steam Workshop.

Thank you! I look forward to seeing your mod on the Steam Workshop!
Notes
Note 1: Please reference the stock BZCC models for unique hardpoints and hierarchy sequences which are critical to creating different assets such as various building and vehicle types.

Note 2: If you wish to get into a version of BZCC quickly and in the editor, add these to the end of your target for your modded shortcut: /nobodyhome /startedit st_dunes.bzn

I myself won't be using /nobodyhome as it put me in an odd spot on the map, but you can use it for faster loading time into bz, it removes all objects and scripts from use, so it's just you in a tank on the bare map.

the /startedit command can be followed by any map (or none at all), just put the filename of it, i usually use dunes but you can use any map you wish.
Changes & Updates
All made April 21/2018:
Modified:
UVW Unwrapping our Model (Part 2) (just further info)
Animating our Model (got rid of TCB controller as it isn't used anymore and updated fin animation information, as well as the entire section about how to animate our gatling gun loop anim.)
Applying Textures to our Model (changed specularity and gloss settings so that they actually work, along with the map type)
Creating our Other Textures (changed the way we make an Emit map and the way we Save our Specular map)
changed map names (myship00.bmp and stuff like this to proper usage: ivmyship_d.bmp) etc.
______________________________________________________________________________
May 18, 2018:
Removed .DDS as a required file format for the normal map, as it isn't necessary, .bmp works fine, hope this makes your life a little easier. .DDS is still used for the mod.dds for the config files when uploading your mod, i'm pretty sure that this .dds file needs to be a .dds file but i could be wrong.
______________________________________________________________________________
19 Comments
StealthMode℠™©® 5 Mar, 2022 @ 8:55pm 
Rocket.
Why not just link to the old tutorials for Modding bz2?
The ones Pandemic, and Mates made?
_Samuel_ 3 Oct, 2021 @ 9:16pm 
Is it video tutorial for this?
Zeus 6 Dec, 2020 @ 9:41pm 
One day if its made into a Video Tutorial.
SBHScion 10 Oct, 2018 @ 3:23pm 
It would be awesome if you could make a tutorial on how to make treaded vehicles too, theres not a whole lot of documentation on that sort of thing, or walkers and pilots even.
Arif_T 18 Aug, 2018 @ 11:33pm 
Can u make a vedio of this guide
4Horsemen 27 Jul, 2018 @ 3:42pm 
What's the average model poly count and what's the highest poly count per model the engine could handle?
GenBlackDragon  [developer] 24 Jun, 2018 @ 3:18pm 
FYI: The Normal map texture in this tutorial has it's Red channel backwards.

It should look like this:

http://www.blenderdiplom.com/images/frederik/example.normals.fromsphere.png
Rocket3497  [author] 18 May, 2018 @ 10:03pm 
Made a change to the guide, be sure to read the change note at the bottom in the "Changes & Updates" section.
Rocket3497  [author] 18 May, 2018 @ 9:49pm 
@Blue Fox No problem, i just figured that making a guide would speed other people up if they wish to make their own content, it took me a long time to figure out all this stuff, especially after the new graphics update, so i hope it's as helpful as possible.
Skyward Soul 18 May, 2018 @ 5:35pm 
Thank you so much for all the hard work you clearly put into making this super helpful guide!