Skip to content

Commit 7e8066d

Browse files
fix: adding some more logic around recipes and books
1 parent 0facd4c commit 7e8066d

6 files changed

Lines changed: 49 additions & 11 deletions

File tree

src/client/java/com/tcm/MineTale/block/workbenches/screen/CampfireWorkbenchScreen.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.tcm.MineTale.recipe.MineTaleRecipeBookComponent;
88
import com.tcm.MineTale.registry.ModBlocks;
99
import com.tcm.MineTale.registry.ModRecipeDisplay;
10+
import com.tcm.MineTale.registry.ModRecipes;
1011

1112
import net.minecraft.client.gui.GuiGraphics;
1213
import net.minecraft.client.gui.navigation.ScreenPosition;
@@ -44,7 +45,7 @@ private static MineTaleRecipeBookComponent createRecipeBookComponent(CampfireWor
4445
new RecipeBookComponent.TabInfo(tabIcon.getItem(), ModRecipeDisplay.CAMPFIRE_SEARCH)
4546
);
4647

47-
return new MineTaleRecipeBookComponent(menu, tabs);
48+
return new MineTaleRecipeBookComponent(menu, tabs, ModRecipes.CAMPFIRE_TYPE);
4849
}
4950

5051
/**

src/client/java/com/tcm/MineTale/block/workbenches/screen/FurnaceWorkbenchScreen.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.tcm.MineTale.block.workbenches.menu.FurnaceWorkbenchMenu;
77
import com.tcm.MineTale.recipe.MineTaleRecipeBookComponent;
88
import com.tcm.MineTale.registry.ModBlocks;
9+
import com.tcm.MineTale.registry.ModRecipes;
910

1011
import net.minecraft.client.gui.GuiGraphics;
1112
import net.minecraft.client.gui.navigation.ScreenPosition;
@@ -41,7 +42,7 @@ private static MineTaleRecipeBookComponent createRecipeBookComponent(FurnaceWork
4142
new RecipeBookComponent.TabInfo(tabIcon.getItem(), RecipeBookCategories.CRAFTING_MISC)
4243
);
4344

44-
return new MineTaleRecipeBookComponent(menu, tabs);
45+
return new MineTaleRecipeBookComponent(menu, tabs, ModRecipes.FURNACE_TYPE);
4546
}
4647

4748
@Override

src/client/java/com/tcm/MineTale/datagen/builders/WorkbenchRecipeBuilder.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,9 @@ public void save(RecipeOutput recipeOutput, ResourceKey<Recipe<?>> resourceKey)
190190
.requirements(AdvancementRequirements.Strategy.OR);
191191

192192
// Add your criteria here (omitted for brevity)
193+
for (Map.Entry<String, Criterion<?>> entry : this.criteria.entrySet()) {
194+
advancement.addCriterion(entry.getKey(), entry.getValue());
195+
}
193196

194197
// 3. Create the Recipe Instance
195198
WorkbenchRecipe recipe = new WorkbenchRecipe(

src/client/java/com/tcm/MineTale/recipe/MineTaleRecipeBookComponent.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@
1515
import net.minecraft.world.entity.player.StackedItemContents;
1616
import net.minecraft.world.inventory.RecipeBookMenu;
1717
import net.minecraft.world.inventory.Slot;
18+
import net.minecraft.world.item.crafting.RecipeType;
1819
import net.minecraft.world.item.crafting.display.RecipeDisplay;
1920

2021
public class MineTaleRecipeBookComponent extends RecipeBookComponent<RecipeBookMenu> {
22+
private final RecipeType<?> filterType; // The specific machine type
2123

2224
// Standard button sprites (the "Filter" checkmark button)
2325
protected static final WidgetSprites FILTER_BUTTON_SPRITES = new WidgetSprites(
@@ -27,19 +29,31 @@ public class MineTaleRecipeBookComponent extends RecipeBookComponent<RecipeBookM
2729
Identifier.withDefaultNamespace("recipe_book/filter_disabled_focused")
2830
);
2931

30-
public MineTaleRecipeBookComponent(RecipeBookMenu recipeBookMenu, List<TabInfo> list) {
32+
public MineTaleRecipeBookComponent(RecipeBookMenu recipeBookMenu, List<TabInfo> list, RecipeType<?> filterType) {
3133
super(recipeBookMenu, list);
34+
this.filterType = filterType;
3235
}
3336

3437
@Override
3538
protected void selectMatchingRecipes(RecipeCollection recipeCollection, StackedItemContents stackedItemContents) {
3639
// Force everything to be "selected"
3740
// recipeCollection.selectRecipes(stackedItemContents, (recipeDisplay) -> true);
3841

42+
// recipeCollection.selectRecipes(stackedItemContents, (recipeDisplay) -> {
43+
// // Only allow recipes that use your custom Workbench display type
44+
// // This effectively filters out vanilla CraftingRecipeDisplays (the boats)
45+
// return recipeDisplay.type() == ModRecipeDisplay.WORKBENCH_TYPE;
46+
// });
47+
3948
recipeCollection.selectRecipes(stackedItemContents, (recipeDisplay) -> {
40-
// Only allow recipes that use your custom Workbench display type
41-
// This effectively filters out vanilla CraftingRecipeDisplays (the boats)
42-
return recipeDisplay.type() == ModRecipeDisplay.WORKBENCH_TYPE;
49+
// 1. Check if the display matches your custom type
50+
if (recipeDisplay.type() != ModRecipeDisplay.WORKBENCH_TYPE) return false;
51+
52+
// 2. We need to verify if the underlying recipe matches the current block's type
53+
// Note: In 1.21+, you may need to cast the display or check the recipe's origin
54+
// Here is the logic to ensure we only show recipes meant for THIS specific machine:
55+
return recipeDisplay instanceof WorkbenchRecipeDisplay wbDisplay &&
56+
wbDisplay.getRecipeType() == this.filterType;
4357
});
4458
}
4559

src/main/java/com/tcm/MineTale/recipe/WorkbenchRecipeDisplay.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,39 @@
66
import com.mojang.serialization.codecs.RecordCodecBuilder;
77
import com.tcm.MineTale.registry.ModBlocks;
88
import com.tcm.MineTale.registry.ModRecipeDisplay;
9+
import com.tcm.MineTale.registry.ModRecipes;
910

11+
import net.minecraft.core.registries.BuiltInRegistries;
1012
import net.minecraft.world.item.ItemStack;
1113
import net.minecraft.world.item.crafting.Ingredient;
14+
import net.minecraft.world.item.crafting.RecipeType;
1215
import net.minecraft.world.item.crafting.display.RecipeDisplay;
1316
import net.minecraft.world.item.crafting.display.SlotDisplay;
1417

15-
public record WorkbenchRecipeDisplay(List<SlotDisplay> ingredients,
18+
public record WorkbenchRecipeDisplay(
19+
List<SlotDisplay> ingredients,
1620
SlotDisplay result,
17-
SlotDisplay craftingStation) implements RecipeDisplay {
21+
SlotDisplay craftingStation,
22+
RecipeType<?> recipeType
23+
) implements RecipeDisplay {
1824

1925
public static final MapCodec<WorkbenchRecipeDisplay> CODEC = RecordCodecBuilder.mapCodec(inst -> inst.group(
2026
SlotDisplay.CODEC.listOf().fieldOf("ingredients").forGetter(WorkbenchRecipeDisplay::ingredients),
2127
SlotDisplay.CODEC.fieldOf("result").forGetter(WorkbenchRecipeDisplay::result),
22-
SlotDisplay.CODEC.fieldOf("crafting_station").forGetter(WorkbenchRecipeDisplay::craftingStation) // Just one fieldOf
28+
SlotDisplay.CODEC.fieldOf("crafting_station").forGetter(WorkbenchRecipeDisplay::craftingStation),
29+
BuiltInRegistries.RECIPE_TYPE.byNameCodec().fieldOf("recipe_type").forGetter(WorkbenchRecipeDisplay::recipeType)
2330
).apply(inst, WorkbenchRecipeDisplay::new));
2431

32+
// Updated Helper Constructor
2533
public WorkbenchRecipeDisplay(WorkbenchRecipe recipe) {
2634
this(
2735
recipe.ingredients().stream().map(Ingredient::display).toList(),
2836
new SlotDisplay.ItemStackSlotDisplay(recipe.results().isEmpty() ? ItemStack.EMPTY : recipe.results().get(0)),
29-
new SlotDisplay.ItemStackSlotDisplay(new ItemStack(ModBlocks.FURNACE_WORKBENCH_BLOCK_T1))
37+
// Dynamic icon: If it's a campfire recipe, show the campfire item in the book
38+
new SlotDisplay.ItemStackSlotDisplay(new ItemStack(
39+
recipe.getType() == ModRecipes.CAMPFIRE_TYPE ? ModBlocks.CAMPFIRE_WORKBENCH_BLOCK : ModBlocks.FURNACE_WORKBENCH_BLOCK_T1
40+
)),
41+
recipe.getType()
3042
);
3143
}
3244

@@ -46,6 +58,10 @@ public RecipeDisplay.Type<WorkbenchRecipeDisplay> type() {
4658
return ModRecipeDisplay.WORKBENCH_TYPE;
4759
}
4860

61+
public RecipeType<?> getRecipeType() {
62+
return this.recipeType;
63+
}
64+
4965
@Override
5066
public SlotDisplay craftingStation() {
5167
// Replace 'ModBlocks.YOUR_WORKBENCH' with your actual block item

src/main/java/com/tcm/MineTale/registry/ModRecipeDisplay.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import net.minecraft.core.Registry;
77
import net.minecraft.core.registries.BuiltInRegistries;
8+
import net.minecraft.core.registries.Registries;
89
import net.minecraft.network.codec.ByteBufCodecs;
910
import net.minecraft.network.codec.StreamCodec;
1011
import net.minecraft.resources.Identifier;
@@ -17,8 +18,10 @@ public class ModRecipeDisplay {
1718
SlotDisplay.STREAM_CODEC.apply(ByteBufCodecs.list()), WorkbenchRecipeDisplay::ingredients,
1819
SlotDisplay.STREAM_CODEC, WorkbenchRecipeDisplay::result,
1920
SlotDisplay.STREAM_CODEC, WorkbenchRecipeDisplay::craftingStation,
21+
ByteBufCodecs.registry(Registries.RECIPE_TYPE), WorkbenchRecipeDisplay::recipeType,
2022
// Explicitly define the constructor mapping to avoid the Function3 error
21-
(ingredients, result, craftingStation) -> new WorkbenchRecipeDisplay(ingredients, result, craftingStation)
23+
(ingredients, result, craftingStation, recipeType) ->
24+
new WorkbenchRecipeDisplay(ingredients, result, craftingStation, recipeType)
2225
);
2326

2427
public static final RecipeDisplay.Type<WorkbenchRecipeDisplay> WORKBENCH_TYPE =

0 commit comments

Comments
 (0)