Render-time layering for Minecraft item icons. Stack extra sprites on top of any item's icon — driven by resource packs and item properties, without writing any code. Cross-loader library for 1.20.1 (Forge), 1.21.1 (NeoForge) and 26.1.2 (NeoForge).
This is a library, not a content mod. Installing it alone changes nothing. It is a dependency for resource packs and mods that want layered item icons. See "What it does" for one-paste examples that work right away.
Give any item an additional icon layer that appears only when a condition is true.
// assets/mymod/eoml/layers/runeblade.json — just drop this into a resource pack
{
"targets": ["mymod:runeblade", "#minecraft:swords"],
"layers": [
{ "sprite": "mymod:runes/base_glow" },
{ "sprite": "mymod:runes/drawn_crown",
"when": { "type": "eoml:item_property", "property": "minecraft:pull", "min": 0.65 } },
{ "sprite": "mymod:runes/cracked",
"when": { "type": "eoml:variable_range", "name": "property:minecraft:damage", "min": 0.5 } }
]
}
Layers are accumulative — list order is draw order. Each layer can carry its own
condition, and conditions can be combined with all_of / any_of / none_of.
That is the whole feature. No Java, no datapack, no server-side install.
| Layer rules | Arbitrary extra layers on any item icon, condition-gated, multi-layer |
| Pattern trims | Take over a vanilla armor trim pattern and give it your own sprite layer, expanded per slot / material / base model |
| Item overrides | Predicate-based model switching (assets/<ns>/overrides/item/) |
| Model overrides | Feed external model JSON to vanilla's own model loader |
| Plugin API | Other mods register their own variables and condition types; eoml exposes the layer system as a general extension platform |
Built-in conditions: always, variable_equals, variable_range,
item_property (vanilla and modded item properties), item_in,
all_of / any_of / none_of.
Built-in variables: the item id, any item tag, and any vanilla/modded item property — so a pack can already gate layers on damage, stack size, pull progress, trim material and more.
| Minecraft | Loader | Status |
|---|---|---|
| 1.20.1 | Forge 47.x | ✅ |
| 1.21.1 | NeoForge 21.1.x | ✅ |
| 26.1.2 | NeoForge 26.1.x | ✅ |
The same rule JSON works across all three versions. The only version-specific part is
property: — for example minecraft:pulling exists on 1.20.1 / 1.21.1 but not on
26.1.2, where the crossbow/pull axis is used instead.
Client-side only in practice. All data is read from the resource stack, so the definitions live on the client and work on vanilla servers — no server-side install, no datapack required. The mod itself loads on both sides and is safe on dedicated servers.
You are free to include eoml in any modpack. No permission needed.