How to create a
A great dynamic feature to add to a mod is a destroyable building. A destroyable building adds realism to the game and gives the player the impression that they are tangibly affecting the game. This tutorial will show you how to create your own destroyable building.
STEP 1 – Creating the
Models
The first step to building a new destroyable building is to create the models of the building. There will need to be three new models created to bring this new object to life. The first model will be the low polygon model that will be seen by players while they are far away from the building. The second model will be the detailed model of the building as it will appear when a player is either close to the building or inside of it. The third model will be the destroyed version of the building. This model will be seen only after the building has been destroyed. Each model should be exported with a collision mesh. The collision mesh will need to have a material ID assigned to it for the building to be destroyable. You can learn more about material ID’s in the Damage System Tutorial.
For the purposes of this tutorial, we have provided a mini-mod that also contains the three demo models.
Link 1
STEP 2 – Creating the
Geometry Objects
Now that we have the three models of our new building, we need to create the geometry objects to which the game will refer. The geometry object exists so that the game engine will know how to show each model and its various levels of detail. We will create a text file named “Geometries.con” to house the geometry object scripting. Now that the file has been created, let’s open it and begin to create our objects.
GeometryTemplate.create StandardMesh Britain_Factory_M1
The first line creates and names the geometry object. “GeometryTemplate.create” specifies that we are creating an object. “StandardMesh” is the type of object that is being created and “Britain_Factory_M1” is the name of the object that we are creating.
GeometryTemplate.file Britain_Factory_M1
The second line will specify the model (.sm file) that this geometry object will use. We have specified that the model named “Britain_Factory_M1”. BF:1942 assumes that the model will be in the “standardMesh.rfa” file unless you specify otherwise.
GeometryTemplate.setLodDistance 0 0
The “setLodDistance” line sets which LOD (Level Of Detail) of the model will be seen at a particular distance. The first value, “0”, represents the first LOD that will be shown to a player (“1” would represent the second LOD, “2” would represent the third LOD, etc). The second value, “0”, represents the distance at which you will begin to see the first LOD (Each subsequent LOD has less detail than the one before it.).
The model we are using for our close-up model was only exported with three LODs, so it will only need three “GeometryTemplate.setLodDistance” lines. When we have completed the scripting for this object it will look like this:
GeometryTemplate.create
StandardMesh Britain_Factory_M1
GeometryTemplate.file
Britain_Factory_M1
GeometryTemplate.setLodDistance
0 0
GeometryTemplate.setLodDistance
1 50
GeometryTemplate.setLodDistance
2 100
GeometryTemplate.setLodDistance
3 200
GeometryTemplate.setLodDistance
4 400
GeometryTemplate.setLodDistance
5 800
Because the second Geometry object we will create will be for the exterior view, it will have more LOD objects to provide for viewing it from longer distances. It will be setup the same, but when complete will look like this:
GeometryTemplate.create
StandardMesh Britain_Factory_L1
GeometryTemplate.file
Britain_Factory_L1
GeometryTemplate.setLodDistance
0 0
GeometryTemplate.setLodDistance
1 50
GeometryTemplate.setLodDistance
2 100
GeometryTemplate.setLodDistance
3 200
GeometryTemplate.setLodDistance
4 400
GeometryTemplate.setLodDistance
5 800
We will finish the Geometry objects by creating the last object for our wrecked model of the building. We will call the object “Britain_Factory_wreck_m1” and it will use the “Britain_Factory_wreck_m1.sm” file located in the “StandardMesh” directory.
GeometryTemplate.create
StandardMesh Britain_Factory_wreck_m1
GeometryTemplate.file
Britain_Factory_Wreck_m1
GeometryTemplate.setLodDistance
0 0
GeometryTemplate.setLodDistance
1 150
GeometryTemplate.setLodDistance
2 200
GeometryTemplate.setLodDistance
3 250
GeometryTemplate.setLodDistance
4 300
GeometryTemplate.setLodDistance
5 500
Now that we have finished creating the Geometry objects, save this file and we will begin the necessary scripting to create the destroyable building.
STEP 2: Scripting for
the Destroyable Building
A normal building in BF:1942 is not affected by weapons, vehicles, etc. A building needs to have hitpoints to be destructible and the only way to accomplish this is to script the building so that it is a “Player Controllable Object” (PCO). The PCO will contain all of the hitpoint settings as well as any special effects that you might want to use with this building (smoke stacks, flashing lights, etc.).
ObjectTemplate.create PlayerControlObject Britain_Factory
The first line will create a PCO named “Britain_Factory”. (Note that object scripting begins with “ObjectTemplate”, just as geometry scripting begins with “GeometryTemplate”.)
ObjectTemplate.setNetworkableInfo FactoryBodyInfo
The second
line will define how the status of the building will be communicated in
multiplayer games.
“ObjectTemplate.setNetworkableInfo” tells the game engine that the
building status will be communicated using the “FactoryBodyInfo” network
object.
ObjectTemplate.cullRadiusScale 5
ObjectTemplate.hasMobilePhysics 0
ObjectTemplate.explosionRadius 20
ObjectTemplate.explosionDamage 5
ObjectTemplate.drag 2
ObjectTemplate.dragOffset 0/0/0
ObjectTemplate.mass 4500
The next few lines configure a few necessary things for a PCO, including mobile physics (“0” is off, “1” is on), the size of the explosion, how much damage the explosion will inflict, the mass of the building, etc. Mobile physics are turned off for the building because it will be stationary. The values set for the explosion radius and damage can be adjusted at any time (the higher the value, the larger the explosion) and the mass should always be more than “2500”.
ObjectTemplate.hasCollisionPhysics 1
ObjectTemplate.hasResponsePhysics 1
These two lines turn on collision and response physics for the PCO. The collision and response physics are needed (in tandem with the collision mesh of the model) so that a player can’t walk through the building and so a weapon can inflict damage on the building.
ObjectTemplate.hasArmor 1
ObjectTemplate.speedMod 2
ObjectTemplate.hitpoints 20
ObjectTemplate.maxhitpoints 20
The PCO’s hitpoints and armor is configured in the next four lines. The higher the hitpoints, the more damage it will take to destroy the building. The “has Armor” value must be set to “1” because if note, the PCO can’t be damaged.
ObjectTemplate.timeToLiveAfterDeath 10
ObjectTemplate.material 45
ObjectTemplate.criticalDamage 10
The “timeToLiveAfterDeath” is the time the wrecked model will exist before fading away. As mentioned in Step 1, the type of material defines how the PCO will take damage from different weapons. The “criticalDamage” value defines how many hitpoints the PCO must have to be considered critically damaged. You could add another line using “ObjectTemplate.hplostwhilecriticaldamage” to set how many hitpoints will be taken away from the PCO once it is critically damaged.
ObjectTemplate.addTemplate lodfactory
This line adds the LOD object that we will create later.
ObjectTemplate.GUIIndex 30
ObjectTemplate.setSoldierExitLocation 6/12/-7 180/0/0
ObjectTemplate.setVehicleIconPos 40/60
ObjectTemplate.setNumberOfWeaponIcons 0
ObjectTemplate.setVehicleCategory VCLand
ObjectTemplate.setVehicleType VTArtillery
ObjectTemplate.setToolTipType TTArtillery
What do you want to
say about these lines above? They aren’t
really necessary.
ObjectTemplate.setMinimapIcon "Minimap/minimap_icon_Factory_32x32.tga"
The final line we will need for the creation of the PCO sets the file location of the icon image that will be used to identify the position of the PCO on the minimap.
The next object we will need to create is the LOD object.
ObjectTemplate.create LodObject lodFactory
ObjectTemplate.hasMobilePhysics 0
ObjectTemplate.hasCollisionPhysics 1
ObjectTemplate.hasResponsePhysics 1
rem -------------------------------------
ObjectTemplate.addTemplate FactoryComplex
ObjectTemplate.addTemplate FactorySimple
ObjectTemplate.addTemplate FactoryWreck
rem -------------------------------------
ObjectTemplate.lodSelector FactoryLodSelector
BF:1942 uses LOD objects to control which model is shown to a player at any given time. The LOD object is imbued with collision and response physics. There are three templates added to this LOD object; FactoryComplex – close-up view of the building; FactorySimple – the low polygon view of the building from long distance; and FactoryWreck – the wrecked view of the building. The final line defines the “lodSelector”. The “lodSelector” object makes the decisions about which model of the building a player will see.
***NOTE: The order of the templates added into an LOD object is very important. The first template must be the high polygon model, followed by the low polygon model and the wrecked model last.
FactoryComplex:
ObjectTemplate.create Bundle FactoryComplex
ObjectTemplate.geometry Britain_factory_m1
ObjectTemplate.setHasCollisionPhysics 1
We will create the “FactoryComplex” object first. It will be set up as a “Bundle” because we may want to include other objects within this object (ladders, special effects, etc.). The “ObjectTemplate.geometry” line defines which geometry object (model) this object will use. We created the geometry objects that we are referencing in Step 1.
FactorySimple:
ObjectTemplate.create SimpleObject FactorySimple
ObjectTemplate.geometry Britain_Factory_L1
ObjectTemplate.hasDynamicShadow 1
FactoryWreck:
ObjectTemplate.create SimpleObject FactoryWreck
ObjectTemplate.geometry Britain_Factory_Wreck_m1
The other two objects will be a “SimpleObject” because it is only a model that will be shown, with no dynamic properties. If a model is exported with a shadow, you can enable this via the “ObjectTemplate.hasDynamicShadow” line.
LodSelectorTemplate.create DistCompareSelector2 FactoryLodSelector
LodSelectorTemplate.hasDestroyedLod 1
LodSelectorTemplate.addLodDistance 300
The final object we will need to create in this file will be the “lodSelector” object that we referenced within the LOD object earlier. If you plan to have a wrecked model shown when the building is destroyed, you must include the “LodSelectorTemplate.hasDestroyedLod 1” line.
We have finished all the scripting we need to complete for the ‘Objects.con” file. Save and close the file.
STEP 3: Creating the
Network Objects
For a destroyable building to work in a multiplayer game there needs to be some way for the game to communicate the status of the building to other clients. BF:1942 does this using network objects. A networkable object is usually reference in an object using the “ObjectTemplate.setNetworkableInfo” line. Back in Step 2, we created a line stating “ObjectTemplate.setNetworkableInfo FactoryBodyInfo”. Now we need to create the object we referenced.
Network objects are usually kept in a file titled “Network.con”. Create a file named “Network.con” and open it.
NetworkableInfo.createNewInfo FactoryBodyInfo
“NetworkableInfo.createNewInfo” indicates that we are creating a new network object. The value “DesBuildingBodyInfo” will be the name of the new object.
NetworkableInfo.setPredictionMode PMLinear
The second and final line of the network object sets the way the data will be exchanged over the network. “PMLinear” is the standard value that is used for all networkable data.
Those two lines are all that is needed to create the necessary network object. The network object is the final piece of scripting that is needed to create the destroyable building. The “Network.con” file can be saved and closed.
Final Notes
The
tutorial has shown you how to create a basic destroyable building. A mini-mod has been created as an example and
employs the scripting listed above. You
can download it here.