From c9651932a4856e7e4fa4759bd924bcaf72059a84 Mon Sep 17 00:00:00 2001 From: Reclipse <17797013+ReclipseTheOne@users.noreply.github.com> Date: Sat, 11 Jan 2025 00:06:51 +0200 Subject: [PATCH] Crafting Predicate --- .../content/predicates/CraftingPredicate.java | 54 +++++++++++++++++++ .../predicates/CraftingPredicateData.java | 33 ++++++++++++ .../researchd/data/ResearchdAttachments.java | 3 ++ .../researchd/data/helper/ResearchTeam.java | 1 - .../ResearchPredicateSerializers.java | 2 + .../researchd/utils/Codecs.java | 15 ++++++ 6 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/portingdeadmods/researchd/content/predicates/CraftingPredicate.java create mode 100644 src/main/java/com/portingdeadmods/researchd/content/predicates/CraftingPredicateData.java create mode 100644 src/main/java/com/portingdeadmods/researchd/utils/Codecs.java diff --git a/src/main/java/com/portingdeadmods/researchd/content/predicates/CraftingPredicate.java b/src/main/java/com/portingdeadmods/researchd/content/predicates/CraftingPredicate.java new file mode 100644 index 0000000..c0b09c4 --- /dev/null +++ b/src/main/java/com/portingdeadmods/researchd/content/predicates/CraftingPredicate.java @@ -0,0 +1,54 @@ +package com.portingdeadmods.researchd.content.predicates; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import com.portingdeadmods.researchd.api.research.Research; +import com.portingdeadmods.researchd.api.research.ResearchPredicate; +import com.portingdeadmods.researchd.api.research.serializers.ResearchPredicateSerializer; +import com.portingdeadmods.researchd.data.ResearchdAttachments; +import com.portingdeadmods.researchd.utils.Codecs; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.dimension.DimensionType; + +public record CraftingPredicate > (RecipeHolder recipe) implements ResearchPredicate { + @Override + public void onUnlock(Level level, Player player, ResourceKey research) { + CraftingPredicateData data = player.getData(ResearchdAttachments.CRAFTING_PREDICATE.get()); + player.setData(ResearchdAttachments.CRAFTING_PREDICATE.get(), data.removeBlockedRecipe(this.recipe)); + } + + @Override + public ResearchPredicateSerializer getSerializer() { + return Serializer.INSTANCE; + } + + public static final class Serializer implements ResearchPredicateSerializer { + public static final Serializer INSTANCE = new Serializer(); + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Codecs.RECIPE_HOLDER_CODEC.fieldOf("recipe").forGetter(CraftingPredicate::recipe) + ).apply(instance, CraftingPredicate::new)); + + private Serializer() { + } + + @Override + public MapCodec codec() { + return CODEC; + } + + @Override + public StreamCodec streamCodec() { + return null; + } + } +} diff --git a/src/main/java/com/portingdeadmods/researchd/content/predicates/CraftingPredicateData.java b/src/main/java/com/portingdeadmods/researchd/content/predicates/CraftingPredicateData.java new file mode 100644 index 0000000..a0d2697 --- /dev/null +++ b/src/main/java/com/portingdeadmods/researchd/content/predicates/CraftingPredicateData.java @@ -0,0 +1,33 @@ +package com.portingdeadmods.researchd.content.predicates; + +import com.mojang.serialization.Codec; +import com.portingdeadmods.portingdeadlibs.utils.codec.CodecUtils; +import com.portingdeadmods.researchd.utils.Codecs; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.dimension.DimensionType; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +public record CraftingPredicateData (Set> blockedRecipes) { + public static final CraftingPredicateData EMPTY = new CraftingPredicateData(Collections.emptySet()); + public static final Codec CODEC = CodecUtils.set(Codecs.RECIPE_HOLDER_CODEC).xmap(CraftingPredicateData::new, CraftingPredicateData::blockedRecipes); + + public CraftingPredicateData addBlockedRecipe(RecipeHolder recipe) { + Set> recipes = new HashSet<>(this.blockedRecipes()); + recipes.add(recipe); + return new CraftingPredicateData(recipes); + } + + public CraftingPredicateData removeBlockedRecipe(RecipeHolder recipe) { + Set> recipes = new HashSet<>(this.blockedRecipes()); + recipes.remove(recipe); + return new CraftingPredicateData(recipes); + } +} diff --git a/src/main/java/com/portingdeadmods/researchd/data/ResearchdAttachments.java b/src/main/java/com/portingdeadmods/researchd/data/ResearchdAttachments.java index d201931..c79a970 100644 --- a/src/main/java/com/portingdeadmods/researchd/data/ResearchdAttachments.java +++ b/src/main/java/com/portingdeadmods/researchd/data/ResearchdAttachments.java @@ -1,6 +1,7 @@ package com.portingdeadmods.researchd.data; import com.portingdeadmods.researchd.Researchd; +import com.portingdeadmods.researchd.content.predicates.CraftingPredicateData; import com.portingdeadmods.researchd.content.predicates.DimensionPredicate; import com.portingdeadmods.researchd.content.predicates.DimensionPredicateData; import com.portingdeadmods.researchd.impl.capabilities.EntityResearchImpl; @@ -19,4 +20,6 @@ public final class ResearchdAttachments { public static final Supplier> DIMENSION_PREDICATE = ATTACHMENTS.register("dimension_predicate", () -> AttachmentType.builder(() -> DimensionPredicateData.EMPTY).serialize(DimensionPredicateData.CODEC).build()); + public static final Supplier> CRAFTING_PREDICATE = ATTACHMENTS.register("crafting_predicate", + () -> AttachmentType.builder(() -> CraftingPredicateData.EMPTY).serialize(CraftingPredicateData.CODEC).build()); } diff --git a/src/main/java/com/portingdeadmods/researchd/data/helper/ResearchTeam.java b/src/main/java/com/portingdeadmods/researchd/data/helper/ResearchTeam.java index 894c121..afbc6ac 100644 --- a/src/main/java/com/portingdeadmods/researchd/data/helper/ResearchTeam.java +++ b/src/main/java/com/portingdeadmods/researchd/data/helper/ResearchTeam.java @@ -3,7 +3,6 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.UUIDUtil; -import net.minecraft.server.MinecraftServer; import java.util.List; import java.util.UUID; diff --git a/src/main/java/com/portingdeadmods/researchd/registries/serializers/ResearchPredicateSerializers.java b/src/main/java/com/portingdeadmods/researchd/registries/serializers/ResearchPredicateSerializers.java index 430708e..d1d013a 100644 --- a/src/main/java/com/portingdeadmods/researchd/registries/serializers/ResearchPredicateSerializers.java +++ b/src/main/java/com/portingdeadmods/researchd/registries/serializers/ResearchPredicateSerializers.java @@ -3,6 +3,7 @@ import com.portingdeadmods.researchd.ResearchdRegistries; import com.portingdeadmods.researchd.Researchd; import com.portingdeadmods.researchd.api.research.serializers.ResearchPredicateSerializer; +import com.portingdeadmods.researchd.content.predicates.CraftingPredicate; import com.portingdeadmods.researchd.content.predicates.DimensionPredicate; import net.neoforged.neoforge.registries.DeferredRegister; @@ -11,5 +12,6 @@ public final class ResearchPredicateSerializers { static { SERIALIZERS.register("dimension_predicate", () -> DimensionPredicate.Serializer.INSTANCE); + SERIALIZERS.register("crafting_predicate", () -> CraftingPredicate.Serializer.INSTANCE); } } diff --git a/src/main/java/com/portingdeadmods/researchd/utils/Codecs.java b/src/main/java/com/portingdeadmods/researchd/utils/Codecs.java new file mode 100644 index 0000000..46de933 --- /dev/null +++ b/src/main/java/com/portingdeadmods/researchd/utils/Codecs.java @@ -0,0 +1,15 @@ +package com.portingdeadmods.researchd.utils; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeHolder; + +public class Codecs { + // TODO: Place this into PDL + public static final Codec> RECIPE_HOLDER_CODEC = RecordCodecBuilder.create(instance -> instance.group ( + ResourceLocation.CODEC.fieldOf("id").forGetter(RecipeHolder::id), + Recipe.CODEC.fieldOf("recipe").forGetter(RecipeHolder::value) + ).apply(instance, RecipeHolder::new)); +}