From 92252f1c85e7a1881df0c8f1467d89971db29c36 Mon Sep 17 00:00:00 2001 From: MCTBL Date: Wed, 18 Feb 2026 23:36:44 +0800 Subject: [PATCH 01/14] quickly insert pattern --- .../tools/blocks/ToolStationBlock.java | 21 +++++++++++++++++++ .../tools/logic/PatternChestLogic.java | 12 +++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java b/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java index 89321b3af1c..cf7822cd9b2 100644 --- a/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java +++ b/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java @@ -243,4 +243,25 @@ public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase l } super.onBlockPlacedBy(world, x, y, z, living, stack); } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float clickX, + float clickY, float clickZ) { + int blockMeta = world.getBlockMetadata(x, y, z); + if (blockMeta <= 9 && blockMeta >= 5 && !player.isSneaking()) { + // is the pattern chest and player is not holding shift key + ItemStack itemInHand = player.getHeldItem(); + PatternChestLogic logic = (PatternChestLogic) world.getTileEntity(x, y, z); + if (logic.isItemValidForSlot(0, itemInHand)) { + // is the player holding a tinker pattern + if (!logic.insertItemStackIntoInventory(itemInHand)) { + // try insert into chest + // if fail, just do the same thing as default + super.onBlockActivated(world, x, y, z, player, side, clickX, clickY, clickZ); + } + return true; + } + } + return super.onBlockActivated(world, x, y, z, player, side, clickX, clickY, clickZ); + } } diff --git a/src/main/java/tconstruct/tools/logic/PatternChestLogic.java b/src/main/java/tconstruct/tools/logic/PatternChestLogic.java index f805c064291..b468efed454 100644 --- a/src/main/java/tconstruct/tools/logic/PatternChestLogic.java +++ b/src/main/java/tconstruct/tools/logic/PatternChestLogic.java @@ -50,4 +50,16 @@ public void openInventory() {} @Override public void closeInventory() {} + + public boolean insertItemStackIntoInventory(ItemStack stack) { + for (int i = 0; i < this.inventory.length; i++) { + if (this.inventory[i] == null) { + this.inventory[i] = stack.copy(); + stack.stackSize = 0; + this.markDirty(); + return true; + } + } + return false; + } } From 38100d3c409c45bcaa51d1ec7b48c3e6b8bde590 Mon Sep 17 00:00:00 2001 From: MCTBL Date: Thu, 19 Feb 2026 06:21:19 +0800 Subject: [PATCH 02/14] Code Optimization --- .../tconstruct/tools/blocks/ToolStationBlock.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java b/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java index cf7822cd9b2..2517e33981f 100644 --- a/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java +++ b/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java @@ -23,6 +23,7 @@ import mantle.blocks.abstracts.InventoryBlock; import tconstruct.TConstruct; import tconstruct.library.TConstructRegistry; +import tconstruct.library.util.IPattern; import tconstruct.tools.TinkerTools; import tconstruct.tools.logic.PartBuilderLogic; import tconstruct.tools.logic.PatternChestLogic; @@ -247,19 +248,15 @@ public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase l @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float clickX, float clickY, float clickZ) { - int blockMeta = world.getBlockMetadata(x, y, z); - if (blockMeta <= 9 && blockMeta >= 5 && !player.isSneaking()) { + if (world.getTileEntity(x, y, z) instanceof PatternChestLogic logic && !player.isSneaking()) { // is the pattern chest and player is not holding shift key ItemStack itemInHand = player.getHeldItem(); - PatternChestLogic logic = (PatternChestLogic) world.getTileEntity(x, y, z); - if (logic.isItemValidForSlot(0, itemInHand)) { + if (itemInHand.getItem() instanceof IPattern) { // is the player holding a tinker pattern - if (!logic.insertItemStackIntoInventory(itemInHand)) { + if (logic.insertItemStackIntoInventory(itemInHand)) { // try insert into chest - // if fail, just do the same thing as default - super.onBlockActivated(world, x, y, z, player, side, clickX, clickY, clickZ); + return true; } - return true; } } return super.onBlockActivated(world, x, y, z, player, side, clickX, clickY, clickZ); From 8e843dc033dc03d0878780129b3dba5619023ecc Mon Sep 17 00:00:00 2001 From: MCTBL Date: Tue, 24 Feb 2026 23:50:26 +0800 Subject: [PATCH 03/14] temp --- .../java/tconstruct/tools/TinkerTools.java | 2 + .../tconstruct/tools/ToolProxyClient.java | 18 ++++ .../tconstruct/tools/ToolProxyCommon.java | 2 + .../tconstruct/tools/blocks/CraftingSlab.java | 9 +- .../tools/blocks/ToolStationBlock.java | 17 +++- .../tconstruct/tools/gui/PartChestGui.java | 43 ++++++++++ .../tools/inventory/PartChestContainer.java | 80 ++++++++++++++++++ .../tconstruct/tools/inventory/SlotPart.java | 23 +++++ .../itemblocks/CraftingSlabItemBlock.java | 2 +- .../itemblocks/ToolStationItemBlock.java | 2 +- .../tools/logic/PartChestLogic.java | 65 ++++++++++++++ .../resources/assets/tinker/lang/en_US.lang | 1 + .../resources/assets/tinker/lang/zh_CN.lang | 1 + .../textures/blocks/partchest_bottom.png | Bin 0 -> 1850 bytes .../tinker/textures/blocks/partchest_side.png | Bin 0 -> 1855 bytes .../textures/blocks/partchest_slab_side.png | Bin 0 -> 1673 bytes .../tinker/textures/blocks/partchest_top.png | Bin 0 -> 1850 bytes .../assets/tinker/textures/gui/partchest.png | Bin 0 -> 1189 bytes 18 files changed, 257 insertions(+), 8 deletions(-) create mode 100644 src/main/java/tconstruct/tools/gui/PartChestGui.java create mode 100644 src/main/java/tconstruct/tools/inventory/PartChestContainer.java create mode 100644 src/main/java/tconstruct/tools/inventory/SlotPart.java create mode 100644 src/main/java/tconstruct/tools/logic/PartChestLogic.java create mode 100644 src/main/resources/assets/tinker/textures/blocks/partchest_bottom.png create mode 100644 src/main/resources/assets/tinker/textures/blocks/partchest_side.png create mode 100644 src/main/resources/assets/tinker/textures/blocks/partchest_slab_side.png create mode 100644 src/main/resources/assets/tinker/textures/blocks/partchest_top.png create mode 100644 src/main/resources/assets/tinker/textures/gui/partchest.png diff --git a/src/main/java/tconstruct/tools/TinkerTools.java b/src/main/java/tconstruct/tools/TinkerTools.java index 6be5689be77..079f17fad11 100644 --- a/src/main/java/tconstruct/tools/TinkerTools.java +++ b/src/main/java/tconstruct/tools/TinkerTools.java @@ -109,6 +109,7 @@ import tconstruct.tools.logic.FrypanLogic; import tconstruct.tools.logic.FurnaceLogic; import tconstruct.tools.logic.PartBuilderLogic; +import tconstruct.tools.logic.PartChestLogic; import tconstruct.tools.logic.PatternChestLogic; import tconstruct.tools.logic.StencilTableLogic; import tconstruct.tools.logic.ToolForgeLogic; @@ -251,6 +252,7 @@ public void preInit(FMLPreInitializationEvent event) { GameRegistry.registerTileEntity(ToolStationLogic.class, "ToolStation"); GameRegistry.registerTileEntity(PartBuilderLogic.class, "PartCrafter"); GameRegistry.registerTileEntity(PatternChestLogic.class, "PatternHolder"); + GameRegistry.registerTileEntity(PartChestLogic.class, "PartHolder"); GameRegistry.registerTileEntity(StencilTableLogic.class, "PatternShaper"); GameRegistry.registerBlock(TinkerTools.toolForge, MetadataItemBlock.class, "ToolForgeBlock"); GameRegistry.registerTileEntity(ToolForgeLogic.class, "ToolForge"); diff --git a/src/main/java/tconstruct/tools/ToolProxyClient.java b/src/main/java/tconstruct/tools/ToolProxyClient.java index 2d0aa7da101..a48025d9795 100644 --- a/src/main/java/tconstruct/tools/ToolProxyClient.java +++ b/src/main/java/tconstruct/tools/ToolProxyClient.java @@ -52,6 +52,7 @@ import tconstruct.tools.gui.CraftingStationGui; import tconstruct.tools.gui.FrypanGui; import tconstruct.tools.gui.FurnaceGui; +import tconstruct.tools.gui.PartChestGui; import tconstruct.tools.gui.PartCrafterGui; import tconstruct.tools.gui.PatternChestGui; import tconstruct.tools.gui.StencilTableGui; @@ -62,6 +63,7 @@ import tconstruct.tools.logic.FrypanLogic; import tconstruct.tools.logic.FurnaceLogic; import tconstruct.tools.logic.PartBuilderLogic; +import tconstruct.tools.logic.PartChestLogic; import tconstruct.tools.logic.PatternChestLogic; import tconstruct.tools.logic.StencilTableLogic; import tconstruct.tools.logic.ToolForgeLogic; @@ -297,6 +299,7 @@ public void registerManualIcons() { MantleClientRegistry.registerManualIcon("toolstation", new ItemStack(TinkerTools.toolStationWood, 1, 0)); MantleClientRegistry.registerManualIcon("partcrafter", new ItemStack(TinkerTools.toolStationWood, 1, 1)); MantleClientRegistry.registerManualIcon("patternchest", new ItemStack(TinkerTools.toolStationWood, 1, 5)); + MantleClientRegistry.registerManualIcon("partchest", new ItemStack(TinkerTools.toolStationWood, 1, 6)); MantleClientRegistry.registerManualIcon("stenciltable", new ItemStack(TinkerTools.toolStationWood, 1, 10)); // TODO: Untwine this @@ -397,6 +400,13 @@ void registerManualRecipes() { pattern, null, chest); + MantleClientRegistry.registerManualSmallRecipe( + "partchest", + new ItemStack(TinkerTools.toolStationWood, 1, 6), + null, + stick, + null, + chest); MantleClientRegistry.registerManualSmallRecipe( "stenciltable", new ItemStack(TinkerTools.toolStationWood, 1, 10), @@ -596,6 +606,7 @@ protected void registerGuiHandler() { TProxyCommon.registerClientGuiHandler(toolStationID, this); TProxyCommon.registerClientGuiHandler(partBuilderID, this); TProxyCommon.registerClientGuiHandler(patternChestID, this); + TProxyCommon.registerClientGuiHandler(partChestID, this); TProxyCommon.registerClientGuiHandler(stencilTableID, this); TProxyCommon.registerClientGuiHandler(frypanGuiID, this); TProxyCommon.registerClientGuiHandler(toolForgeID, this); @@ -627,6 +638,13 @@ public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, y, z); + if (ID == ToolProxyCommon.partChestID) return new PartChestGui( + player.inventory, + (PartChestLogic) world.getTileEntity(x, y, z), + world, + x, + y, + z); if (ID == ToolProxyCommon.frypanGuiID) return new FrypanGui(player.inventory, (FrypanLogic) world.getTileEntity(x, y, z), world, x, y, z); if (ID == ToolProxyCommon.battlesignTextID) diff --git a/src/main/java/tconstruct/tools/ToolProxyCommon.java b/src/main/java/tconstruct/tools/ToolProxyCommon.java index f8fc1e17ee4..2803ff85eca 100644 --- a/src/main/java/tconstruct/tools/ToolProxyCommon.java +++ b/src/main/java/tconstruct/tools/ToolProxyCommon.java @@ -16,6 +16,7 @@ public class ToolProxyCommon implements IGuiHandler { public static final int stencilTableID = 3; public static final int frypanGuiID = 4; public static final int toolForgeID = 5; + public static final int partChestID = 6; public static final int furnaceID = 8; public static final int craftingStationID = 11; public static final int battlesignTextID = 12; @@ -33,6 +34,7 @@ protected void registerGuiHandler() { TProxyCommon.registerServerGuiHandler(stencilTableID, this); TProxyCommon.registerServerGuiHandler(frypanGuiID, this); TProxyCommon.registerServerGuiHandler(toolForgeID, this); + TProxyCommon.registerServerGuiHandler(partChestID, this); TProxyCommon.registerServerGuiHandler(furnaceID, this); TProxyCommon.registerServerGuiHandler(craftingStationID, this); } diff --git a/src/main/java/tconstruct/tools/blocks/CraftingSlab.java b/src/main/java/tconstruct/tools/blocks/CraftingSlab.java index fa3d1d6cfba..46d1900f5c0 100644 --- a/src/main/java/tconstruct/tools/blocks/CraftingSlab.java +++ b/src/main/java/tconstruct/tools/blocks/CraftingSlab.java @@ -25,6 +25,7 @@ import tconstruct.tools.ToolProxyCommon; import tconstruct.tools.logic.CraftingStationLogic; import tconstruct.tools.logic.PartBuilderLogic; +import tconstruct.tools.logic.PartChestLogic; import tconstruct.tools.logic.PatternChestLogic; import tconstruct.tools.logic.StencilTableLogic; import tconstruct.tools.logic.ToolForgeLogic; @@ -47,7 +48,8 @@ public String[] getTextureNames() { "toolstation_top", "toolstation_slab_side", "toolstation_bottom", "partbuilder_oak_top", "partbuilder_slab_side", "partbuilder_oak_bottom", "stenciltable_oak_top", "stenciltable_slab_side", "stenciltable_oak_bottom", "patternchest_top", "patternchest_slab_side", "patternchest_bottom", - "toolforge_top", "toolforge_slab_side", "toolforge_top" }; + "toolforge_top", "toolforge_slab_side", "toolforge_top", + "partchest_top", "partchest_slab_side", "partchest_bottom" }; } @Override @@ -71,7 +73,7 @@ public int getTextureIndex(int side) { @Override public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { int metadata = world.getBlockMetadata(x, y, z); - if (metadata == 5) return AxisAlignedBB.getBoundingBox( + if (metadata == 5 || metadata == 6) return AxisAlignedBB.getBoundingBox( (double) x + this.minX, (double) y + this.minY, (double) z + this.minZ, @@ -96,6 +98,7 @@ public TileEntity createTileEntity(World world, int metadata) { case 3 -> new StencilTableLogic(); case 4 -> new PatternChestLogic(); case 5 -> new ToolForgeLogic(); + case 6 -> new PartChestLogic(); default -> null; }; } @@ -110,6 +113,7 @@ public Integer getGui(World world, int x, int y, int z, EntityPlayer entityplaye case 3 -> ToolProxyCommon.stencilTableID; case 4 -> ToolProxyCommon.patternChestID; case 5 -> ToolProxyCommon.toolForgeID; + case 6 -> ToolProxyCommon.partChestID; default -> -1; }; @@ -163,6 +167,7 @@ public TileEntity createNewTileEntity(World var1, int metadata) { case 3 -> new StencilTableLogic(); case 4 -> new PatternChestLogic(); case 5 -> new ToolForgeLogic(); + case 6 -> new PartChestLogic(); default -> null; }; } diff --git a/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java b/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java index 2517e33981f..451354c8985 100644 --- a/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java +++ b/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java @@ -26,6 +26,7 @@ import tconstruct.library.util.IPattern; import tconstruct.tools.TinkerTools; import tconstruct.tools.logic.PartBuilderLogic; +import tconstruct.tools.logic.PartChestLogic; import tconstruct.tools.logic.PatternChestLogic; import tconstruct.tools.logic.StencilTableLogic; import tconstruct.tools.logic.ToolStationLogic; @@ -51,6 +52,7 @@ public String[] getTextureNames() { "partbuilder_spruce_bottom", "partbuilder_birch_top", "partbuilder_birch_side", "partbuilder_birch_bottom", "partbuilder_jungle_top", "partbuilder_jungle_side", "partbuilder_jungle_bottom", "patternchest_top", "patternchest_side", "patternchest_bottom", + "partchest_top", "partchest_side", "partchest_bottom", "stenciltable_oak_top", "stenciltable_oak_side", "stenciltable_oak_bottom", "stenciltable_spruce_top", "stenciltable_spruce_side", "stenciltable_spruce_bottom", "stenciltable_birch_top", "stenciltable_birch_side", "stenciltable_birch_bottom", "stenciltable_jungle_top", @@ -61,11 +63,17 @@ public String[] getTextureNames() { @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int meta) { if (meta <= 4) { + // toolstation && partbuilder return icons[meta * 3 + getTextureIndex(side)]; - } else if (meta <= 9) { + } else if (meta == 5) { + // patternchest meta == 5 return icons[15 + getTextureIndex(side)]; + } else if (meta <= 9) { + // partchest meta == 6 + return icons[18 + getTextureIndex(side)]; } else { - return icons[meta * 3 + getTextureIndex(side) - 12]; + // stenciltable + return icons[meta * 3 + getTextureIndex(side) - 9]; } } @@ -104,7 +112,7 @@ public boolean shouldSideBeRendered(IBlockAccess par1IBlockAccess, int par2, int @Override public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { int metadata = world.getBlockMetadata(x, y, z); - if (metadata == 5) return AxisAlignedBB.getBoundingBox( + if (metadata == 5 || metadata == 6) return AxisAlignedBB.getBoundingBox( (double) x + this.minX, (double) y + this.minY, (double) z + this.minZ, @@ -125,7 +133,8 @@ public TileEntity createNewTileEntity(World world, int metadata) { return switch (metadata) { case 0 -> new ToolStationLogic(); case 1, 3, 2, 4 -> new PartBuilderLogic(); - case 5, 9, 8, 7, 6 -> new PatternChestLogic(); + case 5, 9, 8, 7 -> new PatternChestLogic(); + case 6 -> new PartChestLogic(); case 10, 13, 12, 11 -> new StencilTableLogic(); default -> null; }; diff --git a/src/main/java/tconstruct/tools/gui/PartChestGui.java b/src/main/java/tconstruct/tools/gui/PartChestGui.java new file mode 100644 index 00000000000..66d3c26bcf8 --- /dev/null +++ b/src/main/java/tconstruct/tools/gui/PartChestGui.java @@ -0,0 +1,43 @@ +package tconstruct.tools.gui; + +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import org.lwjgl.opengl.GL11; + +import tconstruct.tools.logic.PartChestLogic; +import tconstruct.tools.logic.PatternChestLogic; + +public class PartChestGui extends GuiContainer { + + public PartChestLogic logic; + + public PartChestGui(InventoryPlayer inventoryplayer, PartChestLogic holder, World world, int x, int y, + int z) { + super(holder.getGuiContainer(inventoryplayer, world, x, y, z)); + logic = holder; + xSize = 194; + ySize = 168; + } + + @Override + protected void drawGuiContainerForegroundLayer(int par1, int par2) { + fontRendererObj.drawString(StatCollector.translateToLocal("inventory.PartChest"), 60, 6, 0x404040); + fontRendererObj + .drawString(StatCollector.translateToLocal("container.inventory"), 17, (ySize - 96) + 2, 0x404040); + } + + private static final ResourceLocation background = new ResourceLocation("tinker", "textures/gui/partchest.png"); + + @Override + protected void drawGuiContainerBackgroundLayer(float f, int i, int j) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(background); + int cornerX = (width - xSize) / 2; + int cornerY = (height - ySize) / 2; + drawTexturedModalRect(cornerX, cornerY, 0, 0, xSize, ySize); + } +} diff --git a/src/main/java/tconstruct/tools/inventory/PartChestContainer.java b/src/main/java/tconstruct/tools/inventory/PartChestContainer.java new file mode 100644 index 00000000000..e891e61dd4e --- /dev/null +++ b/src/main/java/tconstruct/tools/inventory/PartChestContainer.java @@ -0,0 +1,80 @@ +package tconstruct.tools.inventory; + +import invtweaks.api.container.ChestContainer; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import tconstruct.library.util.IToolPart; +import tconstruct.tools.TinkerTools; +import tconstruct.tools.logic.PartChestLogic; + +@ChestContainer +public class PartChestContainer extends Container { + + public PartChestLogic logic; + + public PartChestContainer(InventoryPlayer inventoryplayer, PartChestLogic chest) { + logic = chest; + for (int column = 0; column < 3; column++) { + for (int row = 0; row < 10; row++) { + this.addSlotToContainer(new SlotPart(chest, row + column * 10, 8 + row * 18, 18 + column * 18)); + } + } + + /* Player inventory */ + for (int column = 0; column < 3; column++) { + for (int row = 0; row < 9; row++) { + this.addSlotToContainer( + new Slot(inventoryplayer, row + column * 9 + 9, 17 + row * 18, 86 + column * 18)); + } + } + + for (int column = 0; column < 9; column++) { + this.addSlotToContainer(new Slot(inventoryplayer, column, 17 + column * 18, 144)); + } + } + + @Override + public boolean canInteractWith(EntityPlayer entityplayer) { + Block block = logic.getWorldObj().getBlock(logic.xCoord, logic.yCoord, logic.zCoord); + if (block != TinkerTools.toolStationWood && block != TinkerTools.craftingSlabWood) return false; + return logic.isUseableByPlayer(entityplayer); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slotID) { + ItemStack stack = null; + Slot slot = (Slot) this.inventorySlots.get(slotID); + + if (slot != null && slot.getHasStack()) { + ItemStack slotStack = slot.getStack(); + stack = slotStack.copy(); + + if (slotID < logic.getSizeInventory()) { + if (!this.mergeItemStack(slotStack, logic.getSizeInventory(), this.inventorySlots.size(), true)) { + return null; + } + } else if (!this.mergeItemStack(slotStack, 0, logic.getSizeInventory(), false)) { + return null; + } + + if (slotStack.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + } + + return stack; + } + + @Override + protected boolean mergeItemStack(ItemStack stack, int inventorySize, int slotSize, boolean par4) { + if (!(stack.getItem() instanceof IToolPart)) return false; + + return super.mergeItemStack(stack, inventorySize, slotSize, par4); + } +} diff --git a/src/main/java/tconstruct/tools/inventory/SlotPart.java b/src/main/java/tconstruct/tools/inventory/SlotPart.java new file mode 100644 index 00000000000..7465a417afe --- /dev/null +++ b/src/main/java/tconstruct/tools/inventory/SlotPart.java @@ -0,0 +1,23 @@ +package tconstruct.tools.inventory; + +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +import tconstruct.library.util.IPattern; +import tconstruct.library.util.IToolPart; + +public class SlotPart extends Slot { + + public SlotPart(IInventory builder, int par3, int par4, int par5) { + super(builder, par3, par4, par5); + } + + /** + * Check if the stack is a valid item for this slot. Always true beside for the armor slots. + */ + @Override + public boolean isItemValid(ItemStack stack) { + return stack.getItem() instanceof IToolPart; + } +} diff --git a/src/main/java/tconstruct/tools/itemblocks/CraftingSlabItemBlock.java b/src/main/java/tconstruct/tools/itemblocks/CraftingSlabItemBlock.java index 3f304c6c7e4..13bdc9c8a38 100644 --- a/src/main/java/tconstruct/tools/itemblocks/CraftingSlabItemBlock.java +++ b/src/main/java/tconstruct/tools/itemblocks/CraftingSlabItemBlock.java @@ -9,7 +9,7 @@ public class CraftingSlabItemBlock extends MultiItemBlock { public static final String[] blockTypes = { "tile.CraftingStation", "Crafter", "Parts", "PatternShaper", - "PatternChest", "tile.ToolForge" }; + "PatternChest", "tile.ToolForge", "PartChest" }; public CraftingSlabItemBlock(Block b) { super(b, "ToolStation", blockTypes); diff --git a/src/main/java/tconstruct/tools/itemblocks/ToolStationItemBlock.java b/src/main/java/tconstruct/tools/itemblocks/ToolStationItemBlock.java index 931a038b3ac..5f9560318d7 100644 --- a/src/main/java/tconstruct/tools/itemblocks/ToolStationItemBlock.java +++ b/src/main/java/tconstruct/tools/itemblocks/ToolStationItemBlock.java @@ -7,7 +7,7 @@ public class ToolStationItemBlock extends MultiItemBlock { public static final String[] blockTypes = { "Crafter", "Parts", "Parts", "Parts", "Parts", "PatternChest", - "PatternChest", "PatternChest", "PatternChest", "PatternChest", "PatternShaper", "PatternShaper", + "PartChest", "PartChest", "PartChest", "PartChest", "PatternShaper", "PatternShaper", "PatternShaper", "PatternShaper", "CastingTable" }; public ToolStationItemBlock(Block b) { diff --git a/src/main/java/tconstruct/tools/logic/PartChestLogic.java b/src/main/java/tconstruct/tools/logic/PartChestLogic.java new file mode 100644 index 00000000000..78dbd3db734 --- /dev/null +++ b/src/main/java/tconstruct/tools/logic/PartChestLogic.java @@ -0,0 +1,65 @@ +package tconstruct.tools.logic; + +import mantle.blocks.abstracts.InventoryLogic; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import tconstruct.library.util.IPattern; +import tconstruct.library.util.IToolPart; +import tconstruct.tools.inventory.PartChestContainer; + +public class PartChestLogic extends InventoryLogic { + + public PartChestLogic() { + super(30); + } + + @Override + public boolean canUpdate() { + return false; + } + + @Override + public String getDefaultName() { + return "toolstation.partholder"; + } + + @Override + public Container getGuiContainer(InventoryPlayer inventoryplayer, World world, int x, int y, int z) { + return new PartChestContainer(inventoryplayer, this); + } + + @Override + public String getInventoryName() { + return getDefaultName(); + } + + @Override + public boolean hasCustomInventoryName() { + return true; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack itemstack) { + return itemstack != null && itemstack.getItem() instanceof IToolPart; + } + + @Override + public void openInventory() {} + + @Override + public void closeInventory() {} + + public boolean insertItemStackIntoInventory(ItemStack stack) { + for (int i = 0; i < this.inventory.length; i++) { + if (this.inventory[i] == null) { + this.inventory[i] = stack.copy(); + stack.stackSize = 0; + this.markDirty(); + return true; + } + } + return false; + } +} diff --git a/src/main/resources/assets/tinker/lang/en_US.lang b/src/main/resources/assets/tinker/lang/en_US.lang index 97f5328c570..8175270f1ff 100644 --- a/src/main/resources/assets/tinker/lang/en_US.lang +++ b/src/main/resources/assets/tinker/lang/en_US.lang @@ -23,6 +23,7 @@ tile.ToolStation.name=Tool Station ToolStation.Crafter.name=Tool Station ToolStation.Parts.name=Part Builder ToolStation.PatternChest.name=Pattern Chest +ToolStation.PartChest.name=Part Chest ToolStation.PatternShaper.name=Stencil Table ToolStation.CastingTable.name=Casting Table tile.FurnaceSlab.name=Slab Furnace diff --git a/src/main/resources/assets/tinker/lang/zh_CN.lang b/src/main/resources/assets/tinker/lang/zh_CN.lang index 2b11b5c0765..0ca93f32a1e 100644 --- a/src/main/resources/assets/tinker/lang/zh_CN.lang +++ b/src/main/resources/assets/tinker/lang/zh_CN.lang @@ -21,6 +21,7 @@ nei.options.keys.gui.tinkers_belt=切换旅行者腰带 ToolStation.Crafter.name=工具组装台 ToolStation.Parts.name=部件加工台 ToolStation.PatternChest.name=模具箱 +ToolStation.PartChest.name=部件箱 ToolStation.PatternShaper.name=模具加工台 ToolStation.CastingTable.name=浇铸台 tile.FurnaceSlab.name=半砖熔炉 diff --git a/src/main/resources/assets/tinker/textures/blocks/partchest_bottom.png b/src/main/resources/assets/tinker/textures/blocks/partchest_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..474f3bd27ffd54aea4d2933310e277904483d88c GIT binary patch literal 1850 zcmbVN3ry5z9PeG2B7!>6=!|hq-4fWiYp?fgGU6bxkwhhWr<()R8;t`FPd9cbb! zW3bIR-KMx5?iDqXY0M0gxg~1EC&uWO%?U!>T+{&Krc-Cw>+5k`ba5}6eChXn{r!Lc z_rFc^OXg-}Ov`{ED66QDDh2Ne#!5Fskm>5?$`8O{j8eErgP^h5#xgIy8X5B<30@NHjcXKv6A-<|i}(zMa3wt-_RA^{ zJFPAYYjZeZH(|B8><)s+gK^B}K`{?%vs-K~(t(jU4ksT3Xj8c$SxU`G>H;S(64rHv zMA2w8YK_{hvKm5d1VNw}j^ellAS_y)q%$##q|F>*pm>c{1w|KR2{ss+YPnYTBEZsN z7epmRD{09vfq>%y20I+A_DXqqgN zG@X%HzKHT7z-_A_aHNA_ZM@6wvbbFyj|F!->=uuM;4ML{+Cu~x){VJ6Bl48Y)*8tj zk>~!W{0pi8nv01%GLO-6Mpcl7f(G(cmu!kMepzxC5#U52kPK@SxEEoK%<>$PycQlg z0>iY?Fb_!oA>G3;O%Cc&M&*4W5Uu}GQ7Et*}w=upte){zlyR73_UtvrC(3aA3{T1jsZU54|*)8I=zME^eUcY)P)ZKio zr`vsF=;*N_v3L};W`C~9Ghl+M^5c3-+Ymx=74$yGDAW0`ddO4*Yu&&{jY zG6ia0RNfRG7t4R+&gBCe%AthvI|i$9YVO#BKg~c|rxi3`xN~@MXGpYP zi8L+zMqPR_rcVwuG&a0_;_SsWndk1kc9pJ#;OCm4H(MwAZp%9|oG{dSd;EpY^i3;+ S=l2?ax1xd)YR~gkYySjehl*kV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/blocks/partchest_side.png b/src/main/resources/assets/tinker/textures/blocks/partchest_side.png new file mode 100644 index 0000000000000000000000000000000000000000..1af3d27f1c6eebeda9c4cb9913407dd38c291626 GIT binary patch literal 1855 zcmbVN3rrJd96z0zFB~vsqSNd=wcxb9yS9|xK|yFinpvz^1m}!i@2>4hdw1SlZ9#&M zC{uBnuQ_##s1Os$#>_UvjrrO%h>Nc=r%}mf7H53oK!bBx+;^oky118@e7W!Y?)U%w z-~U_VESxrM$mk&u1P!wn*oweAL0yAhgrI)D`)7KV>(F-0UgB%ZdMl#hyV>inb~2HqRUtXcC%iNw;-J@hY^@#EJ#V319OO0*2fi8 zNbIbNLKj_8MiUH@odsuxNk9-_6$%aq{JcztEl7ly1bg)wMc@cTDYGCsszSKb;e@S% z#KLJhla|JfX>dBB!%YSwK}>=57;Z)}Gm0CuxQR4kq+Sn49|UNV7!O%w%a7^;Ckx_J z6p=*HP$;Ae8FYf=MR9^4P)v{N^;&??%H_O5g|)mqzK_Ai%Cy9Z3McTe%1F6|pkhIQ zrM)f$#276vN5cdHhK4B-#dVnKQUu7*F`O8b{1N30jk10=!19U=uy_nB`UFLgeZt>R z$38!$0EE`zi0OEyErCExg{L_h?Rw)M6-E|ftlk~Z$#26v6Lc6 zEtT$T*6sEfwCP5|Y@&^fn@Pv}%T z%{_MndTB#G7Lfi!x_e==;88-9#O8QGwEjy)p}>Ar?Z#eL(7$>a`SwKT_QAn8P`9x; z1P-xD#`0i%NnlRVRXt0fZR#O;-PlH00Wb8j}*-LD#`$?XW*FI^esx_Y^zdgd?1uWp@NgKO~2 zEE4+Z+fRO+a*`+>)WY}N5Nq3x|F-RrMaMllFf#R^w`p%b%?eGv>%DDF{_R`Nq&Hto z9^dSE<8IupTZ>F}`(Ampqg{VzQ}UeV<&_WLM{>uU_!u5@ZHKAy>lwqkuD&*V-1>1_rzEvzUGrO;)A#IN12=qkto~@Qy$kMHd7z!~ z-~WtDneTE8*f=UM=a;1}d&y9< m@XN;sJ&6^Y*KMx5)ID$s*Lm*b-js*xFV3DU+1p3xBZjL4!w)$Aav6A~tfK?{(HSX48mgquq7N_cNyGZdMESP?f>XDcK- z{4Jyh8IW{3T(ryyPI9~G;9Ql0C{~a>%T+OK6~k51oJ$f|iRa1mLt$-(5|moKkEM0t zlbZ@#mM$?&JRWz%D;>xPF`Ouh49hb-Ph$ja_G=bM(3)AAVempzHdNhGkw)5#pd0mC zZVFqv>_SY>(rRWpOgLan0_Y6qU~QLDKt;~t^j;&HQm)7hjKUbyEE8k7ELIOA3z=c` zH`LkBcPYT3_4~6rRWL1e@L_F0XA5M*>MM3LD@N*)wN23Cx%t4vwp_e(y_ zw16f|=RGdz+m@_>i4sP{ZTP zz;kLzQjXx!Snc!H1HbHyDlDmQtj49Up{#&a_Pz0 zRVaTZ@!tGJ@#_267u#;0d8&l|$=B=NPv(BV`^?Ud^9FWbd$z5~J9cX*Fg1~L^bgUWXg&BQuNB+58lY>Jqd^!5y)f>l83WGx<=I0Mh zJ1gGmY+bckq?lXmNn@5Vim`_e)8-Mv0gb&P|n2a1QU`Cul?t@P+UCTLij2RA1 vJ+OhjuXds-|J3+9hxUs3Y&jSm`{Ba_tF4lGWt=ae?4O0Nq1iiD-?jHoRP{iy literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/tinker/textures/blocks/partchest_top.png b/src/main/resources/assets/tinker/textures/blocks/partchest_top.png new file mode 100644 index 0000000000000000000000000000000000000000..90cd0b265585d4a34983d95ed42ab987ef1d5f52 GIT binary patch literal 1850 zcmbVN3vAS69PeEwjIjYS2uKJvMH8mG>*F3<8;*Hi2OC)twi_D(;=1;`ySlr!v>kUF zB)sBeDk7*b^oB+QghdFEj72m7!gvz`8bvm?pco+A7zzU7e0{y$E@1FQlP~?gufPBA z|Ngge?wna!8Iv*)1j#BcVoTwBjJeXS2x7UqsqzDO7@-y|&=F*0wz(|GyYYz#l6Fh- zR~nUE2_q;GJ1;8Lz#faJ5RD+y3t}oS)Bppm20=;oU^hNHfT5D;!75xF!KpqFl8Wjz zP*y+3FVxovw1^eVK&QtTNDu)AkH#WlS!ZG%EWyjby?KpeXaZu?crdT25Uu3qqCQ0f zsLSrQ38d47=FxW2?Qqg`E=mz(K2GH0q{BwK87IL|6q@ygVbzdgD0)cw8|u{O z2Nb~2a$HKsLv4vfQYv(#a4B>n8IXsfb$^`-@KT^FwVD75mqIhAn%=04PXoN6XnsWr z4<%~ukjbdeXC{V5r&UO@s6_Rg`(yyi8^D861m(67l#O!wNt$svVB(%7@)?2{gmQ`~ z1?nCOg=x-v01B%{3Ls6U@v45ldc6j~szP z+Gq$s(tk+zAWT;RMwHipHwdHkUn&ZR_Ty$Z4!VN>)yu@U`#N_B4#$DHP0b;ANKG;z z!||oTIpwzA`2~)~>&2|sKW)R}jVI)6@0f-^dU}pH1a53+`pbK!J!LKYuAzNh+oj`c zZe~umUi5B=uZ*95ec4X?D8XCQ+&i$j^jvQRzDD1-ICn;K{`~v036qB(9_~V#@3tK_ zI`F&O*7`?QedT=b(y{pa@t^iyLr)-UvCgJA$+GM`)^A(c$ylje0fh3SQ9OUrn*IMjrTa3f3~Iu<62`Lkmv@BaSQK z#`#~%g0%`syFvzoCFOm(1;u9iKPu{-jJS=r^l_G|EuoTo3uo(F7xm1`Zo1I^%)p}6 z-!?rxQI3z_iHvIdL}cG-L^5+OA2PbLa-!YicfGhGYv26GE`9U;qL!C>`<7%+u?i=* zt`nvfju6XhPJh9)WllNRLH}BicQiAH+t!|&(VAA@VgInDW%uXVyVkE1PPKO2sA&wA>tH2-Nb=6doSc>6^E z=uiJ-{eM%;1RH-BfBv>({-eVu{Z|*Ao4x1LUfXxeV;O5W4?KUqJefE^Edha_p9~~YV3}Gtuj46XZ!h= zyUt1epUmLHzV6u5qR!V}v-&La=Rdx@?j92Z69WejDljxKfSKrwoD*;C8b1G&nSOfd zul5wB>F9NMW@6m#ZpJk8@);TF#<~ht1KAx?W>;ryo@Qyrw38j|NOadBIedd6 zM62A{JeDTg&4MSQ84CDugb^^*%pM0=FL?j^75l^8Z_lord%1M(=AW{RGv+l&?Yn(% z&Miy3Q}1*!LIo67NKQC#F62G)hq+&#tx4oNy`)29>6DHRS8vfA7Nd0D;%PY;q4GVB z(Z}C`S33X9%DKtP6RI)79L02CgjfSrS?->3*a+yg&E3FY*!z+zp^7Q%Mn$sUTVNpF zVP-&!ee@J@LsGi&%*~@R(^lT&V2Msup0J(afgI2e4#}(XnQn3A0OM2VCRfke1JB;1 z^hw`|1=Tj`_pv~Q`VI>VELk_qo&DEjf&YS;o7*h+oZG&it>#$wf%4n4gN>KJ-lbpv{CdOw z5>^9SM$?+@do8yX*ZADE#hNRi`9y#LlyNd902AAqI==PBy9GI}op4jgX9UYfq-i4Lx0tB`DYiHooPjCaoEX$KXLB?6+Bn8Je(LVcXA77G7zl!jMtjMp=f JS?83{1OOPgjHv(s literal 0 HcmV?d00001 From 2c82c90e32955bcd925fc2665699949d8b08a16d Mon Sep 17 00:00:00 2001 From: zyf051520 Date: Wed, 25 Feb 2026 07:34:39 +0800 Subject: [PATCH 04/14] fix (#1) --- .../tconstruct/tools/ToolProxyClient.java | 9 ++------ .../tconstruct/tools/blocks/CraftingSlab.java | 6 +++--- .../tools/blocks/ToolStationBlock.java | 21 ++++++++++--------- .../tconstruct/tools/gui/PartChestGui.java | 4 +--- .../tools/inventory/PartChestContainer.java | 3 ++- .../tconstruct/tools/inventory/SlotPart.java | 1 - .../itemblocks/ToolStationItemBlock.java | 4 ++-- .../tools/logic/PartChestLogic.java | 4 ++-- .../resources/assets/tinker/lang/en_US.lang | 1 + .../resources/assets/tinker/lang/zh_CN.lang | 1 + 10 files changed, 25 insertions(+), 29 deletions(-) diff --git a/src/main/java/tconstruct/tools/ToolProxyClient.java b/src/main/java/tconstruct/tools/ToolProxyClient.java index a48025d9795..6a4d90e57ec 100644 --- a/src/main/java/tconstruct/tools/ToolProxyClient.java +++ b/src/main/java/tconstruct/tools/ToolProxyClient.java @@ -638,13 +638,8 @@ public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, y, z); - if (ID == ToolProxyCommon.partChestID) return new PartChestGui( - player.inventory, - (PartChestLogic) world.getTileEntity(x, y, z), - world, - x, - y, - z); + if (ID == ToolProxyCommon.partChestID) + return new PartChestGui(player.inventory, (PartChestLogic) world.getTileEntity(x, y, z), world, x, y, z); if (ID == ToolProxyCommon.frypanGuiID) return new FrypanGui(player.inventory, (FrypanLogic) world.getTileEntity(x, y, z), world, x, y, z); if (ID == ToolProxyCommon.battlesignTextID) diff --git a/src/main/java/tconstruct/tools/blocks/CraftingSlab.java b/src/main/java/tconstruct/tools/blocks/CraftingSlab.java index 46d1900f5c0..caff7f6c025 100644 --- a/src/main/java/tconstruct/tools/blocks/CraftingSlab.java +++ b/src/main/java/tconstruct/tools/blocks/CraftingSlab.java @@ -48,8 +48,8 @@ public String[] getTextureNames() { "toolstation_top", "toolstation_slab_side", "toolstation_bottom", "partbuilder_oak_top", "partbuilder_slab_side", "partbuilder_oak_bottom", "stenciltable_oak_top", "stenciltable_slab_side", "stenciltable_oak_bottom", "patternchest_top", "patternchest_slab_side", "patternchest_bottom", - "toolforge_top", "toolforge_slab_side", "toolforge_top", - "partchest_top", "partchest_slab_side", "partchest_bottom" }; + "toolforge_top", "toolforge_slab_side", "toolforge_top", "partchest_top", "partchest_slab_side", + "partchest_bottom" }; } @Override @@ -126,7 +126,7 @@ public Object getModInstance() { @Override public void getSubBlocks(Item b, CreativeTabs tab, List list) { - for (int iter = 0; iter < 6; iter++) { + for (int iter = 0; iter < 7; iter++) { list.add(new ItemStack(b, 1, iter)); } } diff --git a/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java b/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java index 451354c8985..170686c9dd8 100644 --- a/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java +++ b/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java @@ -52,27 +52,27 @@ public String[] getTextureNames() { "partbuilder_spruce_bottom", "partbuilder_birch_top", "partbuilder_birch_side", "partbuilder_birch_bottom", "partbuilder_jungle_top", "partbuilder_jungle_side", "partbuilder_jungle_bottom", "patternchest_top", "patternchest_side", "patternchest_bottom", - "partchest_top", "partchest_side", "partchest_bottom", - "stenciltable_oak_top", "stenciltable_oak_side", "stenciltable_oak_bottom", "stenciltable_spruce_top", - "stenciltable_spruce_side", "stenciltable_spruce_bottom", "stenciltable_birch_top", - "stenciltable_birch_side", "stenciltable_birch_bottom", "stenciltable_jungle_top", - "stenciltable_jungle_side", "stenciltable_jungle_bottom" }; + "partchest_top", "partchest_side", "partchest_bottom", "stenciltable_oak_top", "stenciltable_oak_side", + "stenciltable_oak_bottom", "stenciltable_spruce_top", "stenciltable_spruce_side", + "stenciltable_spruce_bottom", "stenciltable_birch_top", "stenciltable_birch_side", + "stenciltable_birch_bottom", "stenciltable_jungle_top", "stenciltable_jungle_side", + "stenciltable_jungle_bottom" }; } @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int meta) { if (meta <= 4) { - // toolstation && partbuilder + // toolstation && partbuilder return icons[meta * 3 + getTextureIndex(side)]; } else if (meta == 5) { - // patternchest meta == 5 + // patternchest meta == 5 return icons[15 + getTextureIndex(side)]; } else if (meta <= 9) { - // partchest meta == 6 + // partchest meta == 6 return icons[18 + getTextureIndex(side)]; } else { - // stenciltable + // stenciltable return icons[meta * 3 + getTextureIndex(side) - 9]; } } @@ -145,6 +145,7 @@ public Integer getGui(World world, int x, int y, int z, EntityPlayer entityplaye int md = world.getBlockMetadata(x, y, z); if (md == 0) return 0; else if (md < 5) return 1; + else if (md == 6) return 6; else if (md < 10) return 2; else return 3; @@ -158,7 +159,7 @@ public Object getModInstance() { @Override public void getSubBlocks(Item id, CreativeTabs tab, List list) { - for (int iter = 0; iter < 6; iter++) { + for (int iter = 0; iter < 7; iter++) { list.add(new ItemStack(id, 1, iter)); } diff --git a/src/main/java/tconstruct/tools/gui/PartChestGui.java b/src/main/java/tconstruct/tools/gui/PartChestGui.java index 66d3c26bcf8..5772f8c41de 100644 --- a/src/main/java/tconstruct/tools/gui/PartChestGui.java +++ b/src/main/java/tconstruct/tools/gui/PartChestGui.java @@ -9,14 +9,12 @@ import org.lwjgl.opengl.GL11; import tconstruct.tools.logic.PartChestLogic; -import tconstruct.tools.logic.PatternChestLogic; public class PartChestGui extends GuiContainer { public PartChestLogic logic; - public PartChestGui(InventoryPlayer inventoryplayer, PartChestLogic holder, World world, int x, int y, - int z) { + public PartChestGui(InventoryPlayer inventoryplayer, PartChestLogic holder, World world, int x, int y, int z) { super(holder.getGuiContainer(inventoryplayer, world, x, y, z)); logic = holder; xSize = 194; diff --git a/src/main/java/tconstruct/tools/inventory/PartChestContainer.java b/src/main/java/tconstruct/tools/inventory/PartChestContainer.java index e891e61dd4e..ea01a68dc2e 100644 --- a/src/main/java/tconstruct/tools/inventory/PartChestContainer.java +++ b/src/main/java/tconstruct/tools/inventory/PartChestContainer.java @@ -1,12 +1,13 @@ package tconstruct.tools.inventory; -import invtweaks.api.container.ChestContainer; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; + +import invtweaks.api.container.ChestContainer; import tconstruct.library.util.IToolPart; import tconstruct.tools.TinkerTools; import tconstruct.tools.logic.PartChestLogic; diff --git a/src/main/java/tconstruct/tools/inventory/SlotPart.java b/src/main/java/tconstruct/tools/inventory/SlotPart.java index 7465a417afe..f488f361e94 100644 --- a/src/main/java/tconstruct/tools/inventory/SlotPart.java +++ b/src/main/java/tconstruct/tools/inventory/SlotPart.java @@ -4,7 +4,6 @@ import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -import tconstruct.library.util.IPattern; import tconstruct.library.util.IToolPart; public class SlotPart extends Slot { diff --git a/src/main/java/tconstruct/tools/itemblocks/ToolStationItemBlock.java b/src/main/java/tconstruct/tools/itemblocks/ToolStationItemBlock.java index 5f9560318d7..875d89a4db3 100644 --- a/src/main/java/tconstruct/tools/itemblocks/ToolStationItemBlock.java +++ b/src/main/java/tconstruct/tools/itemblocks/ToolStationItemBlock.java @@ -7,8 +7,8 @@ public class ToolStationItemBlock extends MultiItemBlock { public static final String[] blockTypes = { "Crafter", "Parts", "Parts", "Parts", "Parts", "PatternChest", - "PartChest", "PartChest", "PartChest", "PartChest", "PatternShaper", "PatternShaper", - "PatternShaper", "PatternShaper", "CastingTable" }; + "PartChest", "PartChest", "PartChest", "PartChest", "PatternShaper", "PatternShaper", "PatternShaper", + "PatternShaper", "CastingTable" }; public ToolStationItemBlock(Block b) { super(b, "ToolStation", blockTypes); diff --git a/src/main/java/tconstruct/tools/logic/PartChestLogic.java b/src/main/java/tconstruct/tools/logic/PartChestLogic.java index 78dbd3db734..eb959e26971 100644 --- a/src/main/java/tconstruct/tools/logic/PartChestLogic.java +++ b/src/main/java/tconstruct/tools/logic/PartChestLogic.java @@ -1,11 +1,11 @@ package tconstruct.tools.logic; -import mantle.blocks.abstracts.InventoryLogic; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.world.World; -import tconstruct.library.util.IPattern; + +import mantle.blocks.abstracts.InventoryLogic; import tconstruct.library.util.IToolPart; import tconstruct.tools.inventory.PartChestContainer; diff --git a/src/main/resources/assets/tinker/lang/en_US.lang b/src/main/resources/assets/tinker/lang/en_US.lang index 8175270f1ff..a6a1c12ad78 100644 --- a/src/main/resources/assets/tinker/lang/en_US.lang +++ b/src/main/resources/assets/tinker/lang/en_US.lang @@ -13,6 +13,7 @@ crafters.PartBuilder=Part Builder crafters.PatternShaper=Stencil Table crafters.CraftingStation=Crafting Station inventory.PatternChest=Pattern Chest +inventory.PartChest=Part Chest crafters.Smeltery=Smeltery crafters.Frypan=Frying Pan inventory.knapsack=Knapsack diff --git a/src/main/resources/assets/tinker/lang/zh_CN.lang b/src/main/resources/assets/tinker/lang/zh_CN.lang index 0ca93f32a1e..31cb3fbcfb4 100644 --- a/src/main/resources/assets/tinker/lang/zh_CN.lang +++ b/src/main/resources/assets/tinker/lang/zh_CN.lang @@ -12,6 +12,7 @@ crafters.PartBuilder=部件加工台 crafters.PatternShaper=模具加工台 crafters.CraftingStation=合成站 inventory.PatternChest=模具箱 +inventory.PartChest=部件箱 crafters.Smeltery=冶炼炉 crafters.Frypan=煎锅 inventory.knapsack=背包 From 20cf9e46bef0f0cb8f2785a369afe118816eab06 Mon Sep 17 00:00:00 2001 From: MCTBL Date: Wed, 25 Feb 2026 22:30:17 +0800 Subject: [PATCH 05/14] fix quick insert and break block crash --- .../tools/blocks/ToolStationBlock.java | 46 +++++++++++++++++-- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java b/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java index 170686c9dd8..627862c3beb 100644 --- a/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java +++ b/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java @@ -21,9 +21,11 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import mantle.blocks.abstracts.InventoryBlock; +import mantle.blocks.abstracts.InventoryLogic; import tconstruct.TConstruct; import tconstruct.library.TConstructRegistry; import tconstruct.library.util.IPattern; +import tconstruct.library.util.IToolPart; import tconstruct.tools.TinkerTools; import tconstruct.tools.logic.PartBuilderLogic; import tconstruct.tools.logic.PartChestLogic; @@ -133,8 +135,8 @@ public TileEntity createNewTileEntity(World world, int metadata) { return switch (metadata) { case 0 -> new ToolStationLogic(); case 1, 3, 2, 4 -> new PartBuilderLogic(); - case 5, 9, 8, 7 -> new PatternChestLogic(); - case 6 -> new PartChestLogic(); + case 5 -> new PatternChestLogic(); + case 6, 9, 8, 7 -> new PartChestLogic(); case 10, 13, 12, 11 -> new StencilTableLogic(); default -> null; }; @@ -190,9 +192,27 @@ public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, i if (!world.isRemote && world.getGameRules().getGameRuleBooleanValue("doTileDrops")) { int meta = world.getBlockMetadata(x, y, z); if (meta >= 5 && meta <= 9) { - ItemStack chest = new ItemStack(this, 1, 5); + ItemStack chest = null; + InventoryLogic logic = null; + switch(meta) { + case 5:{ + chest = new ItemStack(this, 1, 5); + logic = (PatternChestLogic) world.getTileEntity(x, y, z); + break; + } + case 6:{ + chest = new ItemStack(this, 1, 6); + logic = (PartChestLogic) world.getTileEntity(x, y, z); + break; + } + default:{ + chest = new ItemStack(this, 1, 5); + logic = (PatternChestLogic) world.getTileEntity(x, y, z); + break; + } + } NBTTagCompound inventory = new NBTTagCompound(); - PatternChestLogic logic = (PatternChestLogic) world.getTileEntity(x, y, z); + logic.writeInventoryToNBT(inventory); NBTTagCompound baseTag = new NBTTagCompound(); baseTag.setTag("Inventory", inventory); @@ -240,6 +260,12 @@ public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase l logic.yCoord = y; logic.zCoord = z; keptInventory = true; + }else if(inventory != null && te instanceof PartChestLogic logic) { + logic.readInventoryFromNBT(inventory); + logic.xCoord = x; + logic.yCoord = y; + logic.zCoord = z; + keptInventory = true; } } if (!keptInventory && PHConstruct.freePatterns) { @@ -261,13 +287,23 @@ public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer p if (world.getTileEntity(x, y, z) instanceof PatternChestLogic logic && !player.isSneaking()) { // is the pattern chest and player is not holding shift key ItemStack itemInHand = player.getHeldItem(); - if (itemInHand.getItem() instanceof IPattern) { + if (itemInHand != null && itemInHand.getItem() instanceof IPattern) { // is the player holding a tinker pattern if (logic.insertItemStackIntoInventory(itemInHand)) { // try insert into chest return true; } } + }else if(world.getTileEntity(x, y, z) instanceof PartChestLogic logic && !player.isSneaking()) { + // is the part chest and player is not holding shift key + ItemStack itemInHand = player.getHeldItem(); + if (itemInHand != null && itemInHand.getItem() instanceof IToolPart) { + // is the player holding a tinker part + if (logic.insertItemStackIntoInventory(itemInHand)) { + // try insert into chest + return true; + } + } } return super.onBlockActivated(world, x, y, z, player, side, clickX, clickY, clickZ); } From b094781b308cb3cf2e1be48a7e371b4e5c5c5d31 Mon Sep 17 00:00:00 2001 From: MCTBL Date: Sun, 1 Mar 2026 11:40:44 +0800 Subject: [PATCH 06/14] rework material info display in part crafter --- .../tconstruct/tools/gui/PartCrafterGui.java | 239 +++++++++++------- .../java/tconstruct/util/McTextFormatter.java | 126 +++++++++ 2 files changed, 268 insertions(+), 97 deletions(-) create mode 100644 src/main/java/tconstruct/util/McTextFormatter.java diff --git a/src/main/java/tconstruct/tools/gui/PartCrafterGui.java b/src/main/java/tconstruct/tools/gui/PartCrafterGui.java index 0146b38ebe3..1af19100370 100644 --- a/src/main/java/tconstruct/tools/gui/PartCrafterGui.java +++ b/src/main/java/tconstruct/tools/gui/PartCrafterGui.java @@ -1,5 +1,6 @@ package tconstruct.tools.gui; +import java.text.DecimalFormat; import java.util.Collections; import java.util.List; @@ -18,10 +19,15 @@ import cpw.mods.fml.common.Optional; import tconstruct.library.TConstructRegistry; import tconstruct.library.crafting.PatternBuilder; +import tconstruct.library.tools.ArrowMaterial; +import tconstruct.library.tools.BowMaterial; import tconstruct.library.tools.ToolMaterial; import tconstruct.library.util.HarvestLevels; +import tconstruct.library.weaponry.ArrowShaftMaterial; +import tconstruct.tools.TinkerTools.MaterialID; import tconstruct.tools.inventory.PartCrafterChestContainer; import tconstruct.tools.logic.PartBuilderLogic; +import tconstruct.util.McTextFormatter; @Optional.Interface(iface = "codechicken.nei.api.INEIGuiHandler", modid = "NotEnoughItems") public class PartCrafterGui extends GuiContainer implements INEIGuiHandler { @@ -29,9 +35,12 @@ public class PartCrafterGui extends GuiContainer implements INEIGuiHandler { PartBuilderLogic logic; String title, otherTitle = ""; boolean drawChestPart; - boolean hasTop, hasBottom; - ItemStack topMaterial, bottomMaterial; + boolean hasTop; + ItemStack topMaterial; ToolMaterial topEnum, bottomEnum; + ArrowMaterial arrowTop; + BowMaterial bowTop; + ArrowShaftMaterial arrowShaftTop; private static final int CRAFT_WIDTH = 176; private static final int CRAFT_HEIGHT = 166; @@ -53,13 +62,15 @@ public class PartCrafterGui extends GuiContainer implements INEIGuiHandler { private int chestLeft = 0; private int chestTop = 0; + private static DecimalFormat df = new DecimalFormat("##.##"); + public PartCrafterGui(InventoryPlayer inventoryplayer, PartBuilderLogic partlogic, World world, int x, int y, int z) { super(partlogic.getGuiContainer(inventoryplayer, world, x, y, z)); logic = partlogic; drawChestPart = inventorySlots instanceof PartCrafterChestContainer; - title = "\u00A7n" + (StatCollector.translateToLocal("gui.partcrafter1")); + title = McTextFormatter.addUnderLine(StatCollector.translateToLocal("gui.partcrafter1")); } @Override @@ -93,140 +104,174 @@ public void initGui() { @Override protected void drawGuiContainerForegroundLayer(int par1, int par2) { if (drawChestPart) { - this.fontRendererObj.drawString(StatCollector.translateToLocal("inventory.PatternChest"), 14, 17, 4210752); + this.fontRendererObj.drawString(StatCollector.translateToLocal("inventory.PatternChest"), 8, 17, 0x404040); } this.fontRendererObj - .drawString(StatCollector.translateToLocal("crafters.PartBuilder"), craftingTextLeft + 6, 6, 4210752); + .drawString(StatCollector.translateToLocal("crafters.PartBuilder"), craftingTextLeft + 6, 6, 0x404040); this.fontRendererObj.drawString( StatCollector.translateToLocal("container.inventory"), craftingTextLeft + 8, this.ySize - 96 + 2, - 4210752); + 0x404040); drawMaterialInformation(); } void drawDefaultInformation() { - title = "\u00A7n" + StatCollector.translateToLocal("gui.partcrafter2"); - this.drawCenteredString(fontRendererObj, title, descTextLeft + DESC_WIDTH / 2, 8, 16777215); + title = McTextFormatter.addUnderLine(StatCollector.translateToLocal("gui.partcrafter2")); + this.drawCenteredString(fontRendererObj, title, descTextLeft + DESC_WIDTH / 2, 8, 0xFFFFFF); fontRendererObj.drawSplitString( StatCollector.translateToLocal("gui.partcrafter3"), descTextLeft + 8, 24, 115, - 16777215); + 0xFFFFFF); } void drawMaterialInformation() { - ItemStack top = logic.getStackInSlot(2); - // ItemStack topResult = logic.getStackInSlot(4); - ItemStack bottom = logic.getStackInSlot(3); - // ItemStack bottomResult = logic.getStackInSlot(6); - if (topMaterial != top) { - topMaterial = top; - int topID = PatternBuilder.instance.getPartID(top); + ItemStack met = logic.getStackInSlot(2) != null ? logic.getStackInSlot(2) : logic.getStackInSlot(3); + + if (topMaterial != met) { + topMaterial = met; + int topID = PatternBuilder.instance.getPartID(met); if (topID != Short.MAX_VALUE) // && topResult != null) { topEnum = TConstructRegistry.getMaterial(topID); + arrowTop = TConstructRegistry.getArrowMaterial(topID); + bowTop = TConstructRegistry.getBowMaterial(topID); + arrowShaftTop = topID <= MaterialID.Wood + ? (ArrowShaftMaterial) TConstructRegistry.getCustomMaterial(topID, ArrowShaftMaterial.class) + : null; + hasTop = true; - title = "\u00A7n" + topEnum.localizedName(); + title = McTextFormatter.addUnderLine(topEnum.localizedName()); } else hasTop = false; } - if (bottomMaterial != bottom) { - bottomMaterial = bottom; - int bottomID = PatternBuilder.instance.getPartID(bottom); + int offset = 6; + if (hasTop) { + this.drawCenteredString( + fontRendererObj, + title, + descTextLeft + DESC_WIDTH / 2, + offset, + topEnum.primaryColor()); + offset += 14; + + GL11.glPushMatrix(); + GL11.glScaled(0.95f, 0.95f, 1.0f); + int scaledDescTextLeft = (int) (descTextLeft / 0.95) + 7; - if (bottomID != Short.MAX_VALUE) // && bottomResult != null) - { - bottomEnum = TConstructRegistry.getMaterial(bottomID); - hasBottom = true; - otherTitle = "\u00A7n" + bottomEnum.localizedName(); - } else hasBottom = false; - } + this.fontRendererObj.drawString( + StatCollector.translateToLocal("gui.partcrafter.durability") + + McTextFormatter.addGreen(String.valueOf(topEnum.durability())), + scaledDescTextLeft, + offset, + 0xFFFFFF); + offset += 11; + + this.fontRendererObj.drawString( + StatCollector.translateToLocal("gui.partcrafter.mininglevel") + + HarvestLevels.getHarvestLevelName(topEnum.harvestLevel()), + scaledDescTextLeft, + offset, + 0xFFFFFF); + offset += 11; - int offset = 8; - if (hasTop) { - this.drawCenteredString(fontRendererObj, title, descTextLeft + DESC_WIDTH / 2, offset, 16777215); this.fontRendererObj.drawString( - StatCollector.translateToLocal("gui.partcrafter4") + topEnum.durability(), - descTextLeft + 8, - offset + 16, - 16777215); + StatCollector.translateToLocal("gui.partcrafter.miningspeed") + + McTextFormatter.addAqua(String.valueOf(topEnum.toolSpeed() / 100f)), + scaledDescTextLeft, + offset, + 0xFFFFFF); + offset += 11; + this.fontRendererObj.drawString( - StatCollector.translateToLocal("gui.partcrafter5") + topEnum.handleDurability() + "x", - descTextLeft + 8, - offset + 27, - 16777215); + StatCollector.translateToLocal("gui.partcrafter.attack") + + McTextFormatter.addRed(String.valueOf(topEnum.attack())), + scaledDescTextLeft, + offset, + 0xFFFFFF); + offset += 11; + this.fontRendererObj.drawString( - StatCollector.translateToLocal("gui.partcrafter6") + topEnum.toolSpeed() / 100f, - descTextLeft + 8, - offset + 38, - 16777215); + StatCollector.translateToLocal("gui.partcrafter.handlemodifier") + + McTextFormatter.addYellow(String.valueOf(topEnum.handleDurability())), + scaledDescTextLeft, + offset, + 0xFFFFFF); + offset += 11; + this.fontRendererObj.drawString( - StatCollector.translateToLocal("gui.partcrafter7") - + HarvestLevels.getHarvestLevelName(topEnum.harvestLevel()), - descTextLeft + 8, - offset + 49, - 16777215); - - int attack = topEnum.attack(); - String heart = attack == 2 ? StatCollector.translateToLocal("gui.partcrafter8") - : StatCollector.translateToLocal("gui.partcrafter9"); - if (attack % 2 == 0) this.fontRendererObj.drawString( - StatCollector.translateToLocal("gui.partcrafter10") + attack / 2 + heart, - descTextLeft + 8, - offset + 60, - 0xffffff); - else this.fontRendererObj.drawString( - StatCollector.translateToLocal("gui.partcrafter10") + attack / 2f + heart, - descTextLeft + 8, - offset + 60, - 0xffffff); - } + StatCollector.translateToLocal("gui.partcrafter.drawspeed") + + McTextFormatter.addGray(df.format(bowTop.drawspeed / 20f) + "s"), + scaledDescTextLeft, + offset, + 0xFFFFFF); + offset += 11; - offset = 90; - if (hasBottom) { - this.drawCenteredString(fontRendererObj, otherTitle, descTextLeft + DESC_WIDTH / 2, offset, 16777215); this.fontRendererObj.drawString( - StatCollector.translateToLocal("gui.partcrafter4") + bottomEnum.durability(), - descTextLeft + 8, - offset + 16, - 16777215); + StatCollector.translateToLocal("gui.partcrafter.arrowspeed") + + McTextFormatter.addGray(df.format(bowTop.flightSpeedMax)), + scaledDescTextLeft, + offset, + 0xFFFFFF); + offset += 11; + + if (arrowShaftTop != null) { + + this.fontRendererObj.drawString( + McTextFormatter.addUnderLine(StatCollector.translateToLocal("gui.partcrafter.arrow")), + scaledDescTextLeft, + offset, + 0xFFFFFF); + offset += 11; + + this.fontRendererObj.drawString( + StatCollector.translateToLocal("gui.partcrafter.weight") + + McTextFormatter.addYellow(df.format(arrowShaftTop.weight)), + scaledDescTextLeft + 4, + offset, + 0xFFFFFF); + offset += 11; + + this.fontRendererObj.drawString( + StatCollector.translateToLocal("gui.partcrafter.breakchance") + + McTextFormatter.addYellow(df.format(arrowShaftTop.fragility * 100f) + "%"), + scaledDescTextLeft + 4, + offset, + 0xFFFFFF); + offset += 11; + } + this.fontRendererObj.drawString( - StatCollector.translateToLocal("gui.partcrafter5") + bottomEnum.handleDurability() + "x", - descTextLeft + 8, - offset + 27, - 16777215); + McTextFormatter.addUnderLine(StatCollector.translateToLocal("gui.partcrafter.bolt")), + scaledDescTextLeft, + offset, + 0xFFFFFF); + offset += 11; + this.fontRendererObj.drawString( - StatCollector.translateToLocal("gui.partcrafter6") + bottomEnum.toolSpeed() / 100f, - descTextLeft + 8, - offset + 38, - 16777215); + StatCollector.translateToLocal("gui.partcrafter.weight") + + McTextFormatter.addYellow(df.format(arrowTop.mass)), + scaledDescTextLeft + 4, + offset, + 0xFFFFFF); + offset += 11; + this.fontRendererObj.drawString( - StatCollector.translateToLocal("gui.partcrafter7") - + HarvestLevels.getHarvestLevelName(bottomEnum.harvestLevel()), - descTextLeft + 8, - offset + 49, - 16777215); - int attack = bottomEnum.attack(); - String heart = attack == 2 ? StatCollector.translateToLocal("gui.partcrafter8") - : StatCollector.translateToLocal("gui.partcrafter9"); - if (attack % 2 == 0) this.fontRendererObj.drawString( - StatCollector.translateToLocal("gui.partcrafter10") + attack / 2 + heart, - descTextLeft + 8, - offset + 60, - 0xffffff); - else this.fontRendererObj.drawString( - StatCollector.translateToLocal("gui.partcrafter10") + attack / 2f + heart, - descTextLeft + 8, - offset + 60, - 0xffffff); + StatCollector.translateToLocal("gui.partcrafter.breakchance") + + McTextFormatter.addYellow(df.format(arrowTop.breakChance * 100f) + "%"), + scaledDescTextLeft + 4, + offset, + 0xFFFFFF); + offset += 11; + + GL11.glPopMatrix(); } - - if (!hasTop && !hasBottom) drawDefaultInformation(); + if (!hasTop) drawDefaultInformation(); } private static final ResourceLocation background = new ResourceLocation("tinker", "textures/gui/toolparts.png"); diff --git a/src/main/java/tconstruct/util/McTextFormatter.java b/src/main/java/tconstruct/util/McTextFormatter.java new file mode 100644 index 00000000000..c269154616b --- /dev/null +++ b/src/main/java/tconstruct/util/McTextFormatter.java @@ -0,0 +1,126 @@ +package tconstruct.util; + +public enum McTextFormatter { + + black("\u00A70"), + dark_blue("\u00A71"), + dark_green("\u00A72"), + dark_aqua("\u00A73"), + dark_red("\u00A74"), + dark_purple("\u00A75"), + gold("\u00A76"), + gray("\u00A77"), + dark_gray("\u00A78"), + blue("\u00A79"), + green("\u00A7a"), + aqua("\u00A7b"), + red("\u00A7c"), + light_purple("\u00A7d"), + yellow("\u00A7e"), + white("\u00A7f"), + reset("\u00A7r"), + obfuscated("\u00A7k"), + bold("\u00A7l"), + strikethrough("\u00A7m"), + underline("\u00A7n"), + italic("\u00A7o"); + + String code; + + McTextFormatter(String code) { + this.code = code; + } + + @Override + public String toString() { + return this.code; + } + + public static String addBlack(String str) { + return black + str + reset; + } + + public static String addDarkBlue(String str) { + return dark_blue + str + reset; + } + + public static String addDarkGreen(String str) { + return dark_green + str + reset; + } + + public static String addDarkAqua(String str) { + return dark_aqua + str + reset; + } + + public static String addDarkRed(String str) { + return dark_red + str + reset; + } + + public static String addDarkPurple(String str) { + return dark_purple + str + reset; + } + + public static String addGold(String str) { + return gold + str + reset; + } + + public static String addGray(String str) { + return gray + str + reset; + } + + public static String addDarkGray(String str) { + return dark_gray + str + reset; + } + + public static String addBlue(String str) { + return blue + str + reset; + } + + public static String addGreen(String str) { + return green + str + reset; + } + + public static String addAqua(String str) { + return aqua + str + reset; + } + + public static String addRed(String str) { + return red + str + reset; + } + + public static String addLightPurple(String str) { + return light_purple + str + reset; + } + + public static String addYellow(String str) { + return yellow + str + reset; + } + + public static String addWhite(String str) { + return white + str + reset; + } + + public static String addObfuscated(String str) { + return obfuscated + str + reset; + } + + public static String addBold(String str) { + return bold + str + reset; + } + + public static String addStrikethrough(String str) { + return strikethrough + str + reset; + } + + public static String addUnderLine(String str) { + return underline + str + reset; + } + + public static String addItalic(String str) { + return italic + str + reset; + } + + public static String reset() { + return reset.code; + } +} From e9f8fd3beb19d797c587fb84fac9eae0963e21b7 Mon Sep 17 00:00:00 2001 From: MCTBL Date: Sun, 1 Mar 2026 11:41:54 +0800 Subject: [PATCH 07/14] rework material info display in part crafter --- .../tconstruct/tools/gui/PartChestGui.java | 2 +- .../tconstruct/tools/gui/PatternChestGui.java | 2 +- .../resources/assets/tinker/lang/en_US.lang | 24 +++++++++++++----- .../resources/assets/tinker/lang/zh_CN.lang | 24 +++++++++++++----- .../tinker/textures/gui/description.png | Bin 4934 -> 3047 bytes 5 files changed, 38 insertions(+), 14 deletions(-) diff --git a/src/main/java/tconstruct/tools/gui/PartChestGui.java b/src/main/java/tconstruct/tools/gui/PartChestGui.java index 5772f8c41de..0c6013710f3 100644 --- a/src/main/java/tconstruct/tools/gui/PartChestGui.java +++ b/src/main/java/tconstruct/tools/gui/PartChestGui.java @@ -23,7 +23,7 @@ public PartChestGui(InventoryPlayer inventoryplayer, PartChestLogic holder, Worl @Override protected void drawGuiContainerForegroundLayer(int par1, int par2) { - fontRendererObj.drawString(StatCollector.translateToLocal("inventory.PartChest"), 60, 6, 0x404040); + fontRendererObj.drawString(StatCollector.translateToLocal("inventory.PartChest"), 8, 8, 0x404040); fontRendererObj .drawString(StatCollector.translateToLocal("container.inventory"), 17, (ySize - 96) + 2, 0x404040); } diff --git a/src/main/java/tconstruct/tools/gui/PatternChestGui.java b/src/main/java/tconstruct/tools/gui/PatternChestGui.java index 88bf5d9680f..c6615f1b9ed 100644 --- a/src/main/java/tconstruct/tools/gui/PatternChestGui.java +++ b/src/main/java/tconstruct/tools/gui/PatternChestGui.java @@ -24,7 +24,7 @@ public PatternChestGui(InventoryPlayer inventoryplayer, PatternChestLogic holder @Override protected void drawGuiContainerForegroundLayer(int par1, int par2) { - fontRendererObj.drawString(StatCollector.translateToLocal("inventory.PatternChest"), 60, 6, 0x404040); + fontRendererObj.drawString(StatCollector.translateToLocal("inventory.PatternChest"), 8, 8, 0x404040); fontRendererObj .drawString(StatCollector.translateToLocal("container.inventory"), 17, (ySize - 96) + 2, 0x404040); } diff --git a/src/main/resources/assets/tinker/lang/en_US.lang b/src/main/resources/assets/tinker/lang/en_US.lang index a6a1c12ad78..537fd460901 100644 --- a/src/main/resources/assets/tinker/lang/en_US.lang +++ b/src/main/resources/assets/tinker/lang/en_US.lang @@ -926,12 +926,24 @@ gui.toolstation21=Ammo: gui.toolstation22=Break Chance: gui.toolstation23=Max. Attack: -gui.mining1=Stone -gui.mining2=Iron -gui.mining3=Redstone -gui.mining4=Obsidian -gui.mining5=Cobalt -gui.mining6=Manyullyn +gui.partcrafter.durability=Durability: +gui.partcrafter.mininglevel=Mining Level: +gui.partcrafter.miningspeed=Mining Speed: +gui.partcrafter.attack=Attack: +gui.partcrafter.handlemodifier=Handle Modifier: +gui.partcrafter.drawspeed=Draw Speed: +gui.partcrafter.arrowspeed=Arrow Speed: +gui.partcrafter.arrow=Arrow +gui.partcrafter.bolt=Bolt +gui.partcrafter.weight=Weight: +gui.partcrafter.breakchance=Break Chance: + +gui.mining1=§7Stone§r +gui.mining2=§fIron§r +gui.mining3=§4Redstone§r +gui.mining4=§dObsidian§r +gui.mining5=§9Cobalt§r +gui.mining6=§5Manyullyn§r gui.toolstation.pickaxe.desc=The Pickaxe is a precise mining tool. It is effective on stone and ores.\n\nRequired parts:\n- Pickaxe Head\n- Tool Binding\n- Handle gui.toolstation.shovel.desc=The Shovel is a precise digging tool. It is effective on dirt, sand, and snow.\n\nRequired parts:\n- Shovel Head\n- Handle diff --git a/src/main/resources/assets/tinker/lang/zh_CN.lang b/src/main/resources/assets/tinker/lang/zh_CN.lang index 31cb3fbcfb4..875a07a7362 100644 --- a/src/main/resources/assets/tinker/lang/zh_CN.lang +++ b/src/main/resources/assets/tinker/lang/zh_CN.lang @@ -880,12 +880,24 @@ gui.toolstation21=弹药: gui.toolstation22=损坏几率: gui.toolstation23=最大攻击: -gui.mining1=石头 -gui.mining2=铁 -gui.mining3=红石 -gui.mining4=黑曜石 -gui.mining5=钴 -gui.mining6=玛玉灵 +gui.partcrafter.durability=耐久: +gui.partcrafter.mininglevel=采掘等级: +gui.partcrafter.miningspeed=采掘速度: +gui.partcrafter.attack=攻击力: +gui.partcrafter.handlemodifier=手柄系数: +gui.partcrafter.drawspeed=拉弓速度: +gui.partcrafter.arrowspeed=箭矢速度: +gui.partcrafter.arrow=箭矢 +gui.partcrafter.bolt=弩箭 +gui.partcrafter.weight=重量: +gui.partcrafter.breakchance=损坏几率: + +gui.mining1=§7石头§r +gui.mining2=§f铁§r +gui.mining3=§4红石§r +gui.mining4=§d黑曜石§r +gui.mining5=§9钴§r +gui.mining6=§5玛玉灵§r gui.toolstation.pickaxe.desc=镐子是标准的挖矿工具.它对石头以及矿物有效.\n\n需求部件:\n- 镐头\n- 绑定结\n- 手柄 gui.toolstation.shovel.desc=铲子是标准的挖掘工具.它对泥土,沙子和雪有效.\n\n需求部件:\n- 铲头\n- 手柄 diff --git a/src/main/resources/assets/tinker/textures/gui/description.png b/src/main/resources/assets/tinker/textures/gui/description.png index 54710ebea8acba7b18a52f557241fcdbaff0cf5d..f52befefdc00a9168a07beaa6b045ffa7ae66e25 100644 GIT binary patch literal 3047 zcmds3drT8|9RC#*d~5dbHI-Y9iALLNucfpX3b+=P%py@XACbXvcRzZR&Es8bWOY?s_OzwiA% zzt8vm%YBuRK7H_j(E|VggVSc{X9FODOA+W71Lb7f#x|(+x6GK&12FLY&?^F)Hjf0L zPrEU5o-ofa6DK)FN>E%bEwwWihz1}r*=`|76D=UQbiR?*itp}si4h~E70-<~$P5-8 zU0|HC#7fUulAcK}F_9WdoScLt+Hpw0&;o(j88ge{cC9$fi^Fy3Gb%>H5W%DsPYoGF z<{2^&9cQJHc&SQ4%9Zg*f<`J=DU=$`6aF3$`um13RlW-3`2SzF|=l-^6=UE zX+5@}rWF?mf(1v>!oosnp+d@8^HI4*qd{dDieVCnknlyUK-eWLKfaeiPxGYJXc3GY zi-Z`7T+SwF#n9945Ex5@mgRfW1QUkZ2@5Kh%0eN9ffO0RS!`Bw*f>R^w3%jTR^TC4 z9>H1)IDz8}xR+2zwx2NoQ)@6pY`oAHhKZQqh1A6`jGlzN5Y1;6S!i@N&2u&@NvAG` zZjKK{W5IP+nh-c^CdZk33zgC9GNRLk3Zp?L&NZ?WSIAF#>I|(X1X?S`WSB}K!z7p@ z6T@&t0tQ%_JC}UpHb5L~{8jmaG&p=_)XLp!j=8t~@!pu&VN4*c^ahBUBHGKk z>K%vk_8fg!x20>hXMy)@4O3-nDE6_A9gZe%>*CJqjls4Pb^aCokTMX}E!rM94s`|& zYCmkQug+(Kd+&W3-rH4`?MjdPIbh3bJifks@WNAxs$HI-d&003AnMaCny+05E;|w% z)+!!8&^b??_c^MZ6&;U)ilh?%zHhUa8HeQHZe^@&Y|f_WjYDK7L^ESIUI&%YGkI`E zRH-Su1z`_A@6@1ikeY4CB~s>*B0eIvV1NF=4;RF~f!Y;SU9d7WRZ zy*jdZ`Jq6`mZjF;oSyrA`oEsFCw#AT>N%JypqtaU?M92E@J3O!GiGQ`lh5XA@)lLh zYM9u($A9*GPb|+Jduhmik=ayby6-$tnK*8EP04MqjWIQJ)Vj}_CeGBXy~_7r6W6IL ziE8-(Nf%vtXCn8JBY4Gk=I$0HQ+(j_oWp?U= zzBhJ*?Yws>+l%^2&sB`-=(ylMS{}GZHUCh0J9xm;wLiiBb@kA=B=g-SS521R>8U^2 z?)Ud^gUwsl$Vg9?!M3esU`HG+cLeH}G%mOk{nwo3^D`@oipi0JTGvw!FbnPg^`>vi-rhd0#U+Xqka9>iF z|F~_;5n*^21slAjKFOuOQ_EBryIV%220Jz^t8;orOxSmcZIX{}I^N=q3TCdpR_}6T zXZyTCu=C-$tdt4%{UvuV*5Bd0rTc3S#;lY@10n_-8U$930{s+VSRO!r2PqpxW&hWW zN7&dhd1FxpY+6&3@79z-a=<{7{yD2I;E5XzJRL)?HMbToeB7d5dm34qyrt`$ zFD*{U%D#M|c)qFXs=C(c!B3sZ`X%AcqAH@wSz9wgbhC{~`F9i8nXo;xr97=Qx+C-} No|c-ful^)w`QJJtL(l*K literal 4934 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 Date: Sun, 1 Mar 2026 11:46:59 +0800 Subject: [PATCH 08/14] make manual can render in the middle --- .../tools/blocks/ToolStationBlock.java | 44 ++-- .../tconstruct/tools/gui/TiCGuiManual.java | 214 ++++++++++++++++++ .../java/tconstruct/tools/items/Manual.java | 15 +- 3 files changed, 244 insertions(+), 29 deletions(-) create mode 100644 src/main/java/tconstruct/tools/gui/TiCGuiManual.java diff --git a/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java b/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java index 627862c3beb..42c939bfa15 100644 --- a/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java +++ b/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java @@ -192,27 +192,27 @@ public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, i if (!world.isRemote && world.getGameRules().getGameRuleBooleanValue("doTileDrops")) { int meta = world.getBlockMetadata(x, y, z); if (meta >= 5 && meta <= 9) { - ItemStack chest = null; - InventoryLogic logic = null; - switch(meta) { - case 5:{ - chest = new ItemStack(this, 1, 5); - logic = (PatternChestLogic) world.getTileEntity(x, y, z); - break; - } - case 6:{ - chest = new ItemStack(this, 1, 6); - logic = (PartChestLogic) world.getTileEntity(x, y, z); - break; - } - default:{ - chest = new ItemStack(this, 1, 5); - logic = (PatternChestLogic) world.getTileEntity(x, y, z); - break; - } - } + ItemStack chest = null; + InventoryLogic logic = null; + switch (meta) { + case 5: { + chest = new ItemStack(this, 1, 5); + logic = (PatternChestLogic) world.getTileEntity(x, y, z); + break; + } + case 6: { + chest = new ItemStack(this, 1, 6); + logic = (PartChestLogic) world.getTileEntity(x, y, z); + break; + } + default: { + chest = new ItemStack(this, 1, 5); + logic = (PatternChestLogic) world.getTileEntity(x, y, z); + break; + } + } NBTTagCompound inventory = new NBTTagCompound(); - + logic.writeInventoryToNBT(inventory); NBTTagCompound baseTag = new NBTTagCompound(); baseTag.setTag("Inventory", inventory); @@ -260,7 +260,7 @@ public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase l logic.yCoord = y; logic.zCoord = z; keptInventory = true; - }else if(inventory != null && te instanceof PartChestLogic logic) { + } else if (inventory != null && te instanceof PartChestLogic logic) { logic.readInventoryFromNBT(inventory); logic.xCoord = x; logic.yCoord = y; @@ -294,7 +294,7 @@ public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer p return true; } } - }else if(world.getTileEntity(x, y, z) instanceof PartChestLogic logic && !player.isSneaking()) { + } else if (world.getTileEntity(x, y, z) instanceof PartChestLogic logic && !player.isSneaking()) { // is the part chest and player is not holding shift key ItemStack itemInHand = player.getHeldItem(); if (itemInHand != null && itemInHand.getItem() instanceof IToolPart) { diff --git a/src/main/java/tconstruct/tools/gui/TiCGuiManual.java b/src/main/java/tconstruct/tools/gui/TiCGuiManual.java new file mode 100644 index 00000000000..bfdc06f8858 --- /dev/null +++ b/src/main/java/tconstruct/tools/gui/TiCGuiManual.java @@ -0,0 +1,214 @@ +package tconstruct.tools.gui; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiLabel; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import mantle.books.BookData; +import mantle.client.MProxyClient; +import mantle.client.RenderItemCopy; +import mantle.client.SmallFontRenderer; +import mantle.client.gui.GuiManual; +import mantle.client.gui.TurnPageButton; +import mantle.client.pages.BookPage; + +@SideOnly(Side.CLIENT) +public class TiCGuiManual extends GuiManual { + + ItemStack itemstackBook; + Document manual; + public RenderItemCopy renderitem = new RenderItemCopy(); + int bookImageWidth = 206; + int bookImageHeight = 200; + int bookTotalPages = 1; + int currentPage; + int maxPages; + BookData bData; + + private TurnPageButton buttonNextPage; + private TurnPageButton buttonPreviousPage; + private static ResourceLocation bookRight;// = new ResourceLocation("mantle", "textures/gui/bookright.png"); + private static ResourceLocation bookLeft;// = new ResourceLocation("mantle", "textures/gui/bookleft.png"); + + BookPage pageLeft; + BookPage pageRight; + + public SmallFontRenderer fonts = MProxyClient.smallFontRenderer; + + public TiCGuiManual(ItemStack stack, BookData data) { + super(stack, data); + this.mc = Minecraft.getMinecraft(); + this.itemstackBook = stack; + currentPage = 0; // Stack page + manual = data.getDoc(); + if (data.font != null) this.fonts = data.font; + bookLeft = data.leftImage; + bookRight = data.rightImage; + this.bData = data; + + // renderitem.renderInFrame = true; + } + + /* + * @Override public void setWorldAndResolution (Minecraft minecraft, int w, int h) { this.guiParticles = new + * GuiParticle(minecraft); this.mc = minecraft; this.width = w; this.height = h; this.buttonList.clear(); + * this.initGui(); } + */ + + @SuppressWarnings("unchecked") + public void initGui() { + maxPages = manual.getElementsByTagName("page").getLength(); + ticUpdateText(); + int xPos = (this.width) / 2; // TODO Width? + // TODO buttonList + this.buttonList.add( + this.buttonNextPage = new TurnPageButton( + 1, + xPos + bookImageWidth - 50, + (this.height + this.bookImageHeight) / 2 - 28, + true, + bData)); + this.buttonList.add( + this.buttonPreviousPage = new TurnPageButton( + 2, + xPos - bookImageWidth + 24, + (this.height + this.bookImageHeight) / 2 - 28, + false, + bData)); + updateButtonVisibility(); + } + + private void updateButtonVisibility() { + buttonPreviousPage.visible = currentPage > 0; + buttonNextPage.visible = currentPage < maxPages - 2; + } + + protected void actionPerformed(GuiButton button) { + if (button.enabled) { + changePage(button.id); + updateButtonVisibility(); + ticUpdateText(); + } + } + + void ticUpdateText() { + if (maxPages % 2 == 1) { + if (currentPage > maxPages) currentPage = maxPages; + } else { + if (currentPage >= maxPages) currentPage = maxPages - 2; + } + if (currentPage % 2 == 1) currentPage--; + if (currentPage < 0) currentPage = 0; + + NodeList nList = manual.getElementsByTagName("page"); + + Node node = nList.item(currentPage); + if (node.getNodeType() == Node.ELEMENT_NODE) { + Element element = (Element) node; + Class clazz = MProxyClient.getPageClass(element.getAttribute("type")); + if (clazz != null) { + try { + pageLeft = clazz.getDeclaredConstructor().newInstance(); + pageLeft.init(this, 0); + pageLeft.readPageFromXML(element); + } catch (Exception e) { + System.out.println(e); + } + } else { + pageLeft = null; + } + } + + node = nList.item(currentPage + 1); + if (node != null && node.getNodeType() == Node.ELEMENT_NODE) { + Element element = (Element) node; + Class clazz = MProxyClient.getPageClass(element.getAttribute("type")); + if (clazz != null) { + try { + pageRight = clazz.getDeclaredConstructor().newInstance(); + pageRight.init(this, 1); + pageRight.readPageFromXML(element); + } catch (Exception e) { + System.out.println(e); + } + } else { + pageLeft = null; + } + } else { + pageRight = null; + } + } + + private void changePage(int buttonId) { + if (buttonId == 1) { + currentPage += 2; + } + if (buttonId == 2) { + currentPage -= 2; + } + } + + public void drawScreen(int par1, int par2, float par3) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(bookRight); + + // aligen to center + int localWidth = (this.width / 2); + int localHeight = ((this.height - this.bookImageHeight) / 2); + + this.drawTexturedModalRect(localWidth, localHeight, 0, 0, this.bookImageWidth, this.bookImageHeight); + + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(bookLeft); + localWidth = localWidth - this.bookImageWidth; + this.drawTexturedModalRect( + localWidth, + localHeight, + 256 - this.bookImageWidth, + 0, + this.bookImageWidth, + this.bookImageHeight); + + this.drawButtons(par1, par2); + + if (pageLeft != null) pageLeft.renderBackgroundLayer(localWidth + 16, localHeight + 12); + if (pageRight != null) pageRight.renderBackgroundLayer(localWidth + 220, localHeight + 12); + if (pageLeft != null) pageLeft.renderContentLayer(localWidth + 16, localHeight + 12, bData.isTranslatable); + if (pageRight != null) pageRight.renderContentLayer(localWidth + 220, localHeight + 12, bData.isTranslatable); + + } + + /** + * copy from {@link net.minecraft.client.gui.GuiScreen#drawScreen(int, int, float)} + */ + public void drawButtons(int mouseX, int mouseY) { + // copy from @GuiScreen.drawScreen + int k; + + for (k = 0; k < this.buttonList.size(); ++k) { + ((GuiButton) this.buttonList.get(k)).drawButton(this.mc, mouseX, mouseY); + } + + for (k = 0; k < this.labelList.size(); ++k) { + ((GuiLabel) this.labelList.get(k)).func_146159_a(this.mc, mouseX, mouseY); + } + } + + public Minecraft getMC() { + return mc; + } + + public boolean doesGuiPauseGame() { + return false; + } +} diff --git a/src/main/java/tconstruct/tools/items/Manual.java b/src/main/java/tconstruct/tools/items/Manual.java index 8edbbe4eb44..e2c120aa40b 100644 --- a/src/main/java/tconstruct/tools/items/Manual.java +++ b/src/main/java/tconstruct/tools/items/Manual.java @@ -13,11 +13,12 @@ import cpw.mods.fml.relauncher.SideOnly; import mantle.books.BookData; import mantle.books.BookDataStore; -import mantle.client.gui.GuiManual; import mantle.items.abstracts.CraftingItem; import tconstruct.TConstruct; import tconstruct.achievements.TAchievements; import tconstruct.library.TConstructRegistry; +import tconstruct.tools.gui.TiCGuiManual; +import tconstruct.util.McTextFormatter; public class Manual extends CraftingItem { @@ -45,7 +46,7 @@ public void openBook(ItemStack stack, World world, EntityPlayer player) { BookData data = BookDataStore.getBookfromName(TConstruct.modID, getBookName(stack.getItemDamage())); if (Objects.nonNull(data)) { player.openGui(TConstruct.instance, mantle.client.MProxyClient.manualGuiID, world, 0, 0, 0); - FMLClientHandler.instance().displayGuiScreen(player, new GuiManual(stack, data)); + FMLClientHandler.instance().displayGuiScreen(player, new TiCGuiManual(stack, data)); } } @@ -64,19 +65,19 @@ private static String getBookName(int bookItemDamage) { public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean par4) { switch (stack.getItemDamage()) { case 0: - list.add("\u00a7o" + StatCollector.translateToLocal("manual1.tooltip")); + list.add(McTextFormatter.addItalic(StatCollector.translateToLocal("manual1.tooltip"))); break; case 1: - list.add("\u00a7o" + StatCollector.translateToLocal("manual2.tooltip")); + list.add(McTextFormatter.addItalic(StatCollector.translateToLocal("manual2.tooltip"))); break; case 2: - list.add("\u00a7o" + StatCollector.translateToLocal("manual3.tooltip")); + list.add(McTextFormatter.addItalic(StatCollector.translateToLocal("manual3.tooltip"))); break; case 4: - list.add("\u00a7o" + StatCollector.translateToLocal("manual4.tooltip")); + list.add(McTextFormatter.addItalic(StatCollector.translateToLocal("manual4.tooltip"))); break; default: - list.add("\u00a7o" + StatCollector.translateToLocal("manual5.tooltip")); + list.add(McTextFormatter.addItalic(StatCollector.translateToLocal("manual5.tooltip"))); break; } } From d6bb58e1e73a6fd2e85df9e789736a305d0413e6 Mon Sep 17 00:00:00 2001 From: MCTBL Date: Sun, 1 Mar 2026 14:35:43 +0800 Subject: [PATCH 09/14] add pattern chest for stencil table --- dependencies.gradle | 2 + .../tconstruct/tools/ToolProxyClient.java | 6 +- .../tconstruct/tools/gui/StencilTableGui.java | 56 +++++++- .../PatternShaperChestContainer.java | 124 ++++++++++++++++++ .../inventory/PatternShaperContainer.java | 17 ++- .../tools/logic/StencilTableLogic.java | 31 ++++- .../util/network/PatternTablePacket.java | 33 ++--- .../weaponry/WeaponryClientProxy.java | 31 +++-- .../textures/gui/patternchestminiright.png | Bin 0 -> 3674 bytes 9 files changed, 250 insertions(+), 50 deletions(-) create mode 100644 src/main/java/tconstruct/tools/inventory/PatternShaperChestContainer.java create mode 100644 src/main/resources/assets/tinker/textures/gui/patternchestminiright.png diff --git a/dependencies.gradle b/dependencies.gradle index a4ebb6cafc2..3fb53738a2e 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -20,6 +20,8 @@ dependencies { compileOnlyApi("net.industrial-craft:industrialcraft-2:2.2.828-experimental:dev") compileOnlyApi("com.github.GTNewHorizons:Natura:2.8.12:dev") compileOnly('com.github.GTNewHorizons:Baubles-Expanded:2.2.6-GTNH:dev') + runtimeOnly('com.github.GTNewHorizons:TiC-Tooltips:1.4.1:dev'){transitive = false} + runtimeOnly("com.github.GTNewHorizons:ServerUtilities:2.2.18:dev") // For testing scythe crop harvesting // devOnlyNonPublishable("net.industrial-craft:industrialcraft-2:2.2.828-experimental:dev") diff --git a/src/main/java/tconstruct/tools/ToolProxyClient.java b/src/main/java/tconstruct/tools/ToolProxyClient.java index 6a4d90e57ec..40132c9d79e 100644 --- a/src/main/java/tconstruct/tools/ToolProxyClient.java +++ b/src/main/java/tconstruct/tools/ToolProxyClient.java @@ -696,13 +696,13 @@ void addStencilButtons() { { 10, 2 }, // excavator head { 6, 2 }, // lumberaxe head { 9, 2 }, // large plate - {}, { 4, 2 }, // frying pan + { 4, 2 }, // frying pan { 5, 2 }, // battlesign { 7, 3 }, // chisel - {}, { 7, 2 }, // knifeblade + { 7, 2 }, // knifeblade { 1, 2 }, // swordblade { 6, 3 }, // cleaver blade - {}, { 4, 3 }, // crossbar + { 4, 3 }, // crossbar { 3, 3 }, // small guard { 2, 3 }, // wide guard }; diff --git a/src/main/java/tconstruct/tools/gui/StencilTableGui.java b/src/main/java/tconstruct/tools/gui/StencilTableGui.java index a00bf77d776..187b4888cfe 100644 --- a/src/main/java/tconstruct/tools/gui/StencilTableGui.java +++ b/src/main/java/tconstruct/tools/gui/StencilTableGui.java @@ -21,23 +21,34 @@ import tconstruct.library.client.StencilGuiElement; import tconstruct.library.client.TConstructClientRegistry; import tconstruct.library.crafting.StencilBuilder; -import tconstruct.tools.inventory.PatternShaperContainer; +import tconstruct.tools.inventory.PatternShaperChestContainer; import tconstruct.tools.logic.StencilTableLogic; import tconstruct.util.network.PatternTablePacket; @Optional.Interface(iface = "codechicken.nei.api.INEIGuiHandler", modid = "NotEnoughItems") public class StencilTableGui extends GuiContainer implements INEIGuiHandler { + private static final int CHEST_WIDTH = 122; + private static final int CHEST_HEIGHT = 114; + + private static final int TEXTURE_WIDTH = 176; + private static final int TEXTURE_HEIGHT = 166; + + private int chestLeft = 0; + private int chestTop = 0; + int[] buttonsLeftRect = new int[] { Integer.MAX_VALUE, Integer.MIN_VALUE }; int[] buttonsRightRect = new int[] { Integer.MIN_VALUE, Integer.MIN_VALUE }; StencilTableLogic logic; int activeButton; + boolean drawChestPart; public StencilTableGui(InventoryPlayer inventoryplayer, StencilTableLogic shaper, World world, int x, int y, int z) { - super(new PatternShaperContainer(inventoryplayer, shaper)); + super(shaper.getGuiContainer(inventoryplayer, world, x, y, z)); logic = shaper; activeButton = 0; + drawChestPart = inventorySlots instanceof PatternShaperChestContainer; } @Override @@ -47,22 +58,37 @@ public void onGuiClosed() { @Override protected void drawGuiContainerForegroundLayer(int par1, int par2) { + if (drawChestPart) { + this.fontRendererObj.drawString( + StatCollector.translateToLocal("inventory.PatternChest"), + TEXTURE_WIDTH + 5, + 17, + 0x404040); + } + fontRendererObj.drawString(StatCollector.translateToLocal("crafters.PatternShaper"), 50, 6, 0x404040); fontRendererObj .drawString(StatCollector.translateToLocal("container.inventory"), 8, (ySize - 96) + 2, 0x404040); } private static final ResourceLocation background = new ResourceLocation("tinker", "textures/gui/patternshaper.png"); + private static final ResourceLocation minichest = new ResourceLocation( + "tinker", + "textures/gui/patternchestminiright.png"); @Override protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.getTextureManager().bindTexture(background); - int cornerX = (this.width - this.xSize) / 2; - int cornerY = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(cornerX, cornerY, 0, 0, this.xSize, this.ySize); + this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT); if (!logic.isStackInSlot(0)) { - this.drawTexturedModalRect(cornerX + 47, cornerY + 34, 176, 0, 18, 18); + this.drawTexturedModalRect(this.guiLeft + 47, this.guiTop + 34, 176, 0, 18, 18); + } + + // Draw chest + if (drawChestPart) { + this.mc.getTextureManager().bindTexture(minichest); + this.drawTexturedModalRect(chestLeft, chestTop, 0, 0, CHEST_WIDTH, CHEST_HEIGHT); } } @@ -70,6 +96,12 @@ protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { public void initGui() { super.initGui(); + this.xSize = TEXTURE_WIDTH; + this.ySize = TEXTURE_HEIGHT; + + this.guiLeft = (this.width - TEXTURE_WIDTH) / 2; + this.guiTop = (this.height - TEXTURE_HEIGHT) / 2; + int bpr = 4; // buttons per row! int cornerX = this.guiLeft - 22 * bpr; int cornerY = this.guiTop + 2; @@ -98,7 +130,7 @@ public void initGui() { // secondary buttons, yay! // these are to use for other mods :I - cornerX = this.guiLeft + this.xSize + 4; + cornerX = this.guiLeft + TEXTURE_WIDTH + 4; for (int iter = 0; iter < TConstructClientRegistry.stencilButtons2.size(); iter++) { StencilGuiElement element = TConstructClientRegistry.stencilButtons2.get(iter); if (element.stencilIndex == -1) continue; @@ -131,6 +163,16 @@ public void initGui() { logic.setSelectedPattern(stack); updateServer(stack); } + + if (drawChestPart) { + this.chestLeft = this.guiLeft + TEXTURE_WIDTH; + this.chestTop = this.guiTop + 11; + + this.xSize += CHEST_WIDTH; + // don't know why need add those buttons size + // other wise nei will cover the chest + this.xSize += 27 * bpr; + } } @Override diff --git a/src/main/java/tconstruct/tools/inventory/PatternShaperChestContainer.java b/src/main/java/tconstruct/tools/inventory/PatternShaperChestContainer.java new file mode 100644 index 00000000000..93d9f9c32a2 --- /dev/null +++ b/src/main/java/tconstruct/tools/inventory/PatternShaperChestContainer.java @@ -0,0 +1,124 @@ +package tconstruct.tools.inventory; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +import tconstruct.armor.inventory.SlotOnlyTake; +import tconstruct.library.util.IPattern; +import tconstruct.tools.TinkerTools; +import tconstruct.tools.logic.PatternChestLogic; +import tconstruct.tools.logic.StencilTableLogic; + +public class PatternShaperChestContainer extends Container { + + protected PatternChestLogic patternLogic; + public StencilTableLogic logic; + + public static ItemStack BLANK_PATTERN = new ItemStack(TinkerTools.blankPattern, 1, 0); + + public PatternShaperChestContainer(InventoryPlayer inventoryplayer, StencilTableLogic shaper, + PatternChestLogic pLogic) { + this.logic = shaper; + this.patternLogic = pLogic; + this.addSlotToContainer(new Slot(shaper, 0, 48, 35)); + this.addSlotToContainer(new SlotOnlyTake(shaper, 1, 106, 35)); + /* + * for (int i = 0; i < 3; i++) { for (int l = 0; l < 3; l++) { this.addSlotToContainer(new Slot(craftMatrix, l + + * i * 3, 30 + l * 18, 17 + i * 18)); } } + */ + + /* Player inventory */ + for (int column = 0; column < 3; column++) { + for (int row = 0; row < 9; row++) { + this.addSlotToContainer( + new Slot(inventoryplayer, row + column * 9 + 9, 8 + row * 18, 84 + column * 18)); + } + } + + for (int column = 0; column < 9; column++) { + this.addSlotToContainer(new Slot(inventoryplayer, column, 8 + column * 18, 142)); + } + + /* Holder inventory */ + for (int column = 0; column < 5; column++) { + for (int row = 0; row < 6; row++) { + this.addSlotToContainer(new SlotPattern(pLogic, row + column * 6, 181 + row * 18, 30 + column * 18)); + } + } + } + + /* + * public void onCraftMatrixChanged(IInventory iinventory) { craftResult.setInventorySloTRepos(0, + * CraftingManager.getInstance().findMatchingRecipe(craftMatrix, worldObj)); } + */ + + /* + * @Override public void onContainerClosed(EntityPlayer entityplayer) { super.onContainerClosed(entityplayer); if + * (logic.worldObj.isRemote) { return; } ItemStack itemstack = logic.getStackInSlot(0); if (itemstack != null) { + * entityplayer.dropPlayerItem(itemstack); } } + */ + + @Override + public boolean canInteractWith(EntityPlayer entityplayer) { + Block block = logic.getWorldObj().getBlock(logic.xCoord, logic.yCoord, logic.zCoord); + if (block != TinkerTools.toolStationWood && block != TinkerTools.craftingSlabWood) return false; + return logic.isUseableByPlayer(entityplayer); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slotID) { + return null; + } + + @Override + public ItemStack slotClick(int slotId, int clickedButton, int mode, EntityPlayer player) { + if (mode == 1 && clickedButton == 0) { + // is it shift left click? + Slot slot = (Slot) this.inventorySlots.get(slotId); + if (slot != null && slot.getHasStack()) { + ItemStack stack = slot.getStack(); + if (slotId >= logic.getSizeInventory() && stack.isItemEqual(BLANK_PATTERN)) { + // clicked in player inventory + if (stack.isItemEqual(BLANK_PATTERN) && !this.mergeItemStack(stack, 0, 1, false)) { + // fail to move blank pattern into stencil table + return null; + } else if (stack.getItem() instanceof IPattern + && !this.mergeItemStack(stack, 4 * 9 + 2, this.inventorySlots.size(), false)) { + // fail to move pattern into pattern chest + return null; + } + } else if (slotId < logic.getSizeInventory()) { + if (stack.getItem() instanceof IPattern) { + // pattern slot, search from pattern chest first + if (!this.mergeItemStack(stack, 4 * 9 + 2, this.inventorySlots.size(), false)) { + if (!this.mergeItemStack(stack, 2, 4 * 9 + 2, false)) { + return null; + } + } + // special for shift click the output pattern + if (slotId == 1) { + this.inventorySlots.get(0).decrStackSize(1); + // if there still have blank pattern + if (this.inventorySlots.get(0).getStack().stackSize != 0) { + ItemStack stackCopy = stack.copy(); + stackCopy.stackSize = 1; + this.inventorySlots.get(1).putStack(stackCopy); + } + } + } else { + if (!this.mergeItemStack(stack, 2, 4 * 9 + 2, false)) { + return null; + } + } + } + slot.onSlotChanged(); + + } + } + return super.slotClick(slotId, clickedButton, mode, player); + } +} diff --git a/src/main/java/tconstruct/tools/inventory/PatternShaperContainer.java b/src/main/java/tconstruct/tools/inventory/PatternShaperContainer.java index d28e51df5e0..aa5b06a5dc0 100644 --- a/src/main/java/tconstruct/tools/inventory/PatternShaperContainer.java +++ b/src/main/java/tconstruct/tools/inventory/PatternShaperContainer.java @@ -8,6 +8,7 @@ import net.minecraft.item.ItemStack; import tconstruct.armor.inventory.SlotOnlyTake; +import tconstruct.library.util.IPattern; import tconstruct.tools.TinkerTools; import tconstruct.tools.logic.StencilTableLogic; @@ -78,16 +79,20 @@ public ItemStack slotClick(int slotId, int clickedButton, int mode, EntityPlayer // pattern slot if (!this.mergeItemStack(stack, 2, this.inventorySlots.size(), false)) { return null; - } else if (slotId == 1) { + } + if (stack.getItem() instanceof IPattern && slotId == 1) { // special for shift click the output pattern this.inventorySlots.get(0).decrStackSize(1); + // if there still have blank pattern + if (this.inventorySlots.get(0).getStack().stackSize != 0) { + ItemStack stackCopy = stack.copy(); + stackCopy.stackSize = 1; + this.inventorySlots.get(1).putStack(stack.copy()); + } } } - if (stack.stackSize == 0) { - slot.putStack((ItemStack) null); - } else { - slot.onSlotChanged(); - } + slot.onSlotChanged(); + } } return super.slotClick(slotId, clickedButton, mode, player); diff --git a/src/main/java/tconstruct/tools/logic/StencilTableLogic.java b/src/main/java/tconstruct/tools/logic/StencilTableLogic.java index 718c2c5bd3a..fb40b69911f 100644 --- a/src/main/java/tconstruct/tools/logic/StencilTableLogic.java +++ b/src/main/java/tconstruct/tools/logic/StencilTableLogic.java @@ -4,11 +4,13 @@ import net.minecraft.inventory.Container; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.StatCollector; import net.minecraft.world.World; import mantle.blocks.abstracts.InventoryLogic; import tconstruct.library.crafting.StencilBuilder; +import tconstruct.tools.inventory.PatternShaperChestContainer; import tconstruct.tools.inventory.PatternShaperContainer; public class StencilTableLogic extends InventoryLogic implements ISidedInventory { @@ -31,6 +33,15 @@ public String getDefaultName() { @Override public Container getGuiContainer(InventoryPlayer inventoryplayer, World world, int x, int y, int z) { + for (int xPos = x - 1; xPos <= x + 1; xPos++) { + for (int zPos = z - 1; zPos <= z + 1; zPos++) { + for (int yPos = y - 1; yPos <= y + 1; yPos++) { + TileEntity tile = world.getTileEntity(xPos, yPos, zPos); + if (tile instanceof PatternChestLogic && (x == xPos || z == zPos)) + return new PatternShaperChestContainer(inventoryplayer, this, (PatternChestLogic) tile); + } + } + } return new PatternShaperContainer(inventoryplayer, this); } @@ -41,7 +52,25 @@ public Container getGuiContainer(InventoryPlayer inventoryplayer, World world, i public void setSelectedPattern(ItemStack stack) { selectedStack = stack; - this.setInventorySlotContents(1, stack); + if (stack == null) this.setInventorySlotContents(1, null); + else { + ItemStack stackBlank = this.getStackInSlot(0); + if (stackBlank != null && stackBlank.stackSize > 0 && StencilBuilder.isBlank(stackBlank)) { + boolean warning = true; + for (ItemStack tempStack : StencilBuilder.instance.stencils.values()) { + if (tempStack != null && stack.isItemEqual(tempStack)) { + stack = tempStack.copy(); + warning = false; + break; + } + } + if (!warning) this.setInventorySlotContents(1, stack); + } + } + } + + public void setSelectedPattern() { + setSelectedPattern(selectedStack); } @Override diff --git a/src/main/java/tconstruct/util/network/PatternTablePacket.java b/src/main/java/tconstruct/util/network/PatternTablePacket.java index 05bbf640a22..78baffc71ae 100644 --- a/src/main/java/tconstruct/util/network/PatternTablePacket.java +++ b/src/main/java/tconstruct/util/network/PatternTablePacket.java @@ -7,8 +7,7 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import mantle.common.network.AbstractPacket; -import tconstruct.TConstruct; -import tconstruct.library.crafting.StencilBuilder; +import tconstruct.tools.inventory.PatternShaperChestContainer; import tconstruct.tools.inventory.PatternShaperContainer; import tconstruct.tools.logic.StencilTableLogic; @@ -47,28 +46,16 @@ public void handleClientSide(EntityPlayer player) {} @Override public void handleServerSide(EntityPlayer player) { - if (player.openContainer instanceof PatternShaperContainer) { - PatternShaperContainer container = (PatternShaperContainer) player.openContainer; - StencilTableLogic logic = container.logic; + if (player.openContainer instanceof PatternShaperContainer + || player.openContainer instanceof PatternShaperChestContainer) { + StencilTableLogic logic = null; + if (player.openContainer instanceof PatternShaperContainer psc) { + logic = psc.logic; + } else if (player.openContainer instanceof PatternShaperChestContainer pscc) { + logic = pscc.logic; + } if (logic != null && logic.xCoord == this.x && logic.yCoord == this.y && logic.zCoord == this.z) - if (this.contents == null) logic.setSelectedPattern(null); - else { - ItemStack stackBlank = logic.getStackInSlot(0); - if (stackBlank != null && stackBlank.stackSize > 0 && StencilBuilder.isBlank(stackBlank)) { - boolean warning = true; - for (ItemStack stack : StencilBuilder.instance.stencils.values()) { - if (stack != null && this.contents.isItemEqual(stack)) { - this.contents = stack.copy(); - warning = false; - break; - } - } - if (warning) TConstruct.logger.warn( - "Possible packet-cheating with PatternTable for player " - + player.getCommandSenderName()); - else logic.setSelectedPattern(this.contents); - } - } + logic.setSelectedPattern(contents); } } } diff --git a/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java b/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java index 669cdd781fc..19d2a20b62b 100644 --- a/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java +++ b/src/main/java/tconstruct/weaponry/WeaponryClientProxy.java @@ -122,17 +122,28 @@ private void buttons() { final String tex = "textures/gui/icons.png"; // Stencil Table - TConstructClientRegistry.addStencilButton2(11, 3, 21, Reference.RESOURCE, tex); // arrow head - TConstructClientRegistry.addStencilButton2(12, 3, 22, Reference.RESOURCE, tex); // fletchling - TConstructClientRegistry.addStencilButton2(0, 0, -1, null, null); - TConstructClientRegistry.addStencilButton2(0, 0, -1, null, null); + // TConstructClientRegistry.addStencilButton2(11, 3, 21, Reference.RESOURCE, tex); // arrow head + // TConstructClientRegistry.addStencilButton2(12, 3, 22, Reference.RESOURCE, tex); // fletchling + // TConstructClientRegistry.addStencilButton2(0, 0, -1, null, null); + // TConstructClientRegistry.addStencilButton2(0, 0, -1, null, null); + + // TConstructClientRegistry.addStencilButton2(10, 3, 23, Reference.RESOURCE, tex); // bowstring + // TConstructClientRegistry.addStencilButton2(0, 4, 24, Reference.RESOURCE, tex); // shuriken + // TConstructClientRegistry.addStencilButton2(1, 4, 25, Reference.RESOURCE, tex); // crossbow limb + // TConstructClientRegistry.addStencilButton2(2, 4, 26, Reference.RESOURCE, tex); // crossbow body + // + // TConstructClientRegistry.addStencilButton2(3, 4, 27, Reference.RESOURCE, tex); // bow limb + + // move to left + TConstructClientRegistry.addStencilButton(11, 3, 21, Reference.RESOURCE, tex); // arrow head + TConstructClientRegistry.addStencilButton(12, 3, 22, Reference.RESOURCE, tex); // fletchling + TConstructClientRegistry.addStencilButton(10, 3, 23, Reference.RESOURCE, tex); // bowstring + TConstructClientRegistry.addStencilButton(0, 4, 24, Reference.RESOURCE, tex); // shuriken + TConstructClientRegistry.addStencilButton(1, 4, 25, Reference.RESOURCE, tex); // crossbow limb + TConstructClientRegistry.addStencilButton(2, 4, 26, Reference.RESOURCE, tex); // crossbow body + + TConstructClientRegistry.addStencilButton(3, 4, 27, Reference.RESOURCE, tex); // bow limb - TConstructClientRegistry.addStencilButton2(10, 3, 23, Reference.RESOURCE, tex); // bowstring - TConstructClientRegistry.addStencilButton2(0, 4, 24, Reference.RESOURCE, tex); // shuriken - TConstructClientRegistry.addStencilButton2(1, 4, 25, Reference.RESOURCE, tex); // crossbow limb - TConstructClientRegistry.addStencilButton2(2, 4, 26, Reference.RESOURCE, tex); // crossbow body - - TConstructClientRegistry.addStencilButton2(3, 4, 27, Reference.RESOURCE, tex); // bow limb // TConstructClientRegistry.addStencilButton2(4, 4, index, Reference.RESOURCE, "textures/gui/icons.png"); // // bolt diff --git a/src/main/resources/assets/tinker/textures/gui/patternchestminiright.png b/src/main/resources/assets/tinker/textures/gui/patternchestminiright.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0c5c7b0d1805fe47176b80d88bee8c05aec10b GIT binary patch literal 3674 zcmdT{Yg7|w8lIp)L;dHQwoVwX4!9iij*n1&>_BYvtm82_fRGwLSf@%Ykp^ z`{w1VPUU zjKg9VExb+UMx@jE98o6+N{3Uh+I_G#!CNL!FvLmQ5ln%)Q}P6|j4#ffePAN5%Qac;fQYbncYT#LmIe&Dh5=Jp2hEpmH_rIa*^VJt?& z1g+&@Ohss5Elv|Ksn!r0g5z)vp&Hq*=b0RLbKU!gea`X>z<9`tX=x2c(kRU0ECZWy zf`-#kObx3!l3*DEPsgy~ngBHm9TxDa(b=O>-KtoC$dD>VrPR`}TB8BGX##_3T$K)! zG;K!JC9?!+> z-Jh4q0ni_4{xG}1o5eiZ!Nq2P+C7iIkZ0)^=-eMxPms8lF`G#kRcW-aiXcds=2#7^ zVlj=9G@CWF7Pw(p)@b!3epG5H%xB%7soo3EWYV?_4xFHf{O9NMeC~X9K99U#zi2*) z`|KRH8uGXcJRk&LoYiq~vlG z9eSIsQYJPMWj70B&PSFs>{)#;WvFwY&15RAszTEC58OI>xGlN4>rQQ}v!I~vE2wMs za%fC;Re8#T(^+Z#r&3DR8cc(I@Ab!o9{%jhR{ww|qe&MXJ#_16XjJq-U(Kc&QBhfu z4d=#8X#Dm*+f)=DaR3THizO457vGVrrv$!Y#ooa+d-ku~(73y5+6Dj87Tet`e|_)l zvTgOH(?Hz%lBk$+lRnM0`twzY8EhyU$-X7N;ixNOMQeF?*n^4HP|Fx`&yNrN`{A5U>z41X>uc&=2Tz42XYdeW+$QPOCut!oOcce!?zmX^*Rk_zK8T&}MR z_GZ2^^ulty1;$thyt4 z#r_>LDoTI3;mrZR2@UNl-?;Xd>t}2c>%UuCRucvc(%AW}t|4vHzHDDC)KfI_xCr76t`0y2}SSM=9c>%8aG!fk-h}Ajg^%_>!uXj|6PPVxTsls zY~`(gRirjagRainhefZKlc?9th_|4>SXd zZ+kDBd_o^ly;Le*ZdgNlFZE+b>3fKFWnRVXn2_TbIQh31NIz1#s}g)TxseDy(O&HU zBCCNRwpU$qTOus1x3@Rhq%xWc>$2Kng6H||eFo~|^?1nlfB0l@{Oy)}0~(H}y8ru2 Nn4hHIIdA#e{{pnA2nGNE literal 0 HcmV?d00001 From 06886dc50878634687eccbe432d35b630960557e Mon Sep 17 00:00:00 2001 From: MCTBL Date: Sun, 1 Mar 2026 14:59:07 +0800 Subject: [PATCH 10/14] set null after transfer stack --- .../tools/inventory/PatternShaperChestContainer.java | 4 +++- .../tconstruct/tools/inventory/PatternShaperContainer.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/tconstruct/tools/inventory/PatternShaperChestContainer.java b/src/main/java/tconstruct/tools/inventory/PatternShaperChestContainer.java index 93d9f9c32a2..55c47ac3919 100644 --- a/src/main/java/tconstruct/tools/inventory/PatternShaperChestContainer.java +++ b/src/main/java/tconstruct/tools/inventory/PatternShaperChestContainer.java @@ -115,8 +115,10 @@ public ItemStack slotClick(int slotId, int clickedButton, int mode, EntityPlayer } } } + if (stack.stackSize == 0 && slotId != 1) { + slot.putStack((ItemStack) null); + } slot.onSlotChanged(); - } } return super.slotClick(slotId, clickedButton, mode, player); diff --git a/src/main/java/tconstruct/tools/inventory/PatternShaperContainer.java b/src/main/java/tconstruct/tools/inventory/PatternShaperContainer.java index aa5b06a5dc0..c1d6dacd76c 100644 --- a/src/main/java/tconstruct/tools/inventory/PatternShaperContainer.java +++ b/src/main/java/tconstruct/tools/inventory/PatternShaperContainer.java @@ -91,8 +91,10 @@ public ItemStack slotClick(int slotId, int clickedButton, int mode, EntityPlayer } } } + if (stack.stackSize == 0 && slotId != 1) { + slot.putStack((ItemStack) null); + } slot.onSlotChanged(); - } } return super.slotClick(slotId, clickedButton, mode, player); From b9bb2728b926c4d2af8bb5b58b9472627f3af91c Mon Sep 17 00:00:00 2001 From: MCTBL Date: Tue, 3 Mar 2026 20:19:55 +0800 Subject: [PATCH 11/14] fix --- .../tools/blocks/ToolStationBlock.java | 4 +- .../tconstruct/tools/gui/PartCrafterGui.java | 72 ++++++++++--------- .../tconstruct/tools/gui/StencilTableGui.java | 15 ++-- .../tconstruct/tools/gui/TiCGuiManual.java | 5 +- .../PatternShaperChestContainer.java | 2 +- 5 files changed, 52 insertions(+), 46 deletions(-) diff --git a/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java b/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java index 42c939bfa15..a7a5a5daacc 100644 --- a/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java +++ b/src/main/java/tconstruct/tools/blocks/ToolStationBlock.java @@ -206,8 +206,8 @@ public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, i break; } default: { - chest = new ItemStack(this, 1, 5); - logic = (PatternChestLogic) world.getTileEntity(x, y, z); + chest = new ItemStack(this, 1, 6); + logic = (PartChestLogic) world.getTileEntity(x, y, z); break; } } diff --git a/src/main/java/tconstruct/tools/gui/PartCrafterGui.java b/src/main/java/tconstruct/tools/gui/PartCrafterGui.java index 1af19100370..694e05fcc22 100644 --- a/src/main/java/tconstruct/tools/gui/PartCrafterGui.java +++ b/src/main/java/tconstruct/tools/gui/PartCrafterGui.java @@ -204,21 +204,23 @@ void drawMaterialInformation() { 0xFFFFFF); offset += 11; - this.fontRendererObj.drawString( - StatCollector.translateToLocal("gui.partcrafter.drawspeed") - + McTextFormatter.addGray(df.format(bowTop.drawspeed / 20f) + "s"), - scaledDescTextLeft, - offset, - 0xFFFFFF); - offset += 11; + if (bowTop != null) { + this.fontRendererObj.drawString( + StatCollector.translateToLocal("gui.partcrafter.drawspeed") + + McTextFormatter.addGray(df.format(bowTop.drawspeed / 20f) + "s"), + scaledDescTextLeft, + offset, + 0xFFFFFF); + offset += 11; - this.fontRendererObj.drawString( - StatCollector.translateToLocal("gui.partcrafter.arrowspeed") - + McTextFormatter.addGray(df.format(bowTop.flightSpeedMax)), - scaledDescTextLeft, - offset, - 0xFFFFFF); - offset += 11; + this.fontRendererObj.drawString( + StatCollector.translateToLocal("gui.partcrafter.arrowspeed") + + McTextFormatter.addGray(df.format(bowTop.flightSpeedMax)), + scaledDescTextLeft, + offset, + 0xFFFFFF); + offset += 11; + } if (arrowShaftTop != null) { @@ -246,28 +248,30 @@ void drawMaterialInformation() { offset += 11; } - this.fontRendererObj.drawString( - McTextFormatter.addUnderLine(StatCollector.translateToLocal("gui.partcrafter.bolt")), - scaledDescTextLeft, - offset, - 0xFFFFFF); - offset += 11; + if (arrowTop != null) { + this.fontRendererObj.drawString( + McTextFormatter.addUnderLine(StatCollector.translateToLocal("gui.partcrafter.bolt")), + scaledDescTextLeft, + offset, + 0xFFFFFF); + offset += 11; - this.fontRendererObj.drawString( - StatCollector.translateToLocal("gui.partcrafter.weight") - + McTextFormatter.addYellow(df.format(arrowTop.mass)), - scaledDescTextLeft + 4, - offset, - 0xFFFFFF); - offset += 11; + this.fontRendererObj.drawString( + StatCollector.translateToLocal("gui.partcrafter.weight") + + McTextFormatter.addYellow(df.format(arrowTop.mass)), + scaledDescTextLeft + 4, + offset, + 0xFFFFFF); + offset += 11; - this.fontRendererObj.drawString( - StatCollector.translateToLocal("gui.partcrafter.breakchance") - + McTextFormatter.addYellow(df.format(arrowTop.breakChance * 100f) + "%"), - scaledDescTextLeft + 4, - offset, - 0xFFFFFF); - offset += 11; + this.fontRendererObj.drawString( + StatCollector.translateToLocal("gui.partcrafter.breakchance") + + McTextFormatter.addYellow(df.format(arrowTop.breakChance * 100f) + "%"), + scaledDescTextLeft + 4, + offset, + 0xFFFFFF); + offset += 11; + } GL11.glPopMatrix(); } diff --git a/src/main/java/tconstruct/tools/gui/StencilTableGui.java b/src/main/java/tconstruct/tools/gui/StencilTableGui.java index 187b4888cfe..7c11f78d818 100644 --- a/src/main/java/tconstruct/tools/gui/StencilTableGui.java +++ b/src/main/java/tconstruct/tools/gui/StencilTableGui.java @@ -79,17 +79,17 @@ protected void drawGuiContainerForegroundLayer(int par1, int par2) { @Override protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(background); - this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT); - if (!logic.isStackInSlot(0)) { - this.drawTexturedModalRect(this.guiLeft + 47, this.guiTop + 34, 176, 0, 18, 18); - } - // Draw chest if (drawChestPart) { this.mc.getTextureManager().bindTexture(minichest); this.drawTexturedModalRect(chestLeft, chestTop, 0, 0, CHEST_WIDTH, CHEST_HEIGHT); } + + this.mc.getTextureManager().bindTexture(background); + this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT); + if (!logic.isStackInSlot(0)) { + this.drawTexturedModalRect(this.guiLeft + 47, this.guiTop + 34, 176, 0, 18, 18); + } } @Override @@ -165,7 +165,8 @@ public void initGui() { } if (drawChestPart) { - this.chestLeft = this.guiLeft + TEXTURE_WIDTH; + // make gui closer to main gui + this.chestLeft = this.guiLeft + TEXTURE_WIDTH - 1; this.chestTop = this.guiTop + 11; this.xSize += CHEST_WIDTH; diff --git a/src/main/java/tconstruct/tools/gui/TiCGuiManual.java b/src/main/java/tconstruct/tools/gui/TiCGuiManual.java index bfdc06f8858..793890ef2ee 100644 --- a/src/main/java/tconstruct/tools/gui/TiCGuiManual.java +++ b/src/main/java/tconstruct/tools/gui/TiCGuiManual.java @@ -21,6 +21,7 @@ import mantle.client.gui.GuiManual; import mantle.client.gui.TurnPageButton; import mantle.client.pages.BookPage; +import tconstruct.TConstruct; @SideOnly(Side.CLIENT) public class TiCGuiManual extends GuiManual { @@ -122,7 +123,7 @@ void ticUpdateText() { pageLeft.init(this, 0); pageLeft.readPageFromXML(element); } catch (Exception e) { - System.out.println(e); + TConstruct.logger.error(e); } } else { pageLeft = null; @@ -139,7 +140,7 @@ void ticUpdateText() { pageRight.init(this, 1); pageRight.readPageFromXML(element); } catch (Exception e) { - System.out.println(e); + TConstruct.logger.error(e); } } else { pageLeft = null; diff --git a/src/main/java/tconstruct/tools/inventory/PatternShaperChestContainer.java b/src/main/java/tconstruct/tools/inventory/PatternShaperChestContainer.java index 55c47ac3919..4b0e19c1143 100644 --- a/src/main/java/tconstruct/tools/inventory/PatternShaperChestContainer.java +++ b/src/main/java/tconstruct/tools/inventory/PatternShaperChestContainer.java @@ -46,7 +46,7 @@ public PatternShaperChestContainer(InventoryPlayer inventoryplayer, StencilTable /* Holder inventory */ for (int column = 0; column < 5; column++) { for (int row = 0; row < 6; row++) { - this.addSlotToContainer(new SlotPattern(pLogic, row + column * 6, 181 + row * 18, 30 + column * 18)); + this.addSlotToContainer(new SlotPattern(pLogic, row + column * 6, 180 + row * 18, 30 + column * 18)); } } } From b874df43254d63fcbc7ef49179713aa21181b868 Mon Sep 17 00:00:00 2001 From: MCTBL Date: Wed, 4 Mar 2026 19:43:51 +0800 Subject: [PATCH 12/14] fix texture --- .../tconstruct/tools/gui/StencilTableGui.java | 14 +++++++------- .../PatternShaperChestContainer.java | 2 +- .../resources/assets/tinker/lang/en_US.lang | 1 + .../resources/assets/tinker/lang/zh_CN.lang | 1 + .../tinker/textures/gui/patternchestmini.png | Bin 954 -> 3214 bytes .../textures/gui/patternchestminiright.png | Bin 3674 -> 3836 bytes 6 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/tconstruct/tools/gui/StencilTableGui.java b/src/main/java/tconstruct/tools/gui/StencilTableGui.java index 7c11f78d818..dbf10012d12 100644 --- a/src/main/java/tconstruct/tools/gui/StencilTableGui.java +++ b/src/main/java/tconstruct/tools/gui/StencilTableGui.java @@ -79,17 +79,17 @@ protected void drawGuiContainerForegroundLayer(int par1, int par2) { @Override protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - // Draw chest - if (drawChestPart) { - this.mc.getTextureManager().bindTexture(minichest); - this.drawTexturedModalRect(chestLeft, chestTop, 0, 0, CHEST_WIDTH, CHEST_HEIGHT); - } - this.mc.getTextureManager().bindTexture(background); this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT); if (!logic.isStackInSlot(0)) { this.drawTexturedModalRect(this.guiLeft + 47, this.guiTop + 34, 176, 0, 18, 18); } + + // Draw chest + if (drawChestPart) { + this.mc.getTextureManager().bindTexture(minichest); + this.drawTexturedModalRect(chestLeft, chestTop, 0, 0, CHEST_WIDTH, CHEST_HEIGHT); + } } @Override @@ -166,7 +166,7 @@ public void initGui() { if (drawChestPart) { // make gui closer to main gui - this.chestLeft = this.guiLeft + TEXTURE_WIDTH - 1; + this.chestLeft = this.guiLeft + TEXTURE_WIDTH - 3; this.chestTop = this.guiTop + 11; this.xSize += CHEST_WIDTH; diff --git a/src/main/java/tconstruct/tools/inventory/PatternShaperChestContainer.java b/src/main/java/tconstruct/tools/inventory/PatternShaperChestContainer.java index 4b0e19c1143..af03d7f91c4 100644 --- a/src/main/java/tconstruct/tools/inventory/PatternShaperChestContainer.java +++ b/src/main/java/tconstruct/tools/inventory/PatternShaperChestContainer.java @@ -46,7 +46,7 @@ public PatternShaperChestContainer(InventoryPlayer inventoryplayer, StencilTable /* Holder inventory */ for (int column = 0; column < 5; column++) { for (int row = 0; row < 6; row++) { - this.addSlotToContainer(new SlotPattern(pLogic, row + column * 6, 180 + row * 18, 30 + column * 18)); + this.addSlotToContainer(new SlotPattern(pLogic, row + column * 6, 178 + row * 18, 30 + column * 18)); } } } diff --git a/src/main/resources/assets/tinker/lang/en_US.lang b/src/main/resources/assets/tinker/lang/en_US.lang index 537fd460901..c5cb432a7f9 100644 --- a/src/main/resources/assets/tinker/lang/en_US.lang +++ b/src/main/resources/assets/tinker/lang/en_US.lang @@ -17,6 +17,7 @@ inventory.PartChest=Part Chest crafters.Smeltery=Smeltery crafters.Frypan=Frying Pan inventory.knapsack=Knapsack +toolstation.partholder=Part Chest nei.options.keys.gui.tinkers_belt=Toggle Travellers Belt diff --git a/src/main/resources/assets/tinker/lang/zh_CN.lang b/src/main/resources/assets/tinker/lang/zh_CN.lang index 875a07a7362..8543c6c6f09 100644 --- a/src/main/resources/assets/tinker/lang/zh_CN.lang +++ b/src/main/resources/assets/tinker/lang/zh_CN.lang @@ -16,6 +16,7 @@ inventory.PartChest=部件箱 crafters.Smeltery=冶炼炉 crafters.Frypan=煎锅 inventory.knapsack=背包 +toolstation.partholder=部件箱 nei.options.keys.gui.tinkers_belt=切换旅行者腰带 diff --git a/src/main/resources/assets/tinker/textures/gui/patternchestmini.png b/src/main/resources/assets/tinker/textures/gui/patternchestmini.png index 40619689453209141f4003a6bebb0037c561366d..0d78524d4fb8667858456789016991386fb02e32 100644 GIT binary patch literal 3214 zcmdT{dr(tX8ov<~eDG*%rCNr)jqNDwCN~cV$(5j(s4z=_5q7aw0@s^Mh#~ie+&}_I zl5Oo`)xyr~tdD}?9|hJ2j$4ORq*bc6SX*EnYg(G+A#RtoHpKE&lfa$?2w3fIx8v;0 z-kJN&Irsd&*YEqzm&se{shdLP)Kr;bPEJAz>)z4F932)(V=@_w@{n(Dh)x4 zpYy&9=$)DuASiHHmAO^FRhEL{l!lEds2v2`sL=v61jVm2YB5|*=;0lNQbmfH&X$Wz zSfvm%vtnf&nN~vNtCC7}L`G?9CSIz>MGEG+1UTM^0s|UCkHJPw0ZF4qG1F%k1#9nT zgbDi~dbOCD=yeEhm8HWHN=Lx4Yyk`B#>B#LA~sjRj}eJ}1@kyuA;J+NTt15{Kw~&4 zj|WdbOyEtY$V0bCH%q^_Y=G z(ko{yNC_I(skC|(MZ#W-*bb^lFJ^*Br&7>p{bosenkGOPV#Krvm(B5}jKTcbu zEATm2;0RGbXb4hI11#5%)#g)riq5Bg#I*nT5eI-;nauCwiLq!jeiyWUV=+i$nvf@= z>C6%>fovgYsz`?u8;e1hE4|rhQHhSg^pq}>q6%gTl|BG}h?zVNPr%~vSUi3vkB9Q(P`+>tM~HGbQ&1VDQ00}(h4NXPm`tt+Q3!}1@!rO%RFEHL={uWqb7$aS9C(-hIRrNTNk))h zeCfcPl85hVg`l9sWNBiivBuGzo%&kWvNx|g)~tB`bs-nbKBI7 zRPTkxCL0jcHa3wYDK8SZACBIw?)-g=rtD^UZTo#mE)?)WE3|-PVSEzwRb$p* z$SJ<~aC7P9o>r?VzOHQF_Z5BDCt5QQM}&Ly%N*tMDUV85K$>T;w_`N>UcR~SIPIM8 zz6NYry4B+gZ11g`HJWf0YKa}W?edr=|Dntn;7kOkw49&pzq9P);|F;)x@!8vKd%j1 zcy6*k3;8JR0e2$${pNQA-PjE8-2$Al28zTIiJ7R5*Px=fuzJr(p-^Wv?RJB)hI*t3TlI!ZqMeEop?w+W18 zxuq5rB7b@Gi)M1T_FU4p$7y*?T_Cb&{-LPccV@+^4dXdR=2F5Rn$NG*Zq-x^k(_Hc z`?K0^7nVO5`X<{sGB!4r?R35pF)XJDQhW$rTR8<6BXsf$l z(&T<6`=bumr&+m2pexy8&%Slpm&-s~v>D#a?$@yIWbZuq_gA5w;Ul!O7%#zvfq09n6SYjWbAovu6QxAQ1E(x&Acf!(}mbmy2=sTnYJkQ zC!5W0^ns9m>3qZ8FjQMB9}umtfvzlk%A(u6Dg73`V^?Gc@}1Ro;{NV4t4`at)m81O zj=I%v3=Lle70&aEDieOy;c$ErIe7xfxsXz&{Y&b^pSa-HeX`kpuPl`@2kKL5(b%o7 zyNrZ~oBoiqe7xo-FfhwrLEy(-!F%aNkMhOXbM~2~%9X1-9_RY{roV1huKcGcB;3$s zci7t7+eadum#C1k4y1Db+0}(d1D-m0PrDei_8ca6v&Jq!gD3ZP*HRn0Zk7(Uo8zMf z>TjJIb9qLBx1Zab#wZ__?EBIZUJt=3jP-}+Svd0{Y!P(nwESV4-EJ=ety;fU2u9wG zhP2Az(6;aK?Wx}^hjvFp!5Pq_T8KOd47?9RD=t?%uN3wS2(>377WWMf4z?S#!pO*h zBb5OSL(f8&mOic>F|YjC?bhSlgGYY%KLi!48$oY1*|vfCP`sjJ=fz%Uy|VAUl7$c! z)){UG#s3Pf=>)y{wR2o8Hto7~xZ88Xe5~!)kLL~;dqP@MRQ^95m;;Ifciub`w9VoD P$B?`+ReE|u?(6>oiO-@L literal 954 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|GzJFdMo$;VkcwMx?*#VEa*#Rj zaON@N&Qqp4I5_7e$?st=;Ip{)CGoM@mePwIX^H#vZ?>;}nd9^^e8$vzp86#R#9Z1N z-2JCbne@G0&#)s<`Nx;jv+HLcD=ZP1v9d)t!b zr)Jlq+t;`MIr8LZO&Jr1!@XzoZ0>v#p3L+>jA6%ft_7=BT`)PT^#5_h^RKTDEMk1| z``^pz^{@ZVE{)sY*Xf|Mk3E6ueAP8WL5^yM1_lNu1`Y-V2!rW?090TC>t_a|lJk?> z=gkmdFnd*Cac1AmZNHAFFio%(Zrs4mFoWaCKQYD~2U+Hou1!`F=zh;Q}Em}A-7H~iV_C!-9gQSrl2jhtuoemrh$H2BGC{6es&GLXvxZ>JYVtgt2 z$s~bIZ~EyczyH>~U+{p7A%<~7W$bm|efhV`zP+zV3Szj?u}DMh{%nwgpIj8a@1ju6 z;P5V-LG8ni{i=@{rljsXF@f{-o^;s)Zg2=5I3wrKW4J6);@{5`8n3Tx%au6(@%8=7 z?)5WwGj%M#eDdOr36DR%P$;-AdLZ=8E(H{$o^%2ZoO}0Xc4g4 zy1mHm!!t2(3RFmLYr3a-Ov1*nQ@f$(rUMhhfP#kWKX{)l+Ld@oT4N^2A)c;&F6*2U FngD(eJg5Kw diff --git a/src/main/resources/assets/tinker/textures/gui/patternchestminiright.png b/src/main/resources/assets/tinker/textures/gui/patternchestminiright.png index 5b0c5c7b0d1805fe47176b80d88bee8c05aec10b..0abd94d647cb9bae4c5f7977923a3e0bc90a85fe 100644 GIT binary patch delta 1878 zcmca5^G9}q1rxjdMyp;XE|U;LODkhjD?`i47nziix&N2~R7}k+ER0Ok(sWaeEKPMS zj7=={G0b@g6r zd`>ekuqS)EIEGZrd3!go=vJBt>x0#NuRoXx-M-!Mrdjga!di)Kf`*fQSMtx?vGVc8 z*aa~UKiB%NWj}3h->$64!t?cVjQWh{l@?FG*KMD*?Bx>sI?ejhe;-$^3Jtyb{r&y_ zUk@LC81VY*ue0$rH8p!qFuc`HU|?Res&3i8rS;eAzU}t5CRv z203Q4CzreV`}?QA=WVadyDRzaJ}a9+10xSmqr`&RhJ}7M<^iQUKQpWUePq%1{NLME zQ3ql-+{)Yj-j4I9{rnYM)&tcV)cpMPbcxcg-Me?62;Llio`27mTZca!@0W+FPiVM$ zxBl+k-QSU9{s_D*tpP z#{K^u@16cizjXFe)d!V~>%Iy^%=*#Z!1_XN!E88jd)2Gt_11My7}7G?E#)uPRqcxY z<9vXrg#W@>6rvuD58=MOp8e&zo$i(y#(}!?^FMs}U~t{O`@Ysc#RSG(>@Uhbsn^V@ zn!R*ynZSGo?hCdK+Y@IktK5Az?k#`c;|P9!e(_4-XR34l{M4HNbkRx-r_E+wsKxGd zQODss!(E+vFbN`}?pf_#!MxDB*5!KrmX7+Gt4(oB-U!`i6kAZ;kVi%0Be#LiWt02& z@0XwdxZk>7uD^SiMYd*GsJ-~}&Dpyo@;*M&HkixMQvI*0H+x_9n^__MZ-?#we}3yd z)#+dQ_AK4Z&7sclkVRn*LyK@j0h53q!y()K$^SOb=a4$S@!Rjc;>~ddN*Z%w9V{48 z6`t!{P~gYX3ez8R`gwYJfq>|bUH8QwZ)Q(ivC8ZJjt|ox+1uOBO`g1vJEH#G^>h~1 z8o!?Y!<9#~_#&s~-`{uk>wEsAi&ljlf4s4pP0ErD)rNOJrJe8nJ~iWORc!m=htKjp z|M>CaS?(oU_6K{{$K8Be_C7DCb9>>u$GK&Us2<>S*zx=`!~3}*JFnih5d31M-gM|D zYdze5oKU~a;oy4i5@4|#>TQ@XFf4=}9|9%Q#X+HgB+SrK3=9gO%{N_44%F>mUpde805``z3!^!%oX;gDZ{!Y`oX4G#!aMtH z+P%E(rS38M7_c%N z6k%WqW`J?R^y@d=&CA{!H-GEJyLsX9`|GyO)y{cdVKZ+l?Sz4`3t9%>@H2;n?&rn^7N9?0mi?E3ijfTa!Vjxk+lOk-3TKqGv91A5>)nqS zmoYG~$9uXshE&XXd-r1C?F>CDVU=bKQ@ie=q+$3=N&VYL$NczCT}% z9)1{b`|Y>w_baNacb{N*tDV5WoU>|P(Em&I+3~+G2K6`jhW`CD;kP~i;iX&dv$EX? z3AMGe`}gH2zr5X_Pg|$U$;)TU9KXrTbNR}zlpFQp5(gOA3>p}D5*ofSwpkVDFUZ>Y zw{i2n!p_SZSBc(Xoqad&`?Kx|*W*^~nJo%b*VZp@KQGiJet+HCDy>bCad+h_Ugp0O z2ia6FVORgJCXAzecWm!t3+t9|>^wlXfz5aL&ER}|{rmlUH_WXy+uHK2dco~wuU`Hs z>%8tZeb1XjO`#8e?eF~x{TsABGMZ_g_=6z+#;u+891#ug71O^kweCt8ZMk?%99v?Afy++Bb!JpeE1#%P0T*URtiW#}V}d zOeOpmaxLWgFXwIFeS?3`{{8D`&z|l2kE56~egFPb)jKn^{wXFf?qYwD1}C1mtT@#f zV8VUD*1;S|)PqTf?bB8t4KGzHsjt8Pu{iu=|N5wl`kK3slsB-xkXtaDdPMXeCZ6Mu z3!`2&zqytt(RMYae$G}gU@E!%@`~;8_~}BQ>_y`nU$Q9N`FuP(=F|FPdMjUAy;!~R z=f`@zui-_W^%J+3&0{*m>0rUgq0aD-MPUv@i*Q51`Fg|u_spA)6@EFrAp8ag*KAv2dr9Zy=`#+bNyphXz z@_8;%AQq_q{ZG!3^S$unw*_&AK9Q>*$sUTkF~@KDJ4wAHnd9#S!%kYFJ7&Jbr)%!V za<<>LlHm(4pMCrG?fduC?iMrL`}Jb#-@5I+wcIJNkyExad38IT?dOFR;wBC| z5@#)Y`R?7i>c0K&9zI;SER*{ZgZ_^PCkn(==M+y~$mI+T7f{$BV-6#8U;$9de{fS< z;)<$W`Mcc{pPDVdyt0~2%&0FpG}QNU$YBGYP}47dM{ZfN*0@ixtoNFHkw-YpOn?7| z+i$aW-#usbqHh0s|M_;7=UDq5hu5EZ$ivX2$-uFUL16|{Ljo6!b3^|+BQR`lz5l+M z|Bc0TOTIH7y%}Zr+HbPoegD0$c;Vv%GI30k75PL>ixn?Sm1loe0HHnz!Aw9gZU%Sb zx<3{M?NDm^b33p&KLqqx0Tf#(~LoW;yoO2*@XA( z;|)b|Ob#1>0k?A1D^SphiGBF+At2N=B(!#S_CtGKC#IcySde^xYCp2y@X6FuYyxEl gSfEA&HmCmO{(864*FfAToB;?tUHx3vIVCg!0H?X$g#Z8m From ef5affde57a0e966f6d0328f9c4709eaea70c5a9 Mon Sep 17 00:00:00 2001 From: MCTBL Date: Thu, 5 Mar 2026 11:00:50 +0800 Subject: [PATCH 13/14] remove one pixel --- .../textures/gui/patternchestminiright.png | Bin 3836 -> 3845 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/tinker/textures/gui/patternchestminiright.png b/src/main/resources/assets/tinker/textures/gui/patternchestminiright.png index 0abd94d647cb9bae4c5f7977923a3e0bc90a85fe..89b7dc0a38124e2a6b71f9c4447c4de1add7547b 100644 GIT binary patch delta 1495 zcmew(+bXx=I1`s?h@pX%iJ_H&;pB@<%E;V*OaUsEmL{eK28k)UmMO-Tx(2BxNxDf% ziKe>dmIfwC7KUaf$)={8io>82R#g~|F7?Uz>sEoU_4SDN8|&UuELs-U0NZ+F+9tF8n{XZXE}dmX;L z@#V_XX_I62wf#z6Cw%6!&74ow^-;c;OD@UppYp%--^W#}LPM{fpKt&F*TaVeE526! zeWri!{{8rrhHs(<4UA!-`-A@1-^sTBeR*jf>*`fig_D1uIQt>!)_Nx9HLF(1$;$)v zojrTDd%o@WA3q|tZ{MEIZ*Zpg_1wh&p$QDk5(gOAfTrAHmw0t#Z{w=dZ~5nZ>3(c6 z@AvlAS&ZQavv%Lz_gmq~{+b1s_A#*;9Qg3|_V&qLFP=SHCMPF%PJhv=>A#uJ?=7o0 zu6e)lvHR9|Rd3+dCq-H zzJGc5e$I%7cZ|CtfkZu+#7+FI>-%@>wo~`b&a9s`&AWH+-uZ9;kF}5TnZy=UH{_|; zA3DBrdgQHQ_K%z!816EcNH5Erwf*+ntN$KY^p%#EmrpcLj5~C4{`ya$aVDbm!eBL< zK?=b{u~LZkQx}a{tS{si%!U)ur=!!wOO;Ai_P_WwUF>83`lt(&r^G(8J}~($htecY zeh8}9tz&GnY4(Xc2BGU=r|SIK=5-0aDucbNxO+lfLA)->d!EY?GBW z=IlmRpw94+MPW|wf&#OqLp!;ZIKcdv)6dh(3xs~`vKN26nmuvFDzE=LK0JS9Z*M!d zc=AFn=gH@}#OlANv#8ei_4FUEJetK9IaS`i?#$Qk?MZ>5s~>;7Vawb*hZ)@|y^8N^ zQ_ocGU3d85hnITA_4WUsrCzdSeXw_Z+|9RT@8xnjr*Ay}(X5;i{wpg@ZBub z?saMo%ignY0Tw_d^=N7=q#YmTu(TG7!~G8N8bixwL6LJ1Jw$5(#(39{ODhUxUO#+z zaJrlAV#Y(fv(Kt6V*K{I_Uz|1jPpJoWt;d=$IIgRWI>+Z$qGE`sd+bY%s!XxUVHoY z?RSwoCL~I%TGduLZ?}8mLtun1dBQDueB-KBVC^<0{f7@(vbH2}F*Ip1a4cg`n8DNl zKVrhE>UQCt;8r14A|BpohA3r0KBM~mHgqWN>V_D`q zxu(--eyrs9(E4ZJ$HVTxusbGsKz!5v_p4X6ty)!CcJbP0l+XkKPtl`f delta 1508 zcmZpb`y;#II1`sih@qvGv8k1z<>ZS@%E;V*OaUsU<`x!4rfF%qsYaHjx)#PJ7C<5~ zQ8y_m*}~Y=JT2KQDQR;Nvjj6yDkm$jitrli8X(!}$Z9{Ck3GNMYmLuo1_t(IPZ!6K ziaBrZ1{U2)6JdR@n(y@oGojnJ8{RZaep^^8u}#o$vhPa%nLAcK-WaG!(rvzEPFVqd3OU;6Lks#T$(SHHi%|NraZ!w&;qfBkhf zzNV&T&k2UN+6fHIYgW}Q`?s|Idfm6(-nLv}pZ1&`GH-CTs z^!L2&m3en1zujkLGiYGs0cw<3P}{K3&&E8UbmwPg^}mlS`kw!LyDI8H?1o!;+uz%9 z{Q4?i0bA!_V{Y`Eu*^4u!w)d9894lAa6W$e`(ul^Clme&-Fn}cw|dno@41V1JWJ)DuEeL$CcCBl#k#6p(SMu|OuopeH2DH2 zYyI2n*28@}9H=`#|HFq52G{Mo?`!>2Okmu_{-W%Ydd-}w*-Q793Cw5UzF_OH zJ#p5u%H4P4-tzZ7j^O9#7q1k4raI@(Pp$b+7p=swdp7ezEq14iIu73%?jne&dse$w zFfa73b-7+&zonzT=4w;ik~c#48O0V+jxWk*ygP zYA^nLbM`KYypNBx4eIAIv{e7A>doGl{bp9k|Jz~v|DWG_Pj&j2zCBAfb91OOJY-Rr z!_Xq!P{1VM$8gAYfAYW0^EsrBZ~XRquXuA@fs)3YSO*J6RE6g{7Zmuhw8HeqoPM5O zULf#e*M0HFo7odrtn&K5MAW~#p3b6L$wzjrEFRc(aaoCZ# z`KF7>fx7+cE9aRW;O5w8VKm2;^SQ)iIiB{(6L>^H*aT<+@9eW__wu%v*4N*+v zc>Mmlt#h?=o>$n++seDilBpqqi=j!Afnyni!VEa)+woF{*I##)?Y?_cdfVLBIqc^? zx--h~wQn}xb^C43bFbTt#T8tW6Zu5V&a^t1?~}D?=Wfiau`b~AXGAguVdPGM7ss|U zKQBYMJrU%jer)vC&}>z}qcdMHd^KDm)Eck%*0KOj~Y->{$2??{j6N85vO P3_#%N>gTe~DWM4f;9HeG From 93f5ff901ac82ab8a0893661d9f4e2f2507bc67a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 16:20:46 +0100 Subject: [PATCH 14/14] Optimising images contained in TIC_QOL for #258 (#262) Co-authored-by: MCTBL <30978504+MCTBL@users.noreply.github.com> --- .../textures/blocks/partchest_bottom.png | Bin 1850 -> 1697 bytes .../tinker/textures/blocks/partchest_side.png | Bin 1855 -> 1710 bytes .../textures/blocks/partchest_slab_side.png | Bin 1673 -> 1574 bytes .../tinker/textures/blocks/partchest_top.png | Bin 1850 -> 1697 bytes .../tinker/textures/gui/description.png | Bin 3047 -> 2651 bytes .../assets/tinker/textures/gui/partchest.png | Bin 1189 -> 1157 bytes .../tinker/textures/gui/patternchestmini.png | Bin 3214 -> 2742 bytes .../textures/gui/patternchestminiright.png | Bin 3845 -> 3328 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/tinker/textures/blocks/partchest_bottom.png b/src/main/resources/assets/tinker/textures/blocks/partchest_bottom.png index 474f3bd27ffd54aea4d2933310e277904483d88c..3cd232697e9799b6636f534bc975f45ed63f8aec 100644 GIT binary patch delta 371 zcmV-(0gV2-4xtUOI0b)HNkl0<0eqGi8 z8U$(~SQDT&1c45KDxiSQ=1bNFJs%D3bURKu&}6l>#o@P;;i}G96JQC=w&Dd*bfuF7 zfru=Av}$ODGrfpjfeE|_r)y#Jnmk-i-u0ycUlVjI__Dn!(7qAM@TJT~^t~r~th0HM z0)h?9^J73j$9`*)*rjNob%7T73zG3-?Sv$GZgMqyzo`C&)U^rf@z&mDqnZrOTWN$zQ6RU RH01yQ002ovPDHLkV1fyzwTu7& delta 526 zcmV+p0`dK!4Z04nI0b+0Nklcul-O%mG(g|H|j0!8A6#ErM$ z$b<3>JObQ7k(_{>%#3@fE)HWsNS*8Zmr~K|S1*Hewp}bfoo(pq@`9P|=ksUVnCRWx zH}Ct!#`|qd1^|J!DFHa_0RUh>oOGSF`yxbSS531t1_9U8-U5I4{(Bc32g3(70G;=@ z!*tp&_oawb3t-hWo8ZTspPclw=pe}eh$7pVoH0a1L{UUkEr8o$0x$#*U>8##e9=l* zmlpt-SyhQ>4tPI~_T##bRRF{+r~NXD1m-V4#O`7;L`Mt1@g5?o8bz4d_Q6}rXKgd) zY>8IZZes#q00e*LF=uB?RqS&CAR+Eq89s*;^ zo{eK8MG0h8Ys}I*w+tS@+By6`H^vMpO{K&v3bh1!+Ae>hs;aKM6RnScW6QPL`ArC9 z6nZ`Gr&6X;a*@vaM*tBu&P}E4b2&H!$E|Zi%6GNi-4E;VkGV}5zz|dG-E3mX(A;6& zHiwo~f9~!9th$DXhLp(A+<^?y`HSaGSO6eEi2#tQ5<&HErV2G60IKy5*~qcBSOkJ;cXJ^Nb^WHn)+FLFEc2?Cpi?Dkf9(X&NlpWhl`g?VN z&HMPM4yY#9aw^;o_Pqrl1QwW%`c}_+Gw67?vAW`SvP}aGv2`~^)5VpwBoTCYs3M^Xrg21)qCGVh;R{|EX+7#-UP9P1I@Dv25 zZVAL_Z46|8U!KH6oFrxmsRj;Y^MZ!IJct^abN?6S^h4E)tOA|rm?|KqTcO5g;75aA z_u95jgZ^2-ODK2{?!sHLCsfwt_lMn@U^mN*O&xFx$dJ$TVFYohp@v#hAOfIbF6`@K zWJoVDC5Q@;Lw6t&6{k>+Mlc0DFe%`h0eY%UW6h)B0bWo;ty>Q-5++cv=D8vM|2;E= e{dPXjVT2zb59YY}x)@~u0000+4ZjYsI0b+5NklnWVv?*YLJtfK=WBlFe@0Xl0J%6n(+`hMkjeAu{cByd zA%!jvXB5s-wSf$vaF%86Q|eeVntXh7IeE5SOeG8NSa=6OCL(``2Lfv&q+T0mb;oIGYQRY<}m|Kf6CNVrdIso9yuiq@n zIaLU|ZujYMpUK7fnZ7+PY5KSqD7|O3sR1T}CPq}1nYC=1md`i0*cc+d@qH%vtJ8bU2JG`}A+oXTjMFhbr zI}P&TA66ldA($)`$3Eq3L$^1kqKP1?(!`{}b<^@7_k_69WNh@aX(wM)O$3q&MuglL z*7cT(z^blkLL_%)@5RvdIFnI$hY>+C!B%z6)qp5~4l|2ty8pdq5qgx2l%v}72YYGn V(aNbO_y7w4002ovPDHLkV1l!({z?D< diff --git a/src/main/resources/assets/tinker/textures/blocks/partchest_slab_side.png b/src/main/resources/assets/tinker/textures/blocks/partchest_slab_side.png index 330f4a1491ed3d3d7f5369455e4ac38b0c8df543..e1a1b36b3902a71ab55cbac153a91547f54724b9 100644 GIT binary patch delta 248 zcmVov@gqg$Hm5m5f583*5-UBVGyh zS3oBku>jB$ztDhjT6foBE6xHLjl-E&1+?j(W^KdPDrkcJ(0>c5&b^wJ76suTi|eOu yu`ddGAY&(R23&TffVtd~8cG$FDcu$R`VCiE54$UqDH>q_0000&%< z&{ggQZv^3ZvGLA1;Ii%hQ~9}E9xdicbv=e40^Dl3PrU<@YUO`@Q%ppz`kYkN%mJ16 zNws!jW}A~(dGAI3*&+MOUBG*9W+F1Kao05AaQ;37zg^FooP)@%7U1-vtTdXOqjSX= z*EKAtSyBc6!Ev4Q$~Y3vZhrr*(WLGbHRNFL$H6SF*V88fU>+kp^X~f|NLkO@9DuEQ zn#|1X(DpmvhvBBrYm*5tqcvtRw!_fn0g#<9pJ&w+ u5HJxy%uEEc$FGorIRr2(VXdy;x`zjJ9`R(yG9DrT00000<0eqGi8 z8U$(~SQDT&1c45KDxiSQ=1bNFJs%D3bURKu&}6l>#o@P;;i}G96JQC=w&Dd*bfuF7 zfru=Av}$ODGrfpjfeE|_r)y#Jnmk-i-u0ycUlVjI__Dn!(7qAM@TJT~^t~r~th0HM z0)h?9^J73j$9`*)*rjNob%7T73zG3-?Sv$GZgMqyzo`C&)U^rf@z&mDqnZrOTWN$zQ6RU RH01yQ002ovPDHLkV1fyzwTu7& delta 526 zcmV+p0`dK!4Z04nI0b+0Nklcul-O%mG(g|H|j0!8A6#ErM$ z$b<3>JObQ7k(_{>%#3@fE)HWsNS*8Zmr~K|S1*Hewp}bfoo(pq@`9P|=ksUVnCRWx zH}Ct!#`|qd1^|J!DFHa_0RUh>oOGSF`yxbSS531t1_9U8-U5I4{(Bc32g3(70G;=@ z!*tp&_oawb3t-hWo8ZTspPclw=pe}eh$7pVoH0a1L{UUkEr8o$0x$#*U>8##e9=l* zmlpt-SyhQ>4tPI~_T##bRRF{+r~NXD1m-V4#O`7;L`Mt1@g5?o8bz4d_Q6}rXKgd) zY>8IZZes#q00e*LF=uB?RqS&CAR+Eq89s*;^ zo{eK8MG0h8Ys}I*w+tS@+By6`H^vMpO{K&v3bh1!+Ae>hs;aKM6RnScW6QPL`ArC9 z6nZ`Gr&6X;a*@vaM*tBu&P}E4b2&H!$E|Zi%6GNi-4E;VkGV}5zz|dG-E3mX(A;6& zHiwo~f9~!9th$DXhLp(A+<^?y`HSaGSO6eEi2#tQ5<&HErV2G60IKy5*~kTl8-VmNcBv(Q9P3Xkg~4Z_s_uJ4Ls?-p=@R;^S)Oolo~N$|CF7(aXH% z^{%&n8&f0q*gs(41ELKt=fB^+Vym0Wk!$iF?`K6$+w@yhVqX)JKm!Ad0s|w50|PQs zLKkS|mTTX*6W;gtS8*ZBChTV@I=()>?9Z=yRpZAOqHe!s=6b#B-Oq0z4qI^(^t1QRL*Pn0;YzgQ*zew{=9L1b@(1O2S#*H)RXBa z!mdTP3B{rZ;#q4A&u?bpsbA&daxKce<__0|>it~FH&`WV+1&LHd@!~sVO*9e)Ha`q zf`CVIg5A$5`>xk1HoUfbR{Gsoq354m1IGad z1~vu*h6Y9k9)<)424)5c2I7V4aq1+^9Gu3Wy9w^Xg5O^6ZKLb61GA^LF(zCP?C9_a zyz_6X8N;72ONqy#4bz(pKJ_!K-6|w_vHE+^hhwqpOkG@Lj4pdSO8gWh-J>`hsD~12 dh%mgfEB{2u%@yYgSoSjjfv2mV%Q~loCIEeVh8q9? literal 3047 zcmds3drT8|9RC#*d~5dbHI-Y9iALLNucfpX3b+=P%py@XACbXvcRzZR&Es8bWOY?s_OzwiA% zzt8vm%YBuRK7H_j(E|VggVSc{X9FODOA+W71Lb7f#x|(+x6GK&12FLY&?^F)Hjf0L zPrEU5o-ofa6DK)FN>E%bEwwWihz1}r*=`|76D=UQbiR?*itp}si4h~E70-<~$P5-8 zU0|HC#7fUulAcK}F_9WdoScLt+Hpw0&;o(j88ge{cC9$fi^Fy3Gb%>H5W%DsPYoGF z<{2^&9cQJHc&SQ4%9Zg*f<`J=DU=$`6aF3$`um13RlW-3`2SzF|=l-^6=UE zX+5@}rWF?mf(1v>!oosnp+d@8^HI4*qd{dDieVCnknlyUK-eWLKfaeiPxGYJXc3GY zi-Z`7T+SwF#n9945Ex5@mgRfW1QUkZ2@5Kh%0eN9ffO0RS!`Bw*f>R^w3%jTR^TC4 z9>H1)IDz8}xR+2zwx2NoQ)@6pY`oAHhKZQqh1A6`jGlzN5Y1;6S!i@N&2u&@NvAG` zZjKK{W5IP+nh-c^CdZk33zgC9GNRLk3Zp?L&NZ?WSIAF#>I|(X1X?S`WSB}K!z7p@ z6T@&t0tQ%_JC}UpHb5L~{8jmaG&p=_)XLp!j=8t~@!pu&VN4*c^ahBUBHGKk z>K%vk_8fg!x20>hXMy)@4O3-nDE6_A9gZe%>*CJqjls4Pb^aCokTMX}E!rM94s`|& zYCmkQug+(Kd+&W3-rH4`?MjdPIbh3bJifks@WNAxs$HI-d&003AnMaCny+05E;|w% z)+!!8&^b??_c^MZ6&;U)ilh?%zHhUa8HeQHZe^@&Y|f_WjYDK7L^ESIUI&%YGkI`E zRH-Su1z`_A@6@1ikeY4CB~s>*B0eIvV1NF=4;RF~f!Y;SU9d7WRZ zy*jdZ`Jq6`mZjF;oSyrA`oEsFCw#AT>N%JypqtaU?M92E@J3O!GiGQ`lh5XA@)lLh zYM9u($A9*GPb|+Jduhmik=ayby6-$tnK*8EP04MqjWIQJ)Vj}_CeGBXy~_7r6W6IL ziE8-(Nf%vtXCn8JBY4Gk=I$0HQ+(j_oWp?U= zzBhJ*?Yws>+l%^2&sB`-=(ylMS{}GZHUCh0J9xm;wLiiBb@kA=B=g-SS521R>8U^2 z?)Ud^gUwsl$Vg9?!M3esU`HG+cLeH}G%mOk{nwo3^D`@oipi0JTGvw!FbnPg^`>vi-rhd0#U+Xqka9>iF z|F~_;5n*^21slAjKFOuOQ_EBryIV%220Jz^t8;orOxSmcZIX{}I^N=q3TCdpR_}6T zXZyTCu=C-$tdt4%{UvuV*5Bd0rTc3S#;lY@10n_-8U$930{s+VSRO!r2PqpxW&hWW zN7&dhd1FxpY+6&3@79z-a=<{7{yD2I;E5XzJRL)?HMbToeB7d5dm34qyrt`$ zFD*{U%D#M|c)qFXs=C(c!B3sZ`X%AcqAH@wSz9wgbhC{~`F9i8nXo;xr97=Qx+C-} No|c-ful^)w`QJJtL(l*K diff --git a/src/main/resources/assets/tinker/textures/gui/partchest.png b/src/main/resources/assets/tinker/textures/gui/partchest.png index ef90108a9832b088d6539f366902446802d7f7e2..41345599a659a02b13ed98eef07b0585e880e10a 100644 GIT binary patch literal 1157 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|GzJD1A5Ry@kcwMx?-ph)_K`S{ z_;#t%GpUaX%sX9K_!nK5unpVRR<>K`?V&QBzPZmEr@!AnU0~lIGv$&`LA5)igKvnu zfBN_E|5ZlImRNeR*j3)0&Gum5*C30g%6a_4js9`pm)&Qmi=K9LhEkeD+p5>Q-Y9?Q zzrHt@;o4J&%JU$nurLTPIAAayu(K$%Ot3L@tA2AbiU0l&wt}58lb%)Wy_M{5R$agX z)`d+U)TAGrj1~W_UrpI~d|u4A5AzvkEL)j1OD*%)zU{~7>3sXptK1-+_NGvILOMeO z0|OHS2ZI7G#uHHn^D{RdyDey9e$XaaeTO6Dhu{HT<8M0zPZ(oyH>yuQaY5_}ILK%* z|NPZWIwzC+Z7ts%6a@PjRV_RmPVqW$C{`x*e7iAuOS|lT#vi^_)kQa&l`-6i;qICb zv%h?MvY~x0lYwvWRTJM!UuyIFZ9S`ReB^krObY1sCz2S3pnJWN^?3LQdK~ru7zNv+s_$^UffzVpXQITOciS1R zte1PfqI9RB>Y0mnU(Q$E?aycU{(EoU?Q8bjBIz>6zuJFwjQ?Kd-eAh~Iw;v|mU7LH z{S|j_+cVF2zVlzP-}2zv-FGLY@pjvOTk_`T@BgRQy_Wm@?V+zMKO-Y7bv8ILKhVGM z=Hv7_R`!Hh%T{I1TJrMuJ-O;h-!?oJJdl6s_TwA>tH2-Nb=6doSc>6^E z=uiJ-{eM%;1RH-BfBv>({-eVu{Z|*Ao4x1LUfXxeV;O5W4?KUqJefE^Edha_p9~~YV3}Gtuj46XZ!h= zyUt1epUmLHzV6u5qR!V}v-&La=Rdx@?j92Z69WejDljxKfSKrwoD*;C8b1G&nSOfd zul5wB>F9NMW@6m#ZpJk8@);TF#<~ht1KAx?W>;ryo@Qyrw38j|NOadBIedd6 zM62A{JeDTg&4MSQ84CDugb^^*%pM0=FL?j^75l^8Z_lord%1M(=AW{RGv+l&?Yn(% z&Miy3Q}1*!LIo67NKQC#F62G)hq+&#tx4oNy`)29>6DHRS8vfA7Nd0D;%PY;q4GVB z(Z}C`S33X9%DKtP6RI)79L02CgjfSrS?->3*a+yg&E3FY*!z+zp^7Q%Mn$sUTVNpF zVP-&!ee@J@LsGi&%*~@R(^lT&V2Msup0J(afgI2e4#}(XnQn3A0OM2VCRfke1JB;1 z^hw`|1=Tj`_pv~Q`VI>VELk_qo&DEjf&YS;o7*h+oZG&it>#$wf%4n4gN>KJ-lbpv{CdOw z5>^9SM$?+@do8yX*ZADE#hNRi`9y#LlyNd902AAqI==PBy9GI}op4jgX9UYfq-i4Lx0tB`DYiHooPjCaoEX$KXLB?6+Bn8Je(LVcXA77G7zl!jMtjMp=f JS?83{1OOPgjHv(s diff --git a/src/main/resources/assets/tinker/textures/gui/patternchestmini.png b/src/main/resources/assets/tinker/textures/gui/patternchestmini.png index 0d78524d4fb8667858456789016991386fb02e32..330329688c6b8233bcb4563a9e1d6d876bd1228b 100644 GIT binary patch delta 1426 zcmeB^+$OrgoVA`c)6>NO`TR! z7qa)o>*9O2pKYlwzxy@!*5mJMy-R<}%O5YCUL}_x(boMl_viEUclVDoS2R?~EqMRC z`)9M>|37E`{{A6S(GbIbp;cg+?Is(CKK@6HHVy0_7~~ExS1|BTsQ;sS)2~u4;r;e! zH}~1>F(0%SH1r0%RM;K)eU_tdj(LO7OL+|;0?*F^n9K&kz zf7SwKiw5Q%`QQBt8^0F<4Qlwr_hF@cN7vqdCL}Y&osezO@2>yI@cHnPKb>0DKMH>~ z0ZkwZ)x*^}d}ZJ9Ppe)!U-fTJP$6T@WA&#||6bZKayT$BX&5vp*B8HeaX(1-fHb4b zPinG!R;t^fC(A~$g%~~82)5FWD;=5W~@I`KR1qJ zA*bELj|_i~PVD_3Pm1Ts2{2SW^^6J(W~>F(v-gDlR4WQ&f8cNU*dmCtadRfaAMa!a z0|p5O9tJiB<_5+C3<)r9!z*@R4$G8iQ~5l*zxd2?L!c^VkSrTW5f6w5Vm2@ufVpfB zt}^H(F5UOj;&_b=bHjRu8dkXCdQ8;^Kz2HqDA-pNuj@}{_#g_@0dxacxPg&@Ie`Jh z1X{+x19BD6vIfQuwkPcQ=e`#5FzjOjYJdqt>_>7A)SVX_{yaFl)2@&4Kz%q+2gsK| zW1&VO+W-^=TCE^8L4J?rb)Y{}WEsx+J^&f0&z?{@+leFO!8iT=j0v?2GK@Sx&jKYR zfX)ND%>d|qpk6{k^@NleF!T{`8X?2LF8lGG{fX$J?Yob%HZd@8F)(<#`njxgN@xNA D`jm#5 literal 3214 zcmdT{dr(tX8ov<~eDG*%rCNr)jqNDwCN~cV$(5j(s4z=_5q7aw0@s^Mh#~ie+&}_I zl5Oo`)xyr~tdD}?9|hJ2j$4ORq*bc6SX*EnYg(G+A#RtoHpKE&lfa$?2w3fIx8v;0 z-kJN&Irsd&*YEqzm&se{shdLP)Kr;bPEJAz>)z4F932)(V=@_w@{n(Dh)x4 zpYy&9=$)DuASiHHmAO^FRhEL{l!lEds2v2`sL=v61jVm2YB5|*=;0lNQbmfH&X$Wz zSfvm%vtnf&nN~vNtCC7}L`G?9CSIz>MGEG+1UTM^0s|UCkHJPw0ZF4qG1F%k1#9nT zgbDi~dbOCD=yeEhm8HWHN=Lx4Yyk`B#>B#LA~sjRj}eJ}1@kyuA;J+NTt15{Kw~&4 zj|WdbOyEtY$V0bCH%q^_Y=G z(ko{yNC_I(skC|(MZ#W-*bb^lFJ^*Br&7>p{bosenkGOPV#Krvm(B5}jKTcbu zEATm2;0RGbXb4hI11#5%)#g)riq5Bg#I*nT5eI-;nauCwiLq!jeiyWUV=+i$nvf@= z>C6%>fovgYsz`?u8;e1hE4|rhQHhSg^pq}>q6%gTl|BG}h?zVNPr%~vSUi3vkB9Q(P`+>tM~HGbQ&1VDQ00}(h4NXPm`tt+Q3!}1@!rO%RFEHL={uWqb7$aS9C(-hIRrNTNk))h zeCfcPl85hVg`l9sWNBiivBuGzo%&kWvNx|g)~tB`bs-nbKBI7 zRPTkxCL0jcHa3wYDK8SZACBIw?)-g=rtD^UZTo#mE)?)WE3|-PVSEzwRb$p* z$SJ<~aC7P9o>r?VzOHQF_Z5BDCt5QQM}&Ly%N*tMDUV85K$>T;w_`N>UcR~SIPIM8 zz6NYry4B+gZ11g`HJWf0YKa}W?edr=|Dntn;7kOkw49&pzq9P);|F;)x@!8vKd%j1 zcy6*k3;8JR0e2$${pNQA-PjE8-2$Al28zTIiJ7R5*Px=fuzJr(p-^Wv?RJB)hI*t3TlI!ZqMeEop?w+W18 zxuq5rB7b@Gi)M1T_FU4p$7y*?T_Cb&{-LPccV@+^4dXdR=2F5Rn$NG*Zq-x^k(_Hc z`?K0^7nVO5`X<{sGB!4r?R35pF)XJDQhW$rTR8<6BXsf$l z(&T<6`=bumr&+m2pexy8&%Slpm&-s~v>D#a?$@yIWbZuq_gA5w;Ul!O7%#zvfq09n6SYjWbAovu6QxAQ1E(x&Acf!(}mbmy2=sTnYJkQ zC!5W0^ns9m>3qZ8FjQMB9}umtfvzlk%A(u6Dg73`V^?Gc@}1Ro;{NV4t4`at)m81O zj=I%v3=Lle70&aEDieOy;c$ErIe7xfxsXz&{Y&b^pSa-HeX`kpuPl`@2kKL5(b%o7 zyNrZ~oBoiqe7xo-FfhwrLEy(-!F%aNkMhOXbM~2~%9X1-9_RY{roV1huKcGcB;3$s zci7t7+eadum#C1k4y1Db+0}(d1D-m0PrDei_8ca6v&Jq!gD3ZP*HRn0Zk7(Uo8zMf z>TjJIb9qLBx1Zab#wZ__?EBIZUJt=3jP-}+Svd0{Y!P(nwESV4-EJ=ety;fU2u9wG zhP2Az(6;aK?Wx}^hjvFp!5Pq_T8KOd47?9RD=t?%uN3wS2(>377WWMf4z?S#!pO*h zBb5OSL(f8&mOic>F|YjC?bhSlgGYY%KLi!48$oY1*|vfCP`sjJ=fz%Uy|VAUl7$c! z)){UG#s3Pf=>)y{wR2o8Hto7~xZ88Xe5~!)kLL~;dqP@MRQ^95m;;Ifciub`w9VoD P$B?`+ReE|u?(6>oiO-@L diff --git a/src/main/resources/assets/tinker/textures/gui/patternchestminiright.png b/src/main/resources/assets/tinker/textures/gui/patternchestminiright.png index 89b7dc0a38124e2a6b71f9c4447c4de1add7547b..bd08ac7bc819d0e31b5c28819e699d0917b2663d 100644 GIT binary patch delta 1424 zcmb_YVN6q382#>hEqz;2K<8SKl?rBy!PuHD4we@vie{pi=w=Ww>q{iCY-a7U{V22J zKI?QO6P$5~3}P`x|3EfIT;?(c*Epurkm_oXk%(_ls5;QDMOSStyRVeO{L?Mj&HeG+ z^PO|P^W6hFF}-uY3M;EO6&1c|8=AbiZR==p>cMNnjiuY${XHL5^sRR&eiFZ_zd4!z zx_9iIPdY|g%-=6PxN_{zBNdfZzqMa4|DZj@6W-hXh4dMm|P;&wh-WE0nC z>a*77c~C=eg^sW`NRbdPs(kQ+PWWRl+tgcN9o*b?B@+w%InrtKDB{VFIzeq_QmljQ zo{udg#LknQbFmYT+=2FK*AQxWjSOhUE2cYLsGKKd&q=Uw_D0NYjqF*!J`OxxSO?I< zuzlYPLwRJ${bzI!nhZFDpbY6a8@`e0SoI`bWd+sS_n{ge{eqD@v8!IL%oW+$`(2-b zCnua|x^}#Q*A8CZKa0l+iHoosotQowm@L5Mq4AD0jP`t>#jVhT`9tJOC(ZcXiHY8m zFN%$*^}&TPSETSElPUu3BhCapw;A674KQR`;m#;9uP2w?X`Xt$T0k*6qs<0v5UxVL z-P7NAtoFT{mrx=AsO6^xp<^@ORM1= z*sm#LP92e#b`N8Iucdb*@4f1(CR)dn63s4o4-;TpHm9bl_;yi>RIj%v%0NA{ za9m}Q4PJG0r&Xd={}jv+hdKYo&y}5XW1@oSzfCO?ozJfZbVzF|@^HH8J#B{IW{CWb zFP&$tio|=WCQ_{ zK?^LOU7_W)4|1XDpB0nE|(K?i=1UU{g|i9LqstMCT|PXf(N~wR delta 1945 zcmZpWYL(m2%wEr)hb=NWFQf__@R z-CcjKx)LCr;rA-;b@=wimn%=FO^(^u_A7Or@R`pxb3RqqNBLeZxg@`T%Ky@TA6Kmk z4ZV7PzWx7S4<8n+_*(V%nf|@|_v2FzSC>tXd@}FAvmr_Uzg2`L^GG{D|1TeS12;!I|RMa})oECNMBd9AIDrnsSR> z;?@c^;_dv*&=FF^dBfsx19Qy5oS2g1-k;<=1t$Gy{Epol)=HaCt2j2g$c)#+OcWhcFXGK&)_Fa}~YX8&{7}t z_OFk+FnLPsBkKc9CHxo8QjgHBV{FTu^~}3w^QZbtvi-+h_gZ9Y0uzPU^VQi^hIbwv z4NtIQo-hS{@cFx-=F!}d%g8u%2s+m*Hf6o&?4MWz$D z=lXquCVk0ozgPRS*(NJ%%-M~sK%LWiS4C zHGATURbKyhe0cuI-rja@F{WlTDpn+{no4azBctt)!uc7AAWeLS6pBJ|5@rKTh<4A*T>y_TlQWqr*rzo z^B>L189{zTcF~UIwGH3RLhW9s=CJHN>lR>vsifXQ+VNoyOKY(>JTPHC+bk$@4yzvA zT7ZeL>&K-Pg)*-nK0G+x&2};4A>P?%)fO>+`(1nX^BTr^ACFFasN-ev92^}Wr`99I zBFtixsHL%BJt7eiwkhvMj@jq3-D_{(zWpw8$AmW z$lG2#M_ZQt+(Si}VicVQ`YgYm9B(YHP`sdS&o}3=Gm3NS;k-DGFDLt%pMP*#;9n