So I'm trying to update my mods to 1.3.2. I have everything working but one single bug: whenever I try to put a stack of items inside a custom inventory, the stack is duplicated, and whenever I try to remove it, it totally disappears. Example: I have a stack of 2, I try to place it in a slot in my custom inventory and the stack size is now 4, I remove it and it disappears. This is very strange as the same code worked in 1.2.5. This is my code:
InventoryResearch:
package jimmynator.researchcraft;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import cpw.mods.fml.client.FMLClientHandler;
import net.minecraft.client.Minecraft;
import net.minecraft.src.Block;
import net.minecraft.src.CraftingManager;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.IInvBasic;
import net.minecraft.src.IInventory;
import net.minecraft.src.IRecipe;
import net.minecraft.src.InventoryBasic;
import net.minecraft.src.InventoryPlayer;
import net.minecraft.src.ItemStack;
import net.minecraft.src.NBTTagCompound;
import net.minecraft.src.NBTTagList;
import net.minecraft.src.StringTranslate;
public class InventoryResearch implements IInventory {
public ItemStack[] itemStacks = new ItemStack[9];
public InventoryPlayer inventoryPlayer;
public GuiResearchButton researchButton;
public int researchProgress = 0;
public boolean isResearching = false;
public String recipeToShow = "";
public InventoryResearch(InventoryPlayer inventoryplayer) {
this.inventoryPlayer = inventoryplayer;
}
public void setIsResearching(GuiResearchButton guibutton, boolean flag) {
if (flag) {
researchProgress = 0;
recipeToShow = "";
}
if (guibutton != null) {
researchButton = guibutton;
}
isResearching = !isResearching;
researchButton.enabled = !isResearching;
}
public void updateInventory() {
if (isResearching) {
if (researchProgress < 12000) {
if (inventoryPlayer.player.getFoodStats().getFoodLevel() - 10 > 0) {
researchProgress += (inventoryPlayer.player.getFoodStats().getFoodLevel() - 10)*10;
inventoryPlayer.player.addExhaustion(0.0025F);
}
} else {
Random rand = inventoryPlayer.player.worldObj.rand;
researchProgress = 12000;
List recipelist = new ArrayList();
recipelist.add(10);
List recipes = CraftingManager.getInstance().getRecipeList();
for (int index = 0; index < recipes.size(); index++) {
String recipe = ResearchCraft.dataHandler.getRecipeString((IRecipe)recipes.get(index));
if (recipe == null) {
continue;
}
ItemStack[] stacks = ResearchCraft.dataHandler.getStacksFromString(recipe);
int itemok = 0;
int size = 0;
for (int i = 1; i < stacks.length; i++) {
if (stacks[i] != null) {
size++;
for (int j = 36; j < 36 + getSizeInventory(); j++) {
if (getStackInSlot(j) != null && stacks[i].itemID == getStackInSlot(j).itemID) {
if (stacks[i].itemID < Block.blocksList.length || !(stacks[i].isItemStackDamageable())) {
if (stacks[i].getItemDamage() != -1) {
if (stacks[i].getItemDamage() == getStackInSlot(j).getItemDamage()) {
itemok++;
break;
}
} else {
itemok++;
break;
}
} else {
itemok++;
break;
}
}
}
} else {
itemok++;
}
}
if (itemok == stacks.length - 1) {
if (!ResearchCraft.dataHandler.getIsResearched(recipe, inventoryPlayer.player)) {
if (recipe.contains("#@58:0") ||
(recipe.contains("#@54:0") && ResearchCraft.dataHandler.getIsResearched("#@58:0", inventoryPlayer.player)) ||
(recipe.contains("#@61:0") && ResearchCraft.dataHandler.getIsResearched("#@58:0", inventoryPlayer.player)) ||
(recipe.contains("#@355:0") && ResearchCraft.dataHandler.getIsResearched("#@58:0", inventoryPlayer.player))) {
recipelist = new ArrayList();
recipelist.add(size);
recipelist.add(recipe);
break;
} else if (size < (Integer) recipelist.get(0)) {
recipelist = new ArrayList();
recipelist.add(size);
recipelist.add(recipe);
} else if (size == (Integer) recipelist.get(0)) {
recipelist.add(recipe);
}
}
}
}
if (recipelist.size() > 1) {
if (rand.nextBoolean()) {
if (!ResearchCraft.dataHandler.getPlayerString(inventoryPlayer.player).contains("#")) {
inventoryPlayer.player.addStat(ResearchCraft.instance.achievements[0], 1);
}
recipeToShow = (String) recipelist.get(rand.nextInt(recipelist.size() - 1) + 1);
if (!ResearchCraft.dataHandler.getPlayerString(inventoryPlayer.player).contains(recipeToShow)) {
ResearchCraft.dataHandler.setPlayerString(inventoryPlayer.player, ResearchCraft.dataHandler.getPlayerString(inventoryPlayer.player).concat(recipeToShow));
PacketHandler.sendRecipeResearch(recipeToShow);
}
setIsResearching(researchButton, false);
ItemStack stack = ResearchCraft.dataHandler.getStacksFromString(recipeToShow)[0];
Minecraft.getMinecraft().ingameGUI.getChatGUI().printChatMessage(stack.getItem().getItemDisplayName(stack) + ". " + StringTranslate.getInstance().translateKey("gui.yes") + "!");
} else {
for (int i = 36; i < 36 + getSizeInventory(); i++) {
if (getStackInSlot(i) != null) {
if (rand.nextBoolean()) {
if (getStackInSlot(i).stackSize > 1) {
getStackInSlot(i).stackSize -= 1;
setInventorySlotContents(i, getStackInSlot(i));
} else {
setInventorySlotContents(i, null);
}
PacketHandler.sendReduceResearch(i);
}
}
}
if (isResearching) {
setIsResearching(researchButton, false);
setIsResearching(researchButton, true);
} else {
setIsResearching(researchButton, true);
}
}
} else {
for (int i = 36; i < 36 + getSizeInventory(); i++) {
if (getStackInSlot(i) != null) {
if (rand.nextBoolean()) {
if (getStackInSlot(i).stackSize > 1) {
getStackInSlot(i).stackSize -= 1;
setInventorySlotContents(i, getStackInSlot(i));
} else {
setInventorySlotContents(i, null);
}
PacketHandler.sendReduceResearch(i);
}
}
}
if (isResearching) {
setIsResearching(researchButton, true);
Minecraft.getMinecraft().ingameGUI.getChatGUI().printChatMessage(StringTranslate.getInstance().translateKey("potion.prefix.uninteresting") + "...");
}
}
}
}
}
public int getResearchProgressScaled(int par1) {
return (int) (par1 * (researchProgress / 12000F));
}
@Override
public int getSizeInventory() {
return 9;
}
@Override
public ItemStack getStackInSlot(int var1) {
return itemStacks[var1 - 36];
}
@Override
public ItemStack decrStackSize(int var1, int var2) {
System.out.println("lol2? " + var1 + " " + var2);
if (this.itemStacks[var1 - 36] != null) {
ItemStack var3;
if (this.itemStacks[var1 - 36].stackSize <= var2) {
var3 = this.itemStacks[var1 - 36];
this.itemStacks[var1 - 36] = null;
this.onInventoryChanged();
return var3;
} else {
var3 = this.itemStacks[var1 - 36].splitStack(var2);
if (this.itemStacks[var1 - 36].stackSize == 0) {
this.itemStacks[var1 - 36] = null;
}
this.onInventoryChanged();
return var3;
}
} else {
return null;
}
}
@Override
public ItemStack getStackInSlotOnClosing(int var1) {
return null;
}
@Override
public void setInventorySlotContents(int var1, ItemStack var2) {
System.out.println("lol? " + var1 + " " + var2);
this.itemStacks[var1 - 36] = var2;
this.onInventoryChanged();
}
@Override
public String getInvName() {
return "Research Inventory";
}
@Override
public int getInventoryStackLimit() {
return 64;
}
@Override
public void onInventoryChanged() {}
@Override
public boolean isUseableByPlayer(EntityPlayer var1) {
return this.inventoryPlayer.player.isDead ? false : var1.getDistanceSqToEntity(this.inventoryPlayer.player) <= 64.0D;
}
@Override
public void openChest() {}
@Override
public void closeChest() {}
}
ContainerResearch:
package jimmynator.researchcraft;
import net.minecraft.src.Container;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.IInventory;
import net.minecraft.src.InventoryPlayer;
import net.minecraft.src.ItemStack;
import net.minecraft.src.Slot;
public class ContainerResearch extends Container
{
public IInventory researchInventory;
public ContainerResearch(InventoryPlayer inventoryplayer, InventoryResearch inventoryresearch) {
researchInventory = inventoryresearch;
int var3;
int var4;
this.addSlotToContainer(new Slot(inventoryresearch, 36, 6, 16));
this.addSlotToContainer(new Slot(inventoryresearch, 37, 27, 6));
this.addSlotToContainer(new Slot(inventoryresearch, 38, 50, );
this.addSlotToContainer(new Slot(inventoryresearch, 39, 11, 38));
this.addSlotToContainer(new Slot(inventoryresearch, 40, 34, 30));
this.addSlotToContainer(new Slot(inventoryresearch, 41, 59, 35));
this.addSlotToContainer(new Slot(inventoryresearch, 42, 13, 60));
this.addSlotToContainer(new Slot(inventoryresearch, 43, 32, 53));
this.addSlotToContainer(new Slot(inventoryresearch, 44, 53, 61));
for (var3 = 0; var3 < 3; ++var3) {
for (var4 = 0; var4 < 9; ++var4) {
this.addSlotToContainer(new Slot(inventoryplayer, var4 + (var3 + 1) * 9, 8 + var4 * 18, 84 + var3 * 18));
}
}
for (var3 = 0; var3 < 9; ++var3) {
this.addSlotToContainer(new Slot(inventoryplayer, var3, 8 + var3 * 18, 142));
}
}
@Override
public boolean canInteractWith(EntityPlayer var1) {
return true;
}
@Override
public ItemStack transferStackInSlot(int par1) {
ItemStack var2 = null;
Slot var3 = (Slot)this.inventorySlots.get(par1);
if (var3 != null && var3.getHasStack()) {
ItemStack var4 = var3.getStack();
var2 = var4.copy();
if (par1 == 0) {
if (!this.mergeItemStack(var4, 9, 45, true)) {
return null;
}
var3.onSlotChange(var4, var2);
} else if (par1 >= 9 && par1 < 36) {
if (!this.mergeItemStack(var4, 36, 45, false)) {
return null;
}
} else if (par1 >= 36 && par1 < 45) {
if (!this.mergeItemStack(var4, 9, 36, false)) {
return null;
}
} else if (!this.mergeItemStack(var4, 9, 45, false)) {
return null;
}
if (var4.stackSize == 0) {
var3.putStack((ItemStack)null);
} else {
var3.onSlotChanged();
}
if (var4.stackSize == var2.stackSize) {
return null;
}
var3.onPickupFromSlot(var4);
}
return var2;
}
}
GuiResearch (only client side):
package jimmynator.researchcraft;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.GuiButton;
import net.minecraft.src.GuiContainer;
import net.minecraft.src.InventoryPlayer;
import net.minecraft.src.ItemStack;
import net.minecraft.src.OpenGlHelper;
import net.minecraft.src.RenderHelper;
import net.minecraft.src.ScaledResolution;
import net.minecraft.src.Slot;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
public class GuiResearch extends GuiContainer {
private static ContainerResearch container = null;
public GuiResearchButton startResearch;
public InventoryPlayer inventoryPlayer;
public InventoryResearch inventoryResearch;
public GuiResearch(EntityPlayer par1EntityPlayer) {
super(new ContainerResearch(par1EntityPlayer.inventory, ResearchCraft.dataHandler.getInventoryResearch(par1EntityPlayer)));
inventoryPlayer = par1EntityPlayer.inventory;
inventoryResearch = ResearchCraft.dataHandler.getInventoryResearch(par1EntityPlayer);
}
@Override
public void initGui() {
super.initGui();
guiLeft = (width - xSize) / 2;
guiTop = (height - ySize) / 2;
controlList.clear();
startResearch = new GuiResearchButton(0, guiLeft + 87, guiTop + 61, 18, 18, "");
inventoryResearch.setIsResearching(startResearch, false);
inventoryResearch.setIsResearching(startResearch, false);
controlList.add(startResearch);
}
@Override
protected void actionPerformed(GuiButton guibutton) {
if (guibutton.id == 0) {
inventoryResearch.setIsResearching((GuiResearchButton) guibutton, true);
}
}
@Override
protected void drawGuiContainerForegroundLayer() {
this.fontRenderer.drawString("Research", 118, 68, 4210752);
}
@Override
protected void drawGuiContainerBackgroundLayer(float f, int i, int j) {
int r = mc.renderEngine.getTexture("/textures/researchcraft_research.png");
GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F);
mc.renderEngine.bindTexture(r);
int w = (width - xSize) / 2;
int h = (height - ySize) / 2;
//GUI
drawTexturedModalRect(w, h, 0, 0, xSize, ySize);
//Bulb
int scaledProgress = inventoryResearch.getResearchProgressScaled(31);
drawTexturedModalRect(w + 86, h + 27 + (31 - scaledProgress), 176, 0 + (31 - scaledProgress), 20, scaledProgress);
//Button
if (startResearch.drawButton) {
ScaledResolution var13 = new ScaledResolution(mc.gameSettings, mc.displayWidth, mc.displayHeight);
int var14 = var13.getScaledWidth();
int var15 = var13.getScaledHeight();
int var16 = Mouse.getX() * var14 / mc.displayWidth;
int var17 = var15 - Mouse.getY() * var15 / mc.displayHeight - 1;
boolean var5 = var16 >= startResearch.xPosition && var17 >= startResearch.yPosition && var16 < startResearch.xPosition + startResearch.width && var17 < startResearch.yPosition + startResearch.height;
int var6 = startResearch.getHoverState(var5);
drawTexturedModalRect(w + 87, h + 61, 176, 32 + var6 * 18, startResearch.width, startResearch.height);
startResearch.mouseDragged(mc, var16, var17);
}
//Research recipe
if (inventoryResearch.researchProgress >= 12000 && inventoryResearch.recipeToShow != "") {
ItemStack[] stacks = ResearchCraft.dataHandler.getStacksFromString(inventoryResearch.recipeToShow);
drawStackInventory(stacks[0], 88, ;
drawStackInventory(stacks[1], 116, ;
drawStackInventory(stacks[2], 134, ;
drawStackInventory(stacks[3], 152, ;
drawStackInventory(stacks[4], 116, 26);
drawStackInventory(stacks[5], 134, 26);
drawStackInventory(stacks[6], 152, 26);
drawStackInventory(stacks[7], 116, 44);
drawStackInventory(stacks[8], 134, 44);
drawStackInventory(stacks[9], 152, 44);
}
}
private void drawStackInventory(ItemStack itemstack, int x, int y) {
ItemStack newitem = null;
if (itemstack != null) {
newitem = itemstack.copy();
if (itemstack.getItemDamage() == -1) {
newitem.setItemDamage(0);
}
}
RenderHelper.enableGUIStandardItemLighting();
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_DEPTH_TEST);
Slot var6 = null;
short var7 = 240;
short var8 = 240;
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)var7 / 1.0F, (float)var8 / 1.0F);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
zLevel = 100.0F;
itemRenderer.zLevel = 100.0F;
if (itemstack != null) {
itemRenderer.renderItemIntoGUI(fontRenderer, mc.renderEngine, newitem, guiLeft + x, guiTop + y);
itemRenderer.renderItemOverlayIntoGUI(fontRenderer, mc.renderEngine, newitem, guiLeft + x, guiTop + y);
}
itemRenderer.zLevel = 0.0F;
zLevel = 0.0F;
GL11.glDisable(GL12.GL_RESCALE_NORMAL);
RenderHelper.disableStandardItemLighting();
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_DEPTH_TEST);
}
@Override
protected void keyTyped(char par1, int par2) {
if (par2 == 1 || par2 == this.mc.gameSettings.keyBindInventory.keyCode || par2 == ClientKeyHandler.Research.keyCode) {
this.mc.thePlayer.closeScreen();
}
}
}