Mod Contributions
Contributions are how your mod integrates with the game beyond just adding new content. They're declared in ModContributions.json and processed automatically by the game's Content Registry.
Types of Contributions
New Content
Any asset saved inside your mod plugin is automatically treated as new content. No special declaration is needed. After packaging, the mod folder looks like:
Mods/
└── my_mod/
├── my_mod.pak
├── my_mod.ucas (IoStore — UE 5.4+)
├── my_mod.utoc (IoStore — UE 5.4+)
├── ModDescriptor.json
└── thumbnail.png
The game developer can query for your new content using UModLoaderSubsystem::QueryModAssets().
Class Overrides
Replace one of the game's Blueprint classes with your own version. Your class must be a child of the original (or implement the same interface).
{
"ClassOverrides": [
{
"Original": "/Game/Characters/BP_Enemy.BP_Enemy_C",
"Replacement": "/Game/Mods/MyMod/Characters/BP_MyEnemy.BP_MyEnemy_C"
}
]
}
The fields are Original (the game class to replace) and Replacement (your class). When the game spawns a BP_Enemy, it will transparently spawn your BP_MyEnemy instead.
The safest way to make a class override is to create a child Blueprint of the original class. This ensures you inherit all the game's logic and only override what you need.
- In the Content Browser, right-click → Create Blueprint Class
- Search for the original class name provided in the game's mod documentation
- Save it under your mod's plugin folder
Conflict Resolution
When two mods override the same class, the outcome is decided by the game developer
through ClassConflictPolicy in Project Settings — this is not set per-override by modders:
| Policy | Behavior |
|---|---|
Priority (default) | The winner is decided by the configured mod load order |
LastWins | The last-loaded mod's override wins |
Error | The conflict is rejected and the original class is kept |
DataTable Row Additions
Add or replace rows in one of the game's DataTables without shipping the entire table. There are two ways to do it.
Option A — Same-path auto-merge (no JSON):
- Check the game's mod documentation for the DataTable's path and Row Type
- Create a DataTable in your mod using the exact same Row Type, placed so its path mirrors the game table's path (same relative sub-path under your mod's content root)
- Add your rows (use an existing Row Name to replace that row)
At load time the Content Registry detects the matching mirror path and merges your rows into the game's table automatically — no declaration required.
Option B — Explicit declaration (ModContributions.json):
{
"CollectionMerges": [
{
"TargetDataTable": "/Game/Data/DT_Items",
"Rows": [
{ "RowName": "Sword_Legendary", "DataPath": "/Game/Mods/MyMod/Data/Row_Sword.Row_Sword" }
]
}
]
}
The fields are TargetDataTable (the game table) and Rows (each with a RowName and a
DataPath to the row object). In both options the merge is row-level:
- New row names → added to the table
- Existing row names → your values replace the originals
Your rows must use the exact same Row Struct as the original table. If the Row Type doesn't match, the merge is skipped. Check the game's mod documentation for the correct struct name.
Full ModContributions.json Example
{
"ClassOverrides": [
{
"Original": "/Game/Characters/BP_Enemy.BP_Enemy_C",
"Replacement": "/Game/Mods/MyMod/Characters/BP_MyEnemy.BP_MyEnemy_C"
},
{
"Original": "/Game/Weapons/BP_BaseSword.BP_BaseSword_C",
"Replacement": "/Game/Mods/MyMod/Weapons/BP_MagicSword.BP_MagicSword_C"
}
],
"CollectionMerges": [
{
"TargetDataTable": "/Game/Data/DT_Items",
"Rows": [
{ "RowName": "MagicSword", "DataPath": "/Game/Mods/MyMod/Data/Row_MagicSword.Row_MagicSword" }
]
}
]
}
New content (maps, weapons, etc.) needs no declaration — any asset in your mod plugin is automatically available. Only class overrides and DataTable merges are declared here.
Editing Contributions via UI
Use ModKit → Edit Mod → {Your Mod} to edit contributions without touching JSON directly. The raw JSON editor at the bottom of the Edit window shows the live ModContributions.json content.
Testing Contributions
During development, load your mod into the game using the game's Mods directory. Check the Output Log for lines tagged LogModKitRegistry to see if your contributions were registered correctly.
Common log messages:
[LogModKitRegistry] Registered class override: /Game/BP_Enemy → /Plugins/my_mod/BP_MyEnemy[LogModKitRegistry] Merged 5 rows from my_mod into DT_Items[LogModKitRegistry] Warning: ConflictPolicy=Error triggered for /Game/BP_Enemy — two mods conflict