From 88ece5adf56dfce1d83f47e2e8980353bd66ae1e Mon Sep 17 00:00:00 2001 From: Halbear Date: Mon, 3 Aug 2026 20:29:31 +0100 Subject: [PATCH] forging now works --- .../GuiScreens/ForgeWorkbenchGUIScreen.java | 15 +-- .../custom/blocks/Forge/ForgeItemRecipe.java | 4 +- .../blocks/Forge/ForgeItemsScrollList.java | 4 + .../blocks/Forge/ForgedAlloyRecipe.java | 15 +-- .../ForgeWorkbenchGuiButtonHandler.java | 111 ++++++++++++++++-- 5 files changed, 118 insertions(+), 31 deletions(-) diff --git a/src/main/java/net/halbear/aotg/custom/GuiScreens/ForgeWorkbenchGUIScreen.java b/src/main/java/net/halbear/aotg/custom/GuiScreens/ForgeWorkbenchGUIScreen.java index c888ae5..977f22e 100644 --- a/src/main/java/net/halbear/aotg/custom/GuiScreens/ForgeWorkbenchGUIScreen.java +++ b/src/main/java/net/halbear/aotg/custom/GuiScreens/ForgeWorkbenchGUIScreen.java @@ -4,10 +4,8 @@ import com.mojang.blaze3d.platform.InputConstants; import net.halbear.aotg.custom.blocks.Forge.ForgeItemRecipe; import net.halbear.aotg.custom.blocks.Forge.ForgeItemsScrollList; import net.halbear.aotg.custom.blocks.Forge.ForgeWorkbenchGUI; -import net.halbear.aotg.registries.ModBlocks; import net.halbear.aotg.registries.ModItems; import net.halbear.aotg.registries.ModScreens; -import net.halbear.aotg.utility.Networking.AlloyFurnaceGuiButtonHandler; import net.halbear.aotg.utility.Networking.ForgeWorkbenchGuiButtonHandler; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.components.ImageButton; @@ -15,15 +13,12 @@ import net.minecraft.client.gui.components.WidgetSprites; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.input.KeyEvent; import net.minecraft.client.renderer.RenderPipelines; -import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.resources.Identifier; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.client.network.ClientPacketDistributor; import java.util.ArrayList; @@ -35,7 +30,7 @@ public class ForgeWorkbenchGUIScreen extends AbstractContainerScreen { int x = ForgeWorkbenchGUIScreen.this.x; int y = ForgeWorkbenchGUIScreen.this.y; int z = ForgeWorkbenchGUIScreen.this.z; - ClientPacketDistributor.sendToServer(new ForgeWorkbenchGuiButtonHandler(0, x, y, z)); - ForgeWorkbenchGuiButtonHandler.handleButtonAction(entity, 0, x, y, z); + ClientPacketDistributor.sendToServer(new ForgeWorkbenchGuiButtonHandler(0,selectedStack.getItemName().getString(), x, y, z)); + ForgeWorkbenchGuiButtonHandler.handleButtonAction(entity,0, x, y, z,selectedStack.getItem()); }) { @Override public void extractContents(GuiGraphicsExtractor guiGraphics, int mouseX, int mouseY, float partialTicks) { guiGraphics.blit(RenderPipelines.GUI_TEXTURED, sprites.get(isActive(), isHoveredOrFocused()), getX(), getY(), 0, 0, width, height, width, height); } }; - this.addRenderableWidget(Blower); + this.addRenderableWidget(ForgeButton); } } diff --git a/src/main/java/net/halbear/aotg/custom/blocks/Forge/ForgeItemRecipe.java b/src/main/java/net/halbear/aotg/custom/blocks/Forge/ForgeItemRecipe.java index 296585a..16e9a8a 100644 --- a/src/main/java/net/halbear/aotg/custom/blocks/Forge/ForgeItemRecipe.java +++ b/src/main/java/net/halbear/aotg/custom/blocks/Forge/ForgeItemRecipe.java @@ -12,8 +12,8 @@ import java.util.*; import static net.halbear.aotg.custom.blocks.Forge.ForgedAlloyRecipe.GetRecipesContainingMetals; public record ForgeItemRecipe(Item primaryOutcomeItem, Item[] RequiredItems, int[] RequiredItemCounts) { - public static final Map FORGE_ITEM_RECIPE_MAP = new HashMap<>(); - public static final Map> ITEM_RECIPE_REVERSE_LOOKUP = new HashMap<>(); + public static final Map FORGE_ITEM_RECIPE_MAP = new LinkedHashMap<>(); + public static final Map> ITEM_RECIPE_REVERSE_LOOKUP = new LinkedHashMap<>(); static{ FORGE_ITEM_RECIPE_MAP.put(ModItems.XIPHOS_SWORD.asItem(),new ForgeItemRecipe(ModItems.XIPHOS_SWORD.asItem(),new Item[]{ModItems.BRONZE_INGOT.asItem(), Items.STICK},new int[]{2,1})); CompileReverseLookupMap(); diff --git a/src/main/java/net/halbear/aotg/custom/blocks/Forge/ForgeItemsScrollList.java b/src/main/java/net/halbear/aotg/custom/blocks/Forge/ForgeItemsScrollList.java index 508559b..8a09394 100644 --- a/src/main/java/net/halbear/aotg/custom/blocks/Forge/ForgeItemsScrollList.java +++ b/src/main/java/net/halbear/aotg/custom/blocks/Forge/ForgeItemsScrollList.java @@ -91,6 +91,10 @@ public class ForgeItemsScrollList extends ObjectSelectionList RecipeMap = new HashMap<>(); - public static final Map> ReverseLookupRecipeMap = new HashMap<>(); + public static final Map RecipeMap = new LinkedHashMap<>(); + public static final Map> ReverseLookupRecipeMap = new LinkedHashMap<>(); static { RecipeMap.put(ModItems.BRONZE_INGOT.asItem(), new ForgedAlloyRecipe(ModItems.BRONZE_INGOT.asItem(), Items.COPPER_INGOT, ModItems.TIN_INGOT.asItem(),9f)); RecipeMap.put(ModItems.ELECTRUM_INGOT.asItem(), new ForgedAlloyRecipe(ModItems.ELECTRUM_INGOT.asItem(), Items.GOLD_INGOT, ModItems.SILVER_INGOT.asItem(), 3f)); @@ -60,14 +57,14 @@ public record ForgedAlloyRecipe(Item OutcomeItem, Item RequiredMetal1, Item Requ if(Pot.getItem().equals(Items.DECORATED_POT)){ ItemContainerContents potContents = Pot.get(DataComponents.CONTAINER); if (potContents != null) { - boolean hasMarker = potContents.getStackInSlot(0).getItem().equals(ModItems.FLUID_INDICATOR_ITEM.asItem()); + boolean hasMarker = potContents.getSlots() == 3 && potContents.getStackInSlot(0).getItem().equals(ModItems.FLUID_INDICATOR_ITEM.asItem()); if (hasMarker) { ItemStack AlloyMetal1 = potContents.getStackInSlot(1); ItemStack AlloyMetal2 = potContents.getStackInSlot(2); availableRecipes = GetRecipesContainingMetals(AlloyMetal1.getItem(),AlloyMetal2.getItem()); availableRecipes.forEach(forgedAlloyRecipe -> { - double Ratio = Math.floor((float) AlloyMetal1.getCount() /(float)AlloyMetal2.getCount()); - if( Ratio == Math.floor(forgedAlloyRecipe.AlloyRatio)) { + double Ratio = ((float) AlloyMetal1.getCount() /(float)AlloyMetal2.getCount()); + if( (Ratio > forgedAlloyRecipe.AlloyRatio * 0.75 && Ratio < forgedAlloyRecipe.AlloyRatio * 1.25)) { ValidRecipes.add(forgedAlloyRecipe); } }); diff --git a/src/main/java/net/halbear/aotg/utility/Networking/ForgeWorkbenchGuiButtonHandler.java b/src/main/java/net/halbear/aotg/utility/Networking/ForgeWorkbenchGuiButtonHandler.java index 3057186..c2f3433 100644 --- a/src/main/java/net/halbear/aotg/utility/Networking/ForgeWorkbenchGuiButtonHandler.java +++ b/src/main/java/net/halbear/aotg/utility/Networking/ForgeWorkbenchGuiButtonHandler.java @@ -1,11 +1,14 @@ package net.halbear.aotg.utility.Networking; import net.halbear.aotg.AgeoftheGods; -import net.halbear.aotg.custom.blocks.AlloyFurnace.AlloyFurnaceBlockEntity; -import net.halbear.aotg.custom.blocks.AlloyFurnace.AlloyFurnaceUpdateHandler; -import net.halbear.aotg.registries.ModBlocks; +import net.halbear.aotg.custom.GuiScreens.ForgeWorkbenchGUIScreen; +import net.halbear.aotg.custom.blocks.Forge.ForgeItemRecipe; +import net.halbear.aotg.custom.blocks.Forge.ForgeWorkbenchBlockEntity; +import net.halbear.aotg.custom.blocks.Forge.ForgedAlloyRecipe; +import net.halbear.aotg.registries.ModItems; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; +import net.minecraft.core.component.DataComponents; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.codec.StreamCodec; @@ -13,6 +16,10 @@ import net.minecraft.network.protocol.PacketFlow; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.Identifier; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.component.ItemContainerContents; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -23,41 +30,125 @@ import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; import net.neoforged.neoforge.network.handling.IPayloadContext; import net.neoforged.neoforge.network.registration.PayloadRegistrar; -import static net.halbear.aotg.custom.blocks.AlloyFurnace.AlloyFurnaceMultiBlock.MODEL_PART; -import static net.halbear.aotg.custom.blocks.AlloyFurnace.AlloyFurnaceMultiBlock.PARENT_BLOCK; +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; @EventBusSubscriber -public record ForgeWorkbenchGuiButtonHandler(int buttonID, int x, int y, int z) implements CustomPacketPayload { +public record ForgeWorkbenchGuiButtonHandler(int buttonID, String ResultItem, int x, int y, int z) implements CustomPacketPayload { public static final Type TYPE = new Type<>(Identifier.fromNamespaceAndPath(AgeoftheGods.MODID, "forge_workbench_buttons")); public static final StreamCodec STREAM_CODEC = StreamCodec.of((RegistryFriendlyByteBuf buffer, ForgeWorkbenchGuiButtonHandler message) -> { buffer.writeInt(message.buttonID); + buffer.writeByteArray(message.ResultItem.getBytes(Charset.defaultCharset())); buffer.writeInt(message.x); buffer.writeInt(message.y); buffer.writeInt(message.z); - }, (RegistryFriendlyByteBuf buffer) -> new ForgeWorkbenchGuiButtonHandler(buffer.readInt(), buffer.readInt(), buffer.readInt(), buffer.readInt())); + }, (RegistryFriendlyByteBuf buffer) -> new ForgeWorkbenchGuiButtonHandler(buffer.readInt(),new String(buffer.readByteArray(),Charset.defaultCharset()), buffer.readInt(), buffer.readInt(), buffer.readInt())); @Override public Type type() { return TYPE; } + public static Map ItemLookupMap = new HashMap<>(); + public static void handleData(final ForgeWorkbenchGuiButtonHandler message, final IPayloadContext context) { if (context.flow() == PacketFlow.SERVERBOUND) { - context.enqueueWork(() -> handleButtonAction(context.player(), message.buttonID, message.x, message.y, message.z)).exceptionally(e -> { + ItemLookupMap.clear(); + ForgeItemRecipe.RecipeSet set = ForgeItemRecipe.GetAllValidRecipesFromContainer(ItemStack.EMPTY, ItemStack.EMPTY); + for(int i = 0; i < set.ItemRecipes().size(); i++){ + ItemLookupMap.put(new ItemStack(set.ItemRecipes().get(i).primaryOutcomeItem()).getItemName().getString(), set.ItemRecipes().get(i).primaryOutcomeItem()); + } + for(int i = 0; i < set.AlloyRecipes().size(); i++){ + ItemLookupMap.put(new ItemStack(set.AlloyRecipes().get(i).OutcomeItem()).getItemName().getString(), set.AlloyRecipes().get(i).OutcomeItem()); + } + context.enqueueWork(() -> handleButtonAction(context.player(), message.buttonID, message.x, message.y, message.z, ItemLookupMap.get(message.ResultItem))).exceptionally(e -> { context.connection().disconnect(Component.literal(e.getMessage())); return null; }); } } - public static void handleButtonAction(Player entity, int buttonID, int x, int y, int z) { + public static ItemStack[] CraftAlloy(ItemStack Pot, Item TargetItem,ItemContainerContents potContents, ForgedAlloyRecipe alloy_recipe){ + ItemStack[] returnVal = new ItemStack[]{ItemStack.EMPTY,ItemStack.EMPTY,ItemStack.EMPTY}; + ItemStack AlloyMetal1 = potContents.getStackInSlot(1); + ItemStack AlloyMetal2 = potContents.getStackInSlot(2); + if (alloy_recipe != null) { + float Ratio = alloy_recipe.AlloyRatio(); + float InRatio = AlloyMetal1.getCount() / (float) AlloyMetal2.getCount(); + int RequiredIngots1 = Ratio < 1 ? 1 : (int) Math.floor(Ratio); + int RequiredIngots2 = Ratio < 1 ? (int) Math.floor(1 / Ratio) : 1; + if ((InRatio > Ratio * 0.75 && InRatio < Ratio * 1.25)) { + int Overfow = AlloyMetal1.getCount() % RequiredIngots1; + float SetsProduced = (float) AlloyMetal1.getCount() / (float) RequiredIngots1; + int IngotsProduced = (int)Math.floor((RequiredIngots1 + RequiredIngots2) * SetsProduced) - Overfow; + int SlagProduced = AlloyMetal1.getCount() + AlloyMetal2.getCount() - IngotsProduced; + returnVal[0] = (new ItemStack(Items.DECORATED_POT, 1)); + returnVal[1] = (new ItemStack(alloy_recipe.OutcomeItem(), IngotsProduced)); + returnVal[2] = (new ItemStack(ModItems.HARDENED_SLAG.asItem(), SlagProduced)); + } else{ + int SlagProduced = AlloyMetal1.getCount() + AlloyMetal2.getCount(); + returnVal[0] = (new ItemStack(Items.DECORATED_POT, 1)); + returnVal[1] = (ItemStack.EMPTY); + returnVal[2] = (new ItemStack(ModItems.HARDENED_SLAG.asItem(), SlagProduced)); + } + } else{ + int SlagProduced = AlloyMetal1.getCount() + AlloyMetal2.getCount(); + returnVal[0] = (new ItemStack(Items.DECORATED_POT, 1)); + returnVal[1] = (ItemStack.EMPTY); + returnVal[2] = (new ItemStack(ModItems.HARDENED_SLAG.asItem(), SlagProduced)); + } + return returnVal; + } + + public static void handleButtonAction(Player entity, int buttonID, int x, int y, int z, Item TargetItem) { Level world = entity.level(); - if (!world.getChunkSource().hasChunk(SectionPos.blockToSectionCoord(x), SectionPos.blockToSectionCoord(z))) + if (!world.getChunkSource().hasChunk(SectionPos.blockToSectionCoord(x), SectionPos.blockToSectionCoord(z)) || TargetItem == null) return; if (buttonID == 0) { + AgeoftheGods.LOGGER.debug("ITEM RECIEVED: " + TargetItem.toString()); + BlockPos TargetPos = new BlockPos(x,y,z); + BlockState blockstate = world.getBlockState(new BlockPos(x,y,z)); + BlockEntity blockEntity = world.getBlockEntity(new BlockPos(TargetPos)); + if(blockEntity instanceof ForgeWorkbenchBlockEntity forgeWorkbenchBlockEntity){ + ItemStack Pot = forgeWorkbenchBlockEntity.getItem(0); + if(Pot.getItem().equals(Items.DECORATED_POT)) { + ItemContainerContents potContents = Pot.get(DataComponents.CONTAINER); + if (potContents != null) { + boolean hasMarker = potContents.getSlots() == 3 && potContents.getStackInSlot(0).getItem().equals(ModItems.FLUID_INDICATOR_ITEM.asItem()); + if (hasMarker) { + ForgedAlloyRecipe alloy_recipe = ForgedAlloyRecipe.RecipeMap.get(TargetItem); + ForgeItemRecipe item_recipe = ForgeItemRecipe.FORGE_ITEM_RECIPE_MAP.get(TargetItem); + ItemStack Secondary = forgeWorkbenchBlockEntity.getItem(1); + if(alloy_recipe != null){ + ItemStack[] CraftResult = CraftAlloy(Pot, TargetItem, potContents, alloy_recipe); + forgeWorkbenchBlockEntity.setItem(0,CraftResult[0]); + forgeWorkbenchBlockEntity.setItem(2,CraftResult[1]); + forgeWorkbenchBlockEntity.setItem(4,CraftResult[2]); + } else if(item_recipe != null){ + ItemStack[] CraftResult = CraftAlloy(Pot, TargetItem, potContents, ForgedAlloyRecipe.RecipeMap.get(item_recipe.RequiredItems()[0].asItem())); + forgeWorkbenchBlockEntity.setItem(0,CraftResult[0]); + ItemStack Alloy = CraftResult[1]; + ItemStack Slag = CraftResult[2]; + ItemStack ResultItem = ItemStack.EMPTY; + if(Alloy.getItem() == item_recipe.RequiredItems()[0] && Alloy.getCount() >= item_recipe.RequiredItemCounts()[0] + && Secondary.getItem() == item_recipe.RequiredItems()[1] && Secondary.getCount() >= item_recipe.RequiredItemCounts()[1]){ + Alloy.setCount(Alloy.getCount() - item_recipe.RequiredItemCounts()[0]); + Secondary.setCount(Secondary.getCount() - item_recipe.RequiredItemCounts()[1]); + ResultItem = new ItemStack(item_recipe.primaryOutcomeItem(), 1); + } + forgeWorkbenchBlockEntity.setItem(2,ResultItem); + forgeWorkbenchBlockEntity.setItem(3,Alloy); + forgeWorkbenchBlockEntity.setItem(4,Slag); + } + } + } + } + } } } + @SubscribeEvent public static void registerMessage(final RegisterPayloadHandlersEvent event) { final PayloadRegistrar registrar = event.registrar("1.0.0");