aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Robertz <dream-master@gmx.net>2021-12-02 16:53:40 +0100
committerGitHub <noreply@github.com>2021-12-02 16:53:40 +0100
commitc0a6800447fdb87e266acfb47f35b5f765c74fe3 (patch)
tree2066554d22848e6818689d41cd4ca7f683ebebb7 /src
parent03b6fb248b1a20b9ccce7ac4da4c1a76875fa966 (diff)
downloadGT5-Unofficial-c0a6800447fdb87e266acfb47f35b5f765c74fe3.tar.gz
GT5-Unofficial-c0a6800447fdb87e266acfb47f35b5f765c74fe3.tar.bz2
GT5-Unofficial-c0a6800447fdb87e266acfb47f35b5f765c74fe3.zip
add select circuit gui for machine and circuits itself (#773)
also fixed some issue with basic machine gui introduced in 9d42b299def1c41bbc7a1f01efe445be28f54399 also retrofitted volumetric flask to use the new INetworkUpdatableItem and GT_Packet_UpdateItem, deprecating MessageSetFlaskCapacity in the meanwhile. To open the gui for machine, shift-left-click the circuit slot To open the gui for circuit, click any block (need to be sneaking if it's chest, furnace, etc) with the circuit held in hand. Signed-off-by: Glease <4586901+Glease@users.noreply.github.com> Co-authored-by: Glease <4586901+Glease@users.noreply.github.com>
Diffstat (limited to 'src')
-rw-r--r--src/main/java/gregtech/api/GregTech_API.java5
-rw-r--r--src/main/java/gregtech/api/gui/GT_Container_BasicMachine.java37
-rw-r--r--src/main/java/gregtech/api/gui/GT_GUIContainer.java16
-rw-r--r--src/main/java/gregtech/api/gui/GT_GUIContainer_BasicMachine.java51
-rw-r--r--src/main/java/gregtech/api/gui/GT_GUICover.java308
-rw-r--r--src/main/java/gregtech/api/gui/GT_GUIDialogSelectItem.java217
-rw-r--r--src/main/java/gregtech/api/gui/GT_GUIScreen.java320
-rw-r--r--src/main/java/gregtech/api/gui/widgets/GT_GuiFakeItemButton.java102
-rw-r--r--src/main/java/gregtech/api/gui/widgets/GT_GuiIcon.java2
-rw-r--r--src/main/java/gregtech/api/gui/widgets/GT_GuiTooltip.java8
-rw-r--r--src/main/java/gregtech/api/gui/widgets/GT_GuiTooltipManager.java19
-rw-r--r--src/main/java/gregtech/api/interfaces/IGuiScreen.java1
-rw-r--r--src/main/java/gregtech/api/interfaces/INetworkUpdatableItem.java23
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_New.java1
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_SetConfigurationCircuit.java102
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_UpdateItem.java61
-rw-r--r--src/main/java/gregtech/api/util/GT_Utility.java29
-rw-r--r--src/main/java/gregtech/api/util/GT_UtilityClient.java32
-rw-r--r--src/main/java/gregtech/common/GT_Network.java3
-rw-r--r--src/main/java/gregtech/common/GT_Proxy.java4
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_Fluidfilter.java1
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_ItemFilter.java1
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_ItemMeter.java1
-rw-r--r--src/main/java/gregtech/common/gui/GT_GUIContainerVolumetricFlask.java6
-rw-r--r--src/main/java/gregtech/common/items/GT_IntegratedCircuit_Item.java156
-rw-r--r--src/main/java/gregtech/common/items/GT_VolumetricFlask.java26
-rw-r--r--src/main/java/gregtech/common/net/MessageSetFlaskCapacity.java1
-rw-r--r--src/main/resources/assets/gregtech/lang/en_US.lang11
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/GuiButtons.pngbin9910 -> 7903 bytes
29 files changed, 1160 insertions, 384 deletions
diff --git a/src/main/java/gregtech/api/GregTech_API.java b/src/main/java/gregtech/api/GregTech_API.java
index 12fc6b6814..7c47ec4a7b 100644
--- a/src/main/java/gregtech/api/GregTech_API.java
+++ b/src/main/java/gregtech/api/GregTech_API.java
@@ -32,6 +32,7 @@ import gregtech.api.world.GT_Worldgen;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ChunkCoordinates;
@@ -39,13 +40,16 @@ import net.minecraft.world.World;
import net.minecraftforge.fluids.Fluid;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
import static gregtech.api.enums.GT_Values.B;
import static gregtech.api.enums.GT_Values.L;
@@ -180,6 +184,7 @@ public class GregTech_API {
sElectroHazmatList = new GT_HashSet<>();
private static final List<ItemStack> sRealConfigurationList = new ArrayList<>();
private static final List<ItemStack> sConfigurationList = Collections.unmodifiableList(sRealConfigurationList);
+ public static final GT_HashSet<GT_ItemStack> sCircuitProgrammerList = new GT_HashSet<>();
/**
* The List of Dimensions, which are Whitelisted for the Teleporter. This list should not contain other Planets.
* Mystcraft Dimensions and other Dimensional Things should be allowed.
diff --git a/src/main/java/gregtech/api/gui/GT_Container_BasicMachine.java b/src/main/java/gregtech/api/gui/GT_Container_BasicMachine.java
index 3c1d35c771..26f795de1c 100644
--- a/src/main/java/gregtech/api/gui/GT_Container_BasicMachine.java
+++ b/src/main/java/gregtech/api/gui/GT_Container_BasicMachine.java
@@ -28,6 +28,9 @@ public class GT_Container_BasicMachine extends GT_Container_BasicTank {
mItemTransfer = false,
mStuttering = false;
+ private Runnable circuitSlotClickCallback;
+ GT_Slot_Render slotCircuit;
+
public GT_Container_BasicMachine(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity) {
super(aInventoryPlayer, aTileEntity);
}
@@ -38,8 +41,7 @@ public class GT_Container_BasicMachine extends GT_Container_BasicTank {
addSlotToContainer(new GT_Slot_Holo(mTileEntity, 0, 26, 63, false, true, 1));
addSlotToContainer(new GT_Slot_Render(mTileEntity, 2, 107, 63));
GT_MetaTileEntity_BasicMachine machine = (GT_MetaTileEntity_BasicMachine) mTileEntity.getMetaTileEntity();
- if (machine.allowSelectCircuit())
- addSlotToContainer(new GT_Slot_Render(mTileEntity, machine.getCircuitSlot(), 153, 63));
+ addSlotToContainer(slotCircuit = new GT_Slot_Render(mTileEntity, machine.getCircuitSlot(), 153, 63));
int tStartIndex = machine.getInputSlot();
@@ -186,17 +188,6 @@ public class GT_Container_BasicMachine extends GT_Container_BasicTank {
addSlotToContainer(new GT_Slot_Render(mTileEntity, tStartIndex++, 53, 63));
}
- private static int find(List<ItemStack> aStacks, ItemStack aStack) {
- if (GT_Utility.isStackInvalid(aStack))
- return -1;
- for (int i = 0, aStacksSize = aStacks.size(); i < aStacksSize; i++) {
- ItemStack tStack = aStacks.get(i);
- if (GT_Utility.areStacksEqual(aStack, tStack))
- return i;
- }
- return -1;
- }
-
@Override
public ItemStack slotClick(int aSlotIndex, int aMouseclick, int aShifthold, EntityPlayer aPlayer) {
if (mTileEntity.getMetaTileEntity() == null) return null;
@@ -213,15 +204,21 @@ public class GT_Container_BasicMachine extends GT_Container_BasicTank {
case 3:
if (machine.allowSelectCircuit() && aMouseclick < 2) {
ItemStack newCircuit;
- if (aMouseclick == 1 && aShifthold == 1) {
- // clear
- newCircuit = null;
+ if (aShifthold == 1) {
+ if (aMouseclick == 0) {
+ if (circuitSlotClickCallback != null)
+ circuitSlotClickCallback.run();
+ return null;
+ } else {
+ // clear
+ newCircuit = null;
+ }
} else {
ItemStack cursorStack = aPlayer.inventory.getItemStack();
List<ItemStack> tCircuits = machine.getConfigurationCircuits();
- int index = find(tCircuits, cursorStack);
+ int index = GT_Utility.findMatchingStackInList(tCircuits, cursorStack);
if (index < 0) {
- int curIndex = find(tCircuits, machine.getStackInSlot(machine.getCircuitSlot())) + 1;
+ int curIndex = GT_Utility.findMatchingStackInList(tCircuits, machine.getStackInSlot(machine.getCircuitSlot())) + 1;
if (aMouseclick == 0) {
curIndex += 1;
} else {
@@ -315,4 +312,8 @@ public class GT_Container_BasicMachine extends GT_Container_BasicTank {
public int getShiftClickSlotCount() {
return ((GT_MetaTileEntity_BasicMachine) mTileEntity.getMetaTileEntity()).mInputSlotCount;
}
+
+ public void setCircuitSlotClickCallback(Runnable circuitSlotClickCallback) {
+ this.circuitSlotClickCallback = circuitSlotClickCallback;
+ }
}
diff --git a/src/main/java/gregtech/api/gui/GT_GUIContainer.java b/src/main/java/gregtech/api/gui/GT_GUIContainer.java
index f53684f10a..b122b33a73 100644
--- a/src/main/java/gregtech/api/gui/GT_GUIContainer.java
+++ b/src/main/java/gregtech/api/gui/GT_GUIContainer.java
@@ -4,6 +4,7 @@ import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.inventory.Container;
import net.minecraft.util.ResourceLocation;
+import org.lwjgl.input.Mouse;
/**
* NEVER INCLUDE THIS FILE IN YOUR MOD!!!
@@ -53,6 +54,21 @@ public class GT_GUIContainer extends GuiContainer {
}
}
}
+
+ @Override
+ public void handleMouseInput() {
+ int delta = Mouse.getEventDWheel();
+ if (delta != 0) {
+ int i = Mouse.getEventX() * this.width / this.mc.displayWidth;
+ int j = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1;
+ onMouseWheel(i, j, delta);
+ }
+ super.handleMouseInput();
+ }
+
+ protected void onMouseWheel(int mx, int my, int delta) {
+ }
+
/*
@Override
protected void drawSlotInventory(Slot par1Slot) {
diff --git a/src/main/java/gregtech/api/gui/GT_GUIContainer_BasicMachine.java b/src/main/java/gregtech/api/gui/GT_GUIContainer_BasicMachine.java
index bd28bb11e9..df02d219fd 100644
--- a/src/main/java/gregtech/api/gui/GT_GUIContainer_BasicMachine.java
+++ b/src/main/java/gregtech/api/gui/GT_GUIContainer_BasicMachine.java
@@ -1,8 +1,14 @@
package gregtech.api.gui;
+import gregtech.api.enums.GT_Values;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_Bronze;
+import gregtech.api.net.GT_Packet_SetConfigurationCircuit;
+import gregtech.api.util.GT_Utility;
import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
import java.util.ArrayList;
import java.util.List;
@@ -33,6 +39,7 @@ public class GT_GUIContainer_BasicMachine extends GT_GUIContainerMetaTile_Machin
public GT_GUIContainer_BasicMachine(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity, String aName, String aTextureFile, String aNEI, byte aProgressBarDirection, byte aProgressBarAmount) {
super(new GT_Container_BasicMachine(aInventoryPlayer, aTileEntity), RES_PATH_GUI + "basicmachines/" + aTextureFile);
+ getContainer().setCircuitSlotClickCallback(this::openSelectCircuitDialog);
mProgressBarDirection = aProgressBarDirection;
mProgressBarAmount = (byte) Math.max(1, aProgressBarAmount);
mName = aName;
@@ -40,6 +47,27 @@ public class GT_GUIContainer_BasicMachine extends GT_GUIContainerMetaTile_Machin
mRenderAutoOutputSlots = !(aTileEntity.getMetaTileEntity() instanceof GT_MetaTileEntity_BasicMachine_Bronze);
}
+ private void openSelectCircuitDialog() {
+ mc.displayGuiScreen(new GT_GUIDialogSelectItem(
+ StatCollector.translateToLocal("GT5U.machines.select_circuit"),
+ null,
+ this,
+ this::onCircuitSelected,
+ getMachine().getConfigurationCircuits(),
+ GT_Utility.findMatchingStackInList(getMachine().getConfigurationCircuits(), getMachine().getStackInSlot(getMachine().getCircuitSlot()))));
+ }
+
+ private void onCircuitSelected(ItemStack selected) {
+ GT_Values.NW.sendToServer(new GT_Packet_SetConfigurationCircuit(mContainer.mTileEntity, selected));
+ // we will not do any validation on client side
+ // it doesn't get to actually decide what inventory contains anyway
+ mContainer.mTileEntity.setInventorySlotContents(getMachine().getCircuitSlot(), selected);
+ }
+
+ private GT_MetaTileEntity_BasicMachine getMachine() {
+ return (GT_MetaTileEntity_BasicMachine) mContainer.mTileEntity.getMetaTileEntity();
+ }
+
@Override
public void drawScreen(int par1, int par2, float par3) {
super.drawScreen(par1, par2, par3);
@@ -72,6 +100,17 @@ public class GT_GUIContainer_BasicMachine extends GT_GUIContainerMetaTile_Machin
}
@Override
+ protected void onMouseWheel(int mx, int my, int delta) {
+ GT_Slot_Render slotCircuit = getContainer().slotCircuit;
+ if (slotCircuit != null && func_146978_c(slotCircuit.xDisplayPosition, slotCircuit.yDisplayPosition, 16, 16, mx, my)) {
+ // emulate click
+ handleMouseClick(slotCircuit, -1, delta > 0 ? 1 : 0, 0);
+ return;
+ }
+ super.onMouseWheel(mx, my, delta);
+ }
+
+ @Override
protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) {
super.drawGuiContainerBackgroundLayer(par1, par2, par3);
int x = (width - xSize) / 2;
@@ -79,16 +118,16 @@ public class GT_GUIContainer_BasicMachine extends GT_GUIContainerMetaTile_Machin
drawTexturedModalRect(x, y, 0, 0, xSize, ySize);
if (mContainer != null) {
if (mRenderAutoOutputSlots){
- if (((GT_Container_BasicMachine) mContainer).mFluidTransfer)
+ if (getContainer().mFluidTransfer)
drawTexturedModalRect(x + 7, y + 62, 176, 18, 18, 18);
- if (((GT_Container_BasicMachine) mContainer).mItemTransfer)
+ if (getContainer().mItemTransfer)
drawTexturedModalRect(x + 25, y + 62, 176, 36, 18, 18);
}
- if (((GT_Container_BasicMachine) mContainer).mStuttering)
+ if (getContainer().mStuttering)
drawTexturedModalRect(x + 79, y + 44, 176, 54, 18, 18);
if (mContainer.mMaxProgressTime > 0) {
- int tSize = (mProgressBarDirection < 2 ? 20 : 18), tProgress = Math.max(1, Math.min(tSize * mProgressBarAmount, (mContainer.mProgressTime > 0 ? 1 : 0) + (mContainer.mProgressTime * tSize * mProgressBarAmount) / mContainer.mMaxProgressTime)) % (tSize + 1);
+ int tSize = mProgressBarDirection < 2 ? 20 : 18, tProgress = Math.max(1, Math.min(tSize * mProgressBarAmount, (mContainer.mProgressTime > 0 ? 1 : 0) + mContainer.mProgressTime * tSize * mProgressBarAmount / mContainer.mMaxProgressTime)) % (tSize + 1);
switch (mProgressBarDirection) { // yes, my OCD was mad at me before I did the Tabs.
case 0:
@@ -123,4 +162,8 @@ public class GT_GUIContainer_BasicMachine extends GT_GUIContainerMetaTile_Machin
}
}
}
+
+ private GT_Container_BasicMachine getContainer() {
+ return (GT_Container_BasicMachine) mContainer;
+ }
}
diff --git a/src/main/java/gregtech/api/gui/GT_GUICover.java b/src/main/java/gregtech/api/gui/GT_GUICover.java
index 2e9d082ebf..5a299d7ff9 100644
--- a/src/main/java/gregtech/api/gui/GT_GUICover.java
+++ b/src/main/java/gregtech/api/gui/GT_GUICover.java
@@ -1,145 +1,16 @@
package gregtech.api.gui;
-import gregtech.api.enums.Dyes;
-import gregtech.api.gui.widgets.GT_GuiFakeItemButton;
-import gregtech.api.gui.widgets.GT_GuiIntegerTextBox;
-import gregtech.api.gui.widgets.GT_GuiTooltip;
-import gregtech.api.gui.widgets.GT_GuiTooltipManager;
-import gregtech.api.gui.widgets.GT_GuiTooltipManager.GT_IToolTipRenderer;
-import gregtech.api.interfaces.IGuiScreen;
import gregtech.api.interfaces.tileentity.ICoverable;
-import net.minecraft.client.gui.FontRenderer;
-import net.minecraft.client.gui.GuiButton;
-import net.minecraft.client.gui.GuiScreen;
-import net.minecraft.client.gui.GuiTextField;
-import net.minecraft.client.renderer.RenderHelper;
-import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.item.ItemStack;
-import net.minecraft.util.ResourceLocation;
-import org.lwjgl.input.Mouse;
-import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL12;
-import java.util.ArrayList;
-import java.util.List;
+public abstract class GT_GUICover extends GT_GUIScreen {
-public abstract class GT_GUICover extends GuiScreen implements GT_IToolTipRenderer, IGuiScreen {
-
- protected GT_GuiTooltipManager ttManager = new GT_GuiTooltipManager();
-
- protected int gui_width = 176;
- protected int gui_height = 107;
- protected int guiTop, guiLeft;
- protected boolean drawButtons = true;
- private GuiButton selectedButton;
- public String header;
- public GT_GuiFakeItemButton headerIcon;
public final ICoverable tile;
-
- protected List<IGuiElement> elements = new ArrayList<>();
- protected List<GT_GuiIntegerTextBox> textBoxes = new ArrayList<>();
-
public GT_GUICover(ICoverable tile, int width, int height, ItemStack cover) {
+ super(width, height, cover == null ? "" : cover.getDisplayName());
this.tile = tile;
- this.gui_width = width;
- this.gui_height = height;
- this.header = (cover != null) ? cover.getDisplayName() : "";
- this.headerIcon = new GT_GuiFakeItemButton(this, 5, 5, null).setItem(cover);
- }
-
- @Override
- public void initGui() {
- guiLeft = (this.width - this.gui_width) / 2;
- guiTop = (this.height - this.gui_height) / 2;
-
- for (IGuiElement element : elements) {
- if (element instanceof GuiButton)
- buttonList.add(element);
- if (element instanceof GT_GuiIntegerTextBox)
- textBoxes.add((GT_GuiIntegerTextBox) element);
- }
-
- onInitGui(guiLeft, guiTop, gui_width, gui_height);
-
- for (IGuiElement element : elements) {
- element.onInit();
- }
- }
-
- protected abstract void onInitGui(int guiLeft, int guiTop, int gui_width, int gui_height);
-
- public void onMouseWheel(int x, int y, int delta) {
- }
-
- @Override
- public void handleMouseInput() {
- int delta = Mouse.getEventDWheel();
- if (delta != 0) {
- int i = Mouse.getEventX() * this.width / this.mc.displayWidth;
- int j = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1;
- onMouseWheel(i, j, delta);
- }
- super.handleMouseInput();
- }
-
- @Override
- public void drawScreen(int mouseX, int mouseY, float parTicks) {
- drawDefaultBackground();
-
- drawBackground(mouseX, mouseY, parTicks);
-
- RenderHelper.disableStandardItemLighting();
- GL11.glDisable(GL11.GL_LIGHTING);
- GL11.glDisable(GL11.GL_DEPTH_TEST);
- GL11.glDisable(GL12.GL_RESCALE_NORMAL);
- if (drawButtons) {
- RenderHelper.enableGUIStandardItemLighting();
- for (IGuiElement e : elements)
- e.draw(mouseX, mouseY, parTicks);
- }
- GL11.glEnable(GL12.GL_RESCALE_NORMAL);
-
- GL11.glPushMatrix();
- GL11.glTranslatef(guiLeft, guiTop, 0.0F);
- GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-
- GL11.glDisable(GL11.GL_LIGHTING);
- drawForegroundLayer(mouseX, mouseY, parTicks);
- GL11.glEnable(GL11.GL_LIGHTING);
-
- GL11.glPopMatrix();
-
- GL11.glEnable(GL11.GL_LIGHTING);
- GL11.glEnable(GL11.GL_DEPTH_TEST);
- RenderHelper.enableStandardItemLighting();
- }
-
- public void drawForegroundLayer(int mouseX, int mouseY, float parTicks) {
- drawExtras(mouseX, mouseY, parTicks);
- ttManager.onTick(this, mouseX, mouseY);
- }
-
- public void drawBackground(int mouseX, int mouseY, float parTicks) {
- short[] color = Dyes.MACHINE_METAL.getRGBA();
- GL11.glColor3ub((byte) color[0], (byte) color[1], (byte) color[2]);
- this.mc.renderEngine.bindTexture(new ResourceLocation("gregtech:textures/gui/GuiCover.png"));
- drawTexturedModalRect(guiLeft, guiTop, 0,0, gui_width, gui_height);
- }
-
- public void drawExtras(int mouseX, int mouseY, float parTicks) {
- this.fontRendererObj.drawString(header, 25, 9, 0xFF222222);
- }
-
- @Override
- public boolean doesGuiPauseGame()
- {
- return false;
- }
-
- public void closeScreen() {
- this.mc.displayGuiScreen((GuiScreen) null);
- this.mc.setIngameFocus();
+ headerIcon.setItem(cover);
}
@Override
@@ -147,179 +18,6 @@ public abstract class GT_GUICover extends GuiScreen implements GT_IToolTipRender
super.updateScreen();
if (!tile.isUseableByPlayer(mc.thePlayer)) {
closeScreen();
- return;
- }
- for (GuiTextField f : textBoxes) {
- f.updateCursorCounter();
- }
- }
-
- @Override
- public void mouseClicked(int x, int y, int button) {
- for (GT_GuiIntegerTextBox tBox : textBoxes) {
- boolean hadFocus = tBox.isFocused();
- if (tBox.isEnabled() || hadFocus)
- tBox.mouseClicked(x,y,button);
-
- if (tBox.isFocused() && button == 1 && tBox.isEnabled()) //rightclick -> lcear it
- tBox.setText("0");
- else if (hadFocus && !tBox.isFocused())
- applyTextBox(tBox);
- }
- super.mouseClicked(x, y, button);
- }
-
- @Override
- public void keyTyped(char c, int key) {
- GT_GuiIntegerTextBox focusedTextBox = null;
- for (GT_GuiIntegerTextBox textBox : textBoxes) {
- if (textBox.isFocused())
- focusedTextBox = textBox;
- }
-
- if (key == 1) { //esc
- if(focusedTextBox != null) {
- resetTextBox(focusedTextBox);
- setFocusedTextBox(null);
- return;
- } else {
- closeScreen();
- }
- }
-
- if (c == '\t') { //tab
- for (int i = 0; i < textBoxes.size(); i++) {
- GT_GuiIntegerTextBox box = textBoxes.get(i);
- if (box.isFocused()) {
- applyTextBox(box);
- setFocusedTextBox(((i+1) < textBoxes.size()) ? textBoxes.get(i+1) : null);
- return;
- }
- }
- if (!textBoxes.isEmpty())
- setFocusedTextBox(textBoxes.get(0));
- return;
- }
-
- if (focusedTextBox != null && focusedTextBox.textboxKeyTyped(c, key)){
- return;
- }
-
- if (key == 28 && focusedTextBox != null) { // enter
- applyTextBox(focusedTextBox);
- setFocusedTextBox(null);
- return;
- }
-
- if (key == this.mc.gameSettings.keyBindInventory.getKeyCode()) {
- if (focusedTextBox != null) {
- applyTextBox(focusedTextBox);
- setFocusedTextBox(null);
- return;
- }
- closeScreen();
- return;
}
- super.keyTyped(c, key);
- }
-
- /**
- * Button
- */
-
- @Override
- public void actionPerformed(GuiButton button) {
- selectedButton = button;
- }
-
- @Override
- public void clearSelectedButton() {
- selectedButton = null;
- }
- @Override
- public GuiButton getSelectedButton(){return selectedButton;}
-
- @Override
- public void buttonClicked(GuiButton button) {
-
- }
-
- /**
- * TextBoxes
- */
- private void setFocusedTextBox(GT_GuiIntegerTextBox boxToFocus) {
- for (GT_GuiIntegerTextBox textBox : textBoxes) {
- textBox.setFocused(textBox.equals(boxToFocus) && textBox.isEnabled());
- }
- }
-
- /**
- * Given textbox's value might have changed.
- */
- public void applyTextBox(GT_GuiIntegerTextBox box) {
-
- }
-
- /**
- * Reset the given textbox to the last valid value, <b>NOT</b> 0.
- */
- public void resetTextBox(GT_GuiIntegerTextBox box) {
-
- }
-
- /**
- * GT_IToolTipRenderer
- */
- @Override
- public void drawHoveringText(List par1List, int par2, int par3, FontRenderer render) {
- super.drawHoveringText(par1List, par2, par3, render);
- }
- @Override
- public FontRenderer getFontRenderer() {
- return super.fontRendererObj;
- }
- @Override
- public void addToolTip(GT_GuiTooltip toolTip) {
- ttManager.addToolTip(toolTip);
- }
- @Override
- public boolean removeToolTip(GT_GuiTooltip toolTip) {
- return ttManager.removeToolTip(toolTip);
- }
-
- /**
- * Junk
- */
- @Override
- public int getGuiTop() {
- return guiTop;
- }
- @Override
- public int getGuiLeft() {
- return guiLeft;
- }
- @Override
- public int getXSize() {
- return gui_width;
- }
- @Override
- public int getYSize() {
- return gui_height;
- }
-
- @Override
- public RenderItem getItemRenderer() {
- return itemRender;
- }
-
- @Override
- public void addElement(IGuiElement element) {
- if (elements.contains(element))
- return;
- elements.add(element);
- }
- @Override
- public boolean removeElement(IGuiElement element) {
- return elements.remove(element);
}
}
diff --git a/src/main/java/gregtech/api/gui/GT_GUIDialogSelectItem.java b/src/main/java/gregtech/api/gui/GT_GUIDialogSelectItem.java
new file mode 100644
index 0000000000..2c3f77cf06
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_GUIDialogSelectItem.java
@@ -0,0 +1,217 @@
+package gregtech.api.gui;
+
+import gregtech.api.gui.widgets.GT_GuiFakeItemButton;
+import gregtech.api.gui.widgets.GT_GuiIcon;
+import gregtech.api.gui.widgets.GT_GuiIconButton;
+import gregtech.api.util.GT_Utility;
+import net.minecraft.client.gui.GuiButton;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+
+public class GT_GUIDialogSelectItem extends GT_GUIScreen {
+ public static final int UNSELECTED = -1;
+ private static final int cols = 9;
+ private static final int rows = 3;
+ private final GuiScreen parent;
+ private final Consumer<ItemStack> selectedCallback;
+ // passed in stack
+ private final List<ItemStack> stacks;
+ // all slots not including btnCurrent
+ private final List<GT_GuiFakeItemButton> slots = new ArrayList<>();
+ // the currently selected slot content
+ private final GT_GuiFakeItemButton btnCurrent = new GT_GuiFakeItemButton(this, 8, 25, GT_GuiIcon.SLOT_DARKGRAY).setMimicSlot(true);
+ private final boolean noDeselect;
+ private int selected;
+ private int scroll = 0;
+ private GT_GuiIconButton btnUp;
+ private GT_GuiIconButton btnDown;
+
+
+ public GT_GUIDialogSelectItem(String header, ItemStack headerItem, GuiScreen parent, Consumer<ItemStack> selectedCallback, List<ItemStack> stacks) {
+ this(header, headerItem, parent, selectedCallback, stacks, UNSELECTED);
+ }
+
+ public GT_GUIDialogSelectItem(String header, ItemStack headerItem, GuiScreen parent, Consumer<ItemStack> selectedCallback, List<ItemStack> stacks, int selected) {
+ this(header, headerItem, parent, selectedCallback, stacks, selected, false);
+ }
+
+ /**
+ * Open a dialog to select an item from given list. Given callback may be called zero or more times depending on user action.
+ * @param header Header text
+ * @param headerItem ItemStack to use as Dialog icon
+ * @param parent open which GUIScreen when this dialog is closed. use null if it has no parent.
+ * @param selectedCallback callback upon selected
+ * @param stacks list to choose from
+ * @param selected preselected item. Use {@link #UNSELECTED} for unselected. Invalid selected will be clamped to 0 or highest index
+ * @param noDeselect true if player cannot deselect, false otherwise. If this is set to true, selectedCallback is guaranteed to be called with a nonnull stack
+ */
+ public GT_GUIDialogSelectItem(String header, ItemStack headerItem, GuiScreen parent, Consumer<ItemStack> selectedCallback, List<ItemStack> stacks, int selected, boolean noDeselect) {
+ super(176, 107, header);
+ this.noDeselect = noDeselect;
+ if (headerItem != null)
+ this.headerIcon.setItem(headerItem);
+ this.parent = parent;
+ this.selectedCallback = selectedCallback;
+ this.stacks = stacks;
+
+ if (stacks.size() > rows * cols) {
+ btnUp = new GT_GuiIconButton(this, 0, 134, 25, GT_GuiIcon.GREEN_ARROW_UP);
+ btnDown = new GT_GuiIconButton(this, 1, 152, 25, GT_GuiIcon.GREEN_ARROW_DOWN);
+ }
+
+ for (int i = 0; i < rows; i++) {
+ for (int j = 0; j < cols; j++) {
+ slots.add(new GT_GuiFakeItemButton(this, 8 + 18 * j, 44 + 18 * i, GT_GuiIcon.SLOT_GRAY).setMimicSlot(true));
+ }
+ }
+
+ setSelected(noDeselect ? Math.max(0, selected) : selected);
+ ensureSelectedDisplayed();
+ }
+
+ @Override
+ protected void onInitGui(int guiLeft, int guiTop, int gui_width, int gui_height) {
+ btnCurrent.setX(8 + 2 + fontRendererObj.getStringWidth(StatCollector.translateToLocal("GT5U.gui.select.current")));
+ }
+
+ @Override
+ public void closeScreen() {
+ selectedCallback.accept(getCandidate(getSelected()));
+ mc.displayGuiScreen(parent);
+ if (parent == null)
+ mc.setIngameFocus();
+ }
+
+ @Override
+ public void buttonClicked(GuiButton button) {
+ switch (button.id) {
+ case 0:
+ setScroll(scroll - 1);
+ return;
+ case 1:
+ setScroll(scroll + 1);
+ return;
+ }
+ super.buttonClicked(button);
+ }
+
+ @Override
+ public void drawExtras(int mouseX, int mouseY, float parTicks) {
+ int y = 25 + (18 - getFontRenderer().FONT_HEIGHT) / 2;
+ getFontRenderer().drawString(StatCollector.translateToLocal("GT5U.gui.select.current"), 8, y, 0xff555555);
+ super.drawExtras(mouseX, mouseY, parTicks);
+ }
+
+ @Override
+ public void mouseClicked(int x, int y, int button) {
+ int mx = x - guiLeft, my = y - guiTop;
+ if (button == 0) {
+ if (btnCurrent.getBounds().contains(mx, my)) {
+ ensureSelectedDisplayed();
+ return;
+ }
+
+ for (int i = 0, slotsSize = slots.size(); i < slotsSize; i++) {
+ GT_GuiFakeItemButton slot = slots.get(i);
+ if (slot.getBounds().contains(mx, my)) {
+ setSelected(slotIndexToListIndex(i));
+ return;
+ }
+ }
+ } else if (button == 1 && getSelected() >= 0) {
+ if (btnCurrent.getBounds().contains(mx, my)) {
+ setSelected(UNSELECTED);
+ return;
+ }
+ GT_GuiFakeItemButton slot = getSlot(listIndexToSlotIndex(getSelected()));
+ if (slot != null && slot.getBounds().contains(mx, my)) {
+ setSelected(UNSELECTED);
+ }
+ }
+ super.mouseClicked(x, y, button);
+ }
+
+ @Override
+ public void onMouseWheel(int x, int y, int delta) {
+ if (delta < 0)
+ setScroll(scroll + 1);
+ else if (delta > 0)
+ setScroll(scroll - 1);
+ }
+
+ private void fillSlots() {
+ for (int i = 0, j = scroll * cols; i < slots.size(); i++, j++) {
+ slots.get(i)
+ .setItem(getCandidate(j))
+ .setBgIcon(j == getSelected() ? GT_GuiIcon.SLOT_DARKGRAY : GT_GuiIcon.SLOT_GRAY);
+ }
+ }
+
+ private void ensureSelectedDisplayed() {
+ if (getSelected() < scroll * cols) {
+ setScroll(getSelected() / cols);
+ } else if (getSelected() > (scroll + rows) * cols) {
+ setScroll((getSelected() - (rows - 1) * cols) / cols);
+ } else {
+ // called nonetheless to update button enabled states
+ setScroll(scroll);
+ }
+ }
+
+ private int slotIndexToListIndex(int index) {
+ int mapped = scroll * cols + index;
+ return mapped >= stacks.size() ? UNSELECTED : mapped;
+ }
+
+ private int listIndexToSlotIndex(int index) {
+ return index - scroll * cols;
+ }
+
+ public int getSelected() {
+ return selected;
+ }
+
+ public void setSelected(int selected) {
+ if (selected == this.selected) return;
+ int newSelected = GT_Utility.clamp(selected, UNSELECTED, stacks.size() - 1);
+
+ if (noDeselect && newSelected == UNSELECTED)
+ return;
+
+ GT_GuiFakeItemButton selectedSlot = getSlot(this.selected);
+ if (selectedSlot != null)
+ selectedSlot.setBgIcon(GT_GuiIcon.SLOT_GRAY);
+
+ this.selected = newSelected;
+
+ btnCurrent.setItem(getCandidate(this.selected));
+
+ selectedSlot = getSlot(this.selected);
+ if (selectedSlot != null)
+ selectedSlot.setBgIcon(GT_GuiIcon.SLOT_DARKGRAY);
+ }
+
+ private void setScroll(int scroll) {
+ if (stacks.size() > rows * cols) {
+ int lo = 0;
+ int hi = (stacks.size() - rows * cols) / cols + 1;
+ this.scroll = GT_Utility.clamp(scroll, lo, hi);
+ btnUp.enabled = this.scroll != lo;
+ btnDown.enabled = this.scroll != hi;
+ }
+ fillSlots();
+ }
+
+ private ItemStack getCandidate(int listIndex) {
+ return listIndex < 0 || listIndex >= stacks.size() ? null : stacks.get(listIndex);
+ }
+
+ private GT_GuiFakeItemButton getSlot(int slotIndex) {
+ return slotIndex < 0 || slotIndex >= slots.size() ? null : slots.get(slotIndex);
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/GT_GUIScreen.java b/src/main/java/gregtech/api/gui/GT_GUIScreen.java
new file mode 100644
index 0000000000..a7ab6e269b
--- /dev/null
+++ b/src/main/java/gregtech/api/gui/GT_GUIScreen.java
@@ -0,0 +1,320 @@
+package gregtech.api.gui;
+
+import gregtech.api.enums.Dyes;
+import gregtech.api.gui.widgets.GT_GuiFakeItemButton;
+import gregtech.api.gui.widgets.GT_GuiIntegerTextBox;
+import gregtech.api.gui.widgets.GT_GuiTooltip;
+import gregtech.api.gui.widgets.GT_GuiTooltipManager;
+import gregtech.api.gui.widgets.GT_GuiTooltipManager.GT_IToolTipRenderer;
+import gregtech.api.interfaces.IGuiScreen;
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.gui.GuiButton;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.client.gui.GuiTextField;
+import net.minecraft.client.renderer.RenderHelper;
+import net.minecraft.client.renderer.entity.RenderItem;
+import net.minecraft.util.ResourceLocation;
+import org.lwjgl.input.Mouse;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public abstract class GT_GUIScreen extends GuiScreen implements GT_IToolTipRenderer, IGuiScreen {
+
+ protected GT_GuiTooltipManager ttManager = new GT_GuiTooltipManager();
+
+ protected int gui_width = 176;
+ protected int gui_height = 107;
+ protected int guiTop, guiLeft;
+ protected boolean drawButtons = true;
+ private GuiButton selectedButton;
+ public String header;
+ public GT_GuiFakeItemButton headerIcon;
+
+
+ protected List<IGuiElement> elements = new ArrayList<>();
+ protected List<GT_GuiIntegerTextBox> textBoxes = new ArrayList<>();
+
+ public GT_GUIScreen(int width, int height, String header) {
+ this.gui_width = width;
+ this.gui_height = height;
+ this.header = header;
+ this.headerIcon = new GT_GuiFakeItemButton(this, 5, 5, null);
+ }
+
+ @Override
+ public void initGui() {
+ guiLeft = (this.width - this.gui_width) / 2;
+ guiTop = (this.height - this.gui_height) / 2;
+
+ for (IGuiElement element : elements) {
+ if (element instanceof GuiButton)
+ buttonList.add(element);
+ if (element instanceof GT_GuiIntegerTextBox)
+ textBoxes.add((GT_GuiIntegerTextBox) element);
+ }
+
+ onInitGui(guiLeft, guiTop, gui_width, gui_height);
+
+ for (IGuiElement element : elements) {
+ element.onInit();
+ }
+ super.initGui();
+ }
+
+ protected abstract void onInitGui(int guiLeft, int guiTop, int gui_width, int gui_height);
+
+ public void onMouseWheel(int x, int y, int delta) {
+ }
+
+ @Override
+ public void handleMouseInput() {
+ int delta = Mouse.getEventDWheel();
+ if (delta != 0) {
+ int i = Mouse.getEventX() * this.width / this.mc.displayWidth;
+ int j = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1;
+ onMouseWheel(i, j, delta);
+ }
+ super.handleMouseInput();
+ }
+
+ @Override
+ public void drawScreen(int mouseX, int mouseY, float parTicks) {
+ drawDefaultBackground();
+
+ drawBackground(mouseX, mouseY, parTicks);
+
+ RenderHelper.disableStandardItemLighting();
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ if (drawButtons) {
+ RenderHelper.enableGUIStandardItemLighting();
+ for (IGuiElement e : elements)
+ e.draw(mouseX, mouseY, parTicks);
+ }
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+
+ GL11.glPushMatrix();
+ GL11.glTranslatef(guiLeft, guiTop, 0.0F);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+
+ GL11.glDisable(GL11.GL_LIGHTING);
+ drawForegroundLayer(mouseX, mouseY, parTicks);
+ GL11.glEnable(GL11.GL_LIGHTING);
+
+ GL11.glPopMatrix();
+
+ GL11.glEnable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+ RenderHelper.enableStandardItemLighting();
+ }
+
+ public void drawForegroundLayer(int mouseX, int mouseY, float parTicks) {
+ drawExtras(mouseX, mouseY, parTicks);
+ ttManager.onTick(this, mouseX, mouseY);
+ }
+
+ public void drawBackground(int mouseX, int mouseY, float parTicks) {
+ short[] color = Dyes.MACHINE_METAL.getRGBA();
+ GL11.glColor3ub((byte) color[0], (byte) color[1], (byte) color[2]);
+ this.mc.renderEngine.bindTexture(new ResourceLocation("gregtech:textures/gui/GuiCover.png"));
+ drawTexturedModalRect(guiLeft, guiTop, 0,0, gui_width, gui_height);
+ }
+
+ public void drawExtras(int mouseX, int mouseY, float parTicks) {
+ this.fontRendererObj.drawString(header, 25, 9, 0xFF222222);
+ }
+
+ @Override
+ public boolean doesGuiPauseGame()
+ {
+ return false;
+ }
+
+ public void closeScreen() {
+ this.mc.displayGuiScreen(null);
+ this.mc.setIngameFocus();
+ }
+
+ @Override
+ public void updateScreen() {
+ super.updateScreen();
+ for (GuiTextField f : textBoxes) {
+ f.updateCursorCounter();
+ }
+ }
+
+ @Override
+ public void mouseClicked(int x, int y, int button) {
+ for (GT_GuiIntegerTextBox tBox : textBoxes) {
+ boolean hadFocus = tBox.isFocused();
+ if (tBox.isEnabled() || hadFocus)
+ tBox.mouseClicked(x,y,button);
+
+ if (tBox.isFocused() && button == 1 && tBox.isEnabled()) //rightclick -> lcear it
+ tBox.setText("0");
+ else if (hadFocus && !tBox.isFocused())
+ applyTextBox(tBox);
+ }
+ super.mouseClicked(x, y, button);
+ }
+
+ @Override
+ public void keyTyped(char c, int key) {
+ GT_GuiIntegerTextBox focusedTextBox = null;
+ for (GT_GuiIntegerTextBox textBox : textBoxes) {
+ if (textBox.isFocused())
+ focusedTextBox = textBox;
+ }
+
+ if (key == 1) { //esc
+ if(focusedTextBox != null) {
+ resetTextBox(focusedTextBox);
+ setFocusedTextBox(null);
+ return;
+ } else {
+ closeScreen();
+ // don't fall through to parent
+ return;
+ }
+ }
+
+ if (c == '\t') { //tab
+ for (int i = 0; i < textBoxes.size(); i++) {
+ GT_GuiIntegerTextBox box = textBoxes.get(i);
+ if (box.isFocused()) {
+ applyTextBox(box);
+ setFocusedTextBox(((i+1) < textBoxes.size()) ? textBoxes.get(i+1) : null);
+ return;
+ }
+ }
+ if (!textBoxes.isEmpty())
+ setFocusedTextBox(textBoxes.get(0));
+ return;
+ }
+
+ if (focusedTextBox != null && focusedTextBox.textboxKeyTyped(c, key)){
+ return;
+ }
+
+ if (key == 28 && focusedTextBox != null) { // enter
+ applyTextBox(focusedTextBox);
+ setFocusedTextBox(null);
+ return;
+ }
+
+ if (key == this.mc.gameSettings.keyBindInventory.getKeyCode()) {
+ if (focusedTextBox != null) {
+ applyTextBox(focusedTextBox);
+ setFocusedTextBox(null);
+ return;
+ }
+ closeScreen();
+ return;
+ }
+ super.keyTyped(c, key);
+ }
+
+ /**
+ * Button
+ */
+
+ @Override
+ public void actionPerformed(GuiButton button) {
+ selectedButton = button;
+ }
+
+ @Override
+ public void clearSelectedButton() {
+ selectedButton = null;
+ }
+ @Override
+ public GuiButton getSelectedButton(){return selectedButton;}
+
+ @Override
+ public void buttonClicked(GuiButton button) {
+
+ }
+
+ /**
+ * TextBoxes
+ */
+ private void setFocusedTextBox(GT_GuiIntegerTextBox boxToFocus) {
+ for (GT_GuiIntegerTextBox textBox : textBoxes) {
+ textBox.setFocused(textBox.equals(boxToFocus) && textBox.isEnabled());
+ }
+ }
+
+ /**
+ * Given textbox's value might have changed.
+ */
+ public void applyTextBox(GT_GuiIntegerTextBox box) {
+
+ }
+
+ /**
+ * Reset the given textbox to the last valid value, <b>NOT</b> 0.
+ */
+ public void resetTextBox(GT_GuiIntegerTextBox box) {
+
+ }
+
+ /**
+ * GT_IToolTipRenderer
+ */
+ @Override
+ public void drawHoveringText(List par1List, int par2, int par3, FontRenderer render) {
+ super.drawHoveringText(par1List, par2, par3, render);
+ }
+ @Override
+ public FontRenderer getFontRenderer() {
+ return super.fontRendererObj;
+ }
+ @Override
+ public void addToolTip(GT_GuiTooltip toolTip) {
+ ttManager.addToolTip(toolTip);
+ }
+ @Override
+ public boolean removeToolTip(GT_GuiTooltip toolTip) {
+ return ttManager.removeToolTip(toolTip);
+ }
+
+ /**
+ * Junk
+ */
+ @Override
+ public int getGuiTop() {
+ return guiTop;
+ }
+ @Override
+ public int getGuiLeft() {
+ return guiLeft;
+ }
+ @Override
+ public int getXSize() {
+ return gui_width;
+ }
+ @Override
+ public int getYSize() {
+ return gui_height;
+ }
+
+ @Override
+ public RenderItem getItemRenderer() {
+ return itemRender;
+ }
+
+ @Override
+ public void addElement(IGuiElement element) {
+ if (elements.contains(element))
+ return;
+ elements.add(element);
+ }
+ @Override
+ public boolean removeElement(IGuiElement element) {
+ return elements.remove(element);
+ }
+}
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_GuiFakeItemButton.java b/src/main/java/gregtech/api/gui/widgets/GT_GuiFakeItemButton.java
index db7029d60f..2c1d8aa886 100644
--- a/src/main/java/gregtech/api/gui/widgets/GT_GuiFakeItemButton.java
+++ b/src/main/java/gregtech/api/gui/widgets/GT_GuiFakeItemButton.java
@@ -1,44 +1,100 @@
package gregtech.api.gui.widgets;
+import codechicken.lib.gui.GuiDraw;
import gregtech.api.interfaces.IGuiScreen;
+import gregtech.api.util.GT_UtilityClient;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
import org.lwjgl.opengl.GL11;
import java.awt.*;
+import java.util.List;
public class GT_GuiFakeItemButton implements IGuiScreen.IGuiElement {
- private final GT_GuiIcon bgIcon;
+ private GT_GuiIcon bgIcon;
private ItemStack item;
private IGuiScreen gui;
- private int x0, y0, xPosition, yPosition;
- private int width, height;
+ private int xPosition, yPosition;
+ private List<String> itemTooltips;
+ private final GT_GuiTooltip tooltip = new GT_GuiTooltip(null) {
+ @Override
+ public List<String> getToolTipText() {
+ return itemTooltips;
+ }
+
+ @Override
+ public boolean isDelayed() {
+ return false;
+ }
+
+ @Override
+ public Rectangle getBounds() {
+ return GT_GuiFakeItemButton.this.getBounds();
+ }
+ };
+ private final Rectangle rectangle;
+ private boolean mimicSlot;
public GT_GuiFakeItemButton(IGuiScreen gui, int x, int y, GT_GuiIcon bgIcon) {
this.gui = gui;
- this.x0 = x;
- this.y0 = y;
this.bgIcon = bgIcon;
item = null;
- width = 18;
- height = 18;
+ rectangle = new Rectangle(x, y, 18, 18);
gui.addElement(this);
}
public GT_GuiFakeItemButton setItem(ItemStack i) {
item = i;
+ if (getMimicSlot())
+ updateTooltip();
return this;
}
+ private void updateTooltip() {
+ itemTooltips = item == null ? null : GT_UtilityClient.getTooltip(item, true);
+ }
+
public ItemStack getItem(){
return item;
}
+ public GT_GuiFakeItemButton setMimicSlot(boolean mimicSlot) {
+ if (mimicSlot != this.mimicSlot) {
+ if (mimicSlot) {
+ updateTooltip();
+ gui.addToolTip(tooltip);
+ } else {
+ gui.removeToolTip(tooltip);
+ }
+ this.mimicSlot = mimicSlot;
+ }
+ return this;
+ }
+
+ public boolean getMimicSlot() {
+ return mimicSlot;
+ }
+
+ public GT_GuiIcon getBgIcon() {
+ return bgIcon;
+ }
+
+ public GT_GuiFakeItemButton setBgIcon(GT_GuiIcon bgIcon) {
+ this.bgIcon = bgIcon;
+ return this;
+ }
+
@Override
public void onInit() {
- xPosition = x0 + gui.getGuiLeft();
- yPosition = y0 + gui.getGuiTop();
+ xPosition = rectangle.x + gui.getGuiLeft();
+ yPosition = rectangle.y + gui.getGuiTop();
+ }
+
+ @Override
+ public void onRemoved() {
+ if (mimicSlot)
+ gui.removeToolTip(tooltip);
}
@Override
@@ -55,10 +111,36 @@ public class GT_GuiFakeItemButton implements IGuiScreen.IGuiElement {
if (item != null)
gui.getItemRenderer().renderItemAndEffectIntoGUI(gui.getFontRenderer(), Minecraft.getMinecraft().getTextureManager(), item, xPosition, yPosition);
+ if (getMimicSlot())
+ if (getBounds().contains(mouseX - gui.getGuiLeft(), mouseY - gui.getGuiTop())) {
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+ GL11.glColorMask(true, true, true, false);
+ GuiDraw.drawGradientRect(xPosition, yPosition, 16, 16, 0x80ffffff, 0x80ffffff);
+ GL11.glColorMask(true, true, true, true);
+ // no glEnable, state will be recovered by glPopAttrib
+ }
+
GL11.glPopAttrib();
}
public Rectangle getBounds() {
- return new Rectangle(x0, y0, width, height);
+ return rectangle;
+ }
+
+ public void setX(int x) {
+ rectangle.x = x;
+ }
+
+ public void setY(int y) {
+ rectangle.y = y;
+ }
+
+ public void setWidth(int width) {
+ rectangle.width = width;
+ }
+
+ public void setHeight(int height) {
+ rectangle.height = height;
}
}
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_GuiIcon.java b/src/main/java/gregtech/api/gui/widgets/GT_GuiIcon.java
index 41e851054d..0b9231b40f 100644
--- a/src/main/java/gregtech/api/gui/widgets/GT_GuiIcon.java
+++ b/src/main/java/gregtech/api/gui/widgets/GT_GuiIcon.java
@@ -24,6 +24,8 @@ public enum GT_GuiIcon {
IMPORT (0, 32, 32*2),
ALLOW_INPUT (0, 32*2, 32*2),
BLOCK_INPUT (0, 32*3, 32*2),
+ GREEN_ARROW_UP (0, 32*4, 32*2),
+ GREEN_ARROW_DOWN (0, 32*5, 32*2),
SLOT_DARKGRAY (1, 176,0,18,18),
SLOT_GRAY (1, 176,18,18,18);
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_GuiTooltip.java b/src/main/java/gregtech/api/gui/widgets/GT_GuiTooltip.java
index d24437f018..6b9e70a71b 100644
--- a/src/main/java/gregtech/api/gui/widgets/GT_GuiTooltip.java
+++ b/src/main/java/gregtech/api/gui/widgets/GT_GuiTooltip.java
@@ -34,4 +34,12 @@ public class GT_GuiTooltip {
public List<String> getToolTipText() {
return text;
}
+
+ public Rectangle getBounds() {
+ return bounds;
+ }
+
+ public boolean isDelayed() {
+ return true;
+ }
}
diff --git a/src/main/java/gregtech/api/gui/widgets/GT_GuiTooltipManager.java b/src/main/java/gregtech/api/gui/widgets/GT_GuiTooltipManager.java
index d0e6964abc..c098e4e2a7 100644
--- a/src/main/java/gregtech/api/gui/widgets/GT_GuiTooltipManager.java
+++ b/src/main/java/gregtech/api/gui/widgets/GT_GuiTooltipManager.java
@@ -21,7 +21,7 @@ public class GT_GuiTooltipManager {
private final List<GT_GuiTooltip> tips = new ArrayList<>();
public void addToolTip(GT_GuiTooltip tip) {
- if (!tips.contains(tip)) tips.add(tip);
+ if (tip != null && !tips.contains(tip)) tips.add(tip);
}
public boolean removeToolTip(GT_GuiTooltip tip) {
@@ -37,15 +37,14 @@ public class GT_GuiTooltipManager {
lastMouseX = mouseX;
lastMouseY = mouseY;
- if (mouseStopped > DELAY)
- mouseX -= render.getGuiLeft();
- mouseY -= render.getGuiTop();
- for (GT_GuiTooltip tip : tips) {
- if(tip.enabled && tip.bounds.contains(mouseX, mouseY)){
- tip.updateText();
- drawTooltip(tip, mouseX, mouseY, render);
- break;
- }
+ mouseX -= render.getGuiLeft();
+ mouseY -= render.getGuiTop();
+ for (GT_GuiTooltip tip : tips) {
+ if (tip.enabled && (!tip.isDelayed() || mouseStopped > DELAY) && tip.getBounds().contains(mouseX, mouseY)) {
+ tip.updateText();
+ drawTooltip(tip, mouseX, mouseY, render);
+ break;
+ }
}
}
diff --git a/src/main/java/gregtech/api/interfaces/IGuiScreen.java b/src/main/java/gregtech/api/interfaces/IGuiScreen.java
index d0089afbb8..5f1ae9cd2b 100644
--- a/src/main/java/gregtech/api/interfaces/IGuiScreen.java
+++ b/src/main/java/gregtech/api/interfaces/IGuiScreen.java
@@ -10,6 +10,7 @@ public interface IGuiScreen {
interface IGuiElement {
void onInit();
+ default void onRemoved() {}
void draw(int mouseX, int mouseY, float parTicks);
}
diff --git a/src/main/java/gregtech/api/interfaces/INetworkUpdatableItem.java b/src/main/java/gregtech/api/interfaces/INetworkUpdatableItem.java
new file mode 100644
index 0000000000..2e102e937c
--- /dev/null
+++ b/src/main/java/gregtech/api/interfaces/INetworkUpdatableItem.java
@@ -0,0 +1,23 @@
+package gregtech.api.interfaces;
+
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+
+/**
+ * Together with {@link gregtech.api.net.GT_Packet_UpdateItem} you can request server side to update item in hand with
+ * a NBT tag.
+ *
+ * Usual NBT tag size limit applies.
+ */
+public interface INetworkUpdatableItem {
+ /**
+ * Receive update from client. Runs on server thread.
+ * @param stack Stack being updated
+ * @param player player holding the stack
+ * @param tag received data
+ * @return true if this stack should be kept inside the player inventory.
+ * false if this stack should vanish (i.e. slot content set to null)
+ */
+ boolean receive(ItemStack stack, EntityPlayerMP player, NBTTagCompound tag);
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_New.java b/src/main/java/gregtech/api/net/GT_Packet_New.java
index 59f6dc7251..10beae0e4d 100644
--- a/src/main/java/gregtech/api/net/GT_Packet_New.java
+++ b/src/main/java/gregtech/api/net/GT_Packet_New.java
@@ -1,6 +1,7 @@
package gregtech.api.net;
import com.google.common.io.ByteArrayDataInput;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
diff --git a/src/main/java/gregtech/api/net/GT_Packet_SetConfigurationCircuit.java b/src/main/java/gregtech/api/net/GT_Packet_SetConfigurationCircuit.java
new file mode 100644
index 0000000000..aeb183a02c
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_SetConfigurationCircuit.java
@@ -0,0 +1,102 @@
+package gregtech.api.net;
+
+import com.google.common.io.ByteArrayDataInput;
+import cpw.mods.fml.common.network.ByteBufUtils;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.ISerializableObject;
+import io.netty.buffer.ByteBuf;
+import net.minecraft.item.ItemStack;
+import net.minecraft.network.INetHandler;
+import net.minecraft.network.NetHandlerPlayServer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.DimensionManager;
+
+/**
+ * Client -> Server: Update machine configuration data
+ */
+
+public class GT_Packet_SetConfigurationCircuit extends GT_Packet_New {
+ protected int mX;
+ protected short mY;
+ protected int mZ;
+ protected int dimId;
+
+ protected ItemStack circuit;
+
+ public GT_Packet_SetConfigurationCircuit() {
+ super(true);
+ }
+
+ public GT_Packet_SetConfigurationCircuit(IGregTechTileEntity tile, ItemStack circuit) {
+ this(tile.getXCoord(), tile.getYCoord(), tile.getZCoord(), circuit);
+ }
+
+ public GT_Packet_SetConfigurationCircuit(int x, short y, int z, ItemStack circuit) {
+ super(false);
+
+ this.mX = x;
+ this.mY = y;
+ this.mZ = z;
+
+ this.circuit = circuit;
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 12;
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ aOut.writeInt(mX);
+ aOut.writeShort(mY);
+ aOut.writeInt(mZ);
+
+ // no null check needed. ByteBufUtils will handle it
+ ByteBufUtils.writeItemStack(aOut, this.circuit);
+ }
+
+ @Override
+ public void setINetHandler(INetHandler aHandler) {
+ if (aHandler instanceof NetHandlerPlayServer) {
+ dimId = ((NetHandlerPlayServer) aHandler).playerEntity.dimension;
+ } else {
+ // packet sent to wrong side, so we need to ignore this one
+ // but there is no way to disrupt packet pipeline
+ // so we will instead go find world -2, which (hopefully) doesn't exist
+ // then we will fail silently in process()
+ dimId = -2;
+ }
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ return new GT_Packet_SetConfigurationCircuit(
+ aData.readInt(),
+ aData.readShort(),
+ aData.readInt(),
+
+ ISerializableObject.readItemStackFromGreggyByteBuf(aData));
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ World world = DimensionManager.getWorld(dimId);
+ if (world == null) return;
+ TileEntity tile = world.getTileEntity(mX, mY, mZ);
+ if (!(tile instanceof IGregTechTileEntity) || ((IGregTechTileEntity) tile).isDead()) return;
+ IMetaTileEntity mte = ((IGregTechTileEntity) tile).getMetaTileEntity();
+ if (!(mte instanceof GT_MetaTileEntity_BasicMachine)) return;
+ GT_MetaTileEntity_BasicMachine machine = (GT_MetaTileEntity_BasicMachine) mte;
+ if (!machine.allowSelectCircuit()) return;
+ machine.getConfigurationCircuits().stream()
+ .filter(stack -> GT_Utility.areStacksEqual(stack, circuit))
+ .findFirst()
+ .ifPresent(stack -> mte.setInventorySlotContents(machine.getCircuitSlot(), stack));
+ }
+}
diff --git a/src/main/java/gregtech/api/net/GT_Packet_UpdateItem.java b/src/main/java/gregtech/api/net/GT_Packet_UpdateItem.java
new file mode 100644
index 0000000000..537f62ccec
--- /dev/null
+++ b/src/main/java/gregtech/api/net/GT_Packet_UpdateItem.java
@@ -0,0 +1,61 @@
+package gregtech.api.net;
+
+import com.google.common.io.ByteArrayDataInput;
+import cpw.mods.fml.common.network.ByteBufUtils;
+import gregtech.api.interfaces.INetworkUpdatableItem;
+import gregtech.api.util.ISerializableObject;
+import io.netty.buffer.ByteBuf;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.INetHandler;
+import net.minecraft.network.NetHandlerPlayServer;
+import net.minecraft.world.IBlockAccess;
+
+/**
+ * Client -> Server: send arbitrary data to server and update the currently held item.
+ */
+public class GT_Packet_UpdateItem extends GT_Packet_New {
+ private NBTTagCompound tag;
+ private EntityPlayerMP mPlayer;
+
+ public GT_Packet_UpdateItem() {
+ super(true);
+ }
+
+ public GT_Packet_UpdateItem(NBTTagCompound tag) {
+ super(false);
+ this.tag = tag;
+ }
+
+ @Override
+ public byte getPacketID() {
+ return 13;
+ }
+
+ @Override
+ public void setINetHandler(INetHandler aHandler) {
+ if (aHandler instanceof NetHandlerPlayServer) {
+ mPlayer = ((NetHandlerPlayServer) aHandler).playerEntity;
+ }
+ }
+
+ @Override
+ public void encode(ByteBuf aOut) {
+ ByteBufUtils.writeTag(aOut, tag);
+ }
+
+ @Override
+ public GT_Packet_New decode(ByteArrayDataInput aData) {
+ return new GT_Packet_UpdateItem(ISerializableObject.readCompoundTagFromGreggyByteBuf(aData));
+ }
+
+ @Override
+ public void process(IBlockAccess aWorld) {
+ if (mPlayer == null) return;
+ ItemStack stack = mPlayer.inventory.getCurrentItem();
+ if (stack != null && stack.getItem() instanceof INetworkUpdatableItem) {
+ ((INetworkUpdatableItem) stack.getItem()).receive(stack, mPlayer, tag);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/api/util/GT_Utility.java b/src/main/java/gregtech/api/util/GT_Utility.java
index a07868ec68..3b0ec94a92 100644
--- a/src/main/java/gregtech/api/util/GT_Utility.java
+++ b/src/main/java/gregtech/api/util/GT_Utility.java
@@ -3,6 +3,7 @@ package gregtech.api.util;
import cofh.api.transport.IItemDuct;
import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterators;
import com.google.common.collect.Maps;
import com.gtnewhorizon.structurelib.alignment.IAlignment;
import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider;
@@ -104,7 +105,16 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.NumberFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Optional;
@@ -2425,7 +2435,18 @@ public class GT_Utility {
return false;
}
- public static class ItemNBT {
+ public static int findMatchingStackInList(List<ItemStack> aStacks, ItemStack aStack) {
+ if (isStackInvalid(aStack))
+ return -1;
+ for (int i = 0, aStacksSize = aStacks.size(); i < aStacksSize; i++) {
+ ItemStack tStack = aStacks.get(i);
+ if (areStacksEqual(aStack, tStack))
+ return i;
+ }
+ return -1;
+ }
+
+ public static class ItemNBT {
public static void setNBT(ItemStack aStack, NBTTagCompound aNBT) {
if (aNBT == null) {
aStack.setTagCompound(null);
@@ -2989,4 +3010,8 @@ public class GT_Utility {
public static long getNonnullElementCount(Object[] tArray) {
return Arrays.stream(tArray).filter(Objects::nonNull).count();
}
+
+ public static int clamp(int val, int lo, int hi) {
+ return val > hi ? hi : val < lo ? lo : val;
+ }
}
diff --git a/src/main/java/gregtech/api/util/GT_UtilityClient.java b/src/main/java/gregtech/api/util/GT_UtilityClient.java
new file mode 100644
index 0000000000..abad0e9e90
--- /dev/null
+++ b/src/main/java/gregtech/api/util/GT_UtilityClient.java
@@ -0,0 +1,32 @@
+package gregtech.api.util;
+
+import com.google.common.collect.Lists;
+import net.minecraft.client.Minecraft;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import java.util.List;
+
+public class GT_UtilityClient {
+
+ @SuppressWarnings("unchecked")
+ public static List<String> getTooltip(ItemStack aStack, boolean aGuiStyle) {
+ try {
+ List<String> tooltip = aStack.getTooltip(Minecraft.getMinecraft().thePlayer, Minecraft.getMinecraft().gameSettings.advancedItemTooltips);
+ if (aGuiStyle) {
+ tooltip.set(0, (aStack.getRarity() == null ? EnumRarity.common : aStack.getRarity()).rarityColor +tooltip.get(0));
+ for (int i = 1; i < tooltip.size(); i++) {
+ tooltip.set(i, EnumChatFormatting.GRAY + tooltip.get(i));
+ }
+ }
+ return tooltip;
+ } catch (RuntimeException e) {
+ // Collections.singletonList() can not be added to. we don't want that
+ if (aGuiStyle)
+ return Lists.newArrayList((aStack.getRarity() == null ? EnumRarity.common : aStack.getRarity()).rarityColor + aStack.getDisplayName());
+ return Lists.newArrayList(aStack.getDisplayName());
+ }
+ }
+
+}
diff --git a/src/main/java/gregtech/common/GT_Network.java b/src/main/java/gregtech/common/GT_Network.java
index 97e511aba4..c17ffcecbb 100644
--- a/src/main/java/gregtech/common/GT_Network.java
+++ b/src/main/java/gregtech/common/GT_Network.java
@@ -36,7 +36,8 @@ public class GT_Network extends MessageToMessageCodec<FMLProxyPacket, GT_Packet>
public GT_Network() {
this.mChannel = NetworkRegistry.INSTANCE.newChannel("GregTech", this, new HandlerShared());
- this.mSubChannels = new GT_Packet[]{new GT_Packet_TileEntity(), new GT_Packet_Sound(), new GT_Packet_Block_Event(), new GT_Packet_Ores(), new GT_Packet_Pollution(), new MessageSetFlaskCapacity(), new GT_Packet_TileEntityCover(), new GT_Packet_TileEntityCoverGUI(), new MessageUpdateFluidDisplayItem(), new GT_Packet_ClientPreference(), new GT_Packet_WirelessRedstoneCover(), new GT_Packet_TileEntityCoverNew()};
+ // last known packet id is 13
+ this.mSubChannels = new GT_Packet[]{new GT_Packet_TileEntity(), new GT_Packet_Sound(), new GT_Packet_Block_Event(), new GT_Packet_Ores(), new GT_Packet_Pollution(), new MessageSetFlaskCapacity(), new GT_Packet_TileEntityCover(), new GT_Packet_TileEntityCoverGUI(), new MessageUpdateFluidDisplayItem(), new GT_Packet_ClientPreference(), new GT_Packet_WirelessRedstoneCover(), new GT_Packet_TileEntityCoverNew(), new GT_Packet_SetConfigurationCircuit(), new GT_Packet_UpdateItem()};
}
@Override
diff --git a/src/main/java/gregtech/common/GT_Proxy.java b/src/main/java/gregtech/common/GT_Proxy.java
index 569e06643a..8d7481ea6a 100644
--- a/src/main/java/gregtech/common/GT_Proxy.java
+++ b/src/main/java/gregtech/common/GT_Proxy.java
@@ -1730,10 +1730,10 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler {
if (GUI_ID_COVER_SIDE_BASE <= aID && aID < GUI_ID_COVER_SIDE_BASE+6) {
byte side = (byte) (aID - GT_Proxy.GUI_ID_COVER_SIDE_BASE);
- GT_CoverBehavior cover = tile.getCoverBehaviorAtSide(side);
+ GT_CoverBehaviorBase<?> cover = tile.getCoverBehaviorAtSideNew(side);
if (cover.hasCoverGUI()) {
- return cover.getClientGUI(side, tile.getCoverIDAtSide(side), tile.getCoverDataAtSide(side), tile);
+ return cover.getClientGUI(side, tile.getCoverIDAtSide(side), tile.getComplexCoverDataAtSide(side), tile, aPlayer, aWorld);
}
return null;
}
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Fluidfilter.java b/src/main/java/gregtech/common/covers/GT_Cover_Fluidfilter.java
index 99836c1d99..ef0946a5f7 100644
--- a/src/main/java/gregtech/common/covers/GT_Cover_Fluidfilter.java
+++ b/src/main/java/gregtech/common/covers/GT_Cover_Fluidfilter.java
@@ -210,6 +210,7 @@ public class GT_Cover_Fluidfilter extends GT_CoverBehaviorBase<GT_Cover_Fluidfil
b = new GT_GuiIconButton(this, 5, startX + spaceX*1, startY+spaceY*1, GT_GuiIcon.BLACKLIST).setTooltipText(trans("237","Blacklist Fluid"));
fluidFilterButton = new GT_GuiFakeItemButton(this, startX, startY + spaceY * 3 + 2, GT_GuiIcon.SLOT_DARKGRAY);
+ fluidFilterButton.setMimicSlot(true);
}
private int getNewFilterMode(int id) {
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_ItemFilter.java b/src/main/java/gregtech/common/covers/GT_Cover_ItemFilter.java
index 88ef51dd01..6e721d4f6a 100644
--- a/src/main/java/gregtech/common/covers/GT_Cover_ItemFilter.java
+++ b/src/main/java/gregtech/common/covers/GT_Cover_ItemFilter.java
@@ -228,6 +228,7 @@ public class GT_Cover_ItemFilter extends GT_CoverBehaviorBase<GT_Cover_ItemFilte
btnMode = new GT_GuiIconCheckButton(this, 0, startX + spaceX * 0, startY + spaceY * 0, GT_GuiIcon.WHITELIST, GT_GuiIcon.BLACKLIST, trans("125", "Whitelist Mode"), trans("124", "Blacklist Mode"));
itemFilterButtons = new GT_GuiFakeItemButton(this, startX + spaceX * 0, startY + spaceY * 2, GT_GuiIcon.SLOT_GRAY);
+ itemFilterButtons.setMimicSlot(true);
}
@Override
diff --git a/src/main/java/gregtech/common/covers/GT_Cover_ItemMeter.java b/src/main/java/gregtech/common/covers/GT_Cover_ItemMeter.java
index 74e5438bde..a7aba3d829 100644
--- a/src/main/java/gregtech/common/covers/GT_Cover_ItemMeter.java
+++ b/src/main/java/gregtech/common/covers/GT_Cover_ItemMeter.java
@@ -193,6 +193,7 @@ public class GT_Cover_ItemMeter extends GT_CoverBehavior {
//only shows if opened gui of block sadly, should've used container.
intSlotIcon = new GT_GuiFakeItemButton(this, startX + spaceX * 8-4, startY + spaceY * 1, GT_GuiIcon.SLOT_GRAY);
+ intSlotIcon.setMimicSlot(true);
if (tile instanceof TileEntity && !super.tile.isDead())
maxSlot = Math.min(tile.getSizeInventory() - 1, SLOT_MASK-1);
diff --git a/src/main/java/gregtech/common/gui/GT_GUIContainerVolumetricFlask.java b/src/main/java/gregtech/common/gui/GT_GUIContainerVolumetricFlask.java
index 6d346fc445..85fe2171b0 100644
--- a/src/main/java/gregtech/common/gui/GT_GUIContainerVolumetricFlask.java
+++ b/src/main/java/gregtech/common/gui/GT_GUIContainerVolumetricFlask.java
@@ -4,6 +4,7 @@ package gregtech.common.gui;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import gregtech.api.enums.GT_Values;
+import gregtech.api.net.GT_Packet_UpdateItem;
import gregtech.common.items.GT_VolumetricFlask;
import gregtech.common.net.MessageSetFlaskCapacity;
import net.minecraft.client.Minecraft;
@@ -11,6 +12,7 @@ import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;
@@ -119,7 +121,9 @@ public final class GT_GUIContainerVolumetricFlask extends GuiContainer {
protected void actionPerformed(GuiButton btn) {
try {
if (btn == apply) {
- GT_Values.NW.sendToServer(new MessageSetFlaskCapacity(Integer.parseInt(amount.getText()), Minecraft.getMinecraft().thePlayer));
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setInteger("cap", Integer.parseInt(amount.getText()));
+ GT_Values.NW.sendToServer(new GT_Packet_UpdateItem(tag));
mc.thePlayer.closeScreen();
}
diff --git a/src/main/java/gregtech/common/items/GT_IntegratedCircuit_Item.java b/src/main/java/gregtech/common/items/GT_IntegratedCircuit_Item.java
index 4b7d294a25..9ae287c610 100644
--- a/src/main/java/gregtech/common/items/GT_IntegratedCircuit_Item.java
+++ b/src/main/java/gregtech/common/items/GT_IntegratedCircuit_Item.java
@@ -1,30 +1,50 @@
package gregtech.common.items;
+import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
import gregtech.api.enums.ItemList;
import gregtech.api.enums.Materials;
import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.gui.GT_GUIDialogSelectItem;
+import gregtech.api.interfaces.INetworkUpdatableItem;
import gregtech.api.items.GT_Generic_Item;
+import gregtech.api.net.GT_Packet_UpdateItem;
+import gregtech.api.objects.XSTR;
import gregtech.api.util.GT_Config;
import gregtech.api.util.GT_LanguageManager;
import gregtech.api.util.GT_Log;
import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.util.IIcon;
+import net.minecraft.util.StatCollector;
+import net.minecraft.world.World;
+import net.minecraftforge.common.util.Constants;
+import net.minecraftforge.common.util.FakePlayer;
+import net.minecraftforge.oredict.OreDictionary;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import static gregtech.GT_Mod.GT_FML_LOGGER;
import static gregtech.api.enums.GT_Values.RES_PATH_ITEM;
-public class GT_IntegratedCircuit_Item extends GT_Generic_Item {
+public class GT_IntegratedCircuit_Item extends GT_Generic_Item implements INetworkUpdatableItem {
private static final String aTextEmptyRow = " ";
+ private static final List<ItemStack> ALL_VARIANTS = new ArrayList<>();
protected IIcon[] mIconDamage = new IIcon[25];
public GT_IntegratedCircuit_Item() {
super("integrated_circuit", "Programmed Circuit", "");
@@ -33,37 +53,40 @@ public class GT_IntegratedCircuit_Item extends GT_Generic_Item {
ItemList.Circuit_Integrated.set(this);
+ ALL_VARIANTS.add(new ItemStack(this, 0, 0));
for (int i = 1; i <= 24; i++) {
- GregTech_API.registerConfigurationCircuit(new ItemStack(this, 0, i));
+ ItemStack aStack = new ItemStack(this, 0, i);
+ GregTech_API.registerConfigurationCircuit(aStack);
+ ALL_VARIANTS.add(aStack);
}
- GT_ModHandler.addShapelessCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 0L, new Object[0]), GT_ModHandler.RecipeBits.NOT_REMOVABLE, new Object[]{OrePrefixes.circuit.get(Materials.Basic)});
+ GT_ModHandler.addShapelessCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 0L), GT_ModHandler.RecipeBits.NOT_REMOVABLE, new Object[]{OrePrefixes.circuit.get(Materials.Basic)});
long bits = GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE;
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 1L, new Object[0]), bits, new Object[]{"d ", " P ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 2L, new Object[0]), bits, new Object[]{" d ", " P ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 3L, new Object[0]), bits, new Object[]{" d", " P ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 4L, new Object[0]), bits, new Object[]{aTextEmptyRow, " Pd", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 5L, new Object[0]), bits, new Object[]{aTextEmptyRow, " P ", " d", 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 6L, new Object[0]), bits, new Object[]{aTextEmptyRow, " P ", " d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 7L, new Object[0]), bits, new Object[]{aTextEmptyRow, " P ", "d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 8L, new Object[0]), bits, new Object[]{aTextEmptyRow, "dP ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
-
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 9L, new Object[0]), bits, new Object[]{"P d", aTextEmptyRow, aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 10L, new Object[0]), bits, new Object[]{"P ", " d", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 11L, new Object[0]), bits, new Object[]{"P ", aTextEmptyRow, " d", 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 12L, new Object[0]), bits, new Object[]{"P ", aTextEmptyRow, " d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 13L, new Object[0]), bits, new Object[]{" P", aTextEmptyRow, " d", 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 14L, new Object[0]), bits, new Object[]{" P", aTextEmptyRow, " d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 15L, new Object[0]), bits, new Object[]{" P", aTextEmptyRow, "d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 16L, new Object[0]), bits, new Object[]{" P", "d ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 17L, new Object[0]), bits, new Object[]{aTextEmptyRow, aTextEmptyRow, "d P", 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 18L, new Object[0]), bits, new Object[]{aTextEmptyRow, "d ", " P", 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 19L, new Object[0]), bits, new Object[]{"d ", aTextEmptyRow, " P", 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 20L, new Object[0]), bits, new Object[]{" d ", aTextEmptyRow, " P", 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 21L, new Object[0]), bits, new Object[]{"d ", aTextEmptyRow, "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 22L, new Object[0]), bits, new Object[]{" d ", aTextEmptyRow, "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 23L, new Object[0]), bits, new Object[]{" d", aTextEmptyRow, "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
- GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 24L, new Object[0]), bits, new Object[]{aTextEmptyRow, " d", "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L, new Object[0])});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 1L), bits, new Object[]{"d ", " P ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 2L), bits, new Object[]{" d ", " P ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 3L), bits, new Object[]{" d", " P ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 4L), bits, new Object[]{aTextEmptyRow, " Pd", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 5L), bits, new Object[]{aTextEmptyRow, " P ", " d", 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 6L), bits, new Object[]{aTextEmptyRow, " P ", " d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 7L), bits, new Object[]{aTextEmptyRow, " P ", "d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 8L), bits, new Object[]{aTextEmptyRow, "dP ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 9L), bits, new Object[]{"P d", aTextEmptyRow, aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 10L), bits, new Object[]{"P ", " d", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 11L), bits, new Object[]{"P ", aTextEmptyRow, " d", 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 12L), bits, new Object[]{"P ", aTextEmptyRow, " d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 13L), bits, new Object[]{" P", aTextEmptyRow, " d", 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 14L), bits, new Object[]{" P", aTextEmptyRow, " d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 15L), bits, new Object[]{" P", aTextEmptyRow, "d ", 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 16L), bits, new Object[]{" P", "d ", aTextEmptyRow, 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 17L), bits, new Object[]{aTextEmptyRow, aTextEmptyRow, "d P", 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 18L), bits, new Object[]{aTextEmptyRow, "d ", " P", 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 19L), bits, new Object[]{"d ", aTextEmptyRow, " P", 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 20L), bits, new Object[]{" d ", aTextEmptyRow, " P", 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 21L), bits, new Object[]{"d ", aTextEmptyRow, "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 22L), bits, new Object[]{" d ", aTextEmptyRow, "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 23L), bits, new Object[]{" d", aTextEmptyRow, "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
+ GT_ModHandler.addCraftingRecipe(ItemList.Circuit_Integrated.getWithDamage(1L, 24L), bits, new Object[]{aTextEmptyRow, " d", "P ", 'P', ItemList.Circuit_Integrated.getWildcard(1L)});
}
private static String getModeString(int aMetaData) {
@@ -129,4 +152,81 @@ public class GT_IntegratedCircuit_Item extends GT_Generic_Item {
byte circuitMode = ((byte) (damage & 0xFF)); // Mask out the MSB Comparison Mode Bits. See: getModeString
return mIconDamage[circuitMode < mIconDamage.length ? circuitMode : 0];
}
+
+ @Override
+ public boolean receive(ItemStack stack, EntityPlayerMP player, NBTTagCompound tag) {
+ int meta = tag.hasKey("meta", Constants.NBT.TAG_BYTE) ? tag.getByte("meta") : -1;
+ if (meta < 0 || meta > 24)
+ return true;
+
+ if (!player.capabilities.isCreativeMode) {
+ int toolIndex = findConfiguratorInInv(player);
+ if (toolIndex < 0) return true;
+
+ ItemStack[] mainInventory = player.inventory.mainInventory;
+ ItemStack oldToolStack = mainInventory[toolIndex];
+ mainInventory[toolIndex] = oldToolStack.getItem().getContainerItem(oldToolStack);
+ }
+ stack.setItemDamage(meta);
+
+ return true;
+ }
+
+ @Override
+ public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float xOffset, float yOffset, float zOffset) {
+ // nothing on server side or fake player
+ if (player instanceof FakePlayer || !world.isRemote) return false;
+ // check if any screwdriver
+ ItemStack configuratorStack;
+ if (player.capabilities.isCreativeMode) {
+ configuratorStack = null;
+ } else {
+ int configurator = findConfiguratorInInv(player);
+ if (configurator < 0) {
+ int count;
+ try {
+ count = Integer.parseInt(StatCollector.translateToLocal("GT5U.item.programmed_circuit.no_screwdriver.count"));
+ } catch (NumberFormatException e) {
+ player.addChatComponentMessage(new ChatComponentText("Error in translation GT5U.item.programmed_circuit.no_screwdriver.count: " + e.getMessage()));
+ count = 1;
+ }
+ player.addChatComponentMessage(new ChatComponentTranslation("GT5U.item.programmed_circuit.no_screwdriver." + XSTR.XSTR_INSTANCE.nextInt(count)));
+ return false;
+ }
+ configuratorStack = player.inventory.mainInventory[configurator];
+ }
+ openSelectorGui(player, configuratorStack, stack.getItemDamage());
+ return true;
+ }
+
+ private void openSelectorGui(EntityPlayer player, ItemStack configurator, int meta) {
+ FMLCommonHandler.instance().showGuiScreen(new GT_GUIDialogSelectItem(
+ StatCollector.translateToLocal("GT5U.item.programmed_circuit.select.header"),
+ configurator,
+ null,
+ GT_IntegratedCircuit_Item::onConfigured,
+ ALL_VARIANTS,
+ meta,
+ true
+ ));
+ }
+
+ private static void onConfigured(ItemStack stack) {
+ NBTTagCompound tag = new NBTTagCompound();
+ tag.setByte("meta", (byte) stack.getItemDamage());
+ GT_Values.NW.sendToServer(new GT_Packet_UpdateItem(tag));
+ }
+
+ private static int findConfiguratorInInv(EntityPlayer player) {
+ int screwdriverOreId = OreDictionary.getOreID(ToolDictNames.craftingToolScrewdriver.name());
+ ItemStack[] mainInventory = player.inventory.mainInventory;
+ for (int j = 0, mainInventoryLength = mainInventory.length; j < mainInventoryLength; j++) {
+ ItemStack toolStack = mainInventory[j];
+ boolean accepted = GT_Utility.isStackInList(toolStack, GregTech_API.sCircuitProgrammerList) ||
+ Arrays.stream(OreDictionary.getOreIDs(toolStack)).anyMatch(i -> i == screwdriverOreId);
+ if (accepted)
+ return j;
+ }
+ return -1;
+ }
}
diff --git a/src/main/java/gregtech/common/items/GT_VolumetricFlask.java b/src/main/java/gregtech/common/items/GT_VolumetricFlask.java
index c0dcb45943..055b0bf036 100644
--- a/src/main/java/gregtech/common/items/GT_VolumetricFlask.java
+++ b/src/main/java/gregtech/common/items/GT_VolumetricFlask.java
@@ -4,12 +4,14 @@ package gregtech.common.items;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import gregtech.api.enums.GT_Values;
+import gregtech.api.interfaces.INetworkUpdatableItem;
import gregtech.api.items.GT_Generic_Item;
import ic2.core.util.LiquidUtil;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
@@ -21,15 +23,22 @@ import net.minecraft.util.MovingObjectPosition.MovingObjectType;
import net.minecraft.world.World;
import net.minecraftforge.common.util.FakePlayer;
import net.minecraftforge.common.util.ForgeDirection;
-import net.minecraftforge.fluids.*;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.IFluidBlock;
+import net.minecraftforge.fluids.IFluidContainerItem;
+import net.minecraftforge.fluids.IFluidHandler;
import java.util.List;
import static gregtech.api.enums.GT_Values.RES_PATH_ITEM;
-import static ic2.core.util.LiquidUtil.*;
+import static ic2.core.util.LiquidUtil.drainContainerStack;
+import static ic2.core.util.LiquidUtil.fillContainerStack;
+import static ic2.core.util.LiquidUtil.placeFluid;
-public class GT_VolumetricFlask extends GT_Generic_Item implements IFluidContainerItem {
+public class GT_VolumetricFlask extends GT_Generic_Item implements IFluidContainerItem, INetworkUpdatableItem {
private final int maxCapacity;
private final String unlocalFlaskName;
@SideOnly(Side.CLIENT)
@@ -287,4 +296,15 @@ public class GT_VolumetricFlask extends GT_Generic_Item implements IFluidContain
}
return false;
}
+
+ @Override
+ public boolean receive(ItemStack stack, EntityPlayerMP player, NBTTagCompound tag) {
+ if (stack != null && stack.stackSize > 0) {
+ Item item = stack.getItem();
+ if (item == this)
+ setCapacity(stack, tag.getInteger("cap"));
+ return true;
+ }
+ return false;
+ }
}
diff --git a/src/main/java/gregtech/common/net/MessageSetFlaskCapacity.java b/src/main/java/gregtech/common/net/MessageSetFlaskCapacity.java
index c65d7f2be4..d9cffaa784 100644
--- a/src/main/java/gregtech/common/net/MessageSetFlaskCapacity.java
+++ b/src/main/java/gregtech/common/net/MessageSetFlaskCapacity.java
@@ -11,6 +11,7 @@ import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.DimensionManager;
+@Deprecated
public final class MessageSetFlaskCapacity extends GT_Packet_New {
private int capacity, dimID, playerID;
diff --git a/src/main/resources/assets/gregtech/lang/en_US.lang b/src/main/resources/assets/gregtech/lang/en_US.lang
index 7aab353061..b4767de05d 100644
--- a/src/main/resources/assets/gregtech/lang/en_US.lang
+++ b/src/main/resources/assets/gregtech/lang/en_US.lang
@@ -80,6 +80,17 @@ GT5U.machines.oilfluidpump=Oil/Fluid Pump
GT5U.machines.minermulti=Multiblock Miner
GT5U.machines.voidoveflow.enabled=Overflow voiding enabled
GT5U.machines.voidoveflow.disabled=Overflow voiding disabled
+GT5U.machines.select_circuit=Select Machine Mode
+
+GT5U.gui.select.current=Current:
+
+GT5U.item.programmed_circuit.select.header=Reprogram Circuit
+# Note to translators: this translation entry is supposed to be a number indicating how many taunts you define here
+# Game will randomly display one of them
+GT5U.item.programmed_circuit.no_screwdriver.count=3
+GT5U.item.programmed_circuit.no_screwdriver.0=Trying to mangle a CIRCUIT with your bare hand again huh?
+GT5U.item.programmed_circuit.no_screwdriver.1=Your thumb is not a screwdriver. Try a real one.
+GT5U.item.programmed_circuit.no_screwdriver.2=Chuck Norris stares at the circuit until it reprograms itself. You do not.
GT5U.hatch.disableFilter.true=Input Filter Off
GT5U.hatch.disableFilter.false=Input Filter On
diff --git a/src/main/resources/assets/gregtech/textures/gui/GuiButtons.png b/src/main/resources/assets/gregtech/textures/gui/GuiButtons.png
index 54f5230e7a..f28d991bd7 100644
--- a/src/main/resources/assets/gregtech/textures/gui/GuiButtons.png
+++ b/src/main/resources/assets/gregtech/textures/gui/GuiButtons.png
Binary files differ