Work in progress!
Hello, in this guide, we are going to add a model to Enlisted, that can be placed in already existing maps.
For this, you’re going to need the following:
- 3Dsmax 2025
- DaEditor - AssetViewer
- The 3D model with textures
Optional tools:
- Blender
- Some kind of converter to convert textures
What are the different data types important to modding?
-
prefabs - Unlike prefabs in the editor, prefabs in DaEditor are objects without LODs. Prefabs cannot be added to maps inside editor.
-
Render Instace or rendinst or RI: Objects with at least two LODs. These are placable on the map like any other RI, and also works with navmesh generation.
-
Composites: I haven’t researched this enough yet, i would rather not say anything for now.
-
Animation to dagor (.a2d) - Animation tracks for dynmodels and units (not known yet how to add to Enlisted)
I am going to import and add the castle from War Thunder’s Fulda map (for the sake of simplicity)
For that, we will export the model from WT using DagorExporter.
Let’s search for castle:
There are two main data types you will see: GRP and DXP.
- DXP stands for Dagor teXture Pack
- GRP stands for Game Resource Pack.
DXP stores textures, GRP has the models. We need to export models, so we are looking for GRP file.
As you can see, the castle is made up of 4 individual models.
I’m only going to export building_a for now, with only the first two LOD levels, and the collision file.
In this case, there shouldn’t be a need to check the models for errors. But when importing custom models there are conditions which need to be met before proceeding to the next step.
- Model has to have a LOD level that has a vertex count smaller than 65535
- Model must not have loose vertices
Loading the model into Blender shows everything is OK
Before opening 3dsmax, make sure DaEditor is set up. Read this: Getting Started with Dagor — Dagor Documentation documentation
This particular guide is specifically for RI import, a different guide for setting DaEditor might be made.
Once you have the program downloaded there should be at least two folders:
- tools
- sample
And if you’ve downloaded the outerSpace sample then 3.
I have created a new project folder for myself, to differentiate it from the outerspace sample project.
This is the folder structure (also true for all project folders)
- develop - Contains raw, unencrypted, non-packed data used for development. This includes textures, models etc
- game - folder contains built data.
Others are irrelevant for now. Tools is not the same as tools in the root folder.
Inside game/content/ you will be able to find the built DXP and GRP files, the game can read. Enlisted cannot load or work with PNGs and Wavefront files!
Inside develop/assets/fulda_castle we will place the converted texture files. These are currently in DDS, but need to be converted to TIF. (TIFF is not acceptable, despite being the same format)
Inside this folder, let’s create a new folder, named fulda_castle
This is the folder for our model. It contains all the relevant data for our model, like textures, the model file, which we will export via 3dsmax, and other filetypes i’m not going to talk about for now.
However, Dagor doesn’t know about these files. We need a folder.blk file that will tell the engine what type of file to look for and where.
All files related to the model will be included at the end of the guide.
Let’s look at this folder.blk. It will look for .DAG files, which are models, in Dagor compatible format.
It should make more sense near the end of this guide.
virtual_res_blk{
find:t="^(.*)\.lod00\.dag$" //Look for LOD 0 level .dag files
exclude:t = "^(.*_dp_.*)\.lod00\.dag$" //exclude files containing _dp_
exclude:t = "^(.*_destr)\.lod00\.dag$" //exclude files containing _destr (destroyable)
stopProcessing:b=false //always false
className:t="rendInst" //class of object
contents {
lod { range:r=5000;} //Distance of LOD 0 in the game
lod { range:r=8000;} //Distance of LOD 1, it will replace LOD 0 after 5000 meters.
bboxFromLod:i=1 //bound box from lod?? idk
}
}
virtual_res_blk{
find:t="^(.*)\.lod01\.dag$" //Find .dag with lod1. collision will be "attached" to this LOD level, but will work on all lod levels.
className:t="collision"
name:t="$1_collision"
contents{
collapseAndOptimize:b=yes //no idea but optimization is always good?
buildFRT:b=yes // no idea what this is
}
stopProcessing:b=false //always false
}
Every folder needs a folder.blk!
Convert the dds texture files to TIF. You can find texture converters online, google will help.
After conversion this is how my folder looks like:
(I also copied the collision of the model)
Only thing left is, to convert the Wavefront to .DAG. There are plugins for Blender to do this, but 3dsmax has more functionality, and it actually works.
Open 3dsmax, and open the LOD 0 model:
Convert unit to meters. Auto smoothing must be enabled at 30. Import as single mesh.
Click on the wrench icon, and select more
:
Select Dagor Utility
:
On the right side, at the material tab, type simple_aces
into Mat class
and click StdMat -> DagorMat
then Dagor ->Dagor New
Then select remove degenerates
Select the wrench again, and choose Dagor Scene export:
On the right side there is an option export DAG
Find the folder where you copied the TIF files and collision to
Here is an important part, naming the file. The filename is made up like this:
- rendinst_name.lodlevel.dag
Because we are exporting LOD 0 model, we need to name it like this:
RINAME.lod00.dag - RINAME is the codename of the rendinst, which name will be used in game DOT lodlevel DOT file extension.
You need to do the same process for the lower lod level models, and name it fulda_castle_building_a.lod01.dag
and fulda_castle_building_a.lod02.dag
etc.
Final look of folder:
We have the TIF textures, the collision file and the two LOD models. But enlisted cannot read this. We need to convert and export these models to GRP and DXP format. I will use the assetviewer for this.
If we open Assetviewer, we can view the model we imported:
And it’s collision:
You can switch between LODs at the bottom right:
LODs here are taken from the folder.blk.
Let’s export this for Enlisted.
Right click on the fulda_castle folder and select “Export all with sub folders”
After that the built resources can be found in game/content/res
_collision_pack.grp
contains collision models
grp_hdr.vromfs.bin
contains array that holds information that tells the game what files to look for
riDesc.bin
contains rendinst name list afaik, which in this case is one name.
Now to load this into Enlisted, copy all those files into Enlisted/content/cdk/res
. If there is no cdk
, res
folder, create one.
Note: there can be only one grp_hdr and riDesc file. That’s why you can only have only one export loaded at once. Devs need to add more mount points.
We are almost there. Open the editor, and a scene, and place down a game_rendinst:
You will not find this in the Rendinst list in editor:
Devs need to make the editor load custom content into this list.
Instead, save the scene and edit the BLK manually:
Remember, RI name is the name you saved the DAG file before!
aaand:
Success!
The castle is now usable in missions, and has collision:
Source files:
fulda_castle.zip (6.6 MB)
Contains TIF textures, .lod00 and .lod01 DAG models and collision file.
res.zip (5.7 MB)
Contains built files, ready to be used in Enlisted.
Developers need to implement server support for custom content and we can have anything we want, within sane limits.
The guide is a little rough, but if you have experience with modding Enlisted, it’s do-able. This particular model shouldn’t take more than 5 minutes to import, if you have practice.
Bonus: adding transparency to material:
Some textures or materials may have an alpha channel, like fences, grates. These need to have transparency added manually in 3dsmax to appear correctly in-game.
After converting materials to dagor mat, open the materials tab with “M” and select the mat which needs transparency:
Click on add:
Select atest:
and set it to 127.
Materials with atest will turn white, but should appear correctly in AssetViewer.