Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 11 additions & 12 deletions src/main/java/twilightforest/init/TFRecipes.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import net.minecraft.core.registries.Registries;
import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.item.crafting.SimpleCraftingRecipeSerializer;
import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.registries.DeferredRegister;
import twilightforest.TwilightForestMod;
Expand All @@ -17,19 +16,19 @@ public class TFRecipes {
public static final DeferredRegister<RecipeSerializer<?>> RECIPE_SERIALIZERS = DeferredRegister.create(Registries.RECIPE_SERIALIZER, TwilightForestMod.ID);
public static final DeferredRegister<RecipeType<?>> RECIPE_TYPES = DeferredRegister.create(Registries.RECIPE_TYPE, TwilightForestMod.ID);

public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<CasketRepairRecipe>> CASKET_REPAIR_RECIPE = RECIPE_SERIALIZERS.register("casket_repair_recipe", () -> new SimpleCraftingRecipeSerializer<>(CasketRepairRecipe::new));
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<EmperorsClothRecipe>> EMPERORS_CLOTH_RECIPE = RECIPE_SERIALIZERS.register("emperors_cloth_recipe", () -> new SimpleCraftingRecipeSerializer<>(EmperorsClothRecipe::new));
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<EssenceRepairRecipe>> ESSENCE_REPAIR_RECIPE = RECIPE_SERIALIZERS.register("essence_repair_recipe", () -> new SimpleCraftingRecipeSerializer<>(EssenceRepairRecipe::new));
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<MagicMapCloningRecipe>> MAGIC_MAP_CLONING_RECIPE = RECIPE_SERIALIZERS.register("magic_map_cloning_recipe", () -> new SimpleCraftingRecipeSerializer<>(MagicMapCloningRecipe::new));
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<MazeMapCloningRecipe>> MAZE_MAP_CLONING_RECIPE = RECIPE_SERIALIZERS.register("maze_map_cloning_recipe", () -> new SimpleCraftingRecipeSerializer<>(MazeMapCloningRecipe::new));
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<MoonwormQueenRepairRecipe>> MOONWORM_QUEEN_REPAIR_RECIPE = RECIPE_SERIALIZERS.register("moonworm_queen_repair_recipe", () -> new SimpleCraftingRecipeSerializer<>(MoonwormQueenRepairRecipe::new));
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<ScepterRepairRecipe>> SCEPTER_REPAIR_RECIPE = RECIPE_SERIALIZERS.register("scepter_repair", ScepterRepairRecipe.Serializer::new);
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<UncraftingRecipe>> UNCRAFTING_SERIALIZER = RECIPE_SERIALIZERS.register("uncrafting", UncraftingRecipe.Serializer::new);
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<CasketRepairRecipe>> CASKET_REPAIR_RECIPE = RECIPE_SERIALIZERS.register("casket_repair_recipe", () -> CasketRepairRecipe.SERIALIZER);
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<EmperorsClothRecipe>> EMPERORS_CLOTH_RECIPE = RECIPE_SERIALIZERS.register("emperors_cloth_recipe", () -> EmperorsClothRecipe.SERIALIZER);
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<EssenceRepairRecipe>> ESSENCE_REPAIR_RECIPE = RECIPE_SERIALIZERS.register("essence_repair_recipe", () -> EssenceRepairRecipe.SERIALIZER);
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<MagicMapCloningRecipe>> MAGIC_MAP_CLONING_RECIPE = RECIPE_SERIALIZERS.register("magic_map_cloning_recipe", () -> MagicMapCloningRecipe.SERIALIZER);
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<MazeMapCloningRecipe>> MAZE_MAP_CLONING_RECIPE = RECIPE_SERIALIZERS.register("maze_map_cloning_recipe", () -> MazeMapCloningRecipe.SERIALIZER);
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<MoonwormQueenRepairRecipe>> MOONWORM_QUEEN_REPAIR_RECIPE = RECIPE_SERIALIZERS.register("moonworm_queen_repair_recipe", () -> MoonwormQueenRepairRecipe.SERIALIZER);
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<ScepterRepairRecipe>> SCEPTER_REPAIR_RECIPE = RECIPE_SERIALIZERS.register("scepter_repair", () -> ScepterRepairRecipe.SERIALIZER);
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<UncraftingRecipe>> UNCRAFTING_SERIALIZER = RECIPE_SERIALIZERS.register("uncrafting", () -> UncraftingRecipe.SERIALIZER);
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<TravellersGearModifierShapelessRecipe>> MODIFIER_SHAPELESS_RECIPE_SERIALIZER = RECIPE_SERIALIZERS.register("travellers_gear_modifier_shapeless_recipe", TravellersGearModifierShapelessRecipe.Serializer::new);
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<TravellersGearModifierShapedRecipe>> MODIFIER_SHAPED_RECIPE_SERIALIZER = RECIPE_SERIALIZERS.register("travellers_gear_modifier_shaped_recipe", TravellersGearModifierShapedRecipe.Serializer::new);
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<TravellersVestGlovesMergeRecipe>> TRAVELLERS_VEST_GLOVES_MERGE_RECIPE_SERIALIZER = RECIPE_SERIALIZERS.register("travellers_vest_gloves_merge_recipe", () -> new SimpleCraftingRecipeSerializer<>(TravellersVestGlovesMergeRecipe::new));
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<NoTemplateSmithingRecipe>> NO_TEMPLATE_SMITHING_SERIALIZER = RECIPE_SERIALIZERS.register("no_template_smithing", NoTemplateSmithingRecipe.Serializer::new);
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<DryingRecipe>> DRYING_SERIALIZER = RECIPE_SERIALIZERS.register("drying", DryingRecipe.Serializer::new);
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<TravellersVestGlovesMergeRecipe>> TRAVELLERS_VEST_GLOVES_MERGE_RECIPE_SERIALIZER = RECIPE_SERIALIZERS.register("travellers_vest_gloves_merge_recipe", () -> TravellersVestGlovesMergeRecipe.SERIALIZER);
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<NoTemplateSmithingRecipe>> NO_TEMPLATE_SMITHING_SERIALIZER = RECIPE_SERIALIZERS.register("no_template_smithing", () -> NoTemplateSmithingRecipe.SERIALIZER);
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<DryingRecipe>> DRYING_SERIALIZER = RECIPE_SERIALIZERS.register("drying", () -> DryingRecipe.SERIALIZER);

public static final DeferredHolder<RecipeType<?>, RecipeType<UncraftingRecipe>> UNCRAFTING_RECIPE = RECIPE_TYPES.register("uncrafting", () -> RecipeType.simple(TwilightForestMod.prefix("uncrafting")));
public static final DeferredHolder<RecipeType<?>, RecipeType<DryingRecipe>> DRYING_RECIPE = RECIPE_TYPES.register("drying", () -> RecipeType.simple(TwilightForestMod.prefix("drying")));
Expand Down
33 changes: 18 additions & 15 deletions src/main/java/twilightforest/item/recipe/CasketRepairRecipe.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,28 @@
package twilightforest.item.recipe;

import net.minecraft.core.HolderLookup;
import com.mojang.serialization.MapCodec;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.CraftingBookCategory;
import net.minecraft.world.item.crafting.CraftingInput;
import net.minecraft.world.item.crafting.CustomRecipe;
import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.level.Level;
import twilightforest.init.TFDataComponents;
import twilightforest.init.TFItems;
import twilightforest.init.TFRecipes;

public class CasketRepairRecipe extends CustomRecipe {
public static final MapCodec<CasketRepairRecipe> MAP_CODEC =
MapCodec.unit(CasketRepairRecipe::new);

public CasketRepairRecipe(CraftingBookCategory category) {
super(category);
public static final StreamCodec<RegistryFriendlyByteBuf, CasketRepairRecipe> STREAM_CODEC =
StreamCodec.unit(new CasketRepairRecipe());

public static final RecipeSerializer<CasketRepairRecipe> SERIALIZER =
new RecipeSerializer<>(MAP_CODEC, STREAM_CODEC);

public CasketRepairRecipe() {
super();
}

@Override
Expand All @@ -40,10 +48,10 @@ public boolean matches(CraftingInput input, Level level) {
}

@Override
public ItemStack assemble(CraftingInput input, HolderLookup.Provider access) {
public ItemStack assemble(CraftingInput craftingInput) {
ItemStack casket = null;
for (int i = 0; i < input.size(); ++i) {
ItemStack itemstack = input.getItem(i);
for (int i = 0; i < craftingInput.size(); ++i) {
ItemStack itemstack = craftingInput.getItem(i);
if (!itemstack.isEmpty()) {
if (itemstack.is(TFItems.KEEPSAKE_CASKET)) {
if (casket == null) {
Expand All @@ -66,12 +74,7 @@ public ItemStack assemble(CraftingInput input, HolderLookup.Provider access) {
}

@Override
public boolean canCraftInDimensions(int width, int height) {
return width * height >= 2;
}

@Override
public RecipeSerializer<?> getSerializer() {
return TFRecipes.CASKET_REPAIR_RECIPE.get();
public RecipeSerializer<? extends CustomRecipe> getSerializer() {
return SERIALIZER;
}
}
86 changes: 48 additions & 38 deletions src/main/java/twilightforest/item/recipe/DryingRecipe.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,67 +6,77 @@
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.item.crafting.SingleItemRecipe;
import net.minecraft.world.item.crafting.SingleRecipeInput;
import net.minecraft.world.item.ItemStackTemplate;
import net.minecraft.world.item.crafting.*;
import net.minecraft.world.level.Level;
import twilightforest.init.TFRecipes;

public class DryingRecipe extends SingleItemRecipe {
public static final MapCodec<DryingRecipe> MAP_CODEC = RecordCodecBuilder.mapCodec(i -> i.group(
CommonInfo.MAP_CODEC.forGetter(o -> o.commonInfo),
Ingredient.CODEC.fieldOf("input").forGetter(SingleItemRecipe::input),
ItemStackTemplate.CODEC.fieldOf("result").forGetter(o -> o.result()),
Codec.INT.fieldOf("filter_time").forGetter(o -> o.dryingTime)
).apply(i, DryingRecipe::new));

public static final StreamCodec<RegistryFriendlyByteBuf, DryingRecipe> STREAM_CODEC = StreamCodec.composite(
CommonInfo.STREAM_CODEC, o -> o.commonInfo,
Ingredient.CONTENTS_STREAM_CODEC, SingleItemRecipe::input,
ItemStackTemplate.STREAM_CODEC, o -> o.result(),
ByteBufCodecs.INT, o -> o.dryingTime,
DryingRecipe::new);

public static final RecipeSerializer<DryingRecipe> SERIALIZER =
new RecipeSerializer<>(MAP_CODEC, STREAM_CODEC);


private final int dryingTime;

public DryingRecipe(Ingredient ingredient, ItemStack result, int dryingTime) {
super(TFRecipes.DRYING_RECIPE.get(), TFRecipes.DRYING_SERIALIZER.get(), "", ingredient, result);
public DryingRecipe(CommonInfo commonInfo, Ingredient input, ItemStackTemplate result, int dryingTime) {
super(commonInfo, input, result);
this.dryingTime = dryingTime;
}

@Override
public boolean matches(SingleRecipeInput input, Level level) {
return this.ingredient.test(input.item());
public RecipeSerializer<? extends SingleItemRecipe> getSerializer() {
return SERIALIZER;
}

public Ingredient getInput() {
return this.ingredient;
@Override
public RecipeType<? extends SingleItemRecipe> getType() {
return TFRecipes.DRYING_RECIPE.get();
}

public ItemStack getResult() {
return this.result;
// Consider adding a category in the future
@Override
public RecipeBookCategory recipeBookCategory() {
return null;
}

public int getDryingTime() {
return this.dryingTime;
@Override
public boolean matches(SingleRecipeInput input, Level level) {
return this.input().test(input.item());
}

@Override
public boolean isSpecial() {
return true;
}

public static class Serializer implements RecipeSerializer<DryingRecipe> {

public static final MapCodec<DryingRecipe> CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group(
Ingredient.CODEC_NONEMPTY.fieldOf("input").forGetter(o -> o.ingredient),
ItemStack.STRICT_CODEC.fieldOf("result").forGetter(o -> o.result),
Codec.INT.fieldOf("filter_time").forGetter(o -> o.dryingTime)
).apply(instance, DryingRecipe::new));

public static final StreamCodec<RegistryFriendlyByteBuf, DryingRecipe> STREAM_CODEC = StreamCodec.composite(
Ingredient.CONTENTS_STREAM_CODEC, o -> o.ingredient,
ItemStack.STREAM_CODEC, o -> o.result,
ByteBufCodecs.INT, o -> o.dryingTime,
DryingRecipe::new);

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

@Override
public StreamCodec<RegistryFriendlyByteBuf, DryingRecipe> streamCodec() {
return STREAM_CODEC;
}
@Override
public String group() {
return "";
}

public Ingredient getInput() {
return this.input();
}

public ItemStackTemplate getResult() {
return this.result();
}

public int getDryingTime() {
return this.dryingTime;
}
}
30 changes: 16 additions & 14 deletions src/main/java/twilightforest/item/recipe/EmperorsClothRecipe.java
Original file line number Diff line number Diff line change
@@ -1,22 +1,30 @@
package twilightforest.item.recipe;

import net.minecraft.core.HolderLookup;
import com.mojang.serialization.MapCodec;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.util.Unit;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.CraftingBookCategory;
import net.minecraft.world.item.crafting.CraftingInput;
import net.minecraft.world.item.crafting.CustomRecipe;
import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.level.Level;
import twilightforest.tags.TFItemTags;
import twilightforest.init.TFDataComponents;
import twilightforest.init.TFItems;
import twilightforest.init.TFRecipes;

public class EmperorsClothRecipe extends CustomRecipe {
public static final MapCodec<EmperorsClothRecipe> MAP_CODEC =
MapCodec.unit(EmperorsClothRecipe::new);

public EmperorsClothRecipe(CraftingBookCategory category) {
super(category);
public static final StreamCodec<RegistryFriendlyByteBuf, EmperorsClothRecipe> STREAM_CODEC =
StreamCodec.unit(new EmperorsClothRecipe());

public static final RecipeSerializer<EmperorsClothRecipe> SERIALIZER =
new RecipeSerializer<>(MAP_CODEC, STREAM_CODEC);

public EmperorsClothRecipe() {
super();
}

@Override
Expand Down Expand Up @@ -45,9 +53,8 @@ public boolean matches(CraftingInput input, Level level) {
}

@Override
public ItemStack assemble(CraftingInput input, HolderLookup.Provider provider) {
public ItemStack assemble(CraftingInput craftingInput) {
ItemStack item = ItemStack.EMPTY;

for (int i = 0; i < input.size(); i++) {
ItemStack stack = input.getItem(i);
if (!stack.isEmpty() && stack.is(TFItemTags.EMPERORS_CLOTH_APPLICABLE) && item.isEmpty()) {
Expand All @@ -61,12 +68,7 @@ public ItemStack assemble(CraftingInput input, HolderLookup.Provider provider) {
}

@Override
public boolean canCraftInDimensions(int width, int height) {
return width * height >= 2;
}

@Override
public RecipeSerializer<?> getSerializer() {
return TFRecipes.EMPERORS_CLOTH_RECIPE.get();
public RecipeSerializer<? extends CustomRecipe> getSerializer() {
return SERIALIZER;
}
}
33 changes: 18 additions & 15 deletions src/main/java/twilightforest/item/recipe/EssenceRepairRecipe.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,28 @@
package twilightforest.item.recipe;

import net.minecraft.core.HolderLookup;
import com.mojang.serialization.MapCodec;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.CraftingBookCategory;
import net.minecraft.world.item.crafting.CraftingInput;
import net.minecraft.world.item.crafting.CustomRecipe;
import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.level.Level;
import twilightforest.tags.TFItemTags;
import twilightforest.init.TFItems;
import twilightforest.init.TFRecipes;

public class EssenceRepairRecipe extends CustomRecipe {
public static final MapCodec<EssenceRepairRecipe> MAP_CODEC =
MapCodec.unit(EssenceRepairRecipe::new);

public EssenceRepairRecipe(CraftingBookCategory category) {
super(category);
public static final StreamCodec<RegistryFriendlyByteBuf, EssenceRepairRecipe> STREAM_CODEC =
StreamCodec.unit(new EssenceRepairRecipe());

public static final RecipeSerializer<EssenceRepairRecipe> SERIALIZER =
new RecipeSerializer<>(MAP_CODEC, STREAM_CODEC);

public EssenceRepairRecipe() {
super();
}

@Override
Expand All @@ -40,10 +48,10 @@ public boolean matches(CraftingInput input, Level level) {
}

@Override
public ItemStack assemble(CraftingInput input, HolderLookup.Provider access) {
public ItemStack assemble(CraftingInput craftingInput) {
ItemStack scepter = null;
for (int i = 0; i < input.size(); ++i) {
ItemStack itemstack = input.getItem(i);
for (int i = 0; i < craftingInput.size(); ++i) {
ItemStack itemstack = craftingInput.getItem(i);
if (!itemstack.isEmpty()) {
if (itemstack.is(TFItemTags.SCEPTERS)) {
if (scepter == null) {
Expand All @@ -66,12 +74,7 @@ public ItemStack assemble(CraftingInput input, HolderLookup.Provider access) {
}

@Override
public boolean canCraftInDimensions(int width, int height) {
return width * height >= 2;
}

@Override
public RecipeSerializer<?> getSerializer() {
return TFRecipes.ESSENCE_REPAIR_RECIPE.get();
public RecipeSerializer<? extends CustomRecipe> getSerializer() {
return SERIALIZER;
}
}
Loading
Loading