Converting Existing Addon Cars for the Extra Options Loader
This walkthrough shows how creators can migrate a finished FH2 addon car from the older mediapc / full-database replacement approach to the modular system in Extra Options. It does not cover creating, modeling, rigging or porting a car from scratch.
The examples use @Pixzl's Porsche 911 GT3 RS (992) from the ForzaMods Discord. This FH2Mods guide follows the sequence and screenshots of RokkuDayo's original GitHub Wiki tutorial, presented here in fresh wording.
Introduction
An Extra Options addon should not distribute an entire modified game database or entire language archives. Instead, the loader merges only the records and strings that your mod adds, updates or deletes relative to the unmodified game.
If your Porsche or other addon already works by replacing gamedbRC.slt and edited EN.zip, the conversion tools can generate the required JSON changes. Your existing car model and resources remain the starting point; this process changes how the mod is packaged and loaded.
Setting up the script
Download the helper files from Extra Options — tools:
•mod_diff.py — compares databases, carbin records and string tables.
•The accompanying batch-file launcher (described in the original guide as Addon Mod Generator.bat; the current repository lists Addon JSON Generator.cmd).
Keep both files in a convenient working directory. Add untouched copies of the original game's gamedbRC.slt and EN.zip as your baseline. For the tool, Python 3.10+ is supported, without third-party dependencies.
Preparing the files
Your previously working addon should already contain the car's ZIP archive, an edited gamedbRC.slt with its new car records, and any changed string tables for its display name or newly added manufacturer.
Copy the addon-specific database and language archive into your working folder and give them recognizable names:
•Original: gamedbRC.slt and EN.zip.
•Porsche changes: gamedbRC+porsche.slt and EN+porsche.zip.
Work from copies. Preserve your existing mod, vanilla data and game saves before comparing anything.
Diffing the files
You can invoke mod_diff.py from a terminal, but the batch launcher is the simplest Windows workflow. Hold Ctrl, select the vanilla gamedbRC.slt first, select gamedbRC+porsche.slt second, then drag both files onto the batch launcher.
The tool displays a series of choices. The original tutorial's screenshots below illustrate each one.
Diffing order
The unmodified database must be first. Check the prompt: if the order is already correct, press Enter. If the two paths are reversed, choose 2 to swap them, then confirm.
Table selection
To export all changes in the database, leave the table filter empty and press Enter. Filtering a particular table is possible, but for an addon car you will generally want all changed tables, since a working car may reference many related records.
Custom table keys
The next prompt controls how table row keys are selected. For a standard conversion, keep automatic key detection. Override a key only if you know a table's unique identifier and have a specific reason to use it.
Policies
The following options determine what happens when other mods modify overlapping data or reserve the same IDs. These choices matter especially when several car packs are installed together.
Value conflicts
A conflict can occur when two mods edit the same existing database value. You may choose whether to reject your addon on a mismatch or permit the mod with higher load-order priority to win.
In the batch prompt illustrated here:
•Option 1: reject the affected mod when expectations conflict.
•Option 2: allow the higher-priority edit to win and keep your mod enabled.
Use the strict choice when unintended compatibility changes would be harmful. Allowing override conflicts is an explicit decision, not a general guarantee that two mods work well together.
ID conflicts
Different addons can try to insert a new car, part or other record with an identical ID.
The menu offers:
•Option 1: keep the requested IDs according to priority, rejecting the conflicting insertion.
•Option 2: ask Extra Options to assign a nearby available ID and remap compatible references.
As the original guide cautions, automatic ID reassignment is especially useful for some car-part/carbin additions. Full addon cars have more interconnected records and can be less predictable after reassignment. Test carefully if you choose the nearest-ID policy.
Output
The generator then asks where the target database is located. For ordinary FH2 mods, keep the standard media/stripped/gamedbRC.slt target.
You can also specify the exported JSON destination. The default saves a file called database.json alongside the tool. An optional report helps inspect which rows or fields the comparison exported.
After completion you should have a database.json representing the existing addon's differences from vanilla. You can subsequently edit the JSON if you need to adjust specific records, rather than rerunning the whole comparison for every minor change.
If you prefer the command line, a basic comparison is:
powershell
python mod_diff.py database gamedbRC.slt "gamedbRC+porsche.slt" -o database.jsonFor edited values or intentional row removals, the tool also supports --updates override and --deletes include; only enable them when those changes are deliberate.
String table
Now convert the display strings. Drag the original EN.zip and modified EN+porsche.zip onto the launcher, as you did with the databases. The same general workflow works with other language archives.
Confirm that the vanilla ZIP comes first and the edited ZIP second. Swap them if the prompt has them reversed.
Choose the language code. When a ZIP archive has a recognizable language name, the tool can suggest the correct default; normally accept it for the English EN.zip comparison. Other languages can be exported similarly.
Choose the output name and location for strings.json. Once the comparison completes, you now have a modular string diff rather than a replacement copy of the game's full language tables.
The generated strings.json should include only your new or modified string values. Remember that string-table keys are localization IDs, not the same thing as car IDs.
Setting up your mod folder
With both JSON files ready, create the new directory inside Azimuth's `mods` folder. The Porsche example uses Porsche 911 GT3 RS (992).
Inside the new mod directory, create media and put database.json and strings.json next to it. These JSON files belong at the root of that individual addon folder.
A finished Porsche-style layout will look like this:
text
Azimuth/
azimuth.exe
mods/
Porsche 911 GT3 RS (992)/
mod.json
database.json
strings.json
media/
Cars/
<Porsche-car-archive>.zip
Stripped/
RC0/
<thumbnail-files>.swatchbinThe exact car archive name, RC subfolder and thumbnail filenames must match your existing mod assets and database references.
Mod.json
Create mod.json by hand. The file describes your mod's identity, author, version, optional dependencies and which files the loader should open.
This is an editable template for your own addon:
json
{
"format_version": 1,
"id": "your-mod",
"name": "My Awesome Mod",
"author": "My Awesome Name",
"version": "1.0.0",
"description": "An addon for Forza Horizon 2.",
"database": "database.json",
"media": "media",
"dependencies": []
}If a mod uses only database changes or only media assets, omit the field for the resource it does not use. A car like the Porsche example needs both database.json and media.
A dependency can keep a mod from loading when a required component is not present. The original guide uses ZephyrSkies' Forza Motorsport 5 packs as an example:
json
{
"dependencies": [
"fm5-zs-fm5-common"
]
}That fragment belongs *inside* a complete mod.json; it is not intended to replace the entire manifest. Any dependency must already be available earlier in the mod load order.
The original Porsche example shows its completed mod.json here:
Media directory
Treat media as this addon's private version of the game's media directory. Keep the same relative file structure you had under vanilla media or the old mediapc / mediaoverride location. You do not need to replace the base game's content.
For thumbnails, you can keep the original compatible files loose inside the matching RC folder. There is no need to package the whole RC directory back into a ZIP. Use the archive identifier referenced by your addon's data.
Finally, place the existing addon-car ZIP in the Cars directory under the mod's media folder. Preserve its correct filename and the resources inside it.
End
With the database diff, string diff, metadata and car media all arranged under your new mod folder, launch Forza Horizon 2 with Extra Options enabled and check whether the car appears.
If it fails, inspect FH2_ExtraOptions.log and the mods/loadorder.txt file near Azimuth. Typical causes include a missing dependency, a conflicting database row/ID, a wrong media path or incomplete original car assets. Keep backups of any save that contains addon cars; uninstalling a car that a save still owns can prevent that save from loading.
Original instructions: Extra Options — Addon Car Tutorial.
Example addon: Porsche 911 GT3 RS (992) by @Pixzl (ForzaMods Discord).
Project and guide: RokkuDayo's Extra Options.
Acknowledgements: @NFSLYY, @Pixzl and @ZephyrSkies for test feedback on the loader.