Saturday, August 1, 2020

DayZ Modding: Adding Custom Cars


Step 1: Install mod

This tutorial isn't focused on installing a mod, if you need information I'll gather links to various tutorials, but you'll need the mod installed on your DayZ server.

For our comprehensive tutorial, we'll be using the mod [CrSk] BMW 525i E34, which adds a 90 BMW and is near production-level mod.

So go install the mod or the mod of your choice. 

Step 2: Prepare your class names

In order to add the items in your mod to your DayZ server, you'll first need to tell DayZ what will be added. Most mods will list class names (unique identifiers for your mod items) in their description or have an XML file in the install folder to help get you quickly started.

For example the ARMA 2 ACR Weapons Pack has an XML folder in the install directory with the files to append (not replace.) If your mod has these files then skip to Step 4.


At this point if you don't know your mod class names to add, you'll need an administration mod like ZomBerry Admin Tools or VPPAdminTools to be installed, which you'll probably need anyway.

Step 3: Gather class names

Using your admin tool, go to the Spawn menu and search for items in your mod, in our example I will search for "bmw" which will give you a list of the class name and then a description in brackets.

We are interested in the class name like, "CrSk_BMW_525i_E34".



The list seems long but these is an extreme example because this mod has 4 variants of the same car, a gray, black, red, and beater (wrecked) version.

So let's just focus on the base CrSk_BMW_525i_E34 variant.

 BMW Class NameDescription

CrSk_BMW_525i_E34
car
BMWE34_bagazhniktrunk
BMWE34_kapothood
BMWE34_dver_1_1driver's side front door
BMWE34_dver_1_2pasenger's side front
BMWE34_dver_2_1driver's side rear door 
BMWE34_dver_2_2pasenger's side rear door

Now that we have our class names we can start editing the files.

Step 4: Backup your files

You are not perfect. You will make mistakes. There are several files we're going to be editing, and one mistake can cause hours of painful searching. 

Back up your files every time before editing them.

This could mean copying the files into a new backup folder, or better yet, create a GitHub account and use git to version control your files.

I also recommend using a free editor such as Notepad++, Visual Studio Code, Eclipse, or any IDE to help validate your XML while you edit. Some more powerful IDEs, like Visual Studio Code and Eclipse, integrate with GitHub.

Step 5: Edit types.xml

The file types.xml is a list of every item in the game. So it's a good first place to start.

Browse to "mpmissions\dayzOffline.enoch\db", assuming you are using Livonia, and open the file "types.xml" in your editor. Do not use Widows Notepad as it has a habit of converting the file encoding and is not XML aware.

If your mod has a types.xml already, open it up and copy all of the <type> nodes into the bottom of your file, but inside the root node. If you're not familiar with XML, each file has a root node (in this case <types>) that contain all of the child nodes, so your insertion must be below the last type node and before the closing </types> tag.

Because it is such a big file, let's pretend "..." is all of the already existing content of the file. Here I copied the contents of the Arma 2 DLC Weapon Pack after the last type node, and before the closing </types> tag.


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<types>
    ...
    ... (existing content)
    ...
    <type name="ZucchiniSeedsPack">
        <nominal>30</nominal>
        <lifetime>3600</lifetime>
        <restock>0</restock>
        <min>20</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="food"/>
        <usage name="Farm"/>
    </type>

    <!-- @ArmA 2 DLC WEAPON PACK -->
    <type name="A2DLC_CZ805A2_StndBttstck">
        <nominal>2</nominal>
        <lifetime>7200</lifetime>
        <restock>1800</restock>
        <min>2</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="weapons"/>
        <usage name="Military"/>
        <value name="Tier3"/>  
        <value name="Tier4"/>    
    </type>
    <type name="A2DLC_CZ805A2_SnprBttstck">
        <nominal>2</nominal>
        <lifetime>7200</lifetime>
        <restock>1800</restock>
        <min>2</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="weapons"/>
        <usage name="Military"/> 
        <value name="Tier4"/>    
    </type> 
</types>

However if your mod has no types.xml to import, like the BMW mod, then you'll need to create these nodes yourself. But don't worry we can just find a similar item, copy that XML, and replace the name attribute of the type node with our class name.

Since the BMW is a sedan, we can find the already existing "CivilianSedan" node, then copy the nodes for the doors, hood, trunk, and wheels, and paste them after the last type node and before the closing </types> tag, and replace the CivilianSedan parts with our BMW parts.

CivilianSedan Class Name BMW Class NameDescription
CivilianSedan

CrSk_BMW_525i_E34
car
CivSedanTrunk
BMWE34_bagazhniktrunk
CivSedanHood
BMWE34_kapothood
CivSedanDoors_Driver
BMWE34_dver_1_1driver's side front door
CivSedanDoors_CoDriver
BMWE34_dver_1_2pasenger's side front
CivSedanDoors_BackLeft
BMWE34_dver_2_1driver's side rear door 
CivSedanDoors_BackRight
BMWE34_dver_2_2pasenger's side rear door

Your file would look like this with "..." representing the already existing content of the file.

Note: In Livonia, "vehiclesparts" category items do not spawn for some reason, so I changed the category name to "tools" and it worked.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<types>
    ...
    ... (existing content)
    ...
    <type name="ZucchiniSeedsPack">
        <nominal>30</nominal>
        <lifetime>3600</lifetime>
        <restock>0</restock>
        <min>20</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="food"/>
        <usage name="Farm"/>
    </type>

    <!-- @[CrSk] BMW 525i E34 -->
    <type name="CrSk_BMW_525i_E34">
        <nominal>0</nominal>
        <lifetime>3888000</lifetime>
        <restock>1800</restock>
        <min>0</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
    </type>
    <type name="BMWE34_bagazhnik">
        <nominal>20</nominal>
        <lifetime>10800</lifetime>
        <restock>0</restock>
        <min>10</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="vehiclesparts"/>
        <tag name="floor"/>
        <usage name="Industrial"/>
    </type>
    <type name="BMWE34_kapot">
        <nominal>20</nominal>
        <lifetime>10800</lifetime>
        <restock>0</restock>
        <min>10</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="vehiclesparts"/>
        <tag name="floor"/>
        <usage name="Industrial"/>
    </type>
    <type name="BMWE34_dver_2_2">
        <nominal>20</nominal>
        <lifetime>10800</lifetime>
        <restock>0</restock>
        <min>10</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="vehiclesparts"/>
        <tag name="floor"/>
        <usage name="Industrial"/>
    </type>
    <type name="BMWE34_dver_1_2">
        <nominal>20</nominal>
        <lifetime>10800</lifetime>
        <restock>0</restock>
        <min>10</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="vehiclesparts"/>
        <tag name="floor"/>
        <usage name="Industrial"/>
    </type>
    <type name="BMWE34_dver_2_1">
        <nominal>20</nominal>
        <lifetime>10800</lifetime>
        <restock>0</restock>
        <min>10</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="vehiclesparts"/>
        <tag name="floor"/>
        <usage name="Industrial"/>
    </type>
    <type name="BMWE34_dver_1_1">
        <nominal>20</nominal>
        <lifetime>10800</lifetime>
        <restock>0</restock>
        <min>10</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="vehiclesparts"/>
        <tag name="floor"/>
        <usage name="Industrial"/>
    </type>
    
</types>

Next we copy these nodes above for our red, black, and beater variants of the BMW, just add "_red", "_black", and "_beater" to the end of each class.

CivilianSedan Class Name BMW Class NameBMW Black Class NameBMW Red Class NameBMW Beater Class NameDescription
CivilianSedan

CrSk_BMW_525i_E34
CrSk_BMW_525i_E34_blackCrSk_BMW_525i_E34_redCrSk_BMW_525i_E34_beatercar
CivSedanTrunk
 BMWE34_bagazhnikBMWE34_bagazhnik_blackBMWE34_bagazhnik_redBMWE34_bagazhnik_beatertrunk
CivSedanHood
 BMWE34_kapotBMWE34_kapot_blackBMWE34_kapot_redBMWE34_kapot_beaterhood
CivSedanDoors_Driver
 BMWE34_dver_1_1BMWE34_dver_1_1_blackBMWE34_dver_1_1_redBMWE34_dver_1_1_beaterdriver's side front door
CivSedanDoors_CoDriver
 BMWE34_dver_1_2BMWE34_dver_1_2_blackBMWE34_dver_1_2_redBMWE34_dver_1_2_beaterpasenger's side front
CivSedanDoors_BackLeft
 BMWE34_dver_2_1BMWE34_dver_2_1_blackBMWE34_dver_2_1_redBMWE34_dver_2_1_beaterdriver's side rear door 
CivSedanDoors_BackRight
BMWE34_dver_2_2BMWE34_dver_2_2_blackBMWE34_dver_2_2_redBMWE34_dver_2_2_beaterpasenger's side rear door

Next let's do the same for our wheels. I'm going to copy the type node for "CivSedanWheel" for each of the wheel variants, and then "CivSedanWheel_Ruined" for the shtamp wheel variants, and paste them below our "BMWE34_dver_1_1" type node.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<types>
    ...
    ... (existing content)
    ...
 
    <type name="BMWE34_koleso_shtamp_black">
        <nominal>4</nominal>
        <lifetime>10800</lifetime>
        <restock>0</restock>
        <min>1</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="vehiclesparts"/>
        <tag name="floor"/>
        <usage name="Industrial"/>
    </type>
    <type name="BMWE34_koleso_shtamp">
        <nominal>4</nominal>
        <lifetime>10800</lifetime>
        <restock>0</restock>
        <min>1</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="vehiclesparts"/>
        <tag name="floor"/>
        <usage name="Industrial"/>
    </type>
    <type name="BMWE34_koleso_style37">
        <nominal>8</nominal>
        <lifetime>10800</lifetime>
        <restock>0</restock>
        <min>4</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="vehiclesparts"/>
        <tag name="floor"/>
        <usage name="Industrial"/>
    </type>
    <type name="BMWE34_koleso_style21_black">
        <nominal>8</nominal>
        <lifetime>10800</lifetime>
        <restock>0</restock>
        <min>4</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="vehiclesparts"/>
        <tag name="floor"/>
        <usage name="Industrial"/>
    </type>
    <type name="BMWE34_koleso_style21">
        <nominal>8</nominal>
        <lifetime>10800</lifetime>
        <restock>0</restock>
        <min>4</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="vehiclesparts"/>
        <tag name="floor"/>
        <usage name="Industrial"/>
    </type>
    <type name="BMWE34_koleso_style16">
        <nominal>8</nominal>
        <lifetime>10800</lifetime>
        <restock>0</restock>
        <min>4</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="vehiclesparts"/>
        <tag name="floor"/>
        <usage name="Industrial"/>
    </type>
    <type name="BMWE34_koleso_style2">
        <nominal>8</nominal>
        <lifetime>10800</lifetime>
        <restock>0</restock>
        <min>4</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="vehiclesparts"/>
        <tag name="floor"/>
        <usage name="Industrial"/>
    </type>
    <type name="BMWE34_koleso_style5">
        <nominal>8</nominal>
        <lifetime>10800</lifetime>
        <restock>0</restock>
        <min>4</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="vehiclesparts"/>
        <tag name="floor"/>
        <usage name="Industrial"/>
    </type>
    
</types>


Step 6: Edit cfgspawnabletypes.xml

For most mods you are done, sort of. Skip to Step 10. However for more complex items, such as cars, we'll need to do some more setup.

The cfgspawnabletypes.xml file will configure how your car will spawn. Will it have wheels and doors? Will it have a spark plug? Will it contain other loot in its trunk? This is where you will set those values.

Open the file, browse to "mpmissions\dayzOffline.enoch", assuming you are using Livonia, and open the file "cfgspawnabletypes.xml".

Did you back up the file first?

We'll use the same trick where we will find a similar item, copy its type node, and paste it after the last type node and before the closing </spawnabletypes> tag. The type name attribute here is the same as the class in types.xml.

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>

<spawnabletypes>
    <damage min="0.3" max="0.7" />
    ...
    ... (existing content)
    ...
    <!-- @[CrSk] BMW 525i E34 -->
    <type name="CrSK_BMW_525i_E34">
        <attachments chance="1.00">
            <item name="BMWE34_koleso_style2" chance="0.60" />
        </attachments>
        <attachments chance="1.00">
            <item name="BMWE34_koleso_style2" chance="0.60" />
        </attachments>
        <attachments chance="1.00">
            <item name="BMWE34_koleso_style2" chance="0.60" />
        </attachments>
        <attachments chance="1.00">
            <item name="BMWE34_koleso_shtamp" chance="0.60" />
        </attachments>
        <attachments chance="1.00">
            <item name="CarRadiator" chance="0.40" />
        </attachments>
        <attachments chance="1.00">
            <item name="CarBattery" chance="0.40" />
        </attachments>
        <attachments chance="1.00">
            <item name="SparkPlug" chance="0.40" />
        </attachments>
        <attachments chance="1.00">
            <item name="HeadlightH7" chance="0.40" />
        </attachments>
        <attachments chance="1.00">
            <item name="HeadlightH7" chance="0.40" />
        </attachments>
        <attachments chance="1.00">
            <item name="BMWE34_dver_1_1" chance="0.60" />
        </attachments>
        <attachments chance="1.00">
            <item name="BMWE34_dver_2_1" chance="0.60" />
        </attachments>
        <attachments chance="1.00">
            <item name="BMWE34_dver_1_2" chance="0.60" />
        </attachments>
        <attachments chance="1.00">
            <item name="BMWE34_dver_2_2" chance="0.60" />
        </attachments>
        <attachments chance="1.00">
            <item name="BMWE34_kapot" chance="0.60" />
        </attachments>
        <attachments chance="1.00">
            <item name="BMWE34_bagazhnik" chance="0.60" />
        </attachments>
    </type>

</spawnabletypes>

Next go through and edit the chance values from 0.00 to 1.00, with 0 being never spawning as an attachment and 1 being always spawn as an attachment.

What value you choose is up to your playstyle. Should it be harder for a user to build a car or should it be pretty easy to drive away once you spot a car. This will take some trial-and-error on your part.

Step 7: Edit events.xml

Again, for most items like clothes and guns you're already done, but for more complex items like cars you'll need to manually place them in your map.

To do that first you'll need to create an "event" in the events.xml file located in the folder "mpmissions\dayzOffline.enoch\db", assuming you are using Livonia.

I've read some documentation that there is a convention for the naming of events. If you look you'll see some events start with "Static", animals start with "Animal", and car events start with "Vehicle", and the names use title case with no spaces, hyphens, or underscores, so you should probably follow this convention to avoid any issues.

Did you backup your file?

We will again find a similar event node, such as "VehicleSedan02" for our car, and copy and paste the node after the last event node and before the </events> closing tag.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<events>
    ...
    ...
    ...
    <!-- @[CrSk] BMW 525i E34 -->
    <event name="VehicleCrSKBMW525iE34">
        <nominal>10</nominal>
        <min>7</min>
        <max>13</max>
        <lifetime>3888000</lifetime>
        <restock>0</restock>
        <saferadius>500</saferadius>
        <distanceradius>500</distanceradius>
        <cleanupradius>200</cleanupradius>
        <flags deletable="0" init_random="0" remove_damaged="1"/>
        <position>fixed</position>
        <limit>mixed</limit>
        <active>1</active>
        <children>
            <child lootmax="0" lootmin="0" max="5" min="3" type="CrSK_BMW_525i_E34_Red"/>
            <child lootmax="0" lootmin="0" max="5" min="3" type="CrSK_BMW_525i_E34_Black"/>
            <child lootmax="0" lootmin="0" max="5" min="3" type="CrSK_BMW_525i_E34"/>
        </children>
    </event>
</events>

Here I've named the copied event "VehicleCrSKBMW525iE34", and what we're looking for is having one child node per variant. So we have three child nodes for the grey, black, and red variant.

I could add the beater variant as a fourth child and that's perfectly fine, but in another tutorial I'll go over creating BMW crash sites players can grab doors and wheels from which will have different spawn numbers and spawn points.

Yes we have to manually set spawn points. Let's go over that next.

Step 8: Edit cfgeventspawns.xml

So more complex items like cars need to know where to spawn, and those locations are set in this file. All other items like clothes and guns will spawn depending on their location you set in types.xml and you do not need to do anything in this step.

It may not be as difficult as you expect. We can simply take coordinate locations from existing events such as the VehicleCivilianSedan, and move them into our event for our car, this would help keep the ratio of functioning cars on your server the same. Or we can go and scout new locations for our car making your server highly unique.

To set your own custom spawn locations for your car, you'll need an administration mod like ZomBerry Admin Tools or VPPAdminTools to be installed, which has functions to locate your coordinates on the game map.

Go to the Map tab, put your mouse over a location and the admin tool will give you its X and Y coordinates. You'll notice the 0, 0 coordinates for each map are on the bottom left of the map.


Gather your list of X, Y coordinates and we're ready to add them.

Browse to the folder "mpmissions\dayzOffline.enoch", assuming you are using Livonia, and open the file "cfgeventspawns.xml" in your editor.

Did you backup your file?

Same technique here where we grab a similar event and paste it after the last event and before the closing </eventposdef> tag.

The name of the event will be the same event name you gave in events.xml, which in my example I named ""VehicleCrSKBMW525iE34".

Two things to note, the Y coordinate has the attribute name "z", and the "a" attribute I believe is not altitude but azimuth, or the rotation since no value is greater than 360. I haven't verified yet but for your custom locations you can set it to "0" and the value works fine.

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<eventposdef>
    ...
    ...
    ...
    <event name="VehicleCivilianSedan">
        <pos x="8475.086914" z="12021.825195" a="98.171761" />
        <pos x="6400.875" z="11015.832" a="87.982" />
        <pos x="1454.454834" z="7873.223632" a="169.339111" />
        <pos x="7979.476074" z="11590.756836" a="306.358276" />
        <pos x="1962.798462" z="6963.157226" a="89.255974" />
        <pos x="2026.577026" z="7376.600586" a="280.835632" />
        <!--
        <pos x="8110.324218" z="11124.857422" a="239.048874" />
        <pos x="5941.000488" z="4073.796875" a="224.205597" />
        <pos x="1807.832031" z="7316.355957" a="353.48465" />
        -->
        <pos x="1158.611328" z="7232.993652" a="184.390396" />
        <pos x="3419.759277" z="12219.115234" a="210.244019" />
        <pos x="5706.550293" z="4009.871582" a="348.438843" />
        <pos x="6538.852539" z="11313" a="197.654129" />
        <pos x="1524.120727" z="9755.583985" a="275.054993" />
        <pos x="6463.915039" z="11295.385742" a="18.860342" />
        <pos x="6101.026855" z="4090.22168" a="314.294312" />
        <pos x="6569.03418" z="11228.957032" a="328.941681" />
        <pos x="1437.497437" z="9759.655273" a="119.077553" />
        <pos x="4956.69629" z="9913.737305" a="30.127554" />
        <pos x="3177.355713" z="12065.053711" a="291.759857" />
        <pos x="6435.437988" z="11455.860352" a="316.596741" />
        <pos x="1689.447754" z="7440.379395" a="322.377319" />
        <pos x="3699.560547" z="11819.297851" a="122.567703" />
        <pos x="8442.847656" z="11842.393554" a="177.814026" />
        <pos x="10650.541016" z="11054.634765" a="142.799698" />
        <pos x="11064.290039" z="4239.735352" a="339.768036" />
        <!--
        <pos x="10657.114258" z="11214.108398" a="144.355301" />
        <pos x="11562.433594" z="429.821716" a="54.768456" />
        <pos x="10961.392578" z="11193.723633" a="281.178528" />
        <pos x="11489.000977" z="4625.76709" a="7.299194" />
        <pos x="11148.257812" z="11417.144532" a="302.733154" />
        -->
        <pos x="11581.658203" z="9631.269532" a="326.835175" />
        <pos x="11245.519531" z="9564.609374" a="148.678238" />
        <pos x="10872.585938" z="940.378479" a="112.660118" />
        <pos x="5559.256836" z="3846.330811" a="331.978912" />
        <pos x="11513.013672" z="470.985016" a="322.622253" />
        <pos x="6192.668458" z="4165.701172" a="49.918659" />
        <pos x="11644.21289" z="9636.391602" a="252.961456" />
        <pos x="11236.445312" z="4365.956543" a="221.51123" />
        <pos x="11050.731445" z="4385.636231" a="328.794769" />
    </event>
    <event name="VehicleCrSKBMW525iE34">
        <!-- Coordinates grabbed from VehicleCivilianSedan -->
        <pos x="8110.324218" z="11124.857422" a="239.048874" />
        <pos x="5941.000488" z="4073.796875" a="224.205597" />
        <pos x="1807.832031" z="7316.355957" a="353.48465" />
        <pos x="10657.114258" z="11214.108398" a="144.355301" />
        <pos x="11562.433594" z="429.821716" a="54.768456" />
        <pos x="10961.392578" z="11193.723633" a="281.178528" />
        <pos x="11489.000977" z="4625.76709" a="7.299194" />
        <pos x="11148.257812" z="11417.144532" a="302.733154" />
 <!-- Custom coordinate locations -->
        <pos x="11515.3" z="475.762" a="0" />
        <pos x="5732.29" z="4032.79" a="0" />
    </event>
</eventposdef>

I included examples of both techniques. I commented out the values and copied them into my custom event, and created some custom positions.

Step 9: Launch your server

Run your server, check for any crashes in the logs, and have fun driving in 1990's style.