Skip to content

Commit bcb7787

Browse files
committed
created custom recipe again but hard to implement
1 parent ef8eaaf commit bcb7787

File tree

6 files changed

+137
-40
lines changed

6 files changed

+137
-40
lines changed

src/main/java/com/junnio/polycoin/block/ModBlocks.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import net.minecraft.registry.RegistryKeys;
1212
import net.minecraft.screen.ScreenHandlerType;
1313
import net.minecraft.sound.BlockSoundGroup;
14+
import net.minecraft.sound.SoundEvents;
1415
import net.minecraft.util.Identifier;
1516
import org.spongepowered.include.com.google.common.base.Function;
1617

@@ -64,7 +65,8 @@ public static Block register(String name, Function<Block.Settings, Block> blockF
6465
"polym_table",
6566
PolymTableBlock::new,
6667
AbstractBlock.Settings.create()
67-
.sounds(BlockSoundGroup.GRASS)
68+
.sounds(BlockSoundGroup.STONE)
69+
6870
.strength(1.5F)
6971
.requiresTool()
7072
);

src/main/java/com/junnio/polycoin/block/PolymTableScreenHandler.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import net.minecraft.screen.ScreenHandlerContext;
1818
import net.minecraft.server.network.ServerPlayerEntity;
1919
import net.minecraft.server.world.ServerWorld;
20+
import org.jetbrains.annotations.Nullable;
2021

2122
import java.util.Optional;
2223

@@ -28,4 +29,42 @@ public PolymTableScreenHandler(int syncId, PlayerInventory playerInventory, Scre
2829
this.customPlayer = playerInventory.player;
2930
this.customContext = context;
3031
}
32+
@Override
33+
public boolean canUse(PlayerEntity player) {
34+
return true;
35+
}
36+
@Override
37+
public void onContentChanged(Inventory inventory) {
38+
customContext.run((world, pos) -> {
39+
if (world instanceof ServerWorld serverWorld) {
40+
updateResult(this, serverWorld, customPlayer, this.craftingInventory, this.craftingResultInventory, null);
41+
}
42+
});
43+
}
44+
public static void updateResult(
45+
ScreenHandler handler,
46+
ServerWorld world,
47+
PlayerEntity player,
48+
RecipeInputInventory craftingInventory,
49+
CraftingResultInventory resultInventory,
50+
@Nullable RecipeEntry<CraftingRecipe> recipe
51+
) {
52+
CraftingRecipeInput craftingRecipeInput = craftingInventory.createRecipeInput();
53+
ServerPlayerEntity serverPlayerEntity = (ServerPlayerEntity)player;
54+
ItemStack itemStack = ItemStack.EMPTY;
55+
Optional<RecipeEntry<CraftingRecipe>> optional = world.getServer().getRecipeManager().getFirstMatch(RecipeType.CRAFTING, craftingRecipeInput, world, recipe);
56+
if (optional.isPresent()) {
57+
RecipeEntry<CraftingRecipe> recipeEntry = (RecipeEntry<CraftingRecipe>)optional.get();
58+
CraftingRecipe craftingRecipe = recipeEntry.value();
59+
if (resultInventory.shouldCraftRecipe(serverPlayerEntity, recipeEntry)) {
60+
ItemStack itemStack2 = craftingRecipe.craft(craftingRecipeInput, world.getRegistryManager());
61+
if (itemStack2.isItemEnabled(world.getEnabledFeatures())) {
62+
itemStack = itemStack2;
63+
}
64+
}
65+
}
66+
resultInventory.setStack(0, itemStack);
67+
handler.setPreviousTrackedSlot(0, itemStack);
68+
serverPlayerEntity.networkHandler.sendPacket(new ScreenHandlerSlotUpdateS2CPacket(handler.syncId, handler.nextRevision(), 0, itemStack));
69+
}
3170
}

src/main/java/com/junnio/polycoin/recipe/ModRecipes.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,14 @@
99

1010
public class ModRecipes {
1111
public static void initialize(){
12+
1213
PoLymCoin.LOGGER.info("Registering Custom Recipes for " + PoLymCoin.MOD_ID);
1314
}
15+
// public static final RecipeSerializer<PolymTableCraftingRecipe> POLYM_CRAFTING_SERIALIZER = Registry.register(
16+
// Registries.RECIPE_SERIALIZER, Identifier.of(PoLymCoin.MOD_ID, "polym_table"),
17+
// new PolymTableCraftingRecipe.Serializer());
1418
public static final RecipeSerializer<PolymTableCraftingRecipe> POLYM_CRAFTING_SERIALIZER = Registry.register(
15-
Registries.RECIPE_SERIALIZER, Identifier.of(PoLymCoin.MOD_ID, "polym_table"),
16-
new PolymTableCraftingRecipe.Serializer());
19+
Registries.RECIPE_SERIALIZER, PolymRecipeSerializer.ID,PolymRecipeSerializer.INSTANCE);
1720
public static final RecipeType<PolymTableCraftingRecipe> POLYM_CRAFTING_TYPE = Registry.register(
1821
Registries.RECIPE_TYPE, Identifier.of(PoLymCoin.MOD_ID, "polym_table"), new RecipeType<PolymTableCraftingRecipe>() {
1922
@Override
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.junnio.polycoin.recipe;
2+
3+
import com.junnio.polycoin.PoLymCoin;
4+
import com.mojang.serialization.MapCodec;
5+
import com.mojang.serialization.codecs.RecordCodecBuilder;
6+
import net.minecraft.item.ItemStack;
7+
import net.minecraft.network.RegistryByteBuf;
8+
import net.minecraft.network.codec.PacketCodec;
9+
import net.minecraft.recipe.Ingredient;
10+
import net.minecraft.recipe.RecipeSerializer;
11+
import net.minecraft.util.Identifier;
12+
13+
public class PolymRecipeSerializer implements RecipeSerializer<PolymTableCraftingRecipe> {
14+
15+
16+
public static final MapCodec<PolymTableCraftingRecipe> CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group(
17+
Ingredient.CODEC.fieldOf("input1").forGetter(PolymTableCraftingRecipe::getInputA),
18+
Ingredient.CODEC.fieldOf("input2").forGetter(PolymTableCraftingRecipe::getInputB),
19+
ItemStack.CODEC.fieldOf("result").forGetter(PolymTableCraftingRecipe::getOutputStack)
20+
).apply(instance, PolymTableCraftingRecipe::new));
21+
private PolymRecipeSerializer() {
22+
23+
}
24+
public static final PolymRecipeSerializer INSTANCE = new PolymRecipeSerializer();
25+
public static final Identifier ID = Identifier.of(PoLymCoin.MOD_ID + ":test");
26+
@Override
27+
public MapCodec<PolymTableCraftingRecipe> codec() {
28+
return CODEC;
29+
}
30+
31+
@Override
32+
public PacketCodec<RegistryByteBuf, PolymTableCraftingRecipe> packetCodec() {
33+
return null;
34+
}
35+
}
Lines changed: 45 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,65 @@
11
package com.junnio.polycoin.recipe;
22

3+
import com.junnio.polycoin.PoLymCoin;
4+
import com.mojang.serialization.Codec;
35
import com.mojang.serialization.MapCodec;
46
import com.mojang.serialization.codecs.RecordCodecBuilder;
57
import net.minecraft.item.ItemStack;
68
import net.minecraft.network.RegistryByteBuf;
79
import net.minecraft.network.codec.PacketCodec;
810
import net.minecraft.recipe.*;
911
import net.minecraft.recipe.book.RecipeBookCategory;
12+
import net.minecraft.recipe.input.CraftingRecipeInput;
1013
import net.minecraft.registry.RegistryWrapper;
14+
import net.minecraft.util.Identifier;
1115
import net.minecraft.world.World;
1216

13-
public record PolymTableCraftingRecipe (Ingredient inputItem, ItemStack output) implements Recipe<PolymTableCraftingRecipeInput> {
17+
import java.util.Map;
18+
19+
public class PolymTableCraftingRecipe implements Recipe<CraftingRecipeInput> {
20+
21+
private final Ingredient inputA;
22+
private final Ingredient inputB;
23+
private final ItemStack outputStack;
24+
public PolymTableCraftingRecipe(Ingredient inputA, Ingredient inputB, ItemStack outputStack) {
25+
this.inputA = inputA;
26+
this.inputB = inputB;
27+
this.outputStack = outputStack;
28+
}
29+
public Ingredient getInputA() {
30+
return inputA;
31+
}
32+
33+
public Ingredient getInputB() {
34+
return inputB;
35+
}
36+
public ItemStack getOutputStack() {
37+
return outputStack;
38+
}
1439
@Override
15-
public boolean matches(PolymTableCraftingRecipeInput input, World world) {
16-
if (!(input instanceof PolymTableCraftingRecipeInput)) {
17-
return false;
18-
}
19-
if(world.isClient()) {
20-
return false;
21-
}
22-
return inputItem.test(input.getStackInSlot(0));
40+
public boolean matches(CraftingRecipeInput input, World world) {
41+
if (input.size() < 2) return false;
42+
return inputA.equals(input.getStackInSlot(0)) && inputB.equals(input.getStackInSlot(1));
2343
}
2444

2545
@Override
26-
public ItemStack craft(PolymTableCraftingRecipeInput input, RegistryWrapper.WrapperLookup registries) {
27-
return output.copy();
46+
public ItemStack craft(CraftingRecipeInput input, RegistryWrapper.WrapperLookup registries) {
47+
return outputStack.copy();
2848
}
2949

3050
@Override
31-
public RecipeSerializer<? extends Recipe<PolymTableCraftingRecipeInput>> getSerializer() {
32-
return ModRecipes.POLYM_CRAFTING_SERIALIZER;
51+
public boolean isIgnoredInRecipeBook() {
52+
return Recipe.super.isIgnoredInRecipeBook();
3353
}
3454

3555
@Override
36-
public RecipeType<? extends Recipe<PolymTableCraftingRecipeInput>> getType() {
37-
return ModRecipes.POLYM_CRAFTING_TYPE;
56+
public RecipeSerializer<? extends Recipe<CraftingRecipeInput>> getSerializer() {
57+
return PolymRecipeSerializer.INSTANCE;
58+
}
59+
60+
@Override
61+
public RecipeType<? extends Recipe<CraftingRecipeInput>> getType() {
62+
return Type.INSTANCE;
3863
}
3964

4065
@Override
@@ -46,27 +71,10 @@ public IngredientPlacement getIngredientPlacement() {
4671
public RecipeBookCategory getRecipeBookCategory() {
4772
return null;
4873
}
49-
50-
public static class Serializer implements RecipeSerializer<PolymTableCraftingRecipe> {
51-
public static final MapCodec<PolymTableCraftingRecipe> CODEC = RecordCodecBuilder.mapCodec(inst -> inst.group(
52-
Ingredient.CODEC.fieldOf("ingredient").forGetter(PolymTableCraftingRecipe::inputItem),
53-
ItemStack.CODEC.fieldOf("result").forGetter(PolymTableCraftingRecipe::output)
54-
).apply(inst, PolymTableCraftingRecipe::new));
55-
56-
public static final PacketCodec<RegistryByteBuf, PolymTableCraftingRecipe> STREAM_CODEC =
57-
PacketCodec.tuple(
58-
Ingredient.PACKET_CODEC, PolymTableCraftingRecipe::inputItem,
59-
ItemStack.PACKET_CODEC, PolymTableCraftingRecipe::output,
60-
PolymTableCraftingRecipe::new);
61-
62-
@Override
63-
public MapCodec<PolymTableCraftingRecipe> codec() {
64-
return CODEC;
65-
}
66-
67-
@Override
68-
public PacketCodec<RegistryByteBuf, PolymTableCraftingRecipe> packetCodec() {
69-
return STREAM_CODEC;
70-
}
74+
public static class Type implements RecipeType<PolymTableCraftingRecipe> {
75+
// Define ExampleRecipe.Type as a singleton by making its constructor private and exposing an instance.
76+
private Type() {}
77+
public static final Type INSTANCE = new Type();
78+
public static final String ID = "two_slot_recipe";
7179
}
7280
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"inputA" : {
3+
"item": "minecraft:redstone"
4+
},
5+
"inputB": {
6+
"tag": "minecraft:logs"
7+
},
8+
"outputItem": "minecraft:cobblestone",
9+
"outputAmount": "20"
10+
}

0 commit comments

Comments
 (0)