00
:
00
:
00
:
00
Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

Data Generation (JSON)

Perché DataGen?

Invece di creare a mano centinaia di file JSON (blockstates, models/item, recipes, loot_tables), possiamo scriverli in Java. Quando eseguiamo il task runDatagen, Fabric genera i file JSON perfetti per noi. Meno errori, meno noia.

Configurazione (fabric.mod.json)

Assicurati di avere l’entrypoint fabric-datagen:

```json “entrypoints”: { “main”: […], “fabric-datagen”: [ “com.example.ExampleModDataGenerator” ] } ```

La classe DataGenerator

```java public class ExampleModDataGenerator implements DataGeneratorEntrypoint { @Override public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { FabricDataGenerator.Pack pack = fabricDataGenerator.createPack();

	pack.addProvider(ModModelProvider::new);
	pack.addProvider(ModRecipeProvider::new);
	pack.addProvider(ModLootTableProvider::new);
}

} ```

1. Generare Modelli (Blockstates & Items)

```java public class ModModelProvider extends FabricModelProvider { // … costruttore …

@Override
public void generateBlockStateModels(BlockStateModelGenerator generator) {
    // Genera blockstate e modello item per un cubo semplice
    generator.registerSimpleCubeAll(ModBlocks.RUBY_BLOCK);
}

@Override
public void generateItemModels(ItemModelGenerator generator) {
    // Genera modello item standard (flat)
    generator.register(ModItems.RAW_RUBY, Models.GENERATED);
}

} ```

2. Generare Ricette

```java public class ModRecipeProvider extends FabricRecipeProvider { // … costruttore …

@Override
public void generate(Consumer<RecipeJsonProvider> exporter) {
    // Shapeless Recipe (Ruby Block -> 9 Rubies)
    ShapelessRecipeJsonBuilder.create(RecipeCategory.MISC, ModItems.RAW_RUBY, 9)
            .input(ModBlocks.RUBY_BLOCK)
            .criterion(FabricRecipeProvider.hasItem(ModBlocks.RUBY_BLOCK),
                    FabricRecipeProvider.conditionsFromItem(ModBlocks.RUBY_BLOCK))
            .offerTo(exporter);

    // Smelting
    offerSmelting(exporter, List.of(ModItems.RAW_RUBY), RecipeCategory.MISC, ModItems.RUBY_INGOT, 0.7f, 200, "ruby_ingot");
}

} ```

Eseguire DataGen

Apri il pannello Gradle -> Tasks -> fabric -> runDatagen. I file verranno generati in src/main/generated. Importante: Aggiungi questa cartella al tuo .gitignore, ma assicurati che venga inclusa nel resources set del build.gradle, altrimenti la mod compilata non avrà le texture!

In build.gradle:

```groovy sourceSets { main { resources { srcDirs += [ ‘src/main/generated’ ] } } } ```

3. Generare Loot Tables

```java public class ModLootTableProvider extends FabricBlockLootTableProvider { // … costruttore …

@Override
public void generate() {
    // Drop se stesso quando rotto
    addDrop(ModBlocks.RUBY_BLOCK);

    // Drop custom (es. minerale che droppa item grezzo)
    addDrop(ModBlocks.RUBY_ORE, oreDrops(ModBlocks.RUBY_ORE, ModItems.RAW_RUBY));

    // Drop con Fortune
    addDrop(ModBlocks.DEEPSLATE_RUBY_ORE, 
        oreDrops(ModBlocks.DEEPSLATE_RUBY_ORE, ModItems.RAW_RUBY));
}

} ```

Per loot tables più complesse (con condizioni, multiple pool, ecc.), puoi usare LootTable.Builder:

```java addDrop(ModBlocks.CUSTOM_BLOCK, LootTable.builder() .pool(LootPool.builder() .rolls(ConstantLootNumberProvider.create(1)) .with(ItemEntry.builder(ModItems.RARE_ITEM) .conditionally(RandomChanceLootCondition.builder(0.1f))) .with(ItemEntry.builder(ModItems.COMMON_ITEM)) ) ); ```

Best Practices

  • Organizza i provider: Crea provider separati per modelli, ricette, loot tables, tag, ecc.
  • Usa costanti: Definisci i tuoi blocchi/item in classi statiche (ModBlocks, ModItems) per evitare errori di battitura
  • Testa sempre: Dopo aver eseguito runDatagen, controlla i file generati in src/main/generated per verificare che siano corretti
  • Versiona i file generati: Anche se sono auto-generati, è buona pratica includerli nel repository per facilitare la collaborazione

Conclusione

Il Data Generation di Fabric elimina la necessità di scrivere manualmente centinaia di file JSON, riducendo drasticamente gli errori e velocizzando lo sviluppo. Una volta configurato, basta eseguire runDatagen ogni volta che aggiungi nuovi blocchi o item, e i file JSON saranno pronti all’uso.