Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

NeoForge data files

This is a scoped audit of server data, not a claim that carrying a file into a package executes it. The paths and examples below identify the readers and fixtures checked; the modifier gaps are tracked separately.

DataResult and readerExample or evidence
Convention item tagsLoaded for content roots: mod_content::build in crates/horizon-client/src/mod_content.rs merges tag files; content_namespaces::tag_namespaces in crates/horizon-items/src/content_namespaces.rs includes c for content roots, and items::load_tag_lists in crates/horizon-items/src/items.rs reads and resolves them. Unknown item entries are filtered by Known::keeps in mod_content.rs.data/c/tags/item/gems/glint.json: {"values":["minecraft:diamond"]}. The glint_mod fixture and a_data_mod_loads_unloads_and_loads_again test in crates/horizon-client/src/mod_content_tests.rs check the resulting c:gems/glint membership.
Structure modifiersNot loaded by any reader found today. mod_content::build copies ordinary files to its overlay; worldgen_entry in that file recognizes worldgen bundles, not structure modifiers. A workspace search for structure_modifier found no reader. Copying is not applying.No verified in-tree example. #1269 tracks loading and applying them.
Global loot modifiersNot loaded by any reader found today. mod_content::build copies ordinary files to its overlay, but a workspace search for loot_modifiers found no loader. The native_loot_drops code hook in crates/horizon-mod-vocab/src/hooks/base.rs is not a data-file reader.No verified current-format in-tree example. #1270 tracks loading and applying them. The old global.json in carry::tests::claims_the_namespaces_its_files_name is a carry classification fixture, not proof of current-format loading.

The shared load-condition evaluator in crates/horizon-world/src/conditions.rs applies to recipes, loot tables, item modifiers, predicates, enchantments, jukebox songs, instruments, damage types, advancements, synchronized registry JSON, world-table tags (including the direct loot and damage readers, synchronized registry tags and function tags), and native item/block data maps. The conditional-data contract describes these file types and their reload lifetimes.

Ordinary JSON resources select the winning pack file before evaluating its conditions. A false or unsupported condition omits that winner without exposing a lower pack's file. Tag resources and data maps evaluate each layer before merge, replace, or remove; an omitted layer cannot clear lower entries. Content-root composition follows the same tag rule, including block/biome tag bundles. The damage registry remains frozen after world open; reloads reevaluate its tags. Generated item default components retain their prototype lifetime.

Supported forms are neoforge:mod_loaded, neoforge:true, neoforge:not (value), and neoforge:and / neoforge:or (values), inside a neoforge:conditions array. Every condition must hold; an unknown kind anywhere in a nested tree omits the file, including beneath not or or. Files without the array load normally.

mod_loaded reads an immutable snapshot of the owning generation's server-enabled mod IDs, including code-only native and WebAssembly mods, plus minecraft. Client-only, disabled and refused packages are absent. Namespaces do not imply a loaded mod. Changed enabled IDs participate in cache identity and are published with successful reloads; failed preparation preserves the old generation, and retained readers keep their old snapshot. Recipe condition behavior is unchanged. This shared contract does not add readers for the two modifier kinds above.