Skip to content
This repository was archived by the owner on Jun 23, 2024. It is now read-only.

Commit 3bdde09

Browse files
committed
Various bugfixes and improvements:
- long trades lists center-align with the original gui now instead of top; this helps sheperds especially with their long list of different colored wool - fixed display of items like pumpkins and melons that were shown too dark - several additional null pointer checks to prevent crashes - code cleanup - removed most debugging output - better check if two itemstacks can be merged, this prevents trade results being put into the wrong locations resulting in items in the hand after trading - added link to mod URL
1 parent 649a40a commit 3bdde09

File tree

3 files changed

+84
-42
lines changed

3 files changed

+84
-42
lines changed

src/main/java/de/guntram/mcmod/easiervillagertrading/BetterGuiMerchant.java

Lines changed: 82 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,12 @@
66
package de.guntram.mcmod.easiervillagertrading;
77

88
import java.io.IOException;
9-
import java.util.List;
109
import net.minecraft.client.gui.GuiButton;
1110
import net.minecraft.client.gui.GuiMerchant;
11+
import net.minecraft.client.renderer.RenderHelper;
1212
import net.minecraft.enchantment.Enchantment;
1313
import net.minecraft.entity.player.InventoryPlayer;
1414
import net.minecraft.inventory.ClickType;
15-
import net.minecraft.inventory.Slot;
1615
import net.minecraft.item.Item;
1716
import net.minecraft.item.ItemEnchantedBook;
1817
import 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
}

src/main/java/de/guntram/mcmod/easiervillagertrading/EasierVillagerTrading.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
public class EasierVillagerTrading {
1010

1111
public static final String MODID = "easiervillagertrading";
12-
public static final String VERSION = "0.1";
12+
public static final String VERSION = "1.01";
1313

1414
@EventHandler
1515
public void init(FMLInitializationEvent event)

src/main/resources/mcmod.info

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"description": "Less clicks to trade with villagers",
66
"version": "${version}",
77
"mcversion": "${mcversion}",
8-
"url": "",
8+
"url": "https://mods.curse.com/mc-mods/minecraft/261605-easiervillagertrading",
99
"updateUrl": "",
1010
"authorList": ["Giselbaer"],
1111
"credits": "",

0 commit comments

Comments
 (0)