Merge pull request #7 from Skiftcha/chisel-gui-scroll

Chisel gui scroll
This commit is contained in:
Martin Robertz authored and GitHub committed 2020-12-16 00:06:22 +01:00
commit 53c72a9397
7 files changed
+306 -108

No files matched your search

@@ -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;
}
}
@@ -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;
}
}
@@ -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);
}
}
@@ -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<ItemStack> 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;
}
}
@@ -30,6 +30,7 @@ public class SlotChiselInput extends Slot {
return;
super.onSlotChanged();
selInventory.setCurrentScroll(0);
selInventory.updateItems();
}
@@ -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);
}
}
}
@@ -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<MessageScrollUpdate, IMessage> {
@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;
}
}
}