From 8ccd5a560c565c98406ba59e5b14a6a1b6b09a21 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sat, 17 Jun 2023 10:37:19 +0100 Subject: [PATCH] Add support for codecs to our data generator system This already exists in both upstream loaders, we just need to abstract over it. --- .../computercraft/data/DataProviders.java | 8 +++++- .../shared/container/BasicContainer.java | 19 -------------- .../data/FabricDataGenerators.java | 25 +++++++++++++++++++ .../dan200/computercraft/data/Generators.java | 17 +++++++++++++ 4 files changed, 49 insertions(+), 20 deletions(-) diff --git a/projects/common/src/main/java/dan200/computercraft/data/DataProviders.java b/projects/common/src/main/java/dan200/computercraft/data/DataProviders.java index 5f4223f8e..a4abd7c8f 100644 --- a/projects/common/src/main/java/dan200/computercraft/data/DataProviders.java +++ b/projects/common/src/main/java/dan200/computercraft/data/DataProviders.java @@ -4,16 +4,20 @@ package dan200.computercraft.data; +import com.mojang.serialization.Codec; import net.minecraft.data.DataProvider; import net.minecraft.data.PackOutput; import net.minecraft.data.loot.LootTableProvider.SubProviderEntry; import net.minecraft.data.models.BlockModelGenerators; import net.minecraft.data.models.ItemModelGenerators; import net.minecraft.data.tags.TagsProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.PackType; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import java.util.List; +import java.util.function.BiConsumer; import java.util.function.Consumer; /** @@ -39,9 +43,11 @@ public static void add(GeneratorSink generator) { generator.add(out -> new LanguageProvider(out, turtleUpgrades, pocketUpgrades)); } - interface GeneratorSink { + public interface GeneratorSink { T add(DataProvider.Factory factory); + void addFromCodec(String name, PackType type, String directory, Codec codec, Consumer> output); + void lootTable(List tables); TagsProvider blockTags(Consumer> tags); diff --git a/projects/common/src/main/java/dan200/computercraft/shared/container/BasicContainer.java b/projects/common/src/main/java/dan200/computercraft/shared/container/BasicContainer.java index 5b63e827a..6680725da 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/container/BasicContainer.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/container/BasicContainer.java @@ -7,7 +7,6 @@ import net.minecraft.core.NonNullList; import net.minecraft.world.Container; import net.minecraft.world.ContainerHelper; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; /** @@ -16,24 +15,6 @@ public interface BasicContainer extends Container { NonNullList getContents(); - @Override - default int getMaxStackSize() { - return 64; - } - - @Override - default void startOpen(Player player) { - } - - @Override - default void stopOpen(Player player) { - } - - @Override - default boolean canPlaceItem(int slot, ItemStack stack) { - return true; - } - @Override default int getContainerSize() { return getContents().size(); diff --git a/projects/fabric/src/main/java/dan200/computercraft/data/FabricDataGenerators.java b/projects/fabric/src/main/java/dan200/computercraft/data/FabricDataGenerators.java index 40e5135a8..8c9340bca 100644 --- a/projects/fabric/src/main/java/dan200/computercraft/data/FabricDataGenerators.java +++ b/projects/fabric/src/main/java/dan200/computercraft/data/FabricDataGenerators.java @@ -4,21 +4,25 @@ package dan200.computercraft.data; +import com.mojang.serialization.Codec; import dan200.computercraft.shared.platform.RegistryWrappers; import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint; import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricCodecDataProvider; import net.fabricmc.fabric.api.datagen.v1.provider.FabricModelProvider; import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider; import net.fabricmc.fabric.api.datagen.v1.provider.SimpleFabricLootTableProvider; import net.minecraft.core.HolderLookup; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataProvider; +import net.minecraft.data.PackOutput; import net.minecraft.data.loot.LootTableProvider; import net.minecraft.data.models.BlockModelGenerators; import net.minecraft.data.models.ItemModelGenerators; import net.minecraft.data.tags.TagsProvider; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.PackType; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; @@ -43,6 +47,27 @@ public T add(DataProvider.Factory factory) { return generator.addProvider(factory); } + @Override + public void addFromCodec(String name, PackType type, String directory, Codec codec, Consumer> output) { + generator.addProvider((FabricDataOutput out) -> { + var ourType = switch (type) { + case SERVER_DATA -> PackOutput.Target.DATA_PACK; + case CLIENT_RESOURCES -> PackOutput.Target.RESOURCE_PACK; + }; + return new FabricCodecDataProvider(out, ourType, directory, codec) { + @Override + public String getName() { + return name; + } + + @Override + protected void configure(BiConsumer provider) { + output.accept(provider); + } + }; + }); + } + @Override public void lootTable(List tables) { for (var table : tables) { diff --git a/projects/forge/src/main/java/dan200/computercraft/data/Generators.java b/projects/forge/src/main/java/dan200/computercraft/data/Generators.java index 840ae1acd..2ddaf757d 100644 --- a/projects/forge/src/main/java/dan200/computercraft/data/Generators.java +++ b/projects/forge/src/main/java/dan200/computercraft/data/Generators.java @@ -4,6 +4,8 @@ package dan200.computercraft.data; +import com.mojang.serialization.Codec; +import com.mojang.serialization.JsonOps; import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.shared.platform.RegistryWrappers; import net.minecraft.core.HolderLookup; @@ -14,18 +16,24 @@ import net.minecraft.data.models.ItemModelGenerators; import net.minecraft.data.tags.ItemTagsProvider; import net.minecraft.data.tags.TagsProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.PackType; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraftforge.common.data.BlockTagsProvider; import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.common.data.JsonCodecProvider; import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.concurrent.CompletableFuture; +import java.util.function.BiConsumer; import java.util.function.Consumer; @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) @@ -46,6 +54,15 @@ public T add(DataProvider.Factory factory) { return generator.addProvider(factory); } + @Override + public void addFromCodec(String name, PackType type, String directory, Codec codec, Consumer> output) { + generator.addProvider(out -> { + Map map = new HashMap<>(); + output.accept(map::put); + return new JsonCodecProvider<>(out, existingFiles, ComputerCraftAPI.MOD_ID, JsonOps.INSTANCE, type, directory, codec, map); + }); + } + @Override public void lootTable(List tables) { add(out -> new LootTableProvider(out, Set.of(), tables));