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 insrc/main/generatedper 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.