From 6ce08de6b1e00c4436b0cfccb49c0e24a0e0efba Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 24 Jan 2021 12:39:03 -0500 Subject: [PATCH] Changed the Alchemy Table so that the player may designate which slots are accessible from which directions. Click on an empty slot in order to select the desired directions. Green outline = enabled, red outline = disabled. --- .../client/screens/ScreenAlchemyTable.java | 167 ++++++++++++++- .../impl/BloodMagicRecipeRegistrar.java | 8 +- .../network/AlchemyTableButtonPacket.java | 76 +++++++ .../network/BloodMagicPacketHandler.java | 1 + .../bloodmagic/tile/TileAlchemyTable.java | 193 +++++++++++++----- .../tile/container/ContainerAlchemyTable.java | 13 +- .../bloodmagic/textures/gui/alchemytable.png | Bin 15920 -> 16623 bytes 7 files changed, 395 insertions(+), 63 deletions(-) create mode 100644 src/main/java/wayoftime/bloodmagic/network/AlchemyTableButtonPacket.java diff --git a/src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemyTable.java b/src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemyTable.java index 03ce861e..ccaa7574 100644 --- a/src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemyTable.java +++ b/src/main/java/wayoftime/bloodmagic/client/screens/ScreenAlchemyTable.java @@ -1,22 +1,32 @@ package wayoftime.bloodmagic.client.screens; import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.platform.GlStateManager.DestFactor; +import com.mojang.blaze3d.platform.GlStateManager.SourceFactor; import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.widget.button.Button; import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.IInventory; import net.minecraft.inventory.container.Slot; +import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TranslationTextComponent; import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.network.AlchemyTableButtonPacket; +import wayoftime.bloodmagic.network.BloodMagicPacketHandler; import wayoftime.bloodmagic.tile.TileAlchemyTable; import wayoftime.bloodmagic.tile.container.ContainerAlchemyTable; public class ScreenAlchemyTable extends ScreenBase { private static final ResourceLocation background = new ResourceLocation(BloodMagic.MODID, "textures/gui/alchemytable.png"); - public IInventory tileTable; + public TileAlchemyTable tileTable; + + private int left, top; public ScreenAlchemyTable(ContainerAlchemyTable container, PlayerInventory playerInventory, ITextComponent title) { @@ -39,6 +49,23 @@ public class ScreenAlchemyTable extends ScreenBase this.font.func_243248_b(stack, new TranslationTextComponent("container.inventory"), 8, 111, 4210752); } + @Override + public void init() + { + super.init(); + left = (this.width - this.xSize) / 2; + top = (this.height - this.ySize) / 2; + + this.buttons.clear(); +// this.buttons.add(); + this.addButton(new Button(left + 135, top + 52, 14, 14, new StringTextComponent("D"), new DirectionalPress(tileTable, Direction.DOWN))); + this.addButton(new Button(left + 153, top + 52, 14, 14, new StringTextComponent("U"), new DirectionalPress(tileTable, Direction.UP))); + this.addButton(new Button(left + 135, top + 70, 14, 14, new StringTextComponent("N"), new DirectionalPress(tileTable, Direction.NORTH))); + this.addButton(new Button(left + 153, top + 70, 14, 14, new StringTextComponent("S"), new DirectionalPress(tileTable, Direction.SOUTH))); + this.addButton(new Button(left + 135, top + 88, 14, 14, new StringTextComponent("W"), new DirectionalPress(tileTable, Direction.WEST))); + this.addButton(new Button(left + 153, top + 88, 14, 14, new StringTextComponent("E"), new DirectionalPress(tileTable, Direction.EAST))); + } + @Override protected void drawGuiContainerBackgroundLayer(MatrixStack stack, float partialTicks, int mouseX, int mouseY) { @@ -49,19 +76,54 @@ public class ScreenAlchemyTable extends ScreenBase this.blit(stack, i, j, 0, 0, this.xSize, this.ySize); int l = this.getCookProgressScaled(90); - this.blit(stack, i + 115, j + 14 + 90 - l, 176, 90 - l, 18, l); + this.blit(stack, i + 106, j + 14 + 90 - l, 176, 90 - l, 18, l); - for (int slotId = 0; slotId < 6; slotId++) + int slotId = tileTable.activeSlot; + if (slotId != -1) { - if (!((TileAlchemyTable) tileTable).isInputSlotAccessible(slotId)) - { - Slot slot = this.getContainer().getSlot(slotId); + Slot slot = this.getContainer().getSlot(slotId); - this.blit(stack, i + slot.xPos, j + slot.yPos, 195, 1, 16, 16); + if (slotId == TileAlchemyTable.outputSlot) + { + this.blit(stack, i + slot.xPos, j + slot.yPos, 195, 37, 16, 16); + } else + { + this.blit(stack, i + slot.xPos, j + slot.yPos, 195, 19, 16, 16); + } + + for (int buttonId = 0; buttonId < 6; buttonId++) + { + int xOffset = (buttonId % 2) * 18 + 133; + int yOffset = (buttonId / 2) * 18 + 50; + if (tileTable.isSlotEnabled(slotId, Direction.byIndex(buttonId))) + { + this.blit(stack, i + xOffset, j + yOffset, 212, 18, 18, 18); + } else + { + this.blit(stack, i + xOffset, j + yOffset, 212, 0, 18, 18); + } } } + +// for (int slotId = 0; slotId < 6; slotId++) +// { +// if (!((TileAlchemyTable) tileTable).isInputSlotAccessible(slotId)) +// { +// Slot slot = this.getContainer().getSlot(slotId); +// +// this.blit(stack, i + slot.xPos, j + slot.yPos, 195, 1, 16, 16); +// } +// } } +// @Override +// public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) +// { +// boolean superMouse = super.mouseClicked(mouseX, mouseY, mouseButton); +// System.out.println("Last button clicked: " + mouseButton); +// return superMouse; +// } + // public int getCookProgressScaled(int scale) { @@ -74,4 +136,93 @@ public class ScreenAlchemyTable extends ScreenBase // System.out.println(this.container.data.get(0)); return (int) (progress * scale); } + + public class DirectionalButton extends Button + { + private static final int BUTTON_TEX_X = 200, BUTTON_TEX_Y = 60; + + public DirectionalButton(int x, int y, int width, int height, ITextComponent title, IPressable pressedAction) + { + super(x, y, width, height, title, pressedAction); + } + + @Override + public void renderButton(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) + { + Minecraft minecraft = Minecraft.getInstance(); + FontRenderer fontrenderer = minecraft.fontRenderer; + minecraft.getTextureManager().bindTexture(WIDGETS_LOCATION); + + // Vanilla's method +// RenderSystem.color4f(1.0F, 1.0F, 1.0F, this.alpha); +// int i = this.getYImage(this.isHovered()); +// RenderSystem.enableBlend(); +// RenderSystem.defaultBlendFunc(); +// RenderSystem.enableDepthTest(); +// this.blit(matrixStack, this.x, this.y, 0, 46 + i * 20, this.width / 2, this.height); +// this.blit(matrixStack, this.x + this.width / 2, this.y, 200 - this.width / 2, 46 + i * 20, this.width / 2, this.height); +// this.renderBg(matrixStack, minecraft, mouseX, mouseY); +// int j = getFGColor(); +// drawCenteredString(matrixStack, fontrenderer, this.getMessage(), this.x + this.width / 2, this.y + (this.height - 8) / 2, j | MathHelper.ceil(this.alpha * 255.0F) << 24); + + // Mekanism's method + int i = this.getYImage(this.isHovered()); + RenderSystem.enableBlend(); + RenderSystem.blendFuncSeparate(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA, SourceFactor.ONE, DestFactor.ZERO); + RenderSystem.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA); + + int width = this.width; + int height = this.height; + int halfWidthLeft = width / 2; + int halfWidthRight = width % 2 == 0 ? halfWidthLeft : halfWidthLeft + 1; + int halfHeightTop = height / 2; + int halfHeightBottom = height % 2 == 0 ? halfHeightTop : halfHeightTop + 1; + int position = i * 20; + + // Left Top Corner + blit(matrixStack, x, y, 0, position, halfWidthLeft, halfHeightTop, BUTTON_TEX_X, BUTTON_TEX_Y); + // Left Bottom Corner + blit(matrixStack, x, y + halfHeightTop, 0, position + 20 - halfHeightBottom, halfWidthLeft, halfHeightBottom, BUTTON_TEX_X, BUTTON_TEX_Y); + // Right Top Corner + blit(matrixStack, x + halfWidthLeft, y, 200 - halfWidthRight, position, halfWidthRight, halfHeightTop, BUTTON_TEX_X, BUTTON_TEX_Y); + // Right Bottom Corner + blit(matrixStack, x + halfWidthLeft, y + halfHeightTop, 200 - halfWidthRight, position + 20 - halfHeightBottom, halfWidthRight, halfHeightBottom, BUTTON_TEX_X, BUTTON_TEX_Y); + renderBg(matrixStack, minecraft, mouseX, mouseY); + RenderSystem.disableBlend(); + + if (this.isHovered()) + { + this.renderToolTip(matrixStack, mouseX, mouseY); + } + } + } + + public class DirectionalPress implements Button.IPressable + { + private final TileAlchemyTable table; + private final Direction direction; + + public DirectionalPress(TileAlchemyTable table, Direction direction) + { + this.table = table; + this.direction = direction; + } + + @Override + public void onPress(Button button) + { +// System.out.println("Pressing le " + direction.toString() + " button, beign oui!"); + int activeSlot = table.activeSlot; + if (activeSlot != -1) + { + boolean enabled = table.isSlotEnabled(activeSlot, direction); + table.setSlotEnabled(!enabled, activeSlot, direction); + BloodMagicPacketHandler.INSTANCE.sendToServer(new AlchemyTableButtonPacket(table.getPos(), activeSlot, direction, !enabled)); + } +//// if (button.visible) +// { +// button.visible = !button.visible; +// } + } + } } \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/impl/BloodMagicRecipeRegistrar.java b/src/main/java/wayoftime/bloodmagic/impl/BloodMagicRecipeRegistrar.java index 3fc055e1..ee31e7b1 100644 --- a/src/main/java/wayoftime/bloodmagic/impl/BloodMagicRecipeRegistrar.java +++ b/src/main/java/wayoftime/bloodmagic/impl/BloodMagicRecipeRegistrar.java @@ -1,6 +1,7 @@ package wayoftime.bloodmagic.impl; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -16,12 +17,12 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.Ingredient; import net.minecraft.world.World; import net.minecraftforge.fluids.FluidStack; +import wayoftime.bloodmagic.common.recipe.BloodMagicRecipeType; import wayoftime.bloodmagic.recipe.RecipeARC; import wayoftime.bloodmagic.recipe.RecipeAlchemyArray; import wayoftime.bloodmagic.recipe.RecipeAlchemyTable; import wayoftime.bloodmagic.recipe.RecipeBloodAltar; import wayoftime.bloodmagic.recipe.RecipeTartaricForge; -import wayoftime.bloodmagic.common.recipe.BloodMagicRecipeType; public class BloodMagicRecipeRegistrar { @@ -214,8 +215,9 @@ public class BloodMagicRecipeRegistrar public Set getCraftingAlchemyArrayRecipes(World world) { - Set recipes = Set.copyOf(world.getRecipeManager().getRecipesForType(BloodMagicRecipeType.ARRAY)); - Set copyRecipes = Set.of(); + Set recipes = new HashSet(world.getRecipeManager().getRecipesForType(BloodMagicRecipeType.ARRAY)); + + Set copyRecipes = new HashSet(); for (RecipeAlchemyArray recipe : recipes) { if (!recipe.getOutput().isEmpty()) diff --git a/src/main/java/wayoftime/bloodmagic/network/AlchemyTableButtonPacket.java b/src/main/java/wayoftime/bloodmagic/network/AlchemyTableButtonPacket.java new file mode 100644 index 00000000..4202043c --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/network/AlchemyTableButtonPacket.java @@ -0,0 +1,76 @@ +package wayoftime.bloodmagic.network; + +import java.util.function.Supplier; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.network.NetworkEvent.Context; +import wayoftime.bloodmagic.tile.TileAlchemyTable; + +public class AlchemyTableButtonPacket +{ + private BlockPos pos; + private int slot; + private Direction dir; + private boolean enable; + + public AlchemyTableButtonPacket() + { + this(BlockPos.ZERO, 0, Direction.DOWN, true); + } + + public AlchemyTableButtonPacket(BlockPos pos, int slot, Direction dir, boolean enable) + { + this.pos = pos; + this.slot = slot; + this.dir = dir; + this.enable = enable; + } + + public static void encode(AlchemyTableButtonPacket pkt, PacketBuffer buf) + { + buf.writeBlockPos(pkt.pos); + buf.writeInt(pkt.slot); + buf.writeInt(pkt.dir.ordinal()); + buf.writeBoolean(pkt.enable); + } + + public static AlchemyTableButtonPacket decode(PacketBuffer buf) + { + AlchemyTableButtonPacket pkt = new AlchemyTableButtonPacket(buf.readBlockPos(), buf.readInt(), Direction.byIndex(buf.readInt()), buf.readBoolean()); + + return pkt; + } + + public static void handle(AlchemyTableButtonPacket message, Supplier context) + { + context.get().enqueueWork(() -> { + PlayerEntity player = context.get().getSender(); + if (player == null) + { + return; + } + TileEntity tile = player.getEntityWorld().getTileEntity(message.pos); + if (tile instanceof TileAlchemyTable) + { + ((TileAlchemyTable) tile).setSlotEnabled(message.enable, message.slot, message.dir); + } + }); + context.get().setPacketHandled(true); + } + +// @OnlyIn(Dist.CLIENT) +// public static void updateTanks(BlockPos pos, CompoundNBT inputNBT, CompoundNBT outputNBT) +// { +// World world = Minecraft.getInstance().world; +// TileEntity tile = world.getTileEntity(pos); +// if (tile instanceof TileAlchemicalReactionChamber) +// { +// ((TileAlchemicalReactionChamber) tile).inputTank.readFromNBT(inputNBT); +// ((TileAlchemicalReactionChamber) tile).outputTank.readFromNBT(outputNBT); +// } +// } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/network/BloodMagicPacketHandler.java b/src/main/java/wayoftime/bloodmagic/network/BloodMagicPacketHandler.java index b6557df5..fd0d365c 100644 --- a/src/main/java/wayoftime/bloodmagic/network/BloodMagicPacketHandler.java +++ b/src/main/java/wayoftime/bloodmagic/network/BloodMagicPacketHandler.java @@ -20,6 +20,7 @@ public class BloodMagicPacketHandler extends BasePacketHandler registerClientToServer(KeyProcessorPacket.class, KeyProcessorPacket::encode, KeyProcessorPacket::decode, KeyProcessorPacket::handle); registerClientToServer(SigilHoldingPacket.class, SigilHoldingPacket::encode, SigilHoldingPacket::decode, SigilHoldingPacket::handle); + registerClientToServer(AlchemyTableButtonPacket.class, AlchemyTableButtonPacket::encode, AlchemyTableButtonPacket::decode, AlchemyTableButtonPacket::handle); // INSTANCE.registerMessage(id, messageType, encoder, decoder, messageConsumer); // INSTANCE.registerMessage(ChatUtil.PacketNoSpamChat.Handler.class, ChatUtil.PacketNoSpamChat.class, 0, Side.CLIENT); // INSTANCE.registerMessage(ItemRouterButtonPacketProcessor.class, ItemRouterButtonPacketProcessor.class, 1, Side.SERVER); diff --git a/src/main/java/wayoftime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/wayoftime/bloodmagic/tile/TileAlchemyTable.java index 85ad6b3f..02d9ec37 100644 --- a/src/main/java/wayoftime/bloodmagic/tile/TileAlchemyTable.java +++ b/src/main/java/wayoftime/bloodmagic/tile/TileAlchemyTable.java @@ -53,6 +53,16 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, public BlockPos connectedPos = BlockPos.ZERO; public boolean[] blockedSlots = new boolean[] { false, false, false, false, false, false }; + public boolean[] allowedDirectionsSlot0 = new boolean[] { false, false, true, true, true, true }; + public boolean[] allowedDirectionsSlot1 = new boolean[] { false, false, true, true, true, true }; + public boolean[] allowedDirectionsSlot2 = new boolean[] { false, false, true, true, true, true }; + public boolean[] allowedDirectionsSlot3 = new boolean[] { false, false, true, true, true, true }; + public boolean[] allowedDirectionsSlot4 = new boolean[] { false, false, true, true, true, true }; + public boolean[] allowedDirectionsSlot5 = new boolean[] { false, false, true, true, true, true }; + public boolean[] allowedDirectionsOrb = new boolean[] { false, true, false, false, false, false }; + public boolean[] allowedDirectionsOutput = new boolean[] { true, false, false, false, false, false }; + + public int activeSlot = -1; public TileAlchemyTable(TileEntityType type) { @@ -91,6 +101,62 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, blockedSlots[slot] = !blockedSlots[slot]; } + public boolean isSlotEnabled(int slot, Direction dir) + { + switch (slot) + { + case 0: + return allowedDirectionsSlot0[dir.ordinal()]; + case 1: + return allowedDirectionsSlot1[dir.ordinal()]; + case 2: + return allowedDirectionsSlot2[dir.ordinal()]; + case 3: + return allowedDirectionsSlot3[dir.ordinal()]; + case 4: + return allowedDirectionsSlot4[dir.ordinal()]; + case 5: + return allowedDirectionsSlot5[dir.ordinal()]; + case 6: + return allowedDirectionsOrb[dir.ordinal()]; + case 7: + return allowedDirectionsOutput[dir.ordinal()]; + } + + return false; + } + + public void setSlotEnabled(boolean enabled, int slot, Direction dir) + { + switch (slot) + { + case 0: + allowedDirectionsSlot0[dir.ordinal()] = enabled; + break; + case 1: + allowedDirectionsSlot1[dir.ordinal()] = enabled; + break; + case 2: + allowedDirectionsSlot2[dir.ordinal()] = enabled; + break; + case 3: + allowedDirectionsSlot3[dir.ordinal()] = enabled; + break; + case 4: + allowedDirectionsSlot4[dir.ordinal()] = enabled; + break; + case 5: + allowedDirectionsSlot5[dir.ordinal()] = enabled; + break; + case 6: + allowedDirectionsOrb[dir.ordinal()] = enabled; + break; + case 7: + allowedDirectionsOutput[dir.ordinal()] = enabled; + break; + } + } + @Override public void deserialize(CompoundNBT tag) { @@ -105,6 +171,16 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, byte[] array = tag.getByteArray("blockedSlots"); for (int i = 0; i < array.length; i++) blockedSlots[i] = array[i] != 0; + + for (int i = 0; i <= outputSlot; i++) + { + byte[] allowedSlotArray = tag.getByteArray("allowedDirections" + i); + for (int j = 0; j < Math.min(allowedSlotArray.length, Direction.values().length); j++) + { + this.setSlotEnabled(allowedSlotArray[j] == 1 ? true : false, i, Direction.values()[j]); + } +// tag.putByteArray("allowedDirections" + i, allowedSlotArray); + } } @Override @@ -125,6 +201,17 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, for (int i = 0; i < blockedSlots.length; i++) blockedSlotArray[i] = (byte) (blockedSlots[i] ? 1 : 0); tag.putByteArray("blockedSlots", blockedSlotArray); + + for (int i = 0; i <= outputSlot; i++) + { + byte[] allowedSlotArray = new byte[Direction.values().length]; + for (int j = 0; j < Direction.values().length; j++) + { + allowedSlotArray[j] = (byte) (this.isSlotEnabled(i, Direction.values()[j]) ? 1 : 0); + } + tag.putByteArray("allowedDirections" + i, allowedSlotArray); + } + return tag; } @@ -152,43 +239,68 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, @Override public int[] getSlotsForFace(Direction side) { - switch (side) + List integerList = new ArrayList(); + for (int i = 0; i <= outputSlot; i++) { - case DOWN: - return new int[] { outputSlot }; - case UP: - return new int[] { orbSlot }; - default: - return new int[] { 0, 1, 2, 3, 4, 5 }; + if (this.isSlotEnabled(i, side)) + { + integerList.add(i); + } } + + int[] intArray = new int[integerList.size()]; + for (int i = 0; i < intArray.length; i++) + { + intArray[i] = integerList.get(i); + } + + return intArray; +// switch (side) +// { +// case DOWN: +// return new int[] { outputSlot }; +// case UP: +// return new int[] { orbSlot }; +// default: +// return new int[] { 0, 1, 2, 3, 4, 5 }; +// } } @Override public boolean canInsertItem(int index, ItemStack stack, Direction direction) { - switch (direction) + switch (index) { - case DOWN: - return index != outputSlot && index != orbSlot; - case UP: - if (index == orbSlot && !stack.isEmpty() && stack.getItem() instanceof IBloodOrb) - { - return true; - } else - { - return true; - } + case outputSlot: + return false; + case orbSlot: + return !stack.isEmpty() && stack.getItem() instanceof IBloodOrb; default: - if (this.isSlave) - { - TileEntity tile = getWorld().getTileEntity(connectedPos); - if (tile instanceof TileAlchemyTable && !((TileAlchemyTable) tile).isSlave) - { - return ((TileAlchemyTable) tile).canInsertItem(index, stack, direction); - } - } - return getAccessibleInputSlots(direction).contains(index); + return this.isSlotEnabled(index, direction); } +// switch (direction) +// { +// case DOWN: +// return index != outputSlot && index != orbSlot; +// case UP: +// if (index == orbSlot && !stack.isEmpty() && stack.getItem() instanceof IBloodOrb) +// { +// return true; +// } else +// { +// return true; +// } +// default: +// if (this.isSlave) +// { +// TileEntity tile = getWorld().getTileEntity(connectedPos); +// if (tile instanceof TileAlchemyTable && !((TileAlchemyTable) tile).isSlave) +// { +// return ((TileAlchemyTable) tile).canInsertItem(index, stack, direction); +// } +// } +// return getAccessibleInputSlots(direction).contains(index); +// } } @Override @@ -196,26 +308,8 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, { switch (direction) { - case DOWN: - return index == outputSlot; - case UP: - if (index == orbSlot && !stack.isEmpty() && stack.getItem() instanceof IBloodOrb) - { - return true; - } else - { - return true; - } default: - if (this.isSlave) - { - TileEntity tile = getWorld().getTileEntity(connectedPos); - if (tile instanceof TileAlchemyTable && !((TileAlchemyTable) tile).isSlave) - { - return ((TileAlchemyTable) tile).canExtractItem(index, stack, direction); - } - } - return getAccessibleInputSlots(direction).contains(index); + return this.isSlotEnabled(index, direction); } } @@ -424,14 +518,15 @@ public class TileAlchemyTable extends TileInventory implements ISidedInventory, // // } + if (!inputStack.isDamageable()) + { + continue; + } if (inputStack.attemptDamageItem(1, world.rand, null)) { setInventorySlotContents(i, ItemStack.EMPTY); } continue; - } else if (!inputStack.isDamageable()) - { - continue; } inputStack.shrink(1); diff --git a/src/main/java/wayoftime/bloodmagic/tile/container/ContainerAlchemyTable.java b/src/main/java/wayoftime/bloodmagic/tile/container/ContainerAlchemyTable.java index c8fe9fa3..ab509370 100644 --- a/src/main/java/wayoftime/bloodmagic/tile/container/ContainerAlchemyTable.java +++ b/src/main/java/wayoftime/bloodmagic/tile/container/ContainerAlchemyTable.java @@ -44,7 +44,7 @@ public class ContainerAlchemyTable extends Container this.addSlot(new Slot(tileTable, 3, 26, 87)); this.addSlot(new Slot(tileTable, 4, 8, 51)); this.addSlot(new Slot(tileTable, 5, 26, 15)); - this.addSlot(new SlotOrb(tileTable, TileAlchemyTable.orbSlot, 152, 51)); + this.addSlot(new SlotOrb(tileTable, TileAlchemyTable.orbSlot, 143, 24)); this.addSlot(new SlotOutput(tileTable, TileAlchemyTable.outputSlot, 44, 51)); for (int i = 0; i < 3; i++) @@ -66,12 +66,19 @@ public class ContainerAlchemyTable extends Container { PlayerInventory inventoryPlayer = player.inventory; - if (slotId < 6 && slotId >= 0) + if (slotId <= TileAlchemyTable.outputSlot && slotId >= 0) { Slot slot = this.getSlot(slotId); if (!slot.getHasStack() && inventoryPlayer.getItemStack().isEmpty()) { - ((TileAlchemyTable) tileTable).toggleInputSlotAccessible(slotId); +// ((TileAlchemyTable) tileTable).toggleInputSlotAccessible(slotId); + if (tileTable.activeSlot == slotId) + { + tileTable.activeSlot = -1; + } else + { + tileTable.activeSlot = slotId; + } } } diff --git a/src/main/resources/assets/bloodmagic/textures/gui/alchemytable.png b/src/main/resources/assets/bloodmagic/textures/gui/alchemytable.png index 492416f9c25183518d5373eddad4d6f8065458ff..a92eac0103d906761b1c6542cb079f17792e821b 100644 GIT binary patch delta 12355 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 mTxq{0mDAQGkw`=T-bqgmC8Q?EC9fB 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