
Mob Dice Attributes
Every mob. Every spawn. A fresh roll. A mod that dynamically converts mob attributes into a range using tabletop RPG dice mechanics.
- Загрузки
- 1K
- Подписчики
- 20
- Обновлён
- 26 апреля 2026 г.
- Лицензия
- LGPL-3.0-or-later
Опубликован 12 февраля 2023 г.
Mob Dice Attributes
Every mob. Every spawn. A fresh roll.
Mob Dice Attributes replaces Minecraft's fixed mob stats with tabletop RPG dice rolls. A zombie isn't always 20 HP — it might roll 13 or 27. A skeleton might track you from twice its normal range, or barely notice you across the room. Every encounter is different.
Balance is preserved by design. The dice formula is constructed so the average rolled value always equals the vanilla value. Mobs aren't globally buffed or nerfed — they vary.
⚔️ Core Features
🎲 Dice Rolling for All Mob Attributes
Eight attributes are rolled on spawn using the xdn + b formula:
- Max Health, Movement Speed, Attack Damage, Knockback
- Armor, Armor Toughness, Attack Speed, Follow Range
Die type is auto-selected per mob based on its vanilla value (low-HP mobs use d6, bosses use d20). Everything is configurable per attribute.
🏅 Rarity Tiers
Every mob spawn draws from a weighted rarity pool — like an RPG loot table, but for mobs.
| Tier | Default chance | Effect |
|---|---|---|
| Common | 60% | Baseline rolls |
| Uncommon | 25% | Slightly above average |
| Rare | 10% | Blue name, 2× XP, bonus loot |
| Legendary | 5% | Purple name, 5× XP, 3× bonus loot, all stats boosted |
Tier weights and profiles are fully customizable via datapack.
⭐ Elite Mobs
Mobs that roll significantly above their average HP are automatically tagged as Elite — given a custom name and (optionally) a visible name tag. Threshold and prefix are configurable.
💰 Loot & XP Scaling
Above-average mobs drop more. Configure the XP multiplier and bonus loot rolls globally, or set them per rarity tier profile. Rare mobs are worth hunting.
🪝 Spawn Hooks
Map specific spawn contexts to profiles. Always give raid mobs a legendary profile. Force spawner mobs to be rare. Or leave it to the rarity draw. Your call.
Valid contexts: natural, spawner, chunk_generation, structure, breeding,
mob_summoned, jockey, event, conversion, reinforcement, triggered,
bucket, spawn_egg, command, patrol
🗂️ Datapack Customization
Everything is driven by datapacks under data/mobdiceattribs/:
| Folder | Purpose |
|---|---|
spawn_profiles/ |
Named stat bundles (name, color, XP, loot, dice overrides) |
rarity_tiers/ |
Weighted pool of profiles drawn on every spawn |
spawn_hooks/ |
Context → profile mappings |
mob_overrides/ |
Per-mob or per-tag dice overrides |
dimension_rules/ |
Enable/disable rolling or scale stats per dimension |
difficulty_rules/ |
Scale stats per world difficulty |
All reloaded live with /reload — no restart required.
🖥️ Commands
| Command | Description |
|---|---|
/mda reroll <targets> |
Force-reroll matched entities (op level 2) |
/mda inspect <target> |
Print current stats, HP ratio, and assigned profile |
⚙️ Configuration
A full server.toml config controls every attribute independently:
- Enable/disable per attribute
- Auto dice selection or manual die type
- Range factor (how swingy the rolls are)
- Mob whitelist / blacklist
- Distance-from-spawn health scaling (disabled by default)
- Elite mob threshold, prefix, and name tag visibility
🔌 Compatibility
- Server-side only — clients do not need the mod installed
- Jade / The One Probe — custom names are visible on hover
- Reloads on
/reload— fully compatible with datapack managers
📖 Documentation
| Page | Link |
|---|---|
| Home | Wiki |
| Dice Formula | How xdn+b works |
| Spawn Profiles | Profile format & fields |
| Rarity Tiers | Weighted pool setup |
| Spawn Hooks | Context-based profiles |
| Mob Overrides | Per-mob dice overrides |
| Dimension Rules | Scale by dimension |
| Difficulty Rules | Scale by difficulty |
| Configuration | Full config reference |
| Commands | /mda reroll & inspect |
📦 Source & Issues
Ченджлог
2.0.0Релиз1.21.1 · 26 апреля 2026 г.
Changelog for Mob Dice Attributes 1.21.1
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[2.0.0] - 2026-04-25
➕ Added
Improved Dice Algorithm:
- Die count (
x) is now computed from the mob's vanilla attribute value andrangeFactor, then the bonus (b) absorbs the rounding error so the rolled average is always exactly equal to the vanilla value — no more systematic buff/nerf from rounding drift - Formula:
xdn + bwhereb = target − x · dieAvg
- Die count (
Auto Dice Type Selection:
- New
autoDiceconfig option (defaulttrue) per attribute section — picks the most "natural-feeling" die for each mob automatically based on its vanilla attribute value - Health curve: d4 (≤6 HP) → d6 (≤15) → d8 (≤30) → d10 (≤60) → d12 (≤120) → d20
- Speed curve: d4 (≤0.15) → d6 (≤0.25) → d8 (≤0.35) → d10
- Damage curve: d4 (≤2) → d6 (≤5) → d8 (≤10) → d10 (≤20) → d12
- Knockback curve: d4 (≤0.5) → d6 (≤1.0) → d8 (≤2.0) → d10
- Set
autoDice = falseto revert to the globaldiceTypefallback
- New
Per-mob Datapack Overrides:
- Override dice / rangeFactor / bonus per mob ID or entity tag via datapack JSON files under
data/<namespace>/mob_overrides/ - Partial overrides supported — omit any field to fall through to the auto-pick or global config value
- Tag support via
#prefix (e.g.#minecraft:raiders) - Reloads on
/reloadwith no restart required - Example file shipped in jar:
data/mobdiceattribs/mob_overrides/example.json - Resolution order: datapack override → auto-pick → config diceType fallback
- Override dice / rangeFactor / bonus per mob ID or entity tag via datapack JSON files under
Dimension Filter:
- Rolling can be disabled or scaled per dimension via datapack JSON files under
data/<namespace>/dimension_rules/ enablefield (optional, defaulttrue) — set tofalseto suppress all rolling in that dimensionmultiplierfield (optional, default1.0) — scales every attribute target before dice are rolled- Example file shipped in jar:
data/mobdiceattribs/dimension_rules/example.json - Reloads on
/reload
- Rolling can be disabled or scaled per dimension via datapack JSON files under
Difficulty Scaling:
- Rolling can be disabled or scaled per world difficulty via datapack JSON files under
data/<namespace>/difficulty_rules/ - Targets:
"peaceful","easy","normal","hard"(lowercase) - Multipliers stack multiplicatively with any active dimension rule multiplier
- Example file shipped in jar:
data/mobdiceattribs/difficulty_rules/example.json - Reloads on
/reload
- Rolling can be disabled or scaled per world difficulty via datapack JSON files under
Distance-from-Spawn Health Scaling:
- Scales mob max health based on horizontal distance from world spawn (health only)
- Controlled via
[distanceScaling]config section — disabled by default - Config fields:
enable(defaultfalse),blocksPerTier(default1000),multiplierPerTier(default0.1),cap(default3.0) - Detailed conflict warning in config comments: enabling alongside mods like Scaling Health or Gradual Difficulty causes double-scaling
Additional Attributes:
- Four new attributes now support dice rolling, each with its own full config section and datapack override support:
armor— only rolls for mobs with base armor > 0 (zombie=2, warden=30)armorToughness— only rolls for mobs with base armor toughness > 0 (warden=3)attackSpeed— only rolls if base > 0; note: limited visible effect on most hostile mobsfollowRange— detection/pursuit range (zombie=35, skeleton=16, blaze=48)
- Example file
mob_overrides/example_all_attributes.jsonshipped in jar showing all eight attributes
- Four new attributes now support dice rolling, each with its own full config section and datapack override support:
Elite Mobs:
- Mobs that roll above a configurable HP ratio threshold are tagged as "elite"
- Elite mobs display a custom name tag (e.g.
Elite Zombie) that is always visible - Config section:
[eliteMobs]—enable,healthThreshold(default1.2),namePrefix(default"Elite"),showName(defaulttrue) - Threshold note: with
rangeFactor=2.0the practical rolled maximum is ~1.35×; values above that will never fire. Recommended range: 1.15–1.35 - Profile
namePrefix(see Spawn Profiles) takes priority over the elite name when set
Loot Scaling:
- Mobs that roll above-average health drop bonus loot rolls and/or extra XP on death
mda_hp_ratiostored in entity NBT for any mob that rolls above its vanilla HP target- Config section:
[lootScaling]—enable,threshold(default1.0),xpMultiplier(default2.0),lootBonusRolls(default1) - Set
thresholdequal toeliteMobs.healthThresholdto restrict bonuses to elite mobs only - Spawn profile
xpMultiplier/lootBonusRollsfields (see Spawn Profiles) override config for that mob
Spawn Profiles:
- Reusable named attribute bundles stored in
data/<namespace>/spawn_profiles/ - Fields:
namePrefix,nameColor,xpMultiplier,lootBonusRolls, and all eightAttribOverridesections (all optional) - Profile overrides merge on top of mob-specific overrides; profile name/loot fields replace the corresponding elite/lootScaling config for that mob
- Four default profiles shipped in jar:
common,uncommon,rare(blue, 2× XP, 1 bonus roll),legendary(purple, 5× XP, 3 bonus rolls, all attributes boosted) - Example reference profile:
data/mobdiceattribs/spawn_profiles/example_legendary.json - Reloads on
/reload
- Reusable named attribute bundles stored in
Rarity Tiers:
- On every mob spawn, a weighted random roll selects a spawn profile from a global tier pool
- Tier pool defined via
data/<namespace>/rarity_tiers/—{ "tiers": [ { "profile": "...", "weight": N }, ... ] } - Weights are proportional (do not need to sum to 100)
- Config section:
[rarityTiers]—enabletoggle only - Example pool shipped in jar:
data/mobdiceattribs/rarity_tiers/example.json(60/25/10/5 weights for common/uncommon/rare/legendary) - Reloads on
/reload
Spawn Hooks:
- Map specific spawn contexts (natural, spawner, raid event, command, etc.) to a fixed spawn profile, bypassing rarity tier selection for that context
- Defined via
data/<namespace>/spawn_hooks/— JSON object with context name keys and profileResourceLocationvalues; omit a key or set tonullto fall through to rarity tiers - Valid contexts:
natural,spawner,chunk_generation,structure,breeding,mob_summoned,jockey,event,conversion,reinforcement,triggered,bucket,spawn_egg,command,patrol - Spawn hook profile beats rarity tier when both apply
- Config section:
[spawnHooks]—enabletoggle only - Example file shipped in jar:
data/mobdiceattribs/spawn_hooks/example.json - Reloads on
/reload
Commands:
/mda reroll <targets>— force-rerolls matched entities; resets HP to stored vanilla value (mda_base_hp) before rolling so results don't compound. Requires op level 2. Accepts standard entity selectors./mda inspect <target>— prints current attribute values plusmda_hp_ratio,mda_base_hp, and assigned profile. Single-entity selector only.
Jade Mod Integration:
jadeadded as a runtime dependency (implementation) inbuild.gradle
⚙️ Changed
- All eight
roll*()methods now accept aSpawnProfileparameter; attribute overrides merge asprofile.attrib().merge(mobOverride)so per-mob overrides beat profile applyRolls()gate order: mob whitelist/blacklist → dimension gate → difficulty gate → profile resolution → per-attribute rolls- Distance multiplier (health only) stacks on top of the combined dimension × difficulty multiplier
- All
SimpleJsonResourceReloadListenerimplementations now filter byMDA.MOD_IDnamespace — onlydata/mobdiceattribs/files are loaded, preventing collisions with other mods - All eight attributes now store vanilla base values in NBT on first roll and reset to them on reroll — prevents compounding across multiple rerolls
showNameconfig (defaultfalse) now gates name tag visibility for both profile names and elite names; names are still set on the mob for Jade/TOP hover[speed] enabledefaults totruewith standard dice mechanics; speed profile overrides removed from legendary/rare after confirming compounding was the root cause/mda inspectnow outputsProfileandSpawn typeNBT fields for debuggingrarity_tiers/example.jsonrenamed torarity_tiers/default.jsonFinalizeSpawnEventupdated to top-level class (NeoForge 1.21.1 API change)
[1.0.0] - 2026-04-23
⚙️ Changed
- Platform port: Forge 1.20.1 → NeoForge 1.21.1
- Build system migrated to
net.neoforged.moddev(Gradle plugin) @Modclass now uses constructor injection ofIEventBusandModContainerMod.EventBusSubscriberreplaced with@EventBusSubscriber(bus = Bus.GAME)ForgeConfigSpecreplaced withModConfigSpecthroughoutResourceLocation.fromNamespaceAndPath()API adopted- Attributes API updated:
Attributes.XreturnsHolder<Attribute>;.value()used to reachRangedAttribute - GottschCore package updated:
mod.gottsch.forge.gottschcore.*→mod.gottsch.neo.gottschcore.* - GottschCore artifact updated:
gottschcore→gottschcore-neoforge neoforge.mods.tomlmoved tosrc/main/templates/META-INF/withgenerateModMetadatatask for property substitution- Mod config registered directly via
modContainer.registerConfig()— removed prematureModConfigEventvalidation listener that caused "Cannot get config value before config is loaded" crash isValidEntity()simplified toentity instanceof Monster(Enemy interface removed in 1.21)- Gradle wrapper pinned to 8.12.1 for compatibility with moddev 2.0.78
- All dependencies declared
side = "SERVER"— mod is server-only and clients can connect without it installed
- Build system migrated to
1.0.0Релиз1.21.1 · 26 апреля 2026 г.
Changelog for Mob Dice Attributes 1.21.1
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[1.0.0] - 2026-04-23
⚙️ Changed
- Platform port: Forge 1.20.1 → NeoForge 1.21.1
- Build system migrated to
net.neoforged.moddev(Gradle plugin) @Modclass now uses constructor injection ofIEventBusandModContainerMod.EventBusSubscriberreplaced with@EventBusSubscriber(bus = Bus.GAME)ForgeConfigSpecreplaced withModConfigSpecthroughoutResourceLocation.fromNamespaceAndPath()API adopted- Attributes API updated:
Attributes.XreturnsHolder<Attribute>;.value()used to reachRangedAttribute - GottschCore package updated:
mod.gottsch.forge.gottschcore.*→mod.gottsch.neo.gottschcore.* - GottschCore artifact updated:
gottschcore→gottschcore-neoforge neoforge.mods.tomlmoved tosrc/main/templates/META-INF/withgenerateModMetadatatask for property substitution- Mod config registered directly via
modContainer.registerConfig()— removed prematureModConfigEventvalidation listener that caused "Cannot get config value before config is loaded" crash isValidEntity()simplified toentity instanceof Monster(Enemy interface removed in 1.21)- Gradle wrapper pinned to 8.12.1 for compatibility with moddev 2.0.78
- All dependencies declared
side = "SERVER"— mod is server-only and clients can connect without it installed
- Build system migrated to
1.0.1Релиз1.19.2 · 15 февраля 2023 г.
Uses the correct fml loader version (43).
1.0.1Релиз1.18.2 · 15 февраля 2023 г.
Uses the correct update url.
1.0.0Релиз1.18.2 · 12 февраля 2023 г.
initial release
1.0.0Релиз1.19.2 · 12 февраля 2023 г.
initial release
1.0.0Релиз1.19.3 · 12 февраля 2023 г.
initial release
Комментарии
Загружаем…