Description
Ultimate Mod Additions
Minecraft 1.21.1 · NeoForge 21.1.240
A content mod built around one idea: nothing is hardcoded. The coliseum, the mobs that spawn in it, what they drop, what the shop sells, how the skills level up — all of it lives in JSON files that any datapack can override, or in KubeJS scripts if you'd rather write code.
The Coliseum
A dedicated dimension (ultimatemodadditions:coliseum) with a real Roman amphitheatre — not a flat
world. The mod builds it procedurally the first time the dimension loads: sand arena, podium wall,
five tiers of stands, an outer wall with two levels of arches, four gates and a return portal. Fall
off the edge and you get put back on the sand instead of dying in the void.
Getting in is a build and a gate. You raise a portal frame exactly like a nether portal, but out of crying obsidian — 4×5 at minimum, up to 23×23, corners included. Then you right-click each of the four corners with a Coliseum Key; the game counts them off for you, and on the fourth the key is consumed and the portal lights up.
Even lit, it won't take just anyone. To step through you need Attack, Defense and Magic maxed out plus 100 experience levels (which you keep). Everyone is checked individually as they enter, so you can't drag an underprepared friend in behind you — the portal simply refuses them and tells them what they're short on. Leaving is free, and there's an already-lit portal home by the north gate. Packs can loosen or drop the whole requirement in the config.
The dimension runs an active difficulty profile that scales every mob in it: health, damage,
speed, armour, knockback resistance, follow range, dropped XP, coins, loot-bag chance, permanent
potion effects and equipment rolls. Four profiles ship with the mod (easy, normal, hard,
nightmare) and it scales further with the number of players online.
Spawners are placed in a ring across the arena floor when it's built, one mob type each so the
fight stays varied — twelve by default, from zombies and creepers to blazes, witches and endermen.
Which types appear, how many spawners there are and every spawner setting (delays, mobs per batch,
player range, spawn radius) live in the config, and unknown ids are skipped with a log warning so
you can list mobs from other mods safely. Don't want them? Set enabled = false and run
/uma spawners clear to wipe the ones already placed. /uma spawners place puts them back.
Skills
Eight skills — Mining, Attack, Defense, Farming, Building, Gathering, Agility and Magic — with a dedicated screen bound to K.
The screen lists every skill with its icon, its colour, your current level out of the maximum, a
blue XP bar showing progress toward the next level, and a + N button with what the next level
costs in skill points — green when you can afford it, grey when you can't. Click a row to level up.
Hover it and a tooltip breaks the skill down: the per-level bonus and exactly how much of it you
have accumulated right now, plus the full perk list, with the ones you've already unlocked in green
and the locked ones greyed out so you can see what's coming.
Every single level gives you something. From level 2 onward each level adds to that skill's attribute — attack damage, armour, mining speed, movement speed, reach, max health, luck — and on top of that, levels 5, 10, 15, 20, 25 and 30 unlock a named perk with a bigger one-off bonus. There are no dead levels.
Two more levels per skill hand you a permanent potion effect, a different one each time: Attack
gives Strength then Haste, Defense gives Resistance then Fire Resistance, Mining gives Haste then
Night Vision, and so on down the eight. They refresh themselves, so they survive death, dimension
changes and /effect clear. Packs can swap them, add more, or make one climb in amplifier as the
skill grows.
Two ways to level up, and they coexist: spend skill points, or just earn XP by using the skill. Skills can also gate items: the mod ships with requirements on diamond and netherite gear, elytra, enchanting, beacons and boss fights, and you can add your own to anything.
Argentine coins
Nine denominations: 10, 20, 50, 100, 200, 500, 1000, 10000 and 20000. From 10 to 500 they're mangos, from 1000 up they're lucas.
No conversion recipes. Right-click a coin and it sweeps every loose coin in your inventory into the fewest possible coins; sneak + right-click breaks one down into smaller change. The Exchange Stand takes any combination of coins and gives correct change automatically.
Loot bags
Eight tiers: common, uncommon, epic, mythic, legendary, omega, food and enchantment. Right-click to open one, sneak to open the whole stack. Bags can roll guaranteed loot, a weighted random pool, vanilla loot tables, and other bags nested inside them.
Only common and uncommon can be bought at the Exchange Stand. The Coliseum Key can never be bought.
Commands
/uma (or the shorter /ums):
/uma tps— real server performance, because most mods report it wrong: average TPS and MSPT over the last 100 ticks against the 50 ms budget, the worst single tick in that window, and MSPT broken down per dimension./uma ping [players]— ping for yourself or anyone else./uma spawners list | place | clear— count, re-place or wipe the arena spawners.- Plus
coliseum,difficulty,skills,bagandrebuild_arena.
Adding your own loot to the bags
This is the part most packs will want. You can add drops to bags that already exist without rewriting them — yours stacks on top of the mod's, or on top of another pack's.
With a datapack (JSON)
Drop a file in data/<your_namespace>/uma/loot_bag_additions/. The namespace can be anything you
want:
{
"tiers": ["legendary", "omega"],
"entries": [
{ "item": "minecraft:netherite_ingot", "count": { "min": 1, "max": 3 }, "weight": 10 }
],
"guaranteed": [
{ "item": "ultimatemodadditions:coin_20000", "count": 1 }
]
}
entriesgoes into the random pool, picked byweight.guaranteedalways drops.- Target bags with
tiers(a whole rarity, or["all"]for every bag),bag(one specific bag) orbags(a list). All three add together.
Reload with /reload. That's it.
Recommended: OpenLoader
A normal datapack lives inside one world's
datapacks/folder, which means you have to copy it into every new world. OpenLoader lets you put the same files inconfig/openloader/data/and they load in every world automatically — much better for a modpack or a server. The path is identical, justconfig/openloader/data/<your_namespace>/uma/loot_bag_additions/…
With KubeJS
If KubeJS is installed the mod adds a global UMA binding with a chained-builder API. It goes in
kubejs/server_scripts/ — the data loads with the datapack, so startup and client scripts won't
work.
// Copper in absolutely every bag
UMA.bagDrop('nadien_tweaks:copper_everywhere')
.allTiers()
.entry('minecraft:copper_ingot', 2, 8, 10) // item, min, max, weight
.register()
// One guaranteed nether star in legendary bags only
UMA.bagDrop('nadien_tweaks:legendary_star')
.bag('ultimatemodadditions:legendary')
.guaranteed('minecraft:nether_star', 1)
.register()
// Only the high tiers
UMA.bagDrop('nadien_tweaks:high_tiers')
.tiers('epic', 'mythic', 'legendary', 'omega')
.entry('minecraft:enchanted_golden_apple', 1, 2, 4)
.register()
Nothing happens without .register() — that's the one thing people forget.
You can also build entirely new bags. This goes in kubejs/server_scripts/ too — not
startup_scripts/, and not client_scripts/. UMA data loads together with the datapack, so
anything registered from a startup or client script is thrown away when the world loads, and the mod
warns you about it in the log:
// kubejs/server_scripts/my_bags.js
UMA.lootBag('nadien_tweaks:mythic')
.name('Mythic Bag')
.tier('mythic')
.rolls(5, 7)
.guaranteed('ultimatemodadditions:coin_10000', 1)
.entry('minecraft:netherite_block', 1, 2, 10)
.bagEntry('ultimatemodadditions:enchantment', 5) // a bag inside a bag
.lootTableEntry('minecraft:chests/end_city_treasure', 0.5, 3)
.register()
The same UMA binding also builds difficulties, mob rules, trades, skills, skill XP sources and
skill requirements. Bad entries are logged with their id and skipped — they never break the rest of
the pack.
Everything else you can define
| Folder | What it controls |
|---|---|
uma/difficulty/ |
Mob scaling profiles |
uma/mob_rules/ |
Which mob uses which difficulty, and what it drops |
uma/loot_bags/ |
Bag contents |
uma/loot_bag_additions/ |
Additive drops on existing bags |
uma/trades/ |
Exchange Stand offers |
uma/skills/ |
Skills, traits and perks |
uma/skill_xp/ |
Where each skill's XP comes from |
uma/skill_requirements/ |
What's locked until a given level |
Every one of them is a plain JSON file under data/<your_namespace>/uma/…, reloaded with
/reload. Here's one of each so you can see the shape:
A whole new bag — uma/loot_bags/boss_reward.json
{
"name": "Boss Reward",
"tier": "legendary",
"color": 16733525,
"rolls": { "min": 3, "max": 5 },
"unique_rolls": true,
"announce": true,
"guaranteed": [
{ "item": "ultimatemodadditions:coin_20000", "count": { "min": 1, "max": 2 } }
],
"entries": [
{ "item": "minecraft:netherite_ingot", "count": { "min": 1, "max": 2 }, "weight": 10 },
{ "item": "minecraft:elytra", "count": 1, "weight": 2 },
{ "bag": "ultimatemodadditions:enchantment", "count": 1, "weight": 6 },
{ "loot_table": "minecraft:chests/end_city_treasure", "weight": 4 }
]
}
A shop offer — uma/trades/boss_reward.json
{
"name": "Boss Reward",
"category": "bags",
"price": 50000,
"cost": [ { "item": "minecraft:emerald", "count": 8 } ],
"result": { "bag": "nadien_tweaks:boss_reward", "count": 1 },
"requirements": [ { "skill": "ultimatemodadditions:attack", "level": 15 } ],
"sort_order": 90
}
price is money and gets paid with any mix of coins, change included.
What a mob drops — uma/mob_rules/wither_skeletons.json
{
"priority": 50,
"match": { "entities": ["minecraft:wither_skeleton"] },
"difficulty": "ultimatemodadditions:hard",
"experience_multiplier": 2.0,
"drops": [
{ "item": "minecraft:netherite_scrap", "count": { "min": 1, "max": 2 }, "chance": 0.25 }
],
"coins": [
{ "tier": "1000", "count": 1, "chance": 0.3 }
],
"bags": [
{ "bag": "nadien_tweaks:boss_reward", "chance": 0.05 }
]
}
How hard a mob is — uma/difficulty/brutal.json
{
"name": "Brutal",
"health_multiplier": 10.0,
"damage_multiplier": 4.0,
"speed_multiplier": 1.2,
"armor_bonus": 8.0,
"experience_multiplier": 3.0,
"coin_multiplier": 8.0,
"bag_chance_bonus": 0.1,
"extra_loot_rolls": 2,
"glowing": true,
"effects": [
{ "effect": "minecraft:strength", "amplifier": 1, "duration": -1, "chance": 1.0 }
],
"equipment": {
"mainhand": { "item": "minecraft:netherite_sword", "chance": 0.5, "drop_chance": 0.02 }
}
}
A new skill — uma/skills/alchemy.json
{
"name": "Alchemy",
"icon": "minecraft:brewing_stand",
"color": 10181046,
"max_level": 20,
"xp_base": 40,
"xp_growth": 1.25,
"description": ["Potions and other strange things."],
"traits": [
{ "attribute": "minecraft:generic.luck", "per_level": 0.05, "start_level": 2 }
],
"perks": [
{ "level": 5, "name": "Distiller", "description": ["+0.5 luck"],
"attribute": "minecraft:generic.luck", "amount": 0.5 }
],
"effects": [
{ "effect": "minecraft:water_breathing", "level": 8 },
{ "effect": "minecraft:night_vision", "level": 18 }
]
}
start_level: 2 is what makes it grow on every level, and effects grants permanent potion
effects from the level you name. Pair it with
uma/skill_xp/alchemy_brewing.json to say where its XP comes from, and
uma/skill_requirements/potions.json to lock something behind it:
{ "skill": "nadien_tweaks:alchemy", "actions": ["craft"], "match": { "items": ["minecraft:potion"] }, "amount": 8 }
{ "match": { "items": ["minecraft:potion"] }, "actions": ["use"],
"requirements": [ { "skill": "nadien_tweaks:alchemy", "level": 4 } ] }
Full documentation, every field and a lot more examples are in the wiki: one page covering every JSON type, the whole KubeJS API, the level-by-level skill tables and a complete worked example.

