Skip to content

Commit 3154963

Browse files
KaupenjoeKaupenjoe
authored andcommitted
custom recipe type
1 parent fd1d62c commit 3154963

8 files changed

Lines changed: 180 additions & 4 deletions

File tree

src/main/java/net/kaupenjoe/tutorialmod/TutorialMod.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import net.kaupenjoe.tutorialmod.particle.BismuthParticles;
1717
import net.kaupenjoe.tutorialmod.particle.ModParticles;
1818
import net.kaupenjoe.tutorialmod.potion.ModPotions;
19+
import net.kaupenjoe.tutorialmod.recipe.ModRecipes;
1920
import net.kaupenjoe.tutorialmod.screen.ModMenuTypes;
2021
import net.kaupenjoe.tutorialmod.screen.custom.GrowthChamberScreen;
2122
import net.kaupenjoe.tutorialmod.screen.custom.PedestalScreen;
@@ -82,6 +83,7 @@ public TutorialMod(IEventBus modEventBus, ModContainer modContainer) {
8283
ModBlockEntities.register(modEventBus);
8384

8485
ModMenuTypes.register(modEventBus);
86+
ModRecipes.register(modEventBus);
8587

8688
// Register the item to a creative tab
8789
modEventBus.addListener(this::addCreative);

src/main/java/net/kaupenjoe/tutorialmod/block/entity/GrowthChamberBlockEntity.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package net.kaupenjoe.tutorialmod.block.entity;
22

33
import net.kaupenjoe.tutorialmod.item.ModItems;
4+
import net.kaupenjoe.tutorialmod.recipe.GrowthChamberRecipe;
5+
import net.kaupenjoe.tutorialmod.recipe.GrowthChamberRecipeInput;
6+
import net.kaupenjoe.tutorialmod.recipe.ModRecipes;
47
import net.kaupenjoe.tutorialmod.screen.custom.GrowthChamberMenu;
58
import net.minecraft.core.BlockPos;
69
import net.minecraft.core.HolderLookup;
@@ -17,12 +20,15 @@
1720
import net.minecraft.world.inventory.AbstractContainerMenu;
1821
import net.minecraft.world.inventory.ContainerData;
1922
import net.minecraft.world.item.ItemStack;
23+
import net.minecraft.world.item.crafting.RecipeHolder;
2024
import net.minecraft.world.level.Level;
2125
import net.minecraft.world.level.block.entity.BlockEntity;
2226
import net.minecraft.world.level.block.state.BlockState;
2327
import net.neoforged.neoforge.items.ItemStackHandler;
2428
import org.jetbrains.annotations.Nullable;
2529

30+
import java.util.Optional;
31+
2632
public class GrowthChamberBlockEntity extends BlockEntity implements MenuProvider {
2733
public final ItemStackHandler itemHandler = new ItemStackHandler(2) {
2834
@Override
@@ -121,7 +127,8 @@ public void tick(Level level, BlockPos blockPos, BlockState blockState) {
121127
}
122128

123129
private void craftItem() {
124-
ItemStack output = new ItemStack(ModItems.BISMUTH.get(), 8);
130+
Optional<RecipeHolder<GrowthChamberRecipe>> recipe = getCurrentRecipe();
131+
ItemStack output = recipe.get().value().output();
125132

126133
itemHandler.extractItem(INPUT_SLOT, 1, false);
127134
itemHandler.setStackInSlot(OUTPUT_SLOT, new ItemStack(output.getItem(),
@@ -142,10 +149,18 @@ private void increaseCraftingProgress() {
142149
}
143150

144151
private boolean hasRecipe() {
145-
ItemStack output = new ItemStack(ModItems.BISMUTH.get(), 8);
152+
Optional<RecipeHolder<GrowthChamberRecipe>> recipe = getCurrentRecipe();
153+
if(recipe.isEmpty()) {
154+
return false;
155+
}
156+
157+
ItemStack output = recipe.get().value().output();
158+
return canInsertAmountIntoOutputSlot(output.getCount()) && canInsertItemIntoOutputSlot(output);
159+
}
146160

147-
return itemHandler.getStackInSlot(INPUT_SLOT).is(ModItems.RAW_BISMUTH) &&
148-
canInsertAmountIntoOutputSlot(output.getCount()) && canInsertItemIntoOutputSlot(output);
161+
private Optional<RecipeHolder<GrowthChamberRecipe>> getCurrentRecipe() {
162+
return this.level.getRecipeManager()
163+
.getRecipeFor(ModRecipes.GROWTH_CHAMBER_TYPE.get(), new GrowthChamberRecipeInput(itemHandler.getStackInSlot(INPUT_SLOT)), level);
149164
}
150165

151166
private boolean canInsertItemIntoOutputSlot(ItemStack output) {
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package net.kaupenjoe.tutorialmod.recipe;
2+
3+
import com.mojang.serialization.MapCodec;
4+
import com.mojang.serialization.codecs.RecordCodecBuilder;
5+
import net.minecraft.core.HolderLookup;
6+
import net.minecraft.core.NonNullList;
7+
import net.minecraft.network.RegistryFriendlyByteBuf;
8+
import net.minecraft.network.codec.StreamCodec;
9+
import net.minecraft.world.item.ItemStack;
10+
import net.minecraft.world.item.crafting.Ingredient;
11+
import net.minecraft.world.item.crafting.Recipe;
12+
import net.minecraft.world.item.crafting.RecipeSerializer;
13+
import net.minecraft.world.item.crafting.RecipeType;
14+
import net.minecraft.world.level.Level;
15+
16+
public record GrowthChamberRecipe(Ingredient inputItem, ItemStack output) implements Recipe<GrowthChamberRecipeInput> {
17+
// inputItem & output ==> Read From JSON File!
18+
// GrowthChamberRecipeInput --> INVENTORY of the Block Entity
19+
20+
@Override
21+
public NonNullList<Ingredient> getIngredients() {
22+
NonNullList<Ingredient> list = NonNullList.create();
23+
list.add(inputItem);
24+
return list;
25+
}
26+
27+
@Override
28+
public boolean matches(GrowthChamberRecipeInput growthChamberRecipeInput, Level level) {
29+
if (level.isClientSide()) {
30+
return false;
31+
}
32+
33+
return inputItem.test(growthChamberRecipeInput.getItem(0));
34+
}
35+
36+
@Override
37+
public ItemStack assemble(GrowthChamberRecipeInput growthChamberRecipeInput, HolderLookup.Provider provider) {
38+
return output.copy();
39+
}
40+
41+
@Override
42+
public boolean canCraftInDimensions(int i, int i1) {
43+
return true;
44+
}
45+
46+
@Override
47+
public ItemStack getResultItem(HolderLookup.Provider provider) {
48+
return output;
49+
}
50+
51+
@Override
52+
public RecipeSerializer<?> getSerializer() {
53+
return ModRecipes.GROWTH_CHAMBER_SERIALIZER.get();
54+
}
55+
56+
@Override
57+
public RecipeType<?> getType() {
58+
return ModRecipes.GROWTH_CHAMBER_TYPE.get();
59+
}
60+
61+
public static class Serializer implements RecipeSerializer<GrowthChamberRecipe> {
62+
public static final MapCodec<GrowthChamberRecipe> CODEC = RecordCodecBuilder.mapCodec(inst -> inst.group(
63+
Ingredient.CODEC_NONEMPTY.fieldOf("ingredient").forGetter(GrowthChamberRecipe::inputItem),
64+
ItemStack.CODEC.fieldOf("result").forGetter(GrowthChamberRecipe::output)
65+
).apply(inst, GrowthChamberRecipe::new));
66+
67+
public static final StreamCodec<RegistryFriendlyByteBuf, GrowthChamberRecipe> STREAM_CODEC =
68+
StreamCodec.composite(
69+
Ingredient.CONTENTS_STREAM_CODEC, GrowthChamberRecipe::inputItem,
70+
ItemStack.STREAM_CODEC, GrowthChamberRecipe::output,
71+
GrowthChamberRecipe::new);
72+
73+
@Override
74+
public MapCodec<GrowthChamberRecipe> codec() {
75+
return CODEC;
76+
}
77+
78+
@Override
79+
public StreamCodec<RegistryFriendlyByteBuf, GrowthChamberRecipe> streamCodec() {
80+
return STREAM_CODEC;
81+
}
82+
}
83+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package net.kaupenjoe.tutorialmod.recipe;
2+
3+
import net.minecraft.world.item.ItemStack;
4+
import net.minecraft.world.item.crafting.RecipeInput;
5+
6+
public record GrowthChamberRecipeInput(ItemStack input) implements RecipeInput {
7+
@Override
8+
public ItemStack getItem(int i) {
9+
return input;
10+
}
11+
12+
@Override
13+
public int size() {
14+
return 1;
15+
}
16+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package net.kaupenjoe.tutorialmod.recipe;
2+
3+
import net.kaupenjoe.tutorialmod.TutorialMod;
4+
import net.minecraft.core.registries.Registries;
5+
import net.minecraft.world.item.crafting.RecipeSerializer;
6+
import net.minecraft.world.item.crafting.RecipeType;
7+
import net.neoforged.bus.api.IEventBus;
8+
import net.neoforged.neoforge.registries.DeferredHolder;
9+
import net.neoforged.neoforge.registries.DeferredRegister;
10+
11+
public class ModRecipes {
12+
public static final DeferredRegister<RecipeSerializer<?>> SERIALIZERS =
13+
DeferredRegister.create(Registries.RECIPE_SERIALIZER, TutorialMod.MOD_ID);
14+
public static final DeferredRegister<RecipeType<?>> TYPES =
15+
DeferredRegister.create(Registries.RECIPE_TYPE, TutorialMod.MOD_ID);
16+
17+
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<GrowthChamberRecipe>> GROWTH_CHAMBER_SERIALIZER =
18+
SERIALIZERS.register("growth_chamber", GrowthChamberRecipe.Serializer::new);
19+
public static final DeferredHolder<RecipeType<?>, RecipeType<GrowthChamberRecipe>> GROWTH_CHAMBER_TYPE =
20+
TYPES.register("growth_chamber", () -> new RecipeType<GrowthChamberRecipe>() {
21+
@Override
22+
public String toString() {
23+
return "growth_chamber";
24+
}
25+
});
26+
27+
28+
public static void register(IEventBus eventBus) {
29+
SERIALIZERS.register(eventBus);
30+
TYPES.register(eventBus);
31+
}
32+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"type": "tutorialmod:growth_chamber",
3+
"ingredient": {
4+
"item": "tutorialmod:raw_bismuth"
5+
},
6+
"result": {
7+
"id": "tutorialmod:bismuth"
8+
}
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"type": "tutorialmod:growth_chamber",
3+
"ingredient": {
4+
"item": "minecraft:diamond"
5+
},
6+
"result": {
7+
"id": "minecraft:diamond_block"
8+
}
9+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"type": "tutorialmod:growth_chamber",
3+
"ingredient": {
4+
"item": "minecraft:stick"
5+
},
6+
"result": {
7+
"id": "minecraft:end_rod",
8+
"count": 2
9+
}
10+
}

0 commit comments

Comments
 (0)