001package net.minecraft.client.gui; 002 003import cpw.mods.fml.relauncher.Side; 004import cpw.mods.fml.relauncher.SideOnly; 005import java.io.ByteArrayOutputStream; 006import java.io.DataOutputStream; 007import net.minecraft.client.gui.inventory.GuiContainer; 008import net.minecraft.client.renderer.RenderHelper; 009import net.minecraft.entity.IMerchant; 010import net.minecraft.entity.player.InventoryPlayer; 011import net.minecraft.inventory.ContainerMerchant; 012import net.minecraft.item.ItemStack; 013import net.minecraft.network.packet.Packet250CustomPayload; 014import net.minecraft.util.StatCollector; 015import net.minecraft.village.MerchantRecipe; 016import net.minecraft.village.MerchantRecipeList; 017import net.minecraft.world.World; 018import org.lwjgl.opengl.GL11; 019import org.lwjgl.opengl.GL12; 020 021@SideOnly(Side.CLIENT) 022public class GuiMerchant extends GuiContainer 023{ 024 /** Instance of IMerchant interface. */ 025 private IMerchant theIMerchant; 026 private GuiButtonMerchant nextRecipeButtonIndex; 027 private GuiButtonMerchant previousRecipeButtonIndex; 028 private int currentRecipeIndex = 0; 029 private String field_94082_v; 030 031 public GuiMerchant(InventoryPlayer par1, IMerchant par2, World par3World, String par4) 032 { 033 super(new ContainerMerchant(par1, par2, par3World)); 034 this.theIMerchant = par2; 035 this.field_94082_v = par4 != null && par4.length() >= 1 ? par4 : StatCollector.translateToLocal("entity.Villager.name"); 036 } 037 038 /** 039 * Adds the buttons (and other controls) to the screen in question. 040 */ 041 public void initGui() 042 { 043 super.initGui(); 044 int i = (this.width - this.xSize) / 2; 045 int j = (this.height - this.ySize) / 2; 046 this.buttonList.add(this.nextRecipeButtonIndex = new GuiButtonMerchant(1, i + 120 + 27, j + 24 - 1, true)); 047 this.buttonList.add(this.previousRecipeButtonIndex = new GuiButtonMerchant(2, i + 36 - 19, j + 24 - 1, false)); 048 this.nextRecipeButtonIndex.enabled = false; 049 this.previousRecipeButtonIndex.enabled = false; 050 } 051 052 /** 053 * Draw the foreground layer for the GuiContainer (everything in front of the items) 054 */ 055 protected void drawGuiContainerForegroundLayer(int par1, int par2) 056 { 057 this.fontRenderer.drawString(this.field_94082_v, this.xSize / 2 - this.fontRenderer.getStringWidth(this.field_94082_v) / 2, 6, 4210752); 058 this.fontRenderer.drawString(StatCollector.translateToLocal("container.inventory"), 8, this.ySize - 96 + 2, 4210752); 059 } 060 061 /** 062 * Called from the main game loop to update the screen. 063 */ 064 public void updateScreen() 065 { 066 super.updateScreen(); 067 MerchantRecipeList merchantrecipelist = this.theIMerchant.getRecipes(this.mc.thePlayer); 068 069 if (merchantrecipelist != null) 070 { 071 this.nextRecipeButtonIndex.enabled = this.currentRecipeIndex < merchantrecipelist.size() - 1; 072 this.previousRecipeButtonIndex.enabled = this.currentRecipeIndex > 0; 073 } 074 } 075 076 /** 077 * Fired when a control is clicked. This is the equivalent of ActionListener.actionPerformed(ActionEvent e). 078 */ 079 protected void actionPerformed(GuiButton par1GuiButton) 080 { 081 boolean flag = false; 082 083 if (par1GuiButton == this.nextRecipeButtonIndex) 084 { 085 ++this.currentRecipeIndex; 086 flag = true; 087 } 088 else if (par1GuiButton == this.previousRecipeButtonIndex) 089 { 090 --this.currentRecipeIndex; 091 flag = true; 092 } 093 094 if (flag) 095 { 096 ((ContainerMerchant)this.inventorySlots).setCurrentRecipeIndex(this.currentRecipeIndex); 097 ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(); 098 DataOutputStream dataoutputstream = new DataOutputStream(bytearrayoutputstream); 099 100 try 101 { 102 dataoutputstream.writeInt(this.currentRecipeIndex); 103 this.mc.getNetHandler().addToSendQueue(new Packet250CustomPayload("MC|TrSel", bytearrayoutputstream.toByteArray())); 104 } 105 catch (Exception exception) 106 { 107 exception.printStackTrace(); 108 } 109 } 110 } 111 112 /** 113 * Draw the background layer for the GuiContainer (everything behind the items) 114 */ 115 protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) 116 { 117 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); 118 this.mc.renderEngine.func_98187_b("/gui/trading.png"); 119 int k = (this.width - this.xSize) / 2; 120 int l = (this.height - this.ySize) / 2; 121 this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.ySize); 122 MerchantRecipeList merchantrecipelist = this.theIMerchant.getRecipes(this.mc.thePlayer); 123 124 if (merchantrecipelist != null && !merchantrecipelist.isEmpty()) 125 { 126 int i1 = this.currentRecipeIndex; 127 MerchantRecipe merchantrecipe = (MerchantRecipe)merchantrecipelist.get(i1); 128 129 if (merchantrecipe.func_82784_g()) 130 { 131 this.mc.renderEngine.func_98187_b("/gui/trading.png"); 132 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); 133 GL11.glDisable(GL11.GL_LIGHTING); 134 this.drawTexturedModalRect(this.guiLeft + 83, this.guiTop + 21, 212, 0, 28, 21); 135 this.drawTexturedModalRect(this.guiLeft + 83, this.guiTop + 51, 212, 0, 28, 21); 136 } 137 } 138 } 139 140 /** 141 * Draws the screen and all the components in it. 142 */ 143 public void drawScreen(int par1, int par2, float par3) 144 { 145 super.drawScreen(par1, par2, par3); 146 MerchantRecipeList merchantrecipelist = this.theIMerchant.getRecipes(this.mc.thePlayer); 147 148 if (merchantrecipelist != null && !merchantrecipelist.isEmpty()) 149 { 150 int k = (this.width - this.xSize) / 2; 151 int l = (this.height - this.ySize) / 2; 152 int i1 = this.currentRecipeIndex; 153 MerchantRecipe merchantrecipe = (MerchantRecipe)merchantrecipelist.get(i1); 154 GL11.glPushMatrix(); 155 ItemStack itemstack = merchantrecipe.getItemToBuy(); 156 ItemStack itemstack1 = merchantrecipe.getSecondItemToBuy(); 157 ItemStack itemstack2 = merchantrecipe.getItemToSell(); 158 RenderHelper.enableGUIStandardItemLighting(); 159 GL11.glDisable(GL11.GL_LIGHTING); 160 GL11.glEnable(GL12.GL_RESCALE_NORMAL); 161 GL11.glEnable(GL11.GL_COLOR_MATERIAL); 162 GL11.glEnable(GL11.GL_LIGHTING); 163 itemRenderer.zLevel = 100.0F; 164 itemRenderer.renderItemAndEffectIntoGUI(this.fontRenderer, this.mc.renderEngine, itemstack, k + 36, l + 24); 165 itemRenderer.renderItemOverlayIntoGUI(this.fontRenderer, this.mc.renderEngine, itemstack, k + 36, l + 24); 166 167 if (itemstack1 != null) 168 { 169 itemRenderer.renderItemAndEffectIntoGUI(this.fontRenderer, this.mc.renderEngine, itemstack1, k + 62, l + 24); 170 itemRenderer.renderItemOverlayIntoGUI(this.fontRenderer, this.mc.renderEngine, itemstack1, k + 62, l + 24); 171 } 172 173 itemRenderer.renderItemAndEffectIntoGUI(this.fontRenderer, this.mc.renderEngine, itemstack2, k + 120, l + 24); 174 itemRenderer.renderItemOverlayIntoGUI(this.fontRenderer, this.mc.renderEngine, itemstack2, k + 120, l + 24); 175 itemRenderer.zLevel = 0.0F; 176 GL11.glDisable(GL11.GL_LIGHTING); 177 178 if (this.isPointInRegion(36, 24, 16, 16, par1, par2)) 179 { 180 this.drawItemStackTooltip(itemstack, par1, par2); 181 } 182 else if (itemstack1 != null && this.isPointInRegion(62, 24, 16, 16, par1, par2)) 183 { 184 this.drawItemStackTooltip(itemstack1, par1, par2); 185 } 186 else if (this.isPointInRegion(120, 24, 16, 16, par1, par2)) 187 { 188 this.drawItemStackTooltip(itemstack2, par1, par2); 189 } 190 191 GL11.glPopMatrix(); 192 GL11.glEnable(GL11.GL_LIGHTING); 193 GL11.glEnable(GL11.GL_DEPTH_TEST); 194 RenderHelper.enableStandardItemLighting(); 195 } 196 } 197 198 /** 199 * Gets the Instance of IMerchant interface. 200 */ 201 public IMerchant getIMerchant() 202 { 203 return this.theIMerchant; 204 } 205}