Skip to content

Ultimate Mod Additions 1.21.1 Wiki ES

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

Wiki de Ultimate Mod Additions (Español)

Todo el contenido del mod se define en JSON y, si KubeJS está instalado, también por script. Nada está grabado en el código: dificultades, drops, bolsas e intercambios se cambian desde un datapack sin recompilar nada.

Los ejemplos de esta página usan el namespace nadien_teaks:. Poné el tuyo — el mod nunca mira el namespace, sólo la carpeta.

Índice

Sección De qué trata
Datapacks Dónde van los archivos, cómo se recargan, tipos compartidos
Dificultades uma/difficulty — escalado de mobs
Reglas de mobs uma/mob_rules — qué suelta cada mob y qué tan duro es
Bolsas de botín uma/loot_bags y uma/loot_bag_additions
Intercambios uma/trades — el puesto de intercambio
Monedas Las nueve denominaciones y cómo se usan
Coliseo La dimensión, el anfiteatro, el portal y la llave
KubeJS El binding UMA y todos sus métodos
Comandos /uma y /ums
Configuración El TOML de configuración
Ejemplo completo Un archivo de cada tipo, en JSON y en KubeJS

Qué agrega el mod

Cosa Id Qué hace
Dimensión coliseo ultimatemodadditions:coliseum Una dimensión propia con un anfiteatro romano que el mod construye solo. A los mobs de adentro los escala la dificultad activa y sueltan monedas y bolsas.
Portal del coliseo ultimatemodadditions:coliseum_portal El bloque que llena un marco de obsidiana llorosa prendido. Caminás adentro y te lleva; comprueba el requisito jugador por jugador. No se craftea ni se levanta: aparece al prender un marco.
Llave del coliseo ultimatemodadditions:coliseum_key Prende un portal. Clic derecho en cada una de las cuatro esquinas del marco de obsidiana llorosa; en la cuarta se gasta la llave. Se craftea, nunca se compra.
Puesto de intercambio ultimatemodadditions:exchange_stand El bloque de la tienda. Clic derecho abre la lista de ofertas, que sale de uma/trades/. Se paga con cualquier mezcla de monedas y devuelve el vuelto.
Monedas coin_10coin_20000 Nueve denominaciones de dinero. Clic derecho junta toda la plata suelta en la menor cantidad de monedas, agachado + clic derecho rompe una en más chicas. Los mobs las sueltan.
Bolsas de botín loot_bag_commonloot_bag_enchantment Ocho rarezas de contenedor. Clic derecho abre una, agachado abre la pila. Lo que sale se define en uma/loot_bags/.

Datapacks

Dónde van los archivos

Todo cuelga de data/<cualquier_namespace>/uma/…. El namespace no importa, usá el tuyo. Sirven tres lugares:

  • un datapack normal, en world/datapacks/nadien_teaks/data/nadien_teaks/uma/…
  • la carpeta de KubeJS, en kubejs/data/nadien_teaks/uma/…
  • el propio mod, si lo estás compilando

Se recargan con /reload. No hace falta reiniciar.

Carpetas

Carpeta Qué define
uma/difficulty/ Perfiles de escalado de mobs
uma/mob_rules/ Qué mob usa qué dificultad y qué suelta
uma/loot_bags/ El contenido de cada bolsa
uma/loot_bag_additions/ Botín extra agregado a bolsas que ya existen
uma/trades/ Ofertas del puesto de intercambio

Tipos compartidos

Rango de enteros

Donde esta página diga rango, podés escribir un número suelto o un objeto:

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

match — filtro de items y bloques

"match": {
  "items": ["minecraft:diamond_pickaxe"],
  "tags": ["c:tools/pickaxe"],
  "blocks": ["minecraft:stone"],
  "block_tags": ["minecraft:mineable/pickaxe"],
  "regex": ["^minecraft:.*_ore$"],
  "exclude": ["minecraft:bedrock"]
}
  • items y tags se comparan contra objetos; blocks y block_tags contra bloques.
  • regex corre sobre el id completo (minecraft:diamond) y sólo se consulta cuando no coincidió nada por lista ni por etiqueta.
  • exclude le gana a todo lo demás.

entity — filtro de entidades

"entity": {
  "entities": ["minecraft:zombie"],
  "tags": ["minecraft:skeletons"],
  "regex": ["^minecraft:.*_zombie$"],
  "categories": ["monster"],
  "exclude": ["minecraft:villager"],
  "boss": true,
  "baby": false
}
  • categories acepta monster, creature, ambient, water_creature, axolotls, underground_water_creature, water_ambient y misc.
  • boss mira la etiqueta c:bosses.
  • Si dejás entities, tags y regex vacíos, coincide con cualquier entidad que pase los demás filtros.

components

Cualquier entrada que entregue un objeto acepta components, con el formato de componentes de 1.21:

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

Dificultades

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

Un perfil de dificultad es un paquete de multiplicadores que se le aplica a un mob al aparecer. easy, normal, hard y nightmare vienen con el mod.

{
  "name": "Dificil",
  "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 }
  }
}

Campos

Campo Tipo Por defecto Qué hace
name texto Nombre visible, opcional
health_multiplier decimal 1.0 Multiplica la vida máxima
damage_multiplier decimal 1.0 Multiplica el daño de ataque
speed_multiplier decimal 1.0 Multiplica la velocidad de movimiento
armor_bonus decimal 0.0 Suma armadura
armor_toughness_bonus decimal 0.0 Suma dureza de armadura
knockback_resistance decimal 0.0 Suma resistencia al empuje (0–1)
follow_range_bonus decimal 0.0 Suma rango de persecución
experience_multiplier decimal 1.0 Multiplica la experiencia que suelta
coin_multiplier decimal 1.0 Multiplica las monedas que suelta
bag_chance_bonus decimal 0.0 Suma a la probabilidad de bolsa
extra_loot_rolls entero 0 Tiradas extra de botín
glowing booleano false Deja al mob brillando
effects lista vacía Efectos de poción permanentes o temporales
equipment objeto vacío Equipo por ranura

effects

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

duration: -1 es permanente. chance va de 0 a 1.

equipment

Las claves son ranuras: 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 }
}
Campo Por defecto Qué hace
item obligatorio Qué se equipa
count 1 Cantidad
chance 1.0 Probabilidad de que lo lleve
drop_chance 0.085 Probabilidad de que lo suelte al morir
components Componentes del objeto

Cómo se elige la dificultad

  1. Si la regla de mob que coincide trae difficulty, se usa ese perfil.
  2. Si trae inline_difficulty, se usa ese perfil escrito en línea.
  3. Si no, se usa la dificultad activa del coliseo (/uma difficulty set).

Ver Reglas de mobs.


Reglas de mobs

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

Deciden qué dificultad usa cada mob y qué suelta al morir. Se comprueban de mayor a menor priority; la primera que coincide gana.

{
  "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 } ]
}

Campos

Campo Tipo Por defecto Qué hace
priority entero 0 Más alto se comprueba antes
match filtro de entidad cualquiera A qué mobs aplica
dimensions lista de ids vacía = todas En qué dimensiones aplica
difficulty id Perfil de dificultad a usar
inline_difficulty objeto Un perfil escrito en línea en vez de difficulty
replace_vanilla_drops booleano false Borra el botín vanilla del mob
drops lista vacía Botín propio
coins lista vacía Monedas que suelta
bags lista vacía Bolsas que suelta
experience_multiplier decimal 1.0 Multiplica la experiencia que suelta
stop_matching booleano false Corta la búsqueda aunque no aplique nada

El filtro va en match y usa el formato de filtro de entidades.

drops

Cada entrada puede entregar un objeto, una tabla de botín o una bolsa.

Campo Por defecto Qué hace
item Objeto a soltar
count 1 Cantidad (rango)
chance 1.0 Probabilidad, de 0 a 1
weight 1 Sólo se usa dentro de bolsas
looting_bonus 0.0 Se suma a chance por nivel de saqueo
components Componentes del objeto
loot_table Tira una tabla de botín entera
bag Entrega una bolsa por su id

Si hay bag, se ignora item.

coins

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

tier es la denominación: "10", "20", "50", "100", "200", "500", "1000", "10000" o "20000". Se aceptan los nombres viejos bronze, silver y gold, que valen 10, 100 y 1000.

La cantidad final se multiplica por el coin_multiplier de la dificultad.

bags

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

A chance se le suma el bag_chance_bonus de la dificultad.


Bolsas de botín

uma/loot_bags/<id>.json

Cada archivo es una bolsa. Hacé todas las que quieras: tier decide sobre cuál de los ocho items se apoya, y con eso su textura y su rareza.

{
  "name": "Bolsa epica",
  "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 }
  ]
}
Campo Tipo Por defecto Qué hace
name texto Nombre visible de la bolsa
tier texto common Rareza, ver la tabla de abajo
rolls rango 1 Cuántas entradas se sortean
guaranteed lista vacía Botín fijo, siempre sale
entries lista vacía Pozo aleatorio, se sortea por weight
unique_rolls booleano false Impide que salga dos veces la misma entrada
color entero 0xFFFFFF Color decimal del nombre
open_sound id Sonido al abrirla
announce booleano false Le avisa a todo el servidor cuando se abre
sort_order entero 0 Orden en JEI

Las entradas usan el mismo formato que los drops de una regla de mob, incluidos loot_table y bag para bolsas anidadas.

Rarezas

tier Item base Se compra en el puesto
common loot_bag_common
uncommon loot_bag_uncommon
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 sigue aceptándose como alias de epic para datapacks viejos.

uma/loot_bag_additions/<id>.json

Para agregar botín a bolsas que ya existen sin reescribirlas. Se aplican después de que cargaron todas las bolsas, así que funcionan sobre las del mod, las de otro datapack o las de KubeJS.

{
  "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
}
Campo Por defecto Qué hace
bag Una bolsa concreta
bags vacía Varias bolsas concretas
tiers vacía Todas las bolsas de esas rarezas; ["all"] alcanza a todas
entries vacía Se suma al pozo aleatorio
guaranteed vacía Se suma al botín fijo
replace false Si es true, borra el contenido previo antes de agregar

bag, bags y tiers se suman: la adición se aplica a toda bolsa que encaje con cualquiera de los tres.

Cómo se abren

Clic derecho abre una. Agachado abre la pila entera. El botín va al inventario y lo que no entra cae al piso.


Intercambios

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

Son las ofertas del puesto de intercambio (ultimatemodadditions:exchange_stand).

{
  "name": "Bolsa poco comun",
  "category": "bags",
  "sort_order": 20,
  "price": 700,
  "cost": [ { "item": "minecraft:emerald", "count": 4 } ],
  "result": { "bag": "ultimatemodadditions:uncommon", "count": 1 },
  "stock": -1,
  "enabled": true
}
Campo Tipo Por defecto Qué hace
name texto el nombre del resultado Etiqueta en la lista
category texto general Agrupación libre
price entero 0 Precio en dinero
cost lista vacía Objetos concretos que además hay que pagar
result objeto obligatorio Qué se entrega
sort_order entero 0 Orden en la lista
stock entero -1 Reservado, -1 es ilimitado
enabled booleano true Si está en false la oferta no aparece

price y cost

price se paga con cualquier mezcla de monedas y devuelve el vuelto. cost pide objetos exactos. Se pueden usar los dos a la vez.

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

result

"result": { "item": "minecraft:golden_apple", "count": 1 }
"result": { "bag": "ultimatemodadditions:common", "count": 1 }
Campo Por defecto Qué hace
item Objeto a entregar
count 1 Cantidad
bag Entrega una bolsa por su id; le gana a item
components Componentes del objeto

Qué no se puede comprar

El puesto rechaza ciertas ofertas aunque las definas, y tampoco las muestra en la pantalla ni en JEI:

  • Bolsas de rareza epic o superior, más las de comida y encantamiento. Sólo common y uncommon se compran.
  • Cualquier cosa que esté en la etiqueta ultimatemodadditions:not_purchasable. La llave del coliseo está ahí de fábrica.

Para permitir o bloquear más cosas, editá esa etiqueta desde un datapack:

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

La pantalla del puesto

Clic derecho en el puesto para abrirlo. Clic en una fila compra una; con shift, ocho. Arriba a la derecha se ve cuánta plata llevás encima.


Monedas

Las denominaciones son las argentinas: 10, 20, 50, 100, 200, 500, 1000, 10000 y 20000. Del 10 al 500 son mangos, del 1000 al 20000 son lucas.

Item Valor Nombre
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

Cómo funcionan

No hay recetas de conversión. Se usan con una moneda en la mano:

  • Clic derecho junta toda la plata suelta del inventario y te la devuelve en la menor cantidad de monedas posible, avisándote el total.
  • Agachado + clic derecho rompe una moneda en las denominaciones que le siguen para abajo.

Las dos cosas funcionan estés apuntando a un bloque o al cielo.

El precio de una oferta del puesto de intercambio se paga con cualquier combinación y devuelve el vuelto solo.

En los datapacks

Donde una regla de mob pida una denominación, se escribe como texto:

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

Se aceptan los nombres viejos bronze, silver y gold, que valen 10, 100 y 1000.


Coliseo

ultimatemodadditions:coliseum

Una dimensión propia con un anfiteatro romano construido por el mod. No es un mundo plano: el generador está vacío y la arena se levanta sola la primera vez que carga la dimensión.

Qué tiene

  • Arena de arena con muro de podio alrededor.
  • Cinco gradas escalonadas.
  • Muralla exterior con arcos en dos niveles.
  • Cuatro puertas en cruz.
  • Iluminación y un portal de vuelta junto a la puerta norte.

Se entra por el portal o con /uma coliseum enter. Siempre aparecés sobre la arena.

Si te caés fuera del anfiteatro, el mod te devuelve a la arena en vez de dejarte caer al vacío.

El portal

Se arma igual que uno del Nether pero con obsidiana llorosa: marco rectangular, mínimo 4×5 contando el marco (2×3 de hueco), hasta 23×23. Las cuatro esquinas tienen que estar.

Para prenderlo, clic derecho con la llave del coliseo en cada una de las cuatro esquinas. El mod te va avisando por cuántas vas (Esquina 2 de 4). En la cuarta se gasta una llave y el portal se abre. El orden no importa y podés dar la vuelta al marco entre clic y clic.

Si rompés un bloque del marco, el portal se apaga solo, como el del Nether.

Adentro del coliseo hay un portal ya abierto junto a la puerta norte que te devuelve de donde viniste. Ese no pide nada.

Requisitos para pasar

Que el portal esté abierto no alcanza: te tiene que dejar pasar a vos. Hacen falta 100 niveles de experiencia de vanilla, que no se gastan.

Si no cumplís, el portal te rechaza y te dice por chat qué te falta y cuánto llevás. Se comprueba por jugador: no podés meter ni arrastrar a alguien que no cumpla, porque a cada uno se le mira lo suyo al entrar. Salir del coliseo no pide nada.

Todo esto se cambia en [coliseum.portal]:

Opción Por defecto Qué hace
enforce_requirements true Si es false el portal deja pasar a cualquiera
required_experience_levels 100 Niveles de experiencia; no se gastan

Para probarlo sin farmear: /xp set @s 100 levels.

Generadores de la arena

Al construir la arena se ponen generadores repartidos en un anillo sobre la arena, cada uno sobre un bloque de arenisca cincelada. Cada generador lleva un tipo de mob, repartidos en orden por la lista de la config, así que aparecen todos los tipos que pongas. El que caería sobre el punto de aparición se saltea.

De serie son doce: zombi, esqueleto, araña, creeper, husk, stray, bruja, saqueador, blaze, esqueleto wither, vindicador y enderman.

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

clear saca todos los generadores del coliseo, incluidos los que pongas a mano. place los vuelve a poner según la config, borrando los anteriores primero. Los dos piden permiso 2; list lo puede usar cualquiera.

Para sacarlos para siempre, poné enabled = false en [coliseum.spawners] y corré /uma spawners clear.

Config de generadores

En [coliseum.spawners]:

Opción Por defecto Qué hace
enabled true Pone generadores al construir la arena
entities 12 mobs hostiles Qué tipos usar, uno por generador
count 12 Cuántos poner; 0 no pone ninguno
min_spawn_delay 200 Espera mínima entre tandas, en ticks
max_spawn_delay 600 Espera máxima entre tandas, en ticks
spawn_count 4 Cuántos mobs intenta sacar cada tanda
max_nearby_entities 8 Se frena si ya hay tantos vivos cerca
required_player_range 24 A qué distancia tiene que haber un jugador
spawn_range 6 A cuántos bloques del generador pueden salir

Los ids que no existan se saltean con un aviso en el log, así que podés poner mobs de otros mods sin romper nada si no están instalados.

Los mobs que salen de estos generadores igual pasan por las reglas de mobs y por la dificultad activa: salen escalados y sueltan monedas y bolsas como cualquier otro.

La llave

ultimatemodadditions:coliseum_key se craftea con un lingote de oro, una perla de ender y una pepita de oro en columna. No se puede comprar en el puesto de intercambio: está en la etiqueta ultimatemodadditions:not_purchasable.

Sirve para prender el portal y se gasta al completar las cuatro esquinas. Una llave abre un portal; después el portal queda abierto para siempre, hasta que rompas el marco.

Dificultad

La dimensión tiene una dificultad activa que vale para toda la partida, y la usan todas las reglas de mob que no declaran una propia:

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

Ver Dificultades y Reglas de mobs.

Reconstruirlo

/uma rebuild_arena

Sirve si cambiaste el radio o la altura en la config, o si alguien lo destrozó. Pide permiso 2.

Config del coliseo

En [coliseum]:

Opción Por defecto Qué hace
enabled true Activa la dimensión
build_arena true Construye el anfiteatro al cargar
arena_radius 30 Radio en bloques del piso de arena
arena_floor_y 64 Altura del piso
player_count_scaling 0.25 Cuánto escala por jugador

KubeJS

Si KubeJS está instalado, el mod agrega el binding global UMA. Sólo funciona en los scripts de servidor (kubejs/server_scripts/), porque los datos cargan junto con el datapack. Si lo llamás desde startup_scripts o client_scripts, la entrada se descarta al entrar al mundo y el mod te avisa en el log. Se vuelven a inyectar en cada /reload, así que el orden de carga no es algo de lo que tengas que preocuparte.

La API es de builders encadenados. Cada uno arranca con UMA.<tipo>('id'), le vas pegando métodos, y termina con .register(). Sin .register() no pasa nada.

Los ids sin namespace se resuelven a ultimatemodadditions:.

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

Los cinco builders

Builder Equivale a
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, amplificador, duracion, probabilidad) — una duración de -1 es permanente. equipment(ranura, item, probabilidad, probabilidadDeSoltarlo) — ranuras: mainhand, offhand, head, chest, legs, feet.

UMA.mobRule(id)

UMA.mobRule('nadien_teaks:zombis')
  .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, probabilidad) · coin(denominacion, min, max, probabilidad) · bag(idBolsa, probabilidad).

UMA.lootBag(id)

UMA.lootBag('nadien_teaks:mitica')
  .name('Bolsa mitica')
  .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, peso) o entry(item, min, max, peso). guaranteed(item), guaranteed(item, cantidad) o guaranteed(item, min, max).

UMA.bagDrop(id)

Agrega botín a bolsas que ya existen, sin reescribirlas.

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

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

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

bag(id), bags(...) y tiers(...) se suman. allTiers() es atajo de tiers('all'). replace(true) borra el contenido previo antes de agregar.

UMA.trade(id)

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

result(item) / result(item, cantidad) para objetos, resultBag(id) para bolsas. price es dinero y se paga con cualquier combinación de monedas, con vuelto.

Escapes para casos raros

Cuando un builder no cubre algo, los métodos raw* aceptan un objeto tal cual:

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

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

También siguen los métodos viejos UMA.addLootBag(id, obj), UMA.addTrade(id, obj) y compañía, que reciben el JSON entero. Sirven para portar datapacks tal cual, pero para escribir de cero conviene el builder.

Ejemplos listos para usar

En run/kubejs/ hay un uma_ejemplos.js en cada carpeta, comentado y probado:

  • server_scripts/uma_ejemplos.js — todo lo de UMA: bolsas, adiciones, trades, una dificultad, una regla de mob y una oferta con precio. Usa minecraft:bedrock y minecraft:iron_golem_spawn_egg como items de referencia.
  • startup_scripts/uma_ejemplos.js — explica por qué UMA no va ahí y muestra qué sí: registrar items nuevos con StartupEvents.registry, para después repartirlos con las bolsas de UMA.
  • client_scripts/uma_ejemplos.js — tooltips avisando qué pide cada objeto.

Sin escribir scripts

KubeJS también carga kubejs/data/, así que podés dejar los JSON en kubejs/data/nadien_teaks/uma/mob_rules/… y funciona igual.

Si algo está mal

Los errores de formato salen en el log del servidor con el id de la entrada, y esa entrada se descarta sin romper el resto.


Comandos

/ums es un alias de /uma: todo funciona con los dos nombres.

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

tps

Muestra el rendimiento real del servidor, que casi todos los mods reportan mal:

  • TPS y MSPT medio de los últimos 100 ticks, contra el presupuesto de 50 ms.
  • El peor tick de ese periodo.
  • El MSPT de cada dimensión por separado.

Los colores marcan cuándo va justo (amarillo) o mal (rojo).

ping

Sin argumentos muestra el tuyo. Con un selector, el de todos. Verde por debajo de 100 ms, amarillo hasta 250, rojo por encima.

coliseum

enter te lleva a la arena y guarda de dónde veniste; leave te devuelve ahí.

spawners

list cuenta los generadores del coliseo, place los pone según la config borrando los que haya, y clear los saca todos. place y clear piden permiso 2. Ver Coliseo.

rebuild_arena

Reconstruye el anfiteatro. Sirve si cambiaste el radio o la altura en la config, o si alguien lo destrozó. Pide permiso 2.

difficulty

get muestra la dificultad activa, list las disponibles, set la cambia para toda la partida. Es la que usan las reglas de mob que no declaran una propia. set pide permiso 2.

bag

Entrega bolsas por id. Pide permiso 2.


Configuración

config/ultimatemodadditions-common.toml

Son los interruptores generales. El contenido en sí vive en JSON, no acá.

[coliseum]

Opción Por defecto Qué hace
enabled true Activa la dimensión
build_arena true Construye el anfiteatro la primera vez
arena_radius 30 Radio del piso de arena
arena_floor_y 64 Altura del piso
player_count_scaling 0.25 Escalado extra por jugador

También la dificultad por defecto y si el botín custom sólo aplica dentro del coliseo.

[coliseum.portal]

Opción Por defecto Qué hace
enforce_requirements true Si es false el portal deja pasar a cualquiera
required_experience_levels 100 Niveles de experiencia; no se gastan

Ver Coliseo.

[coliseum.spawners]

Opción Por defecto Qué hace
enabled true Pone generadores al construir la arena
entities 12 mobs hostiles Qué tipos usar, uno por generador
count 12 Cuántos poner; 0 no pone ninguno
min_spawn_delay 200 Espera mínima entre tandas, en ticks
max_spawn_delay 600 Espera máxima entre tandas, en ticks
spawn_count 4 Cuántos mobs intenta sacar cada tanda
max_nearby_entities 8 Se frena si ya hay tantos vivos cerca
required_player_range 24 A qué distancia tiene que haber un jugador
spawn_range 6 A cuántos bloques del generador pueden salir

Ver Coliseo.

[mob_scaling]

Activa el escalado, si sólo aplica dentro del coliseo, multiplicadores globales y tope de vida.

[coins] y [loot_bags]

Activan cada sistema, si sólo funcionan dentro del coliseo, probabilidad y cantidades base, y si sólo cuentan las muertes hechas por un jugador.


Ejemplo completo

Un pack chiquito que toca todo: una dificultad, una regla de mob, una bolsa, una adición a las bolsas que ya existen y una oferta. Todo bajo el namespace nadien_teaks.

Va en config/openloader/data/nadien_teaks/ con OpenLoader, o en world/datapacks/nadien_teaks/data/nadien_teaks/ si preferís un datapack normal.

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/esqueletos_wither.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:premio_jefe", "chance": 0.05 }
  ]
}

uma/loot_bags/premio_jefe.json

{
  "name": "Premio de jefe",
  "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/cobre_en_todas.json

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

uma/trades/premio_jefe.json

{
  "name": "Premio de jefe",
  "category": "bags",
  "sort_order": 90,
  "price": 50000,
  "cost": [ { "item": "minecraft:emerald", "count": 8 } ],
  "result": { "bag": "nadien_teaks:premio_jefe", "count": 1 },
  "enabled": true
}

Lo mismo en KubeJS

Todo lo de arriba en un solo archivo, 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:premio_jefe')
  .name('Premio de jefe')
  .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:esqueletos_wither')
  .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:premio_jefe', 0.05)
  .register()

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

UMA.trade('nadien_teaks:premio_jefe')
  .name('Premio de jefe')
  .category('bags')
  .price(50000)
  .cost('minecraft:emerald', 8)
  .resultBag('nadien_teaks:premio_jefe')
  .sortOrder(90)
  .register()

/reload y listo. Los errores de formato salen en el log del servidor con el id de la entrada, y esa entrada se descarta sin romper el resto.


El sistema de habilidades

Estaba acá y ahora tiene mod propio: Ultimate Skills, un árbol de nodos donde cada nodo, cada conexión, cada bono y cada efecto se define en JSON o KubeJS. Los dos mods son independientes: se instala cualquiera de los dos suelto, o los dos.

Clone this wiki locally