From 1922c02f5bf21fc3589d72c0f63d8df84f0f7e8a Mon Sep 17 00:00:00 2001 From: Sollace Date: Tue, 19 Mar 2024 22:25:29 +0000 Subject: [PATCH] Fix incorrectly-generated seasons models --- .../unicopia/datagen/DataCollector.java | 38 +++++++++++++++++++ .../providers/SeasonsModelGenerator.java | 25 ++++++++++-- .../providers/UBlockStateModelGenerator.java | 9 ----- .../datagen/providers/UModelProvider.java | 17 ++++++++- 4 files changed, 75 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/datagen/DataCollector.java diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/DataCollector.java b/src/main/java/com/minelittlepony/unicopia/datagen/DataCollector.java new file mode 100644 index 00000000..46b27642 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/datagen/DataCollector.java @@ -0,0 +1,38 @@ +package com.minelittlepony.unicopia.datagen; + +import java.util.HashMap; +import java.util.concurrent.CompletableFuture; +import java.util.function.BiConsumer; +import java.util.function.Supplier; + +import com.google.common.base.Preconditions; +import com.google.gson.JsonElement; + +import net.minecraft.data.DataOutput.PathResolver; +import net.minecraft.data.DataProvider; +import net.minecraft.data.DataWriter; +import net.minecraft.util.Identifier; + +public class DataCollector { + private final HashMap> values = new HashMap<>(); + + private final PathResolver resolver; + + public DataCollector(PathResolver resolver) { + this.resolver = resolver; + } + + public BiConsumer> prime() { + values.clear(); + return (Identifier id, Supplier value) -> + Preconditions.checkState(values.put(id, value) == null, "Duplicate model definition for " + id); + } + + public CompletableFuture upload(DataWriter cache) { + return CompletableFuture.allOf(values.entrySet() + .stream() + .map(entry -> DataProvider.writeToPath(cache, entry.getValue().get(), resolver.resolveJson(entry.getKey()))) + .toArray(CompletableFuture[]::new) + ); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/SeasonsModelGenerator.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/SeasonsModelGenerator.java index d1adf6a1..5b5474bc 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/SeasonsModelGenerator.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/SeasonsModelGenerator.java @@ -1,17 +1,24 @@ package com.minelittlepony.unicopia.datagen.providers; +import java.util.function.BiConsumer; +import java.util.function.Supplier; + +import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.minelittlepony.unicopia.block.UBlocks; +import com.minelittlepony.unicopia.item.UItems; import net.minecraft.data.client.BlockStateModelGenerator; import net.minecraft.util.Identifier; -class SeasonsModelGenerator { +public class SeasonsModelGenerator extends UBlockStateModelGenerator { + private static final String[] SEASONS = { "fall", "summer", "winter" }; - static UBlockStateModelGenerator create(BlockStateModelGenerator modelGenerator) { - return new UBlockStateModelGenerator(modelGenerator.blockStateCollector, (id, jsonSupplier) -> { + public SeasonsModelGenerator(BlockStateModelGenerator modelGenerator, BiConsumer> seasonsModelConsumer) { + super(modelGenerator.blockStateCollector, (id, jsonSupplier) -> { modelGenerator.modelCollector.accept(id, jsonSupplier); - modelGenerator.modelCollector.accept(id.withPrefixedPath("seasons/"), () -> { + seasonsModelConsumer.accept(id, () -> { JsonObject textures = jsonSupplier.get().getAsJsonObject().getAsJsonObject("textures"); JsonObject seasonTextures = new JsonObject(); for (String season : SEASONS) { @@ -31,4 +38,14 @@ class SeasonsModelGenerator { }); return textures; } + + @Override + public void register() { + registerWithStages(UBlocks.OATS, UBlocks.OATS.getAgeProperty(), BlockModels.CROP, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); + registerWithStages(UBlocks.OATS_STEM, UBlocks.OATS_STEM.getAgeProperty(), BlockModels.CROP, 0, 1, 2, 3, 4, 5, 6); + registerWithStages(UBlocks.OATS_CROWN, UBlocks.OATS_CROWN.getAgeProperty(), BlockModels.CROP, 0, 1); + + registerItemModel(UItems.OATS); + registerItemModel(UItems.OAT_SEEDS); + } } diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/UBlockStateModelGenerator.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/UBlockStateModelGenerator.java index e31252fb..eaceb1c5 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/UBlockStateModelGenerator.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/UBlockStateModelGenerator.java @@ -16,7 +16,6 @@ import com.minelittlepony.unicopia.block.ShellsBlock; import com.minelittlepony.unicopia.block.SlimePustuleBlock; import com.minelittlepony.unicopia.block.UBlocks; import com.minelittlepony.unicopia.block.zap.ZapAppleLeavesBlock; -import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.server.world.Tree; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; @@ -81,8 +80,6 @@ public class UBlockStateModelGenerator extends BlockStateModelGenerator { @Override public void register() { - UBlockStateModelGenerator seasonsModelGenerator = SeasonsModelGenerator.create(this); - for (int i = 0; i < Models.STEM_GROWTH_STAGES.length; i++) { Models.STEM_GROWTH_STAGES[i].upload(Unicopia.id("block/apple_sprout_stage" + i), TextureMap.stem(Blocks.MELON_STEM), modelCollector); } @@ -161,12 +158,6 @@ public class UBlockStateModelGenerator extends BlockStateModelGenerator { Tree.REGISTRY.stream().filter(tree -> tree.sapling().isPresent()).forEach(tree -> registerFlowerPotPlant(tree.sapling().get(), tree.pot().get(), TintType.NOT_TINTED)); registerTintableCross(UBlocks.CURING_JOKE, TintType.NOT_TINTED); registerWithStages(UBlocks.GOLD_ROOT, Properties.AGE_7, BlockModels.CROP, 0, 0, 1, 1, 2, 2, 2, 3); - seasonsModelGenerator.registerWithStages(UBlocks.OATS, UBlocks.OATS.getAgeProperty(), BlockModels.CROP, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); - seasonsModelGenerator.registerWithStages(UBlocks.OATS_STEM, UBlocks.OATS_STEM.getAgeProperty(), BlockModels.CROP, 0, 1, 2, 3, 4, 5, 6); - seasonsModelGenerator.registerWithStages(UBlocks.OATS_CROWN, UBlocks.OATS_CROWN.getAgeProperty(), BlockModels.CROP, 0, 1); - - seasonsModelGenerator.registerItemModel(UItems.OATS); - seasonsModelGenerator.registerItemModel(UItems.OAT_SEEDS); registerTallCrop(UBlocks.PINEAPPLE, Properties.AGE_7, Properties.BLOCK_HALF, new int[] { 0, 1, 2, 3, 4, 5, 5, 6 }, diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/UModelProvider.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/UModelProvider.java index 2d82fdff..64bbc4be 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/UModelProvider.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/UModelProvider.java @@ -2,14 +2,17 @@ package com.minelittlepony.unicopia.datagen.providers; import java.util.List; import java.util.Map; - +import java.util.concurrent.CompletableFuture; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.block.UBlocks; +import com.minelittlepony.unicopia.datagen.DataCollector; import com.minelittlepony.unicopia.item.BedsheetsItem; import com.minelittlepony.unicopia.item.UItems; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.datagen.v1.provider.FabricModelProvider; import net.minecraft.block.Block; +import net.minecraft.data.DataOutput; +import net.minecraft.data.DataWriter; import net.minecraft.data.client.BlockStateModelGenerator; import net.minecraft.item.Item; import net.minecraft.item.Items; @@ -29,13 +32,25 @@ public class UModelProvider extends FabricModelProvider { UBlocks.ZAP_BULB, UItems.ZAP_BULB ); + private final DataCollector seasonsModels; + public UModelProvider(FabricDataOutput output) { super(output); + seasonsModels = new DataCollector(output.getResolver(DataOutput.OutputType.RESOURCE_PACK, "seasons/models")); } @Override public void generateBlockStateModels(BlockStateModelGenerator modelGenerator0) { UBlockStateModelGenerator.create(modelGenerator0).register(); + new SeasonsModelGenerator(modelGenerator0, seasonsModels.prime()).register(); + } + + @Override + public CompletableFuture run(DataWriter writer) { + return CompletableFuture.allOf( + super.run(writer), + seasonsModels.upload(writer) + ); } @Override