Vamos a ver qué son las Loot Tables en Minecraft y cómo modificarlas en nuestro mod.
Loot Tables
Una loop table no deja de ser una tabla que contiene unos porcentajes o probabilidades de que aparezca "loot", el mismo nombre lo dice.
De momento, nuestro bloque, cuando lo picamos, nos suelta el ítem. ¿Por qué? Porque no tiene una LOOT TABLE asignada. Necesitaríamos asignar una LOOT TABLE que, cuando el bloque sea roto, lo dropee.
Además, aprovecharemos que tenemos un ítem radioactivo para hacer que cuando matemos un creeper suelte este ítem radioactivo, con cierta probabilidad.
Loot Table Provider
Esto normalmente lo tendríamos que hacer con archivos JSON, pero aprovechando que tenemos nuestro datagen, aprovecharemos y crearemos un provider que se encargue de las loot tables.
Si quieres aprender cómo usar loot tables con archivos JSON, hay muchos tutoriales, sobre todo relacionados con datapacks, que no tienen nada que ver con Fabric, sobre cómo hacerlo.
Empezaremos creando una clase dedicada a las loot tables y extenderemos Fabric Block loot tables Provider.
Ojo, hay que asegurarse de que el constructor es público, no un protected como viene por defecto.
Ahora lo que haremos es registrarlo en nuestra clase DataGen.
Loot Table Bloque
Nuestro provider viene con un montón de funciones de utilidad que nos ayudarán a crear nuestras loot table. Para crear la loot table del bloque que dropea el ítem cuando sea roto, tenemos un método de utilidad llamado addDrop.
Hay un montón de métodos útiles que recomiendo que miréis desde la documentación o descubráis por vuestra cuenta probando.
Loot Table Creeper
El Creeper es una entidad que ya está creada por Minecraft, que significa que nosotros no podemos añadir datos desde el Provider si no los tenemos que modificar. Esto por suerte lo podemos hacer a través de un evento de Fabric.
Primero de todo necesitaremos encontrar la Loot Table que queremos modificar, en este caso lo encontraremos en la LUT Table del Creeper, que esta se encuentra dentro del Jar de Minecraft, en Data, Minecraft, Loot Tables, Entities y Creeper.json.
Si analizamos un poco el JSON, lo que hemos de hacer es poner otro ítem más en el pool que sea nuestro uranio. Esto lo haremos con el evento LootTableEvents.MODIFY
.
Ojo, este listener o hook del evento ha de ir o en la clase principal o en una clase que se cargue cuando se inicie el juego, no en la clase del datagen.
Si nos fijamos, primero de todo estamos comparando que la loop table que queremos modificar es la que realmente queremos modificar. Si lo es, creamos un nuevo pool en el cual añadimos nuestro ítem con una probabilidad del 0.5 y lo aplicamos al table que ya teníamos. Así estamos efectivamente añadiendo un nuevo drop al creeper.
Generar Datos y Probar
Muy bien, una vez tenemos esto hecho, solo queda correr la tarea de Gradle, run datagen para generar nuestros archivos con los datos y ejecutar el juego.