Reference: JSON Datapack Paths

All JSON-driven registry types load files from data/<namespace>/<type_id>/. The <type_id> is the full ExileRegistryType id, which is modid + "_" + shortName.


Built-in type folders

Registry type Folder under data/<namespace>/
MAP_DATA_BLOCK library_of_exile_map_data_block/
MOB_LIST library_of_exile_mob_list/
MOB_AFFIX library_of_exile_mob_affix/
MAP_FINISH_RARITY library_of_exile_map_finish_rar/
MAP_CONTENT library_of_exile_map_content/
RELIC_STAT library_of_exile_relic_stat/
RELIC_TYPE library_of_exile_relic_type/
RELIC_AFFIX library_of_exile_relic_affix/
RELIC_RARITY library_of_exile_relic_rarity/
ITEM_MOD library_of_exile_item_modification/
ITEM_REQ library_of_exile_item_requirement/
CURRENCY library_of_exile_currency/
ORB_EDIT library_of_exile_orb_edit/

LEAGUE has no JSON folder — leagues are hardcoded only.


File placement

Files can be placed at any depth inside the folder. Subdirectories are supported:

data/my_mod/library_of_exile_mob_affix/fire_affixes/burn.json
data/my_mod/library_of_exile_mob_affix/burn.json

Both are loaded. The file name (excluding .json) is not used as the id — the "id" field inside the JSON is the authoritative GUID.


In-mod resources vs external datapacks

Files inside your mod jar at src/main/resources/data/ are loaded as part of the built-in datapack. Players and server admins can override or extend them with external datapack folders in the world's datapacks/ directory using the same path structure.


Loader control fields

Every JSON file may contain these top-level fields to control how the entry is loaded:

"loader"

Value Behaviour
"REPLACE_FULLY" (default) The JSON fully replaces/adds the entry
"REPLACE_FIELDS" Only the fields present in the JSON are merged into an existing hardcoded entry

Use "REPLACE_FIELDS" when you want to override specific values of an entry that is registered in Java by another mod, without needing to copy the full JSON:

{
  "id": "library_of_exile:common",
  "loader": "REPLACE_FIELDS",
  "affixes": 2
}

This adds 2 affixes to the built-in common relic rarity without touching any other field.

"enabled"

{ "id": "some_mod:unwanted_entry", "enabled": false }

Forces the entry to be unregistered even if it was previously added by Java code or another datapack. Useful for removing content from other mods without editing their files.


JSON validation

After each entry is loaded, the library re-serializes it and compares it with the original JSON (a round-trip check). Entries that fail this check are stored in JsonExileRegistry.INVALID_JSONS_MAP.

On player login, if any invalid entries were detected, a chat message lists them. This helps mod authors catch typos and missing fields during development.

To investigate: check the server log for [LibraryOfExile] warnings after a reload.


Hot-reload

All JSON entries support hot-reload via /reload. After reloading:

  1. All JSON entries are cleared and re-read from disk.
  2. Hardcoded (Java) entries are re-registered via EXILE_REGISTRY_GATHER.
  3. Sync packets are re-cached for ON_LOGIN types.
  4. Online players receive updated sync packets immediately (same as a login sync).

Hardcoded entries (non-JSON) cannot change without a server restart.