+0

Fabric Datagen



Vamos a dejar en paz los archivos JSON y vamos a ver cómo generar datos de manera procedural con nuestro código.

Fabric Datagen

El Fabric DataGen es una extensión de toda la familia de software de Fabric que nos permite generar data o en este caso los archivos JSON de Minecraft desde nuestro código. Esto permitirá que no haga falta todo el rato escribir la información en el JSON, sino que podemos hacer una función que se encargue de todo ese procedimiento.

Esto lo configuramos a través de Providers y luego con una tarea de Gradle generamos todos los datos.

Providers

En Fabric Datagen tenemos diferentes providers que nos ayudarán a generar estos archivos de datos:

Model Provider

De momento, el único data que hemos usado son los ModelProviders y los LanguageProviders. Podríamos automatizar los LanguageProviders, pero como la vez es un poco repetitivo, nos dará igual usar el archivo JSON o añadirlo en un archivo de Java. Lo vamos a dejar tal cual está.

Añadiremos todo este data de momento de manera manual, pero la idea sería, con esta utilidad del Data Generator, generar estos datos de manera procedural. Así se podría evitar mucho trabajo manual

Muy bien, vamos a empezar por acceder a la clase Data Generator. Ésta en mi caso se encuentra en CursoFabricDataGenerator.

package dev.polv.cursofabric;  
  
import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint;  
import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator;  
  
public class CursoFabricDataGenerator implements DataGeneratorEntrypoint {  
    @Override  
    public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) {  
  
    }  
}

Aquí hemos de crear nuestro ModelProvider y adjuntarlo a un paquete. Empecemos por crear el paquete. Este lo crearemos cogiendo el generator que nos pasan y llamando al método createPack.

FabricDataGenerator.Pack pack = fabricDataGenerator.createPack();

Una vez tengamos nuestro pack, crearemos una clase que extenderá el provider. Yo la voy a llamar DatagenModelProvider, y extenderá FabricModelProvider.

package dev.polv.cursofabric.datagen;  
  
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;  
import net.fabricmc.fabric.api.datagen.v1.provider.FabricModelProvider;  
import net.minecraft.data.client.BlockStateModelGenerator;  
import net.minecraft.data.client.ItemModelGenerator;  
  
public class DatagenModelProvider extends FabricModelProvider {  
      
    public DatagenModelProvider(FabricDataOutput output) {  
        super(output);  
    }  
  
    @Override  
    public void generateBlockStateModels(BlockStateModelGenerator blockStateModelGenerator) {  
  
    }  
  
    @Override  
    public void generateItemModels(ItemModelGenerator itemModelGenerator) {  
  
    }  
}

Modelo del Item

Vamos a empezar por mover el JSON que tenemos del modelo de nuestro ítem de uranio a código.

En el método generateItemModels tendremos que utilizar el ItemModelGenerator para registrar este como un modelo. Como es un modelo simple y básico, utilizaremos un modelo predeterminado llamado generated (básicamente el mismo que estaba en el JSON).

itemModelGenerator.register(ModItems.URANIUM, Models.GENERATED);
itemModelGenerator.register(ModBlocks.URANIUM_BLOCK, Models.GENERATED);

Y ya estaría. Ahora podemos eliminar el JSON del modelo que hemos creado anteriormente.

Modelo del Bloque

Para configurar el modelo de bloque desde nuestro código, utilicemos la función generateBlockStateModels y utilizaremos el BlockStateModelGenerator para generar nuestro modelo de bloque. Podemos hacer lo mismo, ir a los modelos de bloque anteriores, comprobar el tipo de modelo y ponerlo ahí mismo.

blockStateModelGenerator.registerSimpleCubeAll(ModBlocks.URANIUM_BLOCK);

Registrar provider

Para terminar, nada más quedaría registrar el provider en nuestra clase FabricDataGen. Para eso utilizaremos el pack que hemos creado y le añadiríamos el provider como una nueva instancia.

pack.addProvider(DatagenModelProvider::new);

Generar los datos

Una vez tengamos todo listo, podemos correr la tarea de Gradle Run DataGen. Y veremos que nos aparecerá una nueva carpeta llamada generated con los modelos ahí dentro.

Si ahora ejecutásemos el juego, veríamos que sigue todo igual y sin tanto archivo JSON.