Unlike effects which use boolean checks, attributes store numeric values. Attributification handles this by:
/attribute get commands show virtual values calculated from the target (when unidirectional=false)Unidirectional = false (default):
source = target × equivalence/attribute get source returns calculated value from targetUnidirectional = true:
Note: Pre-configured mappings are included only in the Forge version. Fabric users start with an empty config because most target mods in the default mappings are not available on Fabric. You can add your own mappings for Fabric-compatible mods via the in-game GUI or config file.
Magic & Spells: Iron's Spells 'n Spellbooks ↔ Spell Power Attributes, Ars Nouveau, Eidolon, Goety, Wizard's Reborn
Core Libraries: Apothic Attributes ↔ Obscure API, Turtleboi's Core Library, GTBC's SpellLib/API, Lodestone
All modids involved: spell_power, irons_spellbooks, traveloptics, gtbcs_geomancy_plus, attributeslib, ranged_weapon, eidolon, more_rpg_classes, obscure_api, turtlecore, gtbcs_spell_lib, goety, ars_nouveau, lodestone, wizards_reborn, iter_rpg
Access the configuration GUI through:
The GUI provides:
Config location: config/attributification/attributification.toml
The configuration system supports:
"primary, fallback1, fallback2"When upgrading:
.old extension[[staticMappings]]
sourceAttribute = "spell_power:haste"
targetAttribute = "irons_spellbooks:cast_time_reduction"
**What happens:**
- Registry-level aliasing: `spell_power:haste` becomes an alias for `irons_spellbooks:cast_time_reduction`
- Simple 1:1 mapping without conversion options
- Requires game restart to apply changes
- Use only when attributes have identical scales (1:1 ratio)
- For attributes with different scales (e.g., 100:1), use dynamic mappings instead
[[dynamicMappings]]
sourceAttribute = "spell_power:earth"
targetAttribute = "gtbcs_geomancy_plus:geo_spell_power, irons_spellbooks:nature_spell_power"
equivalence = 3.0
conversionEquivalence = 20.0
unidirectional = false
onlyVisualChange = false
fullReplacement = false
subtractValue = 0.0
operationConversion = "ADDITION_TO_MULTIPLY_BASE"
**What happens:**
- Item with `+6 spell_power:earth` ADDITION → converted to `+0.3 geo_spell_power` MULTIPLY_BASE (30% increase)
- `/attribute get spell_power:earth` shows virtual value: `geo_spell_power × 3.0`
- If GTBC's Geomancy Plus is not installed, falls back to `irons_spellbooks:nature_spell_power`
- Unidirectional=false: source shows virtual value calculated from target
- Changes apply with relog (no restart needed)
[[dynamicMappings]]
sourceAttribute = "obscure_api:critical_hit"
targetAttribute = "attributeslib:crit_chance"
equivalence = 1.0
conversionEquivalence = 0.0
unidirectional = false
onlyVisualChange = false
fullReplacement = true
subtractValue = 0.0
operationConversion = "DEFAULT"
**What happens:**
- Source attribute is "frozen" at base value (modifiers are blocked)
- Only target attribute works, preventing both from stacking
- `/attribute get obscure_api:critical_hit` shows base value only
- Solves balance issues where both attributes would stack for double effect
[[dynamicMappings]]
sourceAttribute = "some_mod:visual_attribute"
targetAttribute = "minecraft:generic.attack_damage"
equivalence = 1.0
conversionEquivalence = 0.0
unidirectional = false
onlyVisualChange = true
fullReplacement = false
subtractValue = 0.0
operationConversion = "DEFAULT"
**What happens:**
- Source attribute is renamed to target without value conversion
- Item with `+10 some_mod:visual_attribute` shows as `+10 minecraft:generic.attack_damage`
- No modifier conversion, only display name changes
- Useful for cosmetic unification