66package de .guntram .mcmod .easiervillagertrading ;
77
88import java .io .IOException ;
9- import java .util .List ;
109import net .minecraft .client .gui .GuiButton ;
1110import net .minecraft .client .gui .GuiMerchant ;
11+ import net .minecraft .client .renderer .RenderHelper ;
1212import net .minecraft .enchantment .Enchantment ;
1313import net .minecraft .entity .player .InventoryPlayer ;
1414import net .minecraft .inventory .ClickType ;
15- import net .minecraft .inventory .Slot ;
1615import net .minecraft .item .Item ;
1716import net .minecraft .item .ItemEnchantedBook ;
1817import net .minecraft .item .ItemStack ;
@@ -29,6 +28,13 @@ public class BetterGuiMerchant extends GuiMerchant {
2928
3029 private final int addXSize =0 ;
3130 private final ItemStack tradeOK , tradeNOK ;
31+ private final int lineHeight =18 ;
32+ private final int titleDistance =20 ;
33+ private final int firstBuyItemXpos =0 ;
34+ private final int secondBuyItemXpos =18 ;
35+ private final int okNokXpos =40 ;
36+ private final int sellItemXpos =60 ;
37+ private final int textXpos =85 ;
3238
3339 BetterGuiMerchant (InventoryPlayer inv , GuiMerchant template , World world ) {
3440 super (inv , template .getMerchant (), world );
@@ -55,18 +61,21 @@ protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY)
5561 MerchantRecipeList trades =getMerchant ().getRecipes (null );
5662 if (trades ==null )
5763 return ;
64+ int topAdjust =getTopAdjust (trades .size ());
5865 String s = trades .size ()+" trades" ;
59- this .fontRenderer .drawString (s , this .xSize -addXSize +5 , 0 , 0xff00ff );
66+ this .fontRenderer .drawString (s , this .xSize -addXSize +5 , - topAdjust , 0xff00ff );
6067 // First draw all items, then all tooltips. This is extra effort,
6168 // but we don't want any items in front of any tooltips.
69+ RenderHelper .enableStandardItemLighting ();
70+ RenderHelper .enableGUIStandardItemLighting ();
6271 for (int i =0 ; i <trades .size (); i ++) {
6372 MerchantRecipe trade =trades .get (i );
6473 ItemStack i1 =trade .getItemToBuy ();
6574 ItemStack i2 =trade .hasSecondItemToBuy () ? trade .getSecondItemToBuy () : null ;
6675 ItemStack o1 =trade .getItemToSell ();
67- drawItem (i1 , this .xSize -addXSize +5 , i * 18 + 20 );
68- drawItem (i2 , this .xSize -addXSize +5 +18 , i *18 + 20 );
69- drawItem (o1 , this .xSize -addXSize +5 +60 , i * 18 + 20 );
76+ drawItem (i1 , this .xSize -addXSize +5 + firstBuyItemXpos , i * lineHeight - topAdjust + titleDistance );
77+ drawItem (i2 , this .xSize -addXSize +5 +secondBuyItemXpos , i *lineHeight - topAdjust + titleDistance );
78+ drawItem (o1 , this .xSize -addXSize +5 +sellItemXpos , i * lineHeight - topAdjust + titleDistance );
7079
7180 NBTTagList enchantments ;
7281
@@ -83,28 +92,37 @@ protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY)
8392 int j = enchantments .getCompoundTagAt (t ).getShort ("id" );
8493 int k = enchantments .getCompoundTagAt (t ).getShort ("lvl" );
8594
86- if (Enchantment .getEnchantmentByID (j ) != null )
95+ Enchantment enchant = Enchantment .getEnchantmentByID (j );
96+ if (enchant != null )
8797 {
8898 if (t >0 )
8999 enchants .append (", " );
90- enchants .append (Enchantment . getEnchantmentByID ( j ) .getTranslatedName (k ));
100+ enchants .append (enchant .getTranslatedName (k ));
91101 }
92102 }
93- fontRenderer .drawString (enchants .toString (), this .xSize -addXSize +85 , i *18 +24 , 0xffff00 );
103+ fontRenderer .drawString (enchants .toString (), this .xSize -addXSize +textXpos , i *lineHeight - topAdjust +24 , 0xffff00 );
94104 }
95- drawItem (trade .isRecipeDisabled () ? tradeNOK : tradeOK , xSize -addXSize +5 +40 , i *18 + 20 );
105+ drawItem (trade .isRecipeDisabled () ? tradeNOK : tradeOK , xSize -addXSize +5 +okNokXpos , i *lineHeight - topAdjust + titleDistance );
96106 }
107+ RenderHelper .disableStandardItemLighting ();
97108 for (int i =0 ; i <trades .size (); i ++) {
98109 MerchantRecipe trade =trades .get (i );
99110 ItemStack i1 =trade .getItemToBuy ();
100111 ItemStack i2 =trade .hasSecondItemToBuy () ? trade .getSecondItemToBuy () : null ;
101112 ItemStack o1 =trade .getItemToSell ();
102- drawTooltip (i1 , this .xSize -addXSize +5 , i *18 + 20 , mouseX , mouseY );
103- drawTooltip (i2 , this .xSize -addXSize +5 +18 , i * 18 + 20 , mouseX , mouseY );
104- drawTooltip (o1 , this .xSize -addXSize +5 +54 , i * 18 + 20 , mouseX , mouseY );
113+ drawTooltip (i1 , this .xSize -addXSize +5 + firstBuyItemXpos , i *lineHeight - topAdjust + titleDistance , mouseX , mouseY );
114+ drawTooltip (i2 , this .xSize -addXSize +5 +secondBuyItemXpos , i * lineHeight - topAdjust + titleDistance , mouseX , mouseY );
115+ drawTooltip (o1 , this .xSize -addXSize +5 +sellItemXpos , i * lineHeight - topAdjust + titleDistance , mouseX , mouseY );
105116 }
106117 }
107118
119+ private int getTopAdjust (int numTrades ) {
120+ int topAdjust = ((numTrades * lineHeight + titleDistance ) - this .ySize )/2 ;
121+ if (topAdjust < 0 )
122+ topAdjust = 0 ;
123+ return topAdjust ;
124+ }
125+
108126 private void drawItem (ItemStack stack , int x , int y ) {
109127 if (stack ==null )
110128 return ;
@@ -123,13 +141,19 @@ private void drawTooltip(ItemStack stack, int x, int y, int mousex, int mousey)
123141
124142 @ Override
125143 protected void mouseClicked (final int mouseX , final int mouseY , final int mouseButton ) throws IOException {
126- System .out .println ("click at " +mouseX +"/" +mouseY );
127- if ((mouseX - this .guiLeft ) > this .xSize -addXSize && (mouseX - this .guiLeft ) < this .xSize -addXSize +80 ) {
128- int tradeIndex =(mouseY -this .guiTop -20 )/18 ;
144+ // System.out.println("click at "+mouseX+"/"+mouseY);
145+ if (mouseButton ==0
146+ && (mouseX - this .guiLeft ) > this .xSize -addXSize
147+ && (mouseX - this .guiLeft ) < this .xSize -addXSize +textXpos
148+ ) {
129149 MerchantRecipeList trades =getMerchant ().getRecipes (null );
150+ if (trades ==null )
151+ return ;
130152 int numTrades =trades .size ();
153+ int topAdjust =getTopAdjust (numTrades );
154+ int tradeIndex =(mouseY +topAdjust -this .guiTop -titleDistance )/lineHeight ;
131155 if (tradeIndex >=0 && tradeIndex <numTrades ) {
132- System .out .println ("tradeIndex=" +tradeIndex +", numTrades=" +numTrades );
156+ // System.out.println("tradeIndex="+tradeIndex+", numTrades="+numTrades);
133157 GuiButton myNextButton = this .buttonList .get (0 );
134158 GuiButton myPrevButton = this .buttonList .get (1 );
135159 for (int i =0 ; i <numTrades ; i ++)
@@ -172,8 +196,8 @@ private boolean hasEnoughItemsInInventory(ItemStack stack) {
172196 ItemStack invstack =inventorySlots .getSlot (i ).getStack ();
173197 if (invstack ==null )
174198 continue ;
175- if (stack . getItem (). equals ( invstack . getItem () )) {
176- System .out .println ("taking " +invstack .getCount ()+" items from slot # " +i );
199+ if (areItemStacksMergable ( stack , invstack )) {
200+ // System.out.println("taking "+invstack.getCount()+" items from slot # "+i);
177201 remaining -=invstack .getCount ();
178202 }
179203 if (remaining <=0 )
@@ -187,11 +211,12 @@ private boolean canReceiveOutput(ItemStack stack) {
187211 for (int i =inventorySlots .inventorySlots .size ()-36 ; i <inventorySlots .inventorySlots .size (); i ++) {
188212 ItemStack invstack =inventorySlots .getSlot (i ).getStack ();
189213 if (invstack ==null || invstack .isEmpty ()) {
190- System .out .println ("can put result into empty slot " +i );
214+ // System.out.println("can put result into empty slot "+i);
191215 return true ;
192216 }
193- if (stack .getItem ().equals (invstack .getItem ())) {
194- System .out .println ("Can merge " +(invstack .getMaxStackSize ()-invstack .getCount ())+" items with slot " +i );
217+ if (areItemStacksMergable (stack , invstack )
218+ && stack .getMaxStackSize () >= stack .getCount () + invstack .getCount ()) {
219+ //System.out.println("Can merge "+(invstack.getMaxStackSize()-invstack.getCount())+" items with slot "+i);
195220 remaining -=(invstack .getMaxStackSize ()-invstack .getCount ());
196221 }
197222 if (remaining <=0 )
@@ -201,21 +226,21 @@ private boolean canReceiveOutput(ItemStack stack) {
201226 }
202227
203228 private void transact (MerchantRecipe recipe ) {
204- System .out .println ("fill input slots called" );
205- int putback0 =- 1 , putback1 =-1 ;
229+ // System.out.println("fill input slots called");
230+ int putback0 , putback1 =-1 ;
206231 putback0 =fillSlot (0 , recipe .getItemToBuy ());
207232 if (recipe .hasSecondItemToBuy ()) {
208233 putback1 =fillSlot (1 , recipe .getSecondItemToBuy ());
209234 }
210235 getslot (2 , recipe .getItemToSell (), putback0 , putback1 );
211- System .out .println ("putting back to slot " +putback0 +" from 0, and to " +putback1 +"from 1" );
236+ // System.out.println("putting back to slot "+putback0+" from 0, and to "+putback1+"from 1");
212237 if (putback0 !=-1 ) {
213- mc . playerController . windowClick ( mc . player . openContainer . windowId , 0 , 0 , ClickType . PICKUP , mc . player );
214- mc . playerController . windowClick ( mc . player . openContainer . windowId , putback0 , 0 , ClickType . PICKUP , mc . player );
238+ slotClick ( 0 );
239+ slotClick ( putback0 );
215240 }
216241 if (putback1 !=-1 ) {
217- mc . playerController . windowClick ( mc . player . openContainer . windowId , 1 , 0 , ClickType . PICKUP , mc . player );
218- mc . playerController . windowClick ( mc . player . openContainer . windowId , putback1 , 0 , ClickType . PICKUP , mc . player );
242+ slotClick ( 1 );
243+ slotClick ( putback1 );
219244 }
220245 }
221246
@@ -233,16 +258,16 @@ private int fillSlot(int slot, ItemStack stack) {
233258 if (invstack ==null )
234259 continue ;
235260 boolean needPutBack =false ;
236- if (stack . getItem (). equals ( invstack . getItem () )) {
261+ if (areItemStacksMergable ( stack , invstack )) {
237262 if (stack .getCount ()+invstack .getCount () > stack .getMaxStackSize ())
238263 needPutBack =true ;
239264 remaining -=invstack .getCount ();
240- System .out .println ("taking " +invstack .getCount ()+" items from slot # " +i +", remaining is now " +remaining );
241- mc . playerController . windowClick ( mc . player . openContainer . windowId , i , 0 , ClickType . PICKUP , mc . player );
242- mc . playerController . windowClick ( mc . player . openContainer . windowId , slot , 0 , ClickType . PICKUP , mc . player );
265+ // System.out.println("taking "+invstack.getCount()+" items from slot # "+i+", remaining is now "+remaining);
266+ slotClick ( i );
267+ slotClick ( slot );
243268 }
244269 if (needPutBack ) {
245- mc . playerController . windowClick ( mc . player . openContainer . windowId , i , 0 , ClickType . PICKUP , mc . player );
270+ slotClick ( i );
246271 }
247272 if (remaining <=0 )
248273 return remaining <0 ? i : -1 ;
@@ -252,18 +277,30 @@ private int fillSlot(int slot, ItemStack stack) {
252277 return -1 ;
253278 }
254279
280+ private boolean areItemStacksMergable (ItemStack a , ItemStack b ) {
281+ if (a ==null || b ==null )
282+ return false ;
283+ if (a .getItem () == b .getItem ()
284+ && (!a .getHasSubtypes () || a .getItemDamage ()==b .getItemDamage ())
285+ && ItemStack .areItemStackTagsEqual (a , b ))
286+ return true ;
287+ return false ;
288+ }
289+
255290 private void getslot (int slot , ItemStack stack , int ... forbidden ) {
256291 int remaining =stack .getCount ();
257- mc . playerController . windowClick ( mc . player . openContainer . windowId , slot , 0 , ClickType . PICKUP , mc . player );
292+ slotClick ( slot );
258293 for (int i =inventorySlots .inventorySlots .size ()-36 ; i <inventorySlots .inventorySlots .size (); i ++) {
259294 ItemStack invstack =inventorySlots .getSlot (i ).getStack ();
260295 if (invstack ==null || invstack .isEmpty ()) {
261296 continue ;
262297 }
263- if (stack .getItem ().equals (invstack .getItem ())) {
264- System .out .println ("Can merge " +(invstack .getMaxStackSize ()-invstack .getCount ())+" items with slot " +i );
298+ if (areItemStacksMergable (stack , invstack )
299+ && invstack .getCount () < invstack .getMaxStackSize ()
300+ ) {
301+ // System.out.println("Can merge "+(invstack.getMaxStackSize()-invstack.getCount())+" items with slot "+i);
265302 remaining -=(invstack .getMaxStackSize ()-invstack .getCount ());
266- mc . playerController . windowClick ( mc . player . openContainer . windowId , i , 0 , ClickType . PICKUP , mc . player );
303+ slotClick ( i );
267304 }
268305 if (remaining <=0 )
269306 return ;
@@ -280,10 +317,15 @@ private void getslot(int slot, ItemStack stack, int... forbidden) {
280317 continue ;
281318 ItemStack invstack =inventorySlots .getSlot (i ).getStack ();
282319 if (invstack ==null || invstack .isEmpty ()) {
283- mc . playerController . windowClick ( mc . player . openContainer . windowId , i , 0 , ClickType . PICKUP , mc . player );
284- System .out .println ("putting result into empty slot " +i );
320+ slotClick ( i );
321+ // System.out.println("putting result into empty slot "+i);
285322 return ;
286323 }
287324 }
288325 }
326+
327+ private void slotClick (int slot ) {
328+ System .out .println ("Clicking slot " +slot );
329+ mc .playerController .windowClick (mc .player .openContainer .windowId , slot , 0 , ClickType .PICKUP , mc .player );
330+ }
289331}
0 commit comments