HomeJavaModsAttributification [Attribute Unification]
Attributification [Attribute Unification]
ModsJava

Attributification [Attribute Unification]

by UtherHel · on CurseForge

A compatibility mod that unifies similar attributes from different mods to prevent duplication and improve cross-mod compatibility.

Which build do you need?

This mod ships a separate file for every mod loader and every version of the game. Pick both, then download — the wrong build installs fine and then does nothing in the game.

Mod loader

Minecraft version

⬇ Download for 1.21.1 · Fabric⬇ Download for 1.20.1 · Fabric⬇ Download for 1.21.1 · NeoForge⬇ Download for 1.20.1 · Forge
I don't know my version or loader
Open the Minecraft launcher and look at the profile you play on — it names both, like fabric-loader-1.21.4. The version also shows in the bottom-right corner of the game's main menu.
No loader in the profile name? Then it's plain Minecraft, and these mods won't run — you need Fabric or NeoForge installed first.
Attributification [Attribute Unification] — screenshot 1Attributification [Attribute Unification] — screenshot 2Attributification [Attribute Unification] — screenshot 3Attributification [Attribute Unification] — screenshot 4

Key Features

How It Works

Unlike effects which use boolean checks, attributes store numeric values. Attributification handles this by:

  1. Modifier Conversion: Item modifiers are converted from source to target at application time
  2. Virtual Display: /attribute get commands show virtual values calculated from the target (when unidirectional=false)
  3. Attribute Redirection: Source attribute lookups redirect to target attribute
  4. Operation Transformation: ADDITION modifiers can be converted to MULTIPLY_BASE for percentage-based scaling

Unidirectional Mode

Unidirectional = false (default):

Unidirectional = true:

Supported Mods (Out-of-the-box)

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.

Configuration

In-Game GUI

Access the configuration GUI through:

The GUI provides:

Configuration File

Config location: config/attributification/attributification.toml

The configuration system supports:

Migration from Older Versions

When upgrading:

  1. Your old config is automatically converted to the latest format
  2. All your custom mappings are preserved
  3. Old config is backed up with .old extension
  4. No manual action required!
Example 1: Static Mapping (Registry Aliasing)
[[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
Example 2: Dynamic Mapping with Operation Conversion
[[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)
Example 3: Full Replacement to Prevent Double-Dipping
[[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
Example 4: Visual Change Only
[[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
Verified by MCModsHub

These come from our own check of the pack file, not from the source page.

Explore more