package net.minecraft.client.gui.inventory;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraft.util.MathHelper;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
@SideOnly(Side.CLIENT)
public abstract class GuiContainer extends GuiScreen
{
/** Stacks renderer. Icons, stack size, health, etc... */
protected static RenderItem itemRenderer = new RenderItem();
/** The X size of the inventory window in pixels. */
protected int xSize = 176;
/** The Y size of the inventory window in pixels. */
protected int ySize = 166;
/** A list of the players inventory slots. */
public Container inventorySlots;
/**
* Starting X position for the Gui. Inconsistent use for Gui backgrounds.
*/
protected int guiLeft;
/**
* Starting Y position for the Gui. Inconsistent use for Gui backgrounds.
*/
protected int guiTop;
private Slot theSlot;
/** Used when touchscreen is enabled */
private Slot clickedSlot = null;
/** Used when touchscreen is enabled */
private boolean isRightMouseClick = false;
/** Used when touchscreen is enabled */
private ItemStack draggedStack = null;
private int field_85049_r = 0;
private int field_85048_s = 0;
private Slot returningStackDestSlot = null;
private long returningStackTime = 0L;
/** Used when touchscreen is enabled */
private ItemStack returningStack = null;
private Slot field_92033_y = null;
private long field_92032_z = 0L;
public GuiContainer(Container par1Container)
{
this.inventorySlots = par1Container;
}
/**
* Adds the buttons (and other controls) to the screen in question.
*/
public void initGui()
{
super.initGui();
this.mc.thePlayer.openContainer = this.inventorySlots;
this.guiLeft = (this.width - this.xSize) / 2;
this.guiTop = (this.height - this.ySize) / 2;
}
/**
* Draws the screen and all the components in it.
*/
public void drawScreen(int par1, int par2, float par3)
{
this.drawDefaultBackground();
int var4 = this.guiLeft;
int var5 = this.guiTop;
this.drawGuiContainerBackgroundLayer(par3, par1, par2);
GL11.glDisable(GL12.GL_RESCALE_NORMAL);
RenderHelper.disableStandardItemLighting();
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_DEPTH_TEST);
super.drawScreen(par1, par2, par3);
RenderHelper.enableGUIStandardItemLighting();
GL11.glPushMatrix();
GL11.glTranslatef((float)var4, (float)var5, 0.0F);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
this.theSlot = null;
short var6 = 240;
short var7 = 240;
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)var6 / 1.0F, (float)var7 / 1.0F);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
int var9;
for (int var13 = 0; var13 < this.inventorySlots.inventorySlots.size(); ++var13)
{
Slot var14 = (Slot)this.inventorySlots.inventorySlots.get(var13);
this.drawSlotInventory(var14);
if (this.isMouseOverSlot(var14, par1, par2))
{
this.theSlot = var14;
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_DEPTH_TEST);
int var8 = var14.xDisplayPosition;
var9 = var14.yDisplayPosition;
this.drawGradientRect(var8, var9, var8 + 16, var9 + 16, -2130706433, -2130706433);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_DEPTH_TEST);
}
}
this.drawGuiContainerForegroundLayer(par1, par2);
InventoryPlayer var15 = this.mc.thePlayer.inventory;
ItemStack var16 = this.draggedStack == null ? var15.getItemStack() : this.draggedStack;
if (var16 != null)
{
byte var18 = 8;
var9 = this.draggedStack == null ? 8 : 16;
if (this.draggedStack != null && this.isRightMouseClick)
{
var16 = var16.copy();
var16.stackSize = MathHelper.ceiling_float_int((float)var16.stackSize / 2.0F);
}
this.drawItemStack(var16, par1 - var4 - var18, par2 - var5 - var9);
}
if (this.returningStack != null)
{
float var17 = (float)(Minecraft.getSystemTime() - this.returningStackTime) / 100.0F;
if (var17 >= 1.0F)
{
var17 = 1.0F;
this.returningStack = null;
}
var9 = this.returningStackDestSlot.xDisplayPosition - this.field_85049_r;
int var10 = this.returningStackDestSlot.yDisplayPosition - this.field_85048_s;
int var11 = this.field_85049_r + (int)((float)var9 * var17);
int var12 = this.field_85048_s + (int)((float)var10 * var17);
this.drawItemStack(this.returningStack, var11, var12);
}
if (var15.getItemStack() == null && this.theSlot != null && this.theSlot.getHasStack())
{
ItemStack var19 = this.theSlot.getStack();
this.drawItemStackTooltip(var19, par1 - var4 + 8, par2 - var5 + 8);
}
GL11.glPopMatrix();
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_DEPTH_TEST);
RenderHelper.enableStandardItemLighting();
}
private void drawItemStack(ItemStack par1ItemStack, int par2, int par3)
{
GL11.glTranslatef(0.0F, 0.0F, 32.0F);
this.zLevel = 200.0F;
itemRenderer.zLevel = 200.0F;
itemRenderer.renderItemAndEffectIntoGUI(this.fontRenderer, this.mc.renderEngine, par1ItemStack, par2, par3);
itemRenderer.renderItemOverlayIntoGUI(this.fontRenderer, this.mc.renderEngine, par1ItemStack, par2, par3 - (this.draggedStack == null ? 0 : 8));
this.zLevel = 0.0F;
itemRenderer.zLevel = 0.0F;
}
protected void drawItemStackTooltip(ItemStack par1ItemStack, int par2, int par3)
{
GL11.glDisable(GL12.GL_RESCALE_NORMAL);
RenderHelper.disableStandardItemLighting();
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_DEPTH_TEST);
List var4 = par1ItemStack.getTooltip(this.mc.thePlayer, this.mc.gameSettings.advancedItemTooltips);
if (!var4.isEmpty())
{
int var5 = 0;
int var6;
int var7;
for (var6 = 0; var6 < var4.size(); ++var6)
{
var7 = this.fontRenderer.getStringWidth((String)var4.get(var6));
if (var7 > var5)
{
var5 = var7;
}
}
var6 = par2 + 12;
var7 = par3 - 12;
int var9 = 8;
if (var4.size() > 1)
{
var9 += 2 + (var4.size() - 1) * 10;
}
if (this.guiTop + var7 + var9 + 6 > this.height)
{
var7 = this.height - var9 - this.guiTop - 6;
}
this.zLevel = 300.0F;
itemRenderer.zLevel = 300.0F;
int var10 = -267386864;
// this.drawGradientRect(var6 - 3, var7 - 4, var6 + var5 + 3, var7 - 3, var10, var10);
// this.drawGradientRect(var6 - 3, var7 + var9 + 3, var6 + var5 + 3, var7 + var9 + 4, var10, var10);
// this.drawGradientRect(var6 - 3, var7 - 3, var6 + var5 + 3, var7 + var9 + 3, var10, var10);
// this.drawGradientRect(var6 - 4, var7 - 3, var6 - 3, var7 + var9 + 3, var10, var10);
// this.drawGradientRect(var6 + var5 + 3, var7 - 3, var6 + var5 + 4, var7 + var9 + 3, var10, var10);
int var11 = 1347420415;
int var12 = (var11 & 16711422) >> 1 | var11 & -16777216;
// this.drawGradientRect(var6 - 3, var7 - 3 + 1, var6 - 3 + 1, var7 + var9 + 3 - 1, var11, var12);
// this.drawGradientRect(var6 + var5 + 2, var7 - 3 + 1, var6 + var5 + 3, var7 + var9 + 3 - 1, var11, var12);
// this.drawGradientRect(var6 - 3, var7 - 3, var6 + var5 + 3, var7 - 3 + 1, var11, var11);
// this.drawGradientRect(var6 - 3, var7 + var9 + 2, var6 + var5 + 3, var7 + var9 + 3, var12, var12);
int tx = this.mc.renderEngine.getTexture("/gui/furnace.png");
this.mc.renderEngine.bindTexture(tx);
this.drawTexturedModalRect(par2, par3, 176, 14, 32, 16);
for (int var13 = 0; var13 < var4.size(); ++var13)
{
String var14 = (String)var4.get(var13);
if (var13 == 0)
{
var14 = "\u00a7" + Integer.toHexString(par1ItemStack.getRarity().rarityColor) + var14;
}
else
{
var14 = "\u00a77" + var14;
}
this.fontRenderer.drawStringWithShadow(var14, var6, var7, -1);
if (var13 == 0)
{
var7 += 2;
}
var7 += 10;
}
this.zLevel = 0.0F;
itemRenderer.zLevel = 0.0F;
}
}
/**
* Draws the text when mouse is over creative inventory tab. Params: current creative tab to be checked, current
* mouse x position, current mouse y position.
*/
protected void drawCreativeTabHoveringText(String par1Str, int par2, int par3)
{
GL11.glDisable(GL12.GL_RESCALE_NORMAL);
RenderHelper.disableStandardItemLighting();
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_DEPTH_TEST);
int var4 = this.fontRenderer.getStringWidth(par1Str);
int var5 = par2 + 12;
int var6 = par3 - 12;
byte var8 = 8;
this.zLevel = 300.0F;
itemRenderer.zLevel = 300.0F;
int var9 = -267386864;
this.drawGradientRect(var5 - 3, var6 - 4, var5 + var4 + 3, var6 - 3, var9, var9);
this.drawGradientRect(var5 - 3, var6 + var8 + 3, var5 + var4 + 3, var6 + var8 + 4, var9, var9);
this.drawGradientRect(var5 - 3, var6 - 3, var5 + var4 + 3, var6 + var8 + 3, var9, var9);
this.drawGradientRect(var5 - 4, var6 - 3, var5 - 3, var6 + var8 + 3, var9, var9);
this.drawGradientRect(var5 + var4 + 3, var6 - 3, var5 + var4 + 4, var6 + var8 + 3, var9, var9);
int var10 = 1347420415;
int var11 = (var10 & 16711422) >> 1 | var10 & -16777216;
this.drawGradientRect(var5 - 3, var6 - 3 + 1, var5 - 3 + 1, var6 + var8 + 3 - 1, var10, var11);
this.drawGradientRect(var5 + var4 + 2, var6 - 3 + 1, var5 + var4 + 3, var6 + var8 + 3 - 1, var10, var11);
this.drawGradientRect(var5 - 3, var6 - 3, var5 + var4 + 3, var6 - 3 + 1, var10, var10);
this.drawGradientRect(var5 - 3, var6 + var8 + 2, var5 + var4 + 3, var6 + var8 + 3, var11, var11);
this.fontRenderer.drawStringWithShadow(par1Str, var5, var6, -1);
this.zLevel = 0.0F;
itemRenderer.zLevel = 0.0F;
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_DEPTH_TEST);
RenderHelper.enableStandardItemLighting();
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
}
/**
* Draw the foreground layer for the GuiContainer (everything in front of the items)
*/
protected void drawGuiContainerForegroundLayer(int par1, int par2) {}
/**
* Draw the background layer for the GuiContainer (everything behind the items)
*/
protected abstract void drawGuiContainerBackgroundLayer(float var1, int var2, int var3);
/**
* Draws an inventory slot
*/
protected void drawSlotInventory(Slot par1Slot)
{
int var2 = par1Slot.xDisplayPosition;
int var3 = par1Slot.yDisplayPosition;
ItemStack var4 = par1Slot.getStack();
boolean var5 = par1Slot == this.clickedSlot && this.draggedStack != null && !this.isRightMouseClick;
if (par1Slot == this.clickedSlot && this.draggedStack != null && this.isRightMouseClick && var4 != null)
{
var4 = var4.copy();
var4.stackSize /= 2;
}
this.zLevel = 100.0F;
itemRenderer.zLevel = 100.0F;
if (var4 == null)
{
int var6 = par1Slot.getBackgroundIconIndex();
if (var6 >= 0)
{
GL11.glDisable(GL11.GL_LIGHTING);
this.mc.renderEngine.bindTexture(this.mc.renderEngine.getTexture(par1Slot.getBackgroundIconTexture()));
this.drawTexturedModalRect(var2, var3, var6 % 16 * 16, var6 / 16 * 16, 16, 16);
GL11.glEnable(GL11.GL_LIGHTING);
var5 = true;
}
}
if (!var5)
{
GL11.glEnable(GL11.GL_DEPTH_TEST);
itemRenderer.renderItemAndEffectIntoGUI(this.fontRenderer, this.mc.renderEngine, var4, var2, var3);
itemRenderer.renderItemOverlayIntoGUI(this.fontRenderer, this.mc.renderEngine, var4, var2, var3);
}
itemRenderer.zLevel = 0.0F;
this.zLevel = 0.0F;
}
/**
* Returns the slot at the given coordinates or null if there is none.
*/
private Slot getSlotAtPosition(int par1, int par2)
{
for (int var3 = 0; var3 < this.inventorySlots.inventorySlots.size(); ++var3)
{
Slot var4 = (Slot)this.inventorySlots.inventorySlots.get(var3);
if (this.isMouseOverSlot(var4, par1, par2))
{
return var4;
}
}
return null;
}
/**
* Called when the mouse is clicked.
*/
protected void mouseClicked(int par1, int par2, int par3)
{
super.mouseClicked(par1, par2, par3);
boolean var4 = par3 == this.mc.gameSettings.keyBindPickBlock.keyCode + 100;
if (par3 == 0 || par3 == 1 || var4)
{
Slot var5 = this.getSlotAtPosition(par1, par2);
int var6 = this.guiLeft;
int var7 = this.guiTop;
boolean var8 = par1 < var6 || par2 < var7 || par1 >= var6 + this.xSize || par2 >= var7 + this.ySize;
int var9 = -1;
if (var5 != null)
{
var9 = var5.slotNumber;
}
if (var8)
{
var9 = -999;
}
if (this.mc.gameSettings.touchscreen && var8 && this.mc.thePlayer.inventory.getItemStack() == null)
{
this.mc.displayGuiScreen((GuiScreen)null);
return;
}
if (var9 != -1)
{
if (this.mc.gameSettings.touchscreen)
{
if (var5 != null && var5.getHasStack())
{
this.clickedSlot = var5;
this.draggedStack = null;
this.isRightMouseClick = par3 == 1;
}
else
{
this.clickedSlot = null;
}
}
else if (var4)
{
this.handleMouseClick(var5, var9, par3, 3);
}
else
{
boolean var10 = var9 != -999 && (Keyboard.isKeyDown(42) || Keyboard.isKeyDown(54));
this.handleMouseClick(var5, var9, par3, var10 ? 1 : 0);
}
}
}
}
protected void func_85041_a(int par1, int par2, int par3, long par4)
{
if (this.clickedSlot != null && this.mc.gameSettings.touchscreen)
{
if (par3 == 0 || par3 == 1)
{
Slot var6 = this.getSlotAtPosition(par1, par2);
if (this.draggedStack == null)
{
if (var6 != this.clickedSlot)
{
this.draggedStack = this.clickedSlot.getStack().copy();
}
}
else if (this.draggedStack.stackSize > 1 && var6 != null && this.func_92031_b(var6))
{
long var7 = Minecraft.getSystemTime();
if (this.field_92033_y == var6)
{
if (var7 - this.field_92032_z > 500L)
{
this.handleMouseClick(this.clickedSlot, this.clickedSlot.slotNumber, 0, 0);
this.handleMouseClick(var6, var6.slotNumber, 1, 0);
this.handleMouseClick(this.clickedSlot, this.clickedSlot.slotNumber, 0, 0);
this.field_92032_z = var7 + 750L;
--this.draggedStack.stackSize;
}
}
else
{
this.field_92033_y = var6;
this.field_92032_z = var7;
}
}
}
}
}
/**
* Called when the mouse is moved or a mouse button is released. Signature: (mouseX, mouseY, which) which==-1 is
* mouseMove, which==0 or which==1 is mouseUp
*/
protected void mouseMovedOrUp(int par1, int par2, int par3)
{
if (this.clickedSlot != null && this.mc.gameSettings.touchscreen)
{
if (par3 == 0 || par3 == 1)
{
Slot var4 = this.getSlotAtPosition(par1, par2);
int var5 = this.guiLeft;
int var6 = this.guiTop;
boolean var7 = par1 < var5 || par2 < var6 || par1 >= var5 + this.xSize || par2 >= var6 + this.ySize;
int var8 = -1;
if (var4 != null)
{
var8 = var4.slotNumber;
}
if (var7)
{
var8 = -999;
}
if (this.draggedStack == null && var4 != this.clickedSlot)
{
this.draggedStack = this.clickedSlot.getStack();
}
boolean var9 = this.func_92031_b(var4);
if (var8 != -1 && this.draggedStack != null && var9)
{
this.handleMouseClick(this.clickedSlot, this.clickedSlot.slotNumber, par3, 0);
this.handleMouseClick(var4, var8, 0, 0);
if (this.mc.thePlayer.inventory.getItemStack() != null)
{
this.handleMouseClick(this.clickedSlot, this.clickedSlot.slotNumber, par3, 0);
this.field_85049_r = par1 - var5;
this.field_85048_s = par2 - var6;
this.returningStackDestSlot = this.clickedSlot;
this.returningStack = this.draggedStack;
this.returningStackTime = Minecraft.getSystemTime();
}
else
{
this.returningStack = null;
}
}
else if (this.draggedStack != null)
{
this.field_85049_r = par1 - var5;
this.field_85048_s = par2 - var6;
this.returningStackDestSlot = this.clickedSlot;
this.returningStack = this.draggedStack;
this.returningStackTime = Minecraft.getSystemTime();
}
this.draggedStack = null;
this.clickedSlot = null;
}
}
}
private boolean func_92031_b(Slot par1Slot)
{
boolean var2 = par1Slot == null || !par1Slot.getHasStack();
if (par1Slot != null && par1Slot.getHasStack() && this.draggedStack != null && ItemStack.areItemStackTagsEqual(par1Slot.getStack(), this.draggedStack))
{
var2 |= par1Slot.getStack().stackSize + this.draggedStack.stackSize <= this.draggedStack.getMaxStackSize();
}
return var2;
}
/**
* Returns if the passed mouse position is over the specified slot.
*/
private boolean isMouseOverSlot(Slot par1Slot, int par2, int par3)
{
return this.isPointInRegion(par1Slot.xDisplayPosition, par1Slot.yDisplayPosition, 16, 16, par2, par3);
}
/**
* Args: left, top, width, height, pointX, pointY. Note: left, top are local to Gui, pointX, pointY are local to
* screen
*/
protected boolean isPointInRegion(int par1, int par2, int par3, int par4, int par5, int par6)
{
int var7 = this.guiLeft;
int var8 = this.guiTop;
par5 -= var7;
par6 -= var8;
return par5 >= par1 - 1 && par5 < par1 + par3 + 1 && par6 >= par2 - 1 && par6 < par2 + par4 + 1;
}
protected void handleMouseClick(Slot par1Slot, int par2, int par3, int par4)
{
if (par1Slot != null)
{
par2 = par1Slot.slotNumber;
}
this.mc.playerController.windowClick(this.inventorySlots.windowId, par2, par3, par4, this.mc.thePlayer);
}
/**
* Fired when a key is typed. This is the equivalent of KeyListener.keyTyped(KeyEvent e).
*/
protected void keyTyped(char par1, int par2)
{
if (par2 == 1 || par2 == this.mc.gameSettings.keyBindInventory.keyCode)
{
this.mc.thePlayer.closeScreen();
}
this.checkHotbarKeys(par2);
if (par2 == this.mc.gameSettings.keyBindPickBlock.keyCode && this.theSlot != null && this.theSlot.getHasStack())
{
this.handleMouseClick(this.theSlot, this.theSlot.slotNumber, this.ySize, 3);
}
}
/**
* This function is what controls the hotbar shortcut check when you press a number key when hovering a stack.
*/
protected boolean checkHotbarKeys(int par1)
{
if (this.mc.thePlayer.inventory.getItemStack() == null && this.theSlot != null)
{
for (int var2 = 0; var2 < 9; ++var2)
{
if (par1 == 2 + var2)
{
this.handleMouseClick(this.theSlot, this.theSlot.slotNumber, var2, 2);
return true;
}
}
}
return false;
}
/**
* Called when the screen is unloaded. Used to disable keyboard repeat events
*/
public void onGuiClosed()
{
if (this.mc.thePlayer != null)
{
this.inventorySlots.onCraftGuiClosed(this.mc.thePlayer);
}
}
/**
* Returns true if this GUI should pause the game when it is displayed in single-player
*/
public boolean doesGuiPauseGame()
{
return false;
}
/**
* Called from the main game loop to update the screen.
*/
public void updateScreen()
{
super.updateScreen();
if (!this.mc.thePlayer.isEntityAlive() || this.mc.thePlayer.isDead)
{
this.mc.thePlayer.closeScreen();
}
}
}