Skip to content

Commit

Permalink
Crafting Predicate
Browse files Browse the repository at this point in the history
ReclipseTheOne committed Jan 10, 2025
1 parent b74e39e commit c965193
Showing 6 changed files with 107 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -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 <T extends Recipe<?>> (RecipeHolder<T> recipe) implements ResearchPredicate {
@Override
public void onUnlock(Level level, Player player, ResourceKey<Research> 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<CraftingPredicate> {
public static final Serializer INSTANCE = new Serializer();
public static final MapCodec<CraftingPredicate> CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group(
Codecs.RECIPE_HOLDER_CODEC.fieldOf("recipe").forGetter(CraftingPredicate::recipe)
).apply(instance, CraftingPredicate::new));

private Serializer() {
}

@Override
public MapCodec<CraftingPredicate> codec() {
return CODEC;
}

@Override
public StreamCodec<RegistryFriendlyByteBuf, CraftingPredicate> streamCodec() {
return null;
}
}
}
Original file line number Diff line number Diff line change
@@ -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<RecipeHolder<?>> blockedRecipes) {
public static final CraftingPredicateData EMPTY = new CraftingPredicateData(Collections.emptySet());
public static final Codec<CraftingPredicateData> CODEC = CodecUtils.set(Codecs.RECIPE_HOLDER_CODEC).xmap(CraftingPredicateData::new, CraftingPredicateData::blockedRecipes);

public CraftingPredicateData addBlockedRecipe(RecipeHolder<?> recipe) {
Set<RecipeHolder<?>> recipes = new HashSet<>(this.blockedRecipes());
recipes.add(recipe);
return new CraftingPredicateData(recipes);
}

public CraftingPredicateData removeBlockedRecipe(RecipeHolder<?> recipe) {
Set<RecipeHolder<?>> recipes = new HashSet<>(this.blockedRecipes());
recipes.remove(recipe);
return new CraftingPredicateData(recipes);
}
}
Original file line number Diff line number Diff line change
@@ -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<AttachmentType<DimensionPredicateData>> DIMENSION_PREDICATE = ATTACHMENTS.register("dimension_predicate",
() -> AttachmentType.builder(() -> DimensionPredicateData.EMPTY).serialize(DimensionPredicateData.CODEC).build());

public static final Supplier<AttachmentType<CraftingPredicateData>> CRAFTING_PREDICATE = ATTACHMENTS.register("crafting_predicate",
() -> AttachmentType.builder(() -> CraftingPredicateData.EMPTY).serialize(CraftingPredicateData.CODEC).build());
}
Original file line number Diff line number Diff line change
@@ -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;
Original file line number Diff line number Diff line change
@@ -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);
}
}
15 changes: 15 additions & 0 deletions src/main/java/com/portingdeadmods/researchd/utils/Codecs.java
Original file line number Diff line number Diff line change
@@ -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<RecipeHolder<?>> 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));
}

0 comments on commit c965193

Please sign in to comment.