Skip to content

Ultimate Mod Additions 1.21.1 Wiki EN

NadienDev 🔥 edited this page Aug 31, 2026 · 1 revision

Ultimate Mod Additions Wiki (English)

The examples on this page use the namespace nadien_teaks:. Use your own — the mod never looks at the namespace, only at the folder.

Index

Section What it covers
Datapacks Where the files go, how they reload, shared types
Difficulties uma/difficulty — mob scaling
Mob rules uma/mob_rules — what each mob drops and how hard it is
Loot bags uma/loot_bags and uma/loot_bag_additions
Trades uma/trades — the exchange stand
Currency The nine denominations and how they work
Coliseum The dimension, the amphitheatre, the portal and the key
KubeJS The UMA binding and all of its methods
Commands /uma and /ums
Configuration The config TOML
Full example One file of every kind, in JSON and in KubeJS

What the mod adds

Thing Id What it does
Coliseum dimension ultimatemodadditions:coliseum A dimension of its own holding a Roman amphitheatre the mod builds by itself. Mobs inside it are scaled by the active difficulty and drop coins and bags.
Coliseum portal ultimatemodadditions:coliseum_portal The block that fills a lit crying obsidian frame. Walk into it to travel; it checks the requirement per player. It cannot be crafted or picked up — it appears when a frame is lit.
Coliseum key ultimatemodadditions:coliseum_key Lights a portal. Right-click each of the four corners of a crying obsidian frame; on the fourth the key is consumed. Craftable, never buyable.
Exchange stand ultimatemodadditions:exchange_stand The shop block. Right-click to open the offer list, which is filled from uma/trades/. Pays with any mix of coins and returns change.
Coins coin_10coin_20000 Nine denominations of money. Right-click to merge all your loose change into the fewest coins, sneak + right-click to break one into smaller ones. Mobs drop them.
Loot bags loot_bag_commonloot_bag_enchantment Eight rarities of container. Right-click to open one, sneak to open the stack. What comes out is defined in uma/loot_bags/.

Datapacks

Where the files go

Everything lives under data/<any_namespace>/uma/…. The namespace does not matter, use your own. Three places work:

  • a normal datapack, in world/datapacks/nadien_teaks/data/nadien_teaks/uma/…
  • the KubeJS folder, in kubejs/data/nadien_teaks/uma/…
  • the mod itself, if you are building it

They reload with /reload. No restart needed.

Folders

Folder What it defines
uma/difficulty/ Mob scaling profiles
uma/mob_rules/ Which mob uses which difficulty, and what it drops
uma/loot_bags/ The contents of each bag
uma/loot_bag_additions/ Extra drops added to bags that already exist
uma/trades/ Exchange stand offers

Shared types

Integer range

Wherever this page says range, you can write a plain number or an object:

"count": 3
"count": { "min": 1, "max": 4 }

match — item and block filter

"match": {
  "items": ["minecraft:diamond_pickaxe"],
  "tags": ["c:tools/pickaxe"],
  "blocks": ["minecraft:stone"],
  "block_tags": ["minecraft:mineable/pickaxe"],
  "regex": ["^minecraft:.*_ore$"],
  "exclude": ["minecraft:bedrock"]
}
  • items and tags are checked against items; blocks and block_tags against blocks.
  • regex runs on the full id (minecraft:diamond) and is only consulted when nothing matched by list or tag.
  • exclude beats everything else.

entity — entity filter

"entity": {
  "entities": ["minecraft:zombie"],
  "tags": ["minecraft:skeletons"],
  "regex": ["^minecraft:.*_zombie$"],
  "categories": ["monster"],
  "exclude": ["minecraft:villager"],
  "boss": true,
  "baby": false
}
  • categories accepts monster, creature, ambient, water_creature, axolotls, underground_water_creature, water_ambient and misc.
  • boss looks at the c:bosses tag.
  • If you leave entities, tags and regex empty it matches any entity that passes the remaining filters.

components

Any entry that hands out an item accepts components, using the 1.21 component format:

{
  "item": "minecraft:enchanted_book",
  "components": {
    "minecraft:stored_enchantments": { "levels": { "minecraft:mending": 1 } }
  }
}

Difficulties

data/<namespace>/uma/difficulty/<id>.json

A difficulty profile is a bundle of multipliers applied to a mob when it spawns. easy, normal, hard and nightmare ship with the mod.

{
  "name": "Hard",
  "health_multiplier": 2.5,
  "damage_multiplier": 1.75,
  "speed_multiplier": 1.1,
  "armor_bonus": 4.0,
  "armor_toughness_bonus": 2.0,
  "knockback_resistance": 0.2,
  "follow_range_bonus": 12.0,
  "experience_multiplier": 2.0,
  "coin_multiplier": 2.0,
  "bag_chance_bonus": 0.05,
  "extra_loot_rolls": 1,
  "glowing": false,
  "effects": [
    { "effect": "minecraft:strength", "amplifier": 0, "duration": -1, "chance": 1.0 }
  ],
  "equipment": {
    "mainhand": { "item": "minecraft:netherite_sword", "chance": 0.35, "drop_chance": 0.02 }
  }
}

Fields

Field Type Default What it does
name string Display name, optional
health_multiplier double 1.0 Multiplies max health
damage_multiplier double 1.0 Multiplies attack damage
speed_multiplier double 1.0 Multiplies movement speed
armor_bonus double 0.0 Adds armor
armor_toughness_bonus double 0.0 Adds armor toughness
knockback_resistance double 0.0 Adds knockback resistance (0–1)
follow_range_bonus double 0.0 Adds follow range
experience_multiplier double 1.0 Multiplies dropped experience
coin_multiplier double 1.0 Multiplies dropped coins
bag_chance_bonus double 0.0 Adds to the loot bag chance
extra_loot_rolls int 0 Extra loot rolls
glowing boolean false Leaves the mob glowing
effects list empty Permanent or timed potion effects
equipment object empty Gear per slot

effects

{ "effect": "minecraft:strength", "amplifier": 0, "duration": -1, "chance": 1.0 }

duration: -1 is permanent. chance runs from 0 to 1.

equipment

The keys are slots: mainhand, offhand, head, chest, legs, feet.

"equipment": {
  "head":  { "item": "minecraft:netherite_helmet", "chance": 0.5, "drop_chance": 0.01 },
  "chest": { "item": "minecraft:netherite_chestplate", "chance": 0.5 }
}
Field Default What it does
item required What gets equipped
count 1 Amount
chance 1.0 Chance the mob carries it
drop_chance 0.085 Chance it drops on death
components Item components

How the difficulty is chosen

  1. If the matching mob rule carries difficulty, that profile is used.
  2. If it carries inline_difficulty, that inline profile is used.
  3. Otherwise the Coliseum's active difficulty is used (/uma difficulty set).

See Mob rules.


Mob rules

data/<namespace>/uma/mob_rules/<id>.json

They decide which difficulty each mob uses and what it drops when it dies. They are checked from highest to lowest priority; the first one that matches wins.

{
  "priority": 0,
  "match": { "categories": ["monster"] },
  "dimensions": ["ultimatemodadditions:coliseum"],
  "difficulty": "ultimatemodadditions:hard",
  "replace_vanilla_drops": true,
  "experience_multiplier": 2.0,
  "stop_matching": false,
  "drops": [
    { "item": "minecraft:diamond", "count": { "min": 1, "max": 3 }, "chance": 0.5, "looting_bonus": 0.1 },
    { "loot_table": "minecraft:chests/simple_dungeon", "chance": 0.1 },
    { "bag": "ultimatemodadditions:epic", "chance": 0.02 }
  ],
  "coins": [ { "tier": "500", "count": { "min": 1, "max": 3 }, "chance": 0.5 } ],
  "bags":  [ { "bag": "ultimatemodadditions:common", "chance": 0.06 } ]
}

Fields

Field Type Default What it does
priority int 0 Higher is checked first
match entity filter anything Which mobs it applies to
dimensions list of ids empty = all Which dimensions it applies in
difficulty id Difficulty profile to use
inline_difficulty object An inline profile instead of difficulty
replace_vanilla_drops boolean false Wipes the mob's vanilla loot
drops list empty Custom loot
coins list empty Coins it drops
bags list empty Bags it drops
experience_multiplier double 1.0 Multiplies dropped experience
stop_matching boolean false Stops the search even if nothing applies

The filter goes in match and uses the entity filter format.

drops

Every entry can hand out an item, a loot table or a bag.

Field Default What it does
item Item to drop
count 1 Amount (range)
chance 1.0 Chance, 0 to 1
weight 1 Only used inside bags
looting_bonus 0.0 Added to chance per level of Looting
components Item components
loot_table Rolls a whole loot table
bag Hands out a bag by id

If bag is present, item is ignored.

coins

{ "tier": "500", "count": { "min": 1, "max": 3 }, "chance": 0.5 }

tier is the denomination: "10", "20", "50", "100", "200", "500", "1000", "10000" or "20000". The old names bronze, silver and gold are still accepted and mean 10, 100 and 1000.

The final amount is multiplied by the difficulty's coin_multiplier.

bags

{ "bag": "ultimatemodadditions:common", "count": 1, "chance": 0.06 }

The difficulty's bag_chance_bonus is added to chance.


Loot bags

uma/loot_bags/<id>.json

Every file is one bag. Make as many as you like: tier decides which of the eight items it rides on, and with that its texture and rarity.

{
  "name": "Epic Bag",
  "tier": "epic",
  "color": 12213503,
  "sort_order": 30,
  "rolls": { "min": 3, "max": 5 },
  "unique_rolls": true,
  "announce": false,
  "open_sound": "ultimatemodadditions:loot_bag_open",
  "guaranteed": [
    { "item": "ultimatemodadditions:coin_500", "count": { "min": 1, "max": 3 } }
  ],
  "entries": [
    { "item": "minecraft:diamond_block", "count": 1, "weight": 16 },
    { "bag": "ultimatemodadditions:enchantment", "count": 1, "weight": 8 }
  ]
}
Field Type Default What it does
name string Display name of the bag
tier string common Rarity, see the table below
rolls range 1 How many entries get rolled
guaranteed list empty Fixed loot, always drops
entries list empty Random pool, rolled by weight
unique_rolls boolean false Stops the same entry rolling twice
color int 0xFFFFFF Decimal colour for the name
open_sound id Sound played when opened
announce boolean false Tells the whole server when it is opened
sort_order int 0 Order in JEI

Entries use the same format as the drops of a mob rule, including loot_table and bag for nested bags.

Tiers

tier Base item Buyable at the stand
common loot_bag_common yes
uncommon loot_bag_uncommon yes
epic loot_bag_epic no
mythic loot_bag_mythic no
legendary loot_bag_legendary no
omega loot_bag_omega no
food loot_bag_food no
enchantment loot_bag_enchantment no

rare is still accepted as an alias of epic for older datapacks.

uma/loot_bag_additions/<id>.json

For adding loot to bags that already exist without rewriting them. They are applied after every bag has loaded, so they work on the mod's bags, another datapack's, or KubeJS ones.

{
  "bag": "ultimatemodadditions:common",
  "bags": ["ultimatemodadditions:uncommon"],
  "tiers": ["legendary", "omega"],
  "entries": [
    { "item": "minecraft:copper_ingot", "count": { "min": 2, "max": 6 }, "weight": 12 }
  ],
  "guaranteed": [
    { "item": "ultimatemodadditions:coin_50", "count": 1 }
  ],
  "replace": false
}
Field Default What it does
bag One specific bag
bags empty Several specific bags
tiers empty Every bag of those rarities; ["all"] reaches all of them
entries empty Added to the random pool
guaranteed empty Added to the fixed loot
replace false When true, wipes the previous contents before adding

bag, bags and tiers add up: the addition applies to every bag that matches any of the three.

Opening them

Right-click opens one. Sneak opens the whole stack. The loot goes to the inventory and whatever does not fit drops on the floor.


Trades

data/<namespace>/uma/trades/<id>.json

These are the offers of the exchange stand (ultimatemodadditions:exchange_stand).

{
  "name": "Uncommon Bag",
  "category": "bags",
  "sort_order": 20,
  "price": 700,
  "cost": [ { "item": "minecraft:emerald", "count": 4 } ],
  "result": { "bag": "ultimatemodadditions:uncommon", "count": 1 },
  "stock": -1,
  "enabled": true
}
Field Type Default What it does
name string the result's name Label in the list
category string general Free-form grouping
price int 0 Price in money
cost list empty Specific items that must also be paid
result object required What is handed over
sort_order int 0 Order in the list
stock int -1 Reserved, -1 is unlimited
enabled boolean true When false the offer does not show up

price and cost

price is paid with any mix of coins and gives change back. cost demands exact items. Both can be used at once.

"cost": [ { "item": "minecraft:emerald", "count": 4 } ]

result

"result": { "item": "minecraft:golden_apple", "count": 1 }
"result": { "bag": "ultimatemodadditions:common", "count": 1 }
Field Default What it does
item Item to hand over
count 1 Amount
bag Hands over a bag by id; beats item
components Item components

What cannot be bought

The stand rejects certain offers even if you define them, and does not show them in the screen or in JEI:

  • Bags of rarity epic or above, plus the food and enchantment ones. Only common and uncommon can be bought.
  • Anything in the ultimatemodadditions:not_purchasable tag. The coliseum key is in there by default.

To allow or block more things, edit that tag from a datapack:

{
  "replace": false,
  "values": ["nadien_teaks:my_item"]
}

The trading screen

Right-click the stand to open it. Clicking a row buys one; shift-clicking buys eight. The top right shows how much money you are carrying.


Currency

The denominations are the Argentine ones: 10, 20, 50, 100, 200, 500, 1000, 10000 and 20000. From 10 to 500 they are mangos, from 1000 to 20000 they are lucas — Argentine slang for "bucks" and "grand", kept in both languages.

Item Value Name
coin_10 10 10 mangos
coin_20 20 20 mangos
coin_50 50 50 mangos
coin_100 100 100 mangos
coin_200 200 200 mangos
coin_500 500 500 mangos
coin_1000 1000 1 luca
coin_10000 10000 10 lucas
coin_20000 20000 20 lucas

How they work

There are no conversion recipes. You use them with a coin in hand:

  • Right-click sweeps every loose coin in the inventory and hands it back as the fewest possible coins, telling you the total.
  • Sneak + right-click breaks one coin down into the next denominations below it.

Both work whether you are aiming at a block or at the sky.

The price of an exchange stand offer is paid with any combination and gives change back on its own.

In datapacks

Wherever a mob rule asks for a denomination, it is written as text:

"coins": [ { "tier": "500", "count": { "min": 1, "max": 3 }, "chance": 0.5 } ]

The old names bronze, silver and gold are still accepted and mean 10, 100 and 1000.


Coliseum

ultimatemodadditions:coliseum

A dimension of its own with a Roman amphitheatre built by the mod. It is not a flat world: the generator is empty and the arena raises itself the first time the dimension loads.

What is in it

  • A sand arena with a podium wall around it.
  • Five tiers of stepped stands.
  • An outer wall with arches on two decks.
  • Four gates in a cross.
  • Lighting and a return portal next to the north gate.

You get in through the portal or with /uma coliseum enter. You always land on the sand.

If you fall outside the amphitheatre the mod puts you back on the arena instead of letting you drop into the void.

The portal

It is built exactly like a nether portal but out of crying obsidian: a rectangular frame, 4×5 counting the frame at minimum (2×3 of opening), up to 23×23. The four corners have to be there.

To light it, right-click each of the four corners with the coliseum key. The mod tells you how many you have done (Corner 2 of 4). On the fourth one a key is consumed and the portal opens. Order does not matter and you can walk around the frame between clicks.

If you break a block of the frame the portal goes out on its own, like a nether one.

Inside the coliseum there is an already-lit portal next to the north gate that takes you back where you came from. That one asks for nothing.

Requirements to pass through

An open portal is not enough: it has to let you through. You need 100 vanilla experience levels, which are not spent.

If you do not meet it the portal rejects you and lists in chat what you are missing and how far along you are. It is checked per player: you cannot drag or push someone in who does not meet it, because each player is checked on entry. Leaving the coliseum asks for nothing.

All of this is changed in [coliseum.portal]:

Option Default What it does
enforce_requirements true When false the portal lets anyone through
required_experience_levels 100 Experience levels; they are not spent

To test it without grinding: /xp set @s 100 levels.

Arena spawners

When the arena is built, spawners are placed in a ring across the sand, each one on a block of chiselled sandstone. Every spawner carries one mob type, handed out in order from the config list, so all the types you list show up. The one that would land on the spawn point is skipped.

Twelve ship by default: zombie, skeleton, spider, creeper, husk, stray, witch, pillager, blaze, wither skeleton, vindicator and enderman.

/uma spawners list
/uma spawners place
/uma spawners clear

clear removes every spawner in the coliseum, including any you placed by hand. place puts them back according to the config, wiping the previous ones first. Both need permission level 2; list is open to anyone.

To get rid of them for good, set enabled = false in [coliseum.spawners] and run /uma spawners clear.

Spawner config

In [coliseum.spawners]:

Option Default What it does
enabled true Places spawners when the arena is built
entities 12 hostile mobs Which types to use, one per spawner
count 12 How many to place; 0 places none
min_spawn_delay 200 Shortest wait between batches, in ticks
max_spawn_delay 600 Longest wait between batches, in ticks
spawn_count 4 How many mobs each batch tries to place
max_nearby_entities 8 Stops once this many are already alive nearby
required_player_range 24 How close a player has to be
spawn_range 6 How far from the spawner mobs can appear

Ids that do not exist are skipped with a warning in the log, so you can list mobs from other mods without breaking anything when they are not installed.

Mobs from these spawners still go through the mob rules and the active difficulty: they come out scaled and drop coins and bags like any other.

The key

ultimatemodadditions:coliseum_key is crafted from a gold ingot, an ender pearl and a gold nugget in a column. It cannot be bought at the exchange stand: it sits in the ultimatemodadditions:not_purchasable tag.

It is used to light the portal and is consumed on completing the four corners. One key opens one portal; after that the portal stays open forever, until you break the frame.

Difficulty

The dimension has an active difficulty that holds for the whole save, and it is used by every mob rule that does not declare its own:

/uma difficulty get
/uma difficulty list
/uma difficulty set ultimatemodadditions:nightmare

See Difficulties and Mob rules.

Rebuilding it

/uma rebuild_arena

Useful if you changed the radius or the height in the config, or if someone wrecked it. Needs permission level 2.

Coliseum config

In [coliseum]:

Option Default What it does
enabled true Turns the dimension on
build_arena true Builds the amphitheatre on load
arena_radius 30 Radius in blocks of the sand floor
arena_floor_y 64 Height of the floor
player_count_scaling 0.25 How much it scales per player

KubeJS

If KubeJS is installed, the mod adds the global binding UMA. It only works in server scripts (kubejs/server_scripts/), because the data loads together with the datapack. Calling it from startup_scripts or client_scripts means the entry is thrown away when the world loads, and the mod warns you in the log. Entries are re-injected on every /reload, so load order is not something you have to worry about.

The API is made of chained builders. Each one starts with UMA.<type>('id'), you hang methods off it, and it ends with .register(). Nothing happens without .register().

Ids without a namespace resolve to ultimatemodadditions:.

UMA.lootBag('nadien_teaks:mythic')
  .name('Mythic Bag')
  .tier('mythic')
  .rolls(5, 7)
  .guaranteed('ultimatemodadditions:coin_10000', 1)
  .entry('minecraft:netherite_block', 1, 2, 10)
  .register()

The eight builders

Builder Equivalent to
UMA.difficulty(id) uma/difficulty/
UMA.mobRule(id) uma/mob_rules/
UMA.lootBag(id) uma/loot_bags/
UMA.bagDrop(id) uma/loot_bag_additions/
UMA.trade(id) uma/trades/

UMA.difficulty(id)

UMA.difficulty('nadien_teaks:brutal')
  .name('Brutal')
  .health(10).damage(4).speed(1.2)
  .armor(8).armorToughness(4).knockbackResistance(0.5).followRange(16)
  .experience(3).coins(8).bagChance(0.1).extraRolls(2)
  .glowing(true)
  .effect('minecraft:strength', 1, -1, 1.0)
  .equipment('mainhand', 'minecraft:netherite_sword', 0.5, 0.02)
  .register()

effect(id, amplifier, duration, chance) — a duration of -1 is permanent. equipment(slot, item, chance, dropChance) — slots: mainhand, offhand, head, chest, legs, feet.

UMA.mobRule(id)

UMA.mobRule('nadien_teaks:zombies')
  .priority(50)
  .entities('minecraft:zombie', 'minecraft:husk')
  .categories('monster')
  .boss(false)
  .dimensions('ultimatemodadditions:coliseum')
  .difficulty('nadien_teaks:brutal')
  .replaceVanillaDrops(true)
  .experienceMultiplier(2)
  .drop('minecraft:netherite_scrap', 1, 2, 0.25)
  .coin('1000', 1, 1, 0.2)
  .bag('ultimatemodadditions:common', 0.1)
  .register()

drop(item, min, max, chance) · coin(denomination, min, max, chance) · bag(bagId, chance).

UMA.lootBag(id)

UMA.lootBag('nadien_teaks:mythic')
  .name('Mythic Bag')
  .tier('mythic')
  .color(0xFF5C5C)
  .rolls(5, 7)
  .uniqueRolls(true)
  .announce(true)
  .openSound('ultimatemodadditions:loot_bag_open')
  .sortOrder(40)
  .guaranteed('ultimatemodadditions:coin_10000', 1)
  .entry('minecraft:netherite_block', 1, 2, 10)
  .bagEntry('ultimatemodadditions:enchantment', 5)
  .lootTableEntry('minecraft:chests/end_city_treasure', 0.5, 3)
  .register()

entry(item, weight) or entry(item, min, max, weight). guaranteed(item), guaranteed(item, amount) or guaranteed(item, min, max).

UMA.bagDrop(id)

Adds loot to bags that already exist, without rewriting them.

UMA.bagDrop('nadien_teaks:copper_everywhere')
  .allTiers()
  .entry('minecraft:copper_ingot', 2, 8, 10)
  .register()

UMA.bagDrop('nadien_teaks:legendary_extra')
  .bag('ultimatemodadditions:legendary')
  .guaranteed('ultimatemodadditions:coin_20000', 1)
  .register()

UMA.bagDrop('nadien_teaks:high_tiers_only')
  .tiers('epic', 'mythic', 'legendary', 'omega')
  .entry('minecraft:nether_star', 1, 1, 4)
  .register()

bag(id), bags(...) and tiers(...) add up. allTiers() is shorthand for tiers('all'). replace(true) wipes the previous contents before adding.

UMA.trade(id)

UMA.trade('nadien_teaks:mythic')
  .name('Mythic Bag')
  .category('bags')
  .price(50000)
  .cost('minecraft:emerald', 8)
  .resultBag('nadien_teaks:mythic')
  .sortOrder(90)
  .register()

result(item) / result(item, amount) for items, resultBag(id) for bags. price is money and is paid with any combination of coins, with change.

Escape hatches

When a builder does not cover something, the raw* methods take an object as-is:

UMA.mobRule('nadien_teaks:odd')
  .rawMatch({ regex: ['^minecraft:.*_zombie$'], exclude: ['minecraft:drowned'] })
  .register()

UMA.lootBag('nadien_teaks:books')
  .rawEntry({
    item: 'minecraft:enchanted_book',
    weight: 10,
    components: { 'minecraft:stored_enchantments': { levels: { 'minecraft:mending': 1 } } }
  })
  .register()

The older methods UMA.addLootBag(id, obj), UMA.addTrade(id, obj) and friends are still there and take the whole JSON. They are handy for porting datapacks as-is, but for writing from scratch the builders are better.

Ready-made examples

run/kubejs/ has a uma_ejemplos.js in every folder, commented and tested:

  • server_scripts/uma_ejemplos.js — everything UMA: bags, additions, trades, a difficulty, a mob rule and a trade with a price. It uses minecraft:bedrock and minecraft:iron_golem_spawn_egg as reference items.
  • startup_scripts/uma_ejemplos.js — explains why UMA does not belong there and shows what does: registering new items with StartupEvents.registry, to hand them out through UMA bags later.
  • client_scripts/uma_ejemplos.js — tooltips telling you what each item demands.

Without writing scripts

KubeJS also loads kubejs/data/, so you can drop the JSON in kubejs/data/nadien_teaks/uma/mob_rules/… and it works the same.

When something is wrong

Format errors show up in the server log with the id of the entry, and that entry is dropped without breaking the rest.


Commands

/ums is an alias of /uma: everything works under both names.

/uma tps
/uma ping [players]
/uma coliseum enter | leave
/uma rebuild_arena
/uma spawners list | place | clear
/uma difficulty get | list | set <id>
/uma bag <players> <bag> [amount]

tps

Shows the server's real performance, which most mods report badly:

  • Average TPS and MSPT over the last 100 ticks, against the 50 ms budget.
  • The worst tick in that window.
  • MSPT for each dimension separately.

The colours mark when it is getting tight (yellow) or bad (red).

ping

With no arguments it shows yours. With a selector, everyone's. Green below 100 ms, yellow up to 250, red above.

coliseum

enter takes you to the arena and remembers where you came from; leave puts you back there.

spawners

list counts the spawners in the coliseum, place puts them back according to the config wiping the existing ones, and clear removes them all. place and clear need permission level 2. See Coliseum.

rebuild_arena

Rebuilds the amphitheatre. Useful if you changed the radius or the height in the config, or if someone wrecked it. Needs permission level 2.

difficulty

get shows the active difficulty, list shows the available ones, set changes it for the whole save. It is the one used by mob rules that do not declare their own. set needs permission level 2.

Hands out bags by id. Needs permission level 2.


Configuration

config/ultimatemodadditions-common.toml

These are the broad switches. The content itself lives in JSON, not here.

[coliseum]

Option Default What it does
enabled true Turns the dimension on
build_arena true Builds the amphitheatre the first time
arena_radius 30 Radius of the sand floor
arena_floor_y 64 Height of the floor
player_count_scaling 0.25 Extra scaling per player

Also the default difficulty and whether custom loot only applies inside the coliseum.

[coliseum.portal]

Option Default What it does
enforce_requirements true When false the portal lets anyone through
required_experience_levels 100 Experience levels; they are not spent

See Coliseum.

[coliseum.spawners]

Option Default What it does
enabled true Places spawners when the arena is built
entities 12 hostile mobs Which types to use, one per spawner
count 12 How many to place; 0 places none
min_spawn_delay 200 Shortest wait between batches, in ticks
max_spawn_delay 600 Longest wait between batches, in ticks
spawn_count 4 How many mobs each batch tries to place
max_nearby_entities 8 Stops once this many are already alive nearby
required_player_range 24 How close a player has to be
spawn_range 6 How far from the spawner mobs can appear

See Coliseum.

[mob_scaling]

Turns scaling on, whether it only applies inside the coliseum, global multipliers and a health cap.

[coins] and [loot_bags]

Turn each system on, whether they only work inside the coliseum, base chance and amounts, and whether only player kills count.


Full example

A small pack that touches everything: a difficulty, a mob rule, a bag, an addition to the bags that already exist and an offer. All under the nadien_teaks namespace.

It goes in config/openloader/data/nadien_teaks/ with OpenLoader, or in world/datapacks/nadien_teaks/data/nadien_teaks/ if you prefer a plain datapack.

uma/difficulty/brutal.json

{
  "name": "Brutal",
  "health_multiplier": 6.0,
  "damage_multiplier": 3.0,
  "speed_multiplier": 1.15,
  "armor_bonus": 8.0,
  "armor_toughness_bonus": 3.0,
  "knockback_resistance": 0.3,
  "follow_range_bonus": 16.0,
  "experience_multiplier": 3.0,
  "coin_multiplier": 4.0,
  "bag_chance_bonus": 0.08,
  "extra_loot_rolls": 1,
  "glowing": true,
  "effects": [
    { "effect": "minecraft:strength", "amplifier": 1, "duration": -1, "chance": 1.0 }
  ],
  "equipment": {
    "mainhand": { "item": "minecraft:netherite_sword", "chance": 0.4, "drop_chance": 0.02 },
    "head": { "item": "minecraft:netherite_helmet", "chance": 0.3 }
  }
}

uma/mob_rules/wither_skeletons.json

{
  "priority": 50,
  "match": { "entities": ["minecraft:wither_skeleton"] },
  "dimensions": ["ultimatemodadditions:coliseum"],
  "difficulty": "nadien_teaks:brutal",
  "replace_vanilla_drops": false,
  "experience_multiplier": 2.0,
  "drops": [
    { "item": "minecraft:netherite_scrap", "count": { "min": 1, "max": 2 }, "chance": 0.25,
      "looting_bonus": 0.05 }
  ],
  "coins": [
    { "tier": "1000", "count": 1, "chance": 0.35 }
  ],
  "bags": [
    { "bag": "nadien_teaks:boss_reward", "chance": 0.05 }
  ]
}

uma/loot_bags/boss_reward.json

{
  "name": "Boss Reward",
  "tier": "legendary",
  "color": 16733525,
  "sort_order": 45,
  "rolls": { "min": 3, "max": 5 },
  "unique_rolls": true,
  "announce": true,
  "open_sound": "ultimatemodadditions:loot_bag_open",
  "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 }
  ]
}

uma/loot_bag_additions/copper_everywhere.json

{
  "tiers": ["all"],
  "entries": [
    { "item": "minecraft:copper_ingot", "count": { "min": 2, "max": 8 }, "weight": 10 }
  ],
  "replace": false
}

uma/trades/boss_reward.json

{
  "name": "Boss Reward",
  "category": "bags",
  "sort_order": 90,
  "price": 50000,
  "cost": [ { "item": "minecraft:emerald", "count": 8 } ],
  "result": { "bag": "nadien_teaks:boss_reward", "count": 1 },
  "enabled": true
}

The same thing in KubeJS

All of the above in a single file, kubejs/server_scripts/nadien_teaks.js:

UMA.difficulty('nadien_teaks:brutal')
  .name('Brutal')
  .health(6).damage(3).speed(1.15)
  .armor(8).armorToughness(3).knockbackResistance(0.3).followRange(16)
  .experience(3).coins(4).bagChance(0.08).extraRolls(1)
  .glowing(true)
  .effect('minecraft:strength', 1, -1, 1.0)
  .equipment('mainhand', 'minecraft:netherite_sword', 0.4, 0.02)
  .register()

UMA.lootBag('nadien_teaks:boss_reward')
  .name('Boss Reward')
  .tier('legendary')
  .color(0xFF5555)
  .rolls(3, 5)
  .uniqueRolls(true)
  .announce(true)
  .guaranteed('ultimatemodadditions:coin_20000', 1, 2)
  .entry('minecraft:netherite_ingot', 1, 2, 10)
  .entry('minecraft:elytra', 2)
  .bagEntry('ultimatemodadditions:enchantment', 6)
  .lootTableEntry('minecraft:chests/end_city_treasure', 1.0, 4)
  .register()

UMA.mobRule('nadien_teaks:wither_skeletons')
  .priority(50)
  .entities('minecraft:wither_skeleton')
  .dimensions('ultimatemodadditions:coliseum')
  .difficulty('nadien_teaks:brutal')
  .experienceMultiplier(2)
  .drop('minecraft:netherite_scrap', 1, 2, 0.25)
  .coin('1000', 1, 1, 0.35)
  .bag('nadien_teaks:boss_reward', 0.05)
  .register()

UMA.bagDrop('nadien_teaks:copper_everywhere')
  .allTiers()
  .entry('minecraft:copper_ingot', 2, 8, 10)
  .register()

UMA.trade('nadien_teaks:boss_reward')
  .name('Boss Reward')
  .category('bags')
  .price(50000)
  .cost('minecraft:emerald', 8)
  .resultBag('nadien_teaks:boss_reward')
  .sortOrder(90)
  .register()

/reload and you are done. Format errors show up in the server log with the id of the entry, and that entry is dropped without breaking the rest.


The skill system

It used to live here and now has a mod of its own: Ultimate Skills, a node tree where every node, connection, bonus and effect is defined in JSON or KubeJS. The two mods are independent — install either one on its own, or both.