diff --git a/src/main/java/team/chisel/client/gui/GuiChisel.java b/src/main/java/team/chisel/client/gui/GuiChisel.java index 550ebe14..bc7dc54f 100644 --- a/src/main/java/team/chisel/client/gui/GuiChisel.java +++ b/src/main/java/team/chisel/client/gui/GuiChisel.java @@ -13,6 +13,7 @@ import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; +import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import team.chisel.client.gui.widgets.GuiButtonChiselMode; import team.chisel.inventory.ContainerChisel; @@ -28,116 +29,149 @@ import static team.chisel.Chisel.MOD_ID; @SideOnly(Side.CLIENT) public class GuiChisel extends GuiContainer { - public static final ResourceLocation TEXTURE_RESOURCE_LOCATION = new ResourceLocation(MOD_ID, "textures/chisel2GuiScroll.png"); - public static final int TEXTURE_WIDTH = 266; - public static final int TEXTURE_HEIGHT = 250; - public static final int GUI_WIDTH = 266; - public static final int GUI_HEIGHT = 202; - public static final int CHISEL_INPUT_SIZE = 48; - private EntityPlayer player; - private ContainerChisel container; - private IChiselMode currentMode; + public static final ResourceLocation TEXTURE_RESOURCE_LOCATION = new ResourceLocation(MOD_ID, "textures/chisel2GuiScroll.png"); + public static final int TEXTURE_WIDTH = 266; + public static final int TEXTURE_HEIGHT = 250; + public static final int GUI_WIDTH = 266; + public static final int GUI_HEIGHT = 202; + public static final int CHISEL_INPUT_SIZE = 48; + private EntityPlayer player; + private ContainerChisel container; + private IChiselMode currentMode; + private GuiScrollbar scrollBar; + private InventoryChiselSelection menu; - public GuiChisel(InventoryPlayer iinventory, InventoryChiselSelection menu) { - super(new ContainerChisel(iinventory, menu)); - player = iinventory.player; - xSize = GUI_WIDTH; - ySize = GUI_HEIGHT; + public GuiChisel(InventoryPlayer iinventory, InventoryChiselSelection menu) { + super(new ContainerChisel(iinventory, menu)); + scrollBar = new GuiScrollbar(); + this.menu = menu; + player = iinventory.player; + xSize = GUI_WIDTH; + ySize = GUI_HEIGHT; - container = (ContainerChisel) inventorySlots; - } + container = (ContainerChisel) inventorySlots; + scrollBar.setContainerChisel(container); + } - @Override - public void onGuiClosed() { - super.onGuiClosed(); - inventorySlots.onContainerClosed(player); - } + @Override + public void onGuiClosed() { + super.onGuiClosed(); + inventorySlots.onContainerClosed(player); + } - @Override - @SuppressWarnings("unchecked") - public void initGui() { - super.initGui(); - currentMode = General.getChiselMode(container.chisel); + @Override + @SuppressWarnings("unchecked") + public void initGui() { + super.initGui(); + currentMode = General.getChiselMode(container.chisel); - if (showMode()) { - buttonList.add(new GuiButtonChiselMode(0, guiLeft + 12, guiTop + 132, this)); - } - } + if (showMode()) { + buttonList.add(new GuiButtonChiselMode(0, guiLeft + 12, guiTop + 132, this)); + } - @Override - public void updateScreen() { - super.updateScreen(); - final ItemStack held = player.getCurrentEquippedItem(); - if (held == null || !(held.getItem() instanceof IChiselItem)) { - mc.displayGuiScreen(null); - } - } + scrollBar.setLeft(246); + scrollBar.setTop(8); + scrollBar.setScrollHeight(106); + } - private boolean showMode() { - return container.chisel != null - && container.chisel.getItem() instanceof IChiselItem - && ((IChiselItem) container.chisel.getItem()).hasModes(container.chisel); - } + @Override + public void updateScreen() { + super.updateScreen(); + final ItemStack held = player.getCurrentEquippedItem(); + if (held == null || !(held.getItem() instanceof IChiselItem)) { + mc.displayGuiScreen(null); + } + } - @Override - protected void drawGuiContainerForegroundLayer(final int mouseX, final int mouseY) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + private boolean showMode() { + return container.chisel != null + && container.chisel.getItem() instanceof IChiselItem + && ((IChiselItem) container.chisel.getItem()).hasModes(container.chisel); + } - final String titleText = I18n.format(container.inventory.getInventoryName() + ".title"); - fontRendererObj.drawSplitString(titleText, 50 - fontRendererObj.getStringWidth(titleText) / 2, 60, 40, 0x404040); + @Override + protected void drawGuiContainerForegroundLayer(final int mouseX, final int mouseY) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - if (showMode()) { - final String modeText = I18n.format(container.inventory.getInventoryName() + ".mode"); - fontRendererObj.drawString(modeText, 12 + (GuiButtonChiselMode.BUTTON_WIDTH - fontRendererObj.getStringWidth(modeText)) / 2, 122, 0x404040); - } - } + final String titleText = I18n.format(container.inventory.getInventoryName() + ".title"); + fontRendererObj.drawSplitString(titleText, 50 - fontRendererObj.getStringWidth(titleText) / 2, 60, 40, 0x404040); - @Override - protected void drawGuiContainerBackgroundLayer(final float partialTicks, final int mouseX, final int mouseY) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glDisable(GL11.GL_LIGHTING); + if (showMode()) { + final String modeText = I18n.format(container.inventory.getInventoryName() + ".mode"); + fontRendererObj.drawString(modeText, 12 + (GuiButtonChiselMode.BUTTON_WIDTH - fontRendererObj.getStringWidth(modeText)) / 2, 122, 0x404040); + } - mc.getTextureManager().bindTexture(TEXTURE_RESOURCE_LOCATION); - // drawModalRectWithCustomSizedTexture: x, y, u, v, width, height, textureWidth, textureHeight - func_146110_a(guiLeft, guiTop, 0, 0, xSize, ySize, TEXTURE_WIDTH, TEXTURE_HEIGHT); + scrollBar.draw(this); + } - Slot main = (Slot) container.inventorySlots.get(InventoryChiselSelection.normalSlots); - if (main.getStack() == null) { - func_146110_a(guiLeft + 8, guiTop + 8, 0, GUI_HEIGHT, CHISEL_INPUT_SIZE, CHISEL_INPUT_SIZE, TEXTURE_WIDTH, TEXTURE_HEIGHT); - } - } + @Override + protected void drawGuiContainerBackgroundLayer(final float partialTicks, final int mouseX, final int mouseY) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_LIGHTING); - @Override - protected void actionPerformed(final GuiButton button) { - if (button.id == 0) { - if (container.chisel != null && container.chisel.getItem() instanceof IAdvancedChisel) { - final IAdvancedChisel item = (IAdvancedChisel) container.chisel.getItem(); - currentMode = item.getNextMode(container.chisel, currentMode); - } else { - currentMode = ChiselMode.next(currentMode); - } - PacketHandler.INSTANCE.sendToServer(new MessageChiselMode(currentMode)); - } - super.actionPerformed(button); - } + mc.getTextureManager().bindTexture(TEXTURE_RESOURCE_LOCATION); + // drawModalRectWithCustomSizedTexture: x, y, u, v, width, height, textureWidth, textureHeight + func_146110_a(guiLeft, guiTop, 0, 0, xSize, ySize, TEXTURE_WIDTH, TEXTURE_HEIGHT); - @Override - protected void func_146977_a(final Slot slot) { - if (slot instanceof SlotChiselInput) { - GL11.glPushMatrix(); - GL11.glScalef(2, 2, 2); - slot.xDisplayPosition -= 16; - slot.yDisplayPosition -= 16; - super.func_146977_a(slot); - slot.xDisplayPosition += 16; - slot.yDisplayPosition += 16; - GL11.glPopMatrix(); - } else { - super.func_146977_a(slot); - } - } + Slot main = (Slot) container.inventorySlots.get(InventoryChiselSelection.normalSlots); + if (main.getStack() == null) { + func_146110_a(guiLeft + 8, guiTop + 8, 0, GUI_HEIGHT, CHISEL_INPUT_SIZE, CHISEL_INPUT_SIZE, TEXTURE_WIDTH, TEXTURE_HEIGHT); + } + } - public IChiselMode getCurrentMode() { - return currentMode; - } + @Override + protected void actionPerformed(final GuiButton button) { + if (button.id == 0) { + if (container.chisel != null && container.chisel.getItem() instanceof IAdvancedChisel) { + final IAdvancedChisel item = (IAdvancedChisel) container.chisel.getItem(); + currentMode = item.getNextMode(container.chisel, currentMode); + } else { + currentMode = ChiselMode.next(currentMode); + } + PacketHandler.INSTANCE.sendToServer(new MessageChiselMode(currentMode)); + } + super.actionPerformed(button); + } + + @Override + protected void func_146977_a(final Slot slot) { + if (slot instanceof SlotChiselInput) { + GL11.glPushMatrix(); + GL11.glScalef(2, 2, 2); + slot.xDisplayPosition -= 16; + slot.yDisplayPosition -= 16; + super.func_146977_a(slot); + slot.xDisplayPosition += 16; + slot.yDisplayPosition += 16; + GL11.glPopMatrix(); + } else { + super.func_146977_a(slot); + } + } + + @Override + protected void mouseClickMove(int x, int y, int c, long d) { + scrollBar.click(x - guiLeft, y - guiTop); + super.mouseClickMove(x, y, c, d); + } + + @Override + protected void mouseClicked(int xCoord, int yCoord, int btn) { + scrollBar.click(xCoord - guiLeft, yCoord - guiTop); + super.mouseClicked(xCoord, yCoord, btn); + } + + @Override + public void handleMouseInput() { + super.handleMouseInput(); + + int i = Mouse.getEventDWheel(); + if (i != 0 && scrollBar != null) { + scrollBar.wheel(i); + } + } + + public IChiselMode getCurrentMode() { + return currentMode; + } } diff --git a/src/main/java/team/chisel/client/gui/GuiScrollbar.java b/src/main/java/team/chisel/client/gui/GuiScrollbar.java new file mode 100644 index 00000000..7854f983 --- /dev/null +++ b/src/main/java/team/chisel/client/gui/GuiScrollbar.java @@ -0,0 +1,95 @@ +package team.chisel.client.gui; + +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import team.chisel.inventory.ContainerChisel; +import team.chisel.network.PacketHandler; +import team.chisel.network.message.MessageScrollUpdate; + +public class GuiScrollbar { + public static final ResourceLocation TEXTURE_RESOURCE_LOCATION = new ResourceLocation("minecraft", "textures/gui/container/creative_inventory/tabs.png"); + + private int displayX = 0; + private int displayY = 0; + private int width = 12; + private int height = 15; + + private int rowSize = 10; + private int rowsOnPage = 6; + + private int scrollHeight = height; + private ContainerChisel container; + + public void draw(GuiChisel g) { + // chisel2GuiScroll scroll button texture coordinates work strange (maybe because of alignment) so taking vanilla one + g.mc.getTextureManager().bindTexture(TEXTURE_RESOURCE_LOCATION); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + + if (getMaxScroll() == 0) { + g.drawTexturedModalRect(displayX, displayY, 232 + width, 0, width, height); + } else { + int offset = getCurrentScroll() * (scrollHeight - height) / getMaxScroll(); + g.drawTexturedModalRect(displayX, offset + displayY, 232, 0, width, height); + } + } + + public GuiScrollbar setScrollHeight(int scrollHeight) { + this.scrollHeight = scrollHeight; + return this; + } + + public GuiScrollbar setLeft(int displayX) { + this.displayX = displayX; + return this; + } + + public GuiScrollbar setTop(int displayY) { + this.displayY = displayY; + return this; + } + + private int getMaxScroll() { + int maxScroll = (container.inventory.getMaxScroll() + rowSize - 1) / rowSize - rowsOnPage; + + if (maxScroll <= 0) { + maxScroll = 0; + } + + return maxScroll; + } + + public int getCurrentScroll() { + return container.inventory.getCurrentScroll() / rowSize; + } + + private void setCurrentScroll(int scroll) { + container.inventory.setCurrentScroll(scroll * rowSize); + PacketHandler.INSTANCE.sendToServer(new MessageScrollUpdate(scroll * rowSize)); + } + + private int applyRange(int scroll) { + return Math.max(Math.min(scroll, getMaxScroll()), 0); + } + + void click(int x, int y) { + if (getMaxScroll() == 0) { + return; + } + + if (x > displayX && x <= displayX + width) { + if (y > displayY && y <= displayY + scrollHeight) { + int currentScroll = (y - displayY - height / 2); + currentScroll = Math.round(1.0f * currentScroll * getMaxScroll() / (scrollHeight - height)); + setCurrentScroll(applyRange(currentScroll)); + } + } + } + + void wheel(int delta) { + setCurrentScroll(applyRange(getCurrentScroll() + Math.max(Math.min(-delta, 1), -1))); + } + + public void setContainerChisel(ContainerChisel container) { + this.container = container; + } +} diff --git a/src/main/java/team/chisel/compat/Compatibility.java b/src/main/java/team/chisel/compat/Compatibility.java index 509e47c4..ef44d114 100644 --- a/src/main/java/team/chisel/compat/Compatibility.java +++ b/src/main/java/team/chisel/compat/Compatibility.java @@ -5,9 +5,11 @@ import java.util.Arrays; import java.util.List; import java.util.Map; +import codechicken.nei.api.GuiInfo; import net.minecraft.block.Block; import net.minecraft.item.ItemStack; import team.chisel.carving.Carving; +import team.chisel.client.gui.GuiChisel; import team.chisel.utils.RecipeUtil; import com.cricketcraft.chisel.api.carving.ICarvingGroup; @@ -86,6 +88,10 @@ public class Compatibility { if (Loader.isModLoaded("EE3")) { loadEE3Values(); } + if (Loader.isModLoaded("NotEnoughItems")) { + // disable chiseling by scrolling over itemstack + GuiInfo.customSlotGuis.add(GuiChisel.class); + } } diff --git a/src/main/java/team/chisel/inventory/InventoryChiselSelection.java b/src/main/java/team/chisel/inventory/InventoryChiselSelection.java index a5c9c115..709f6899 100644 --- a/src/main/java/team/chisel/inventory/InventoryChiselSelection.java +++ b/src/main/java/team/chisel/inventory/InventoryChiselSelection.java @@ -15,11 +15,12 @@ import net.minecraft.item.ItemTool; public class InventoryChiselSelection implements IInventory { - ItemStack chisel = null; + ItemStack chisel; public final static int normalSlots = 60; - public int activeVariations = 0; ContainerChisel container; ItemStack[] inventory; + private int currentScroll = 0; + private int maxScroll = 0; public InventoryChiselSelection(ItemStack c) { super(); @@ -28,6 +29,21 @@ public class InventoryChiselSelection implements IInventory { chisel = c; } + public void setCurrentScroll(int currentScroll) { + if (this.currentScroll != currentScroll) { + this.currentScroll = currentScroll; + updateItems(); + } + } + + public int getCurrentScroll() { + return currentScroll; + } + + public int getMaxScroll() { + return maxScroll; + } + public void onInventoryUpdate(int slot) { } @@ -95,10 +111,10 @@ public class InventoryChiselSelection implements IInventory { } public void clearItems() { - activeVariations = 0; for (int i = 0; i < normalSlots; i++) { inventory[i] = null; } + maxScroll = 0; } public ItemStack getStackInSpecialSlot() { @@ -125,11 +141,11 @@ public class InventoryChiselSelection implements IInventory { return; List list = container.carving.getItemsForChiseling(chiseledItem); - - activeVariations = 0; - while (activeVariations < normalSlots && activeVariations < list.size()) { - if (Block.blockRegistry.getNameForObject(Block.getBlockFromItem(list.get(activeVariations).getItem())) != null) { - inventory[activeVariations] = list.get(activeVariations); + maxScroll = list.size(); + int activeVariations = 0; + while (activeVariations < normalSlots && activeVariations + currentScroll < list.size()) { + if (Block.blockRegistry.getNameForObject(Block.getBlockFromItem(list.get(activeVariations + currentScroll).getItem())) != null) { + inventory[activeVariations] = list.get(activeVariations + currentScroll); activeVariations++; } } @@ -151,8 +167,11 @@ public class InventoryChiselSelection implements IInventory { @Override public void setInventorySlotContents(int slot, ItemStack stack) { - inventory[slot] = stack; - updateInventoryState(slot); + // we do not want external chisel variant updates + if (slot == normalSlots) { + inventory[slot] = stack; + updateInventoryState(slot); + } } @Override @@ -172,5 +191,4 @@ public class InventoryChiselSelection implements IInventory { return !(stack != null && (stack.getItem() instanceof ItemChisel)) && i == normalSlots; } - } diff --git a/src/main/java/team/chisel/inventory/SlotChiselInput.java b/src/main/java/team/chisel/inventory/SlotChiselInput.java index 24aaedc6..72a10897 100644 --- a/src/main/java/team/chisel/inventory/SlotChiselInput.java +++ b/src/main/java/team/chisel/inventory/SlotChiselInput.java @@ -30,6 +30,7 @@ public class SlotChiselInput extends Slot { return; super.onSlotChanged(); + selInventory.setCurrentScroll(0); selInventory.updateItems(); } diff --git a/src/main/java/team/chisel/network/PacketHandler.java b/src/main/java/team/chisel/network/PacketHandler.java index b95ebe31..19e69852 100644 --- a/src/main/java/team/chisel/network/PacketHandler.java +++ b/src/main/java/team/chisel/network/PacketHandler.java @@ -5,6 +5,7 @@ import team.chisel.network.message.MessageAutoChisel; import team.chisel.network.message.MessageChiselMode; import team.chisel.network.message.MessageChiselSound; import team.chisel.network.message.MessagePresentConnect; +import team.chisel.network.message.MessageScrollUpdate; import team.chisel.network.message.MessageSlotUpdate; import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; import cpw.mods.fml.relauncher.Side; @@ -21,5 +22,6 @@ public class PacketHandler { INSTANCE.registerMessage(MessageAutoChisel.Handler.class, MessageAutoChisel.class, id++, Side.CLIENT); INSTANCE.registerMessage(MessageChiselMode.Handler.class, MessageChiselMode.class, id++, Side.SERVER); INSTANCE.registerMessage(MessagePresentConnect.Handler.class, MessagePresentConnect.class, id++, Side.CLIENT); + INSTANCE.registerMessage(MessageScrollUpdate.Handler.class, MessageScrollUpdate.class, id++, Side.SERVER); } -} \ No newline at end of file +} diff --git a/src/main/java/team/chisel/network/message/MessageScrollUpdate.java b/src/main/java/team/chisel/network/message/MessageScrollUpdate.java new file mode 100644 index 00000000..f565541a --- /dev/null +++ b/src/main/java/team/chisel/network/message/MessageScrollUpdate.java @@ -0,0 +1,42 @@ +package team.chisel.network.message; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import io.netty.buffer.ByteBuf; +import net.minecraft.inventory.Container; +import team.chisel.inventory.ContainerChisel; + +public class MessageScrollUpdate implements IMessage { + + private int currentScroll; + + public MessageScrollUpdate() { + } + + public MessageScrollUpdate(int scroll) { + currentScroll = scroll; + } + + @Override + public void fromBytes(ByteBuf buf) { + currentScroll = buf.readInt(); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(currentScroll); + } + + public static class Handler implements IMessageHandler { + + @Override + public IMessage onMessage(MessageScrollUpdate message, MessageContext ctx) { + Container container = ctx.getServerHandler().playerEntity.openContainer; + if (container instanceof ContainerChisel) { + ((ContainerChisel) container).inventory.setCurrentScroll(message.currentScroll); + } + return null; + } + } +}