-
Notifications
You must be signed in to change notification settings - Fork 0
Ultimate Mod Additions 1.21.1 Wiki EN
The examples on this page use the namespace nadien_teaks:. Use your own — the mod never
looks at the namespace, only at the folder.
| 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 |
| 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_10 … coin_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_common … loot_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/. |
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.
| 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 |
Wherever this page says range, you can write a plain number or an object:
"count": 3
"count": { "min": 1, "max": 4 }"match": {
"items": ["minecraft:diamond_pickaxe"],
"tags": ["c:tools/pickaxe"],
"blocks": ["minecraft:stone"],
"block_tags": ["minecraft:mineable/pickaxe"],
"regex": ["^minecraft:.*_ore$"],
"exclude": ["minecraft:bedrock"]
}-
itemsandtagsare checked against items;blocksandblock_tagsagainst blocks. -
regexruns on the full id (minecraft:diamond) and is only consulted when nothing matched by list or tag. -
excludebeats everything else.
"entity": {
"entities": ["minecraft:zombie"],
"tags": ["minecraft:skeletons"],
"regex": ["^minecraft:.*_zombie$"],
"categories": ["monster"],
"exclude": ["minecraft:villager"],
"boss": true,
"baby": false
}-
categoriesacceptsmonster,creature,ambient,water_creature,axolotls,underground_water_creature,water_ambientandmisc. -
bosslooks at thec:bossestag. - If you leave
entities,tagsandregexempty it matches any entity that passes the remaining filters.
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 } }
}
}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 }
}
}| 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 |
{ "effect": "minecraft:strength", "amplifier": 0, "duration": -1, "chance": 1.0 }duration: -1 is permanent. chance runs from 0 to 1.
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 |
- If the matching mob rule carries
difficulty, that profile is used. - If it carries
inline_difficulty, that inline profile is used. - Otherwise the Coliseum's active difficulty is used (
/uma difficulty set).
See 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 } ]
}| 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.
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.
{ "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.
{ "bag": "ultimatemodadditions:common", "count": 1, "chance": 0.06 }The difficulty's bag_chance_bonus is added to chance.
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.
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.
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.
Right-click opens one. Sneak opens the whole stack. The loot goes to the inventory and whatever does not fit drops on the floor.
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 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": { "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 |
The stand rejects certain offers even if you define them, and does not show them in the screen or in JEI:
- Bags of rarity
epicor above, plus the food and enchantment ones. Onlycommonanduncommoncan be bought. - Anything in the
ultimatemodadditions:not_purchasabletag. 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"]
}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.
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 |
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.
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.
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.
- 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.
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.
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.
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.
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.
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.
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.
/uma rebuild_arena
Useful if you changed the radius or the height in the config, or if someone wrecked it. Needs permission level 2.
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 |
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()| 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('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('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('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).
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('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.
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.
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 usesminecraft:bedrockandminecraft:iron_golem_spawn_eggas reference items. -
startup_scripts/uma_ejemplos.js— explains why UMA does not belong there and shows what does: registering new items withStartupEvents.registry, to hand them out through UMA bags later. -
client_scripts/uma_ejemplos.js— tooltips telling you what each item demands.
KubeJS also loads kubejs/data/, so you can drop the JSON in
kubejs/data/nadien_teaks/uma/mob_rules/… and it works the same.
Format errors show up in the server log with the id of the entry, and that entry is dropped without breaking the rest.
/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]
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).
With no arguments it shows yours. With a selector, everyone's. Green below 100 ms, yellow up to 250, red above.
enter takes you to the arena and remembers where you came from; leave puts you back there.
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.
Rebuilds the amphitheatre. Useful if you changed the radius or the height in the config, or if someone wrecked it. Needs permission level 2.
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.
config/ultimatemodadditions-common.toml
These are the broad switches. The content itself lives in JSON, not here.
| 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.
| 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.
| 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.
Turns scaling on, whether it only applies inside the coliseum, global multipliers and a health cap.
Turn each system on, whether they only work inside the coliseum, base chance and amounts, and whether only player kills count.
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.
{
"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 }
}
}{
"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 }
]
}{
"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 }
]
}{
"tiers": ["all"],
"entries": [
{ "item": "minecraft:copper_ingot", "count": { "min": 2, "max": 8 }, "weight": 10 }
],
"replace": false
}{
"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
}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.
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.