promotional bannermobile promotional banner

Ultimate Mod Additions

Roman coliseum dimension with difficulty-scaled mobs, eight skills, Argentine coins and eight tiers of loot bags. Every difficulty, drop, trade and skill is defined in JSON or KubeJS, so packs can rewrite all of it without touching the code.

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, bag and rebuild_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 }
  ]
}
  • entries goes into the random pool, picked by weight.
  • guaranteed always drops.
  • Target bags with tiers (a whole rarity, or ["all"] for every bag), bag (one specific bag) or bags (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 in config/openloader/data/ and they load in every world automatically — much better for a modpack or a server. The path is identical, just config/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 baguma/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 offeruma/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 dropsuma/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 isuma/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 skilluma/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.

The Ultimate Mod Additions Team

RisingBuilder tier frameprofile avatar
  • 15
    Followers
  • 42
    Projects
  • 556.5K
    Downloads

More from NadienDevView all