インベントリにアイテムを入れるとおかしくなる

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.320306)

インベントリにアイテムを入れるとおかしくなる

投稿記事by stocheche » 2018年9月17日(月) 17:41

Minecraft1.7.10のmoddingで質問です。
https://mcmodding.jp/modding/index.php/ ... D%E5%8A%A0を参考に、インベントリを持つアイテムを追加したのですが、インベントリにアイテムを入れるとそれが二倍になって、出そうとすると消えてしまいます。
怪しそうな部分のソースを載せるので、どこかおかしな点があったらご指摘願います。

Inventory

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;

public class InventoryHandy_Chest implements IInventory
{
private InventoryPlayer inventoryPlayer;
private ItemStack currentItem;
public static ItemStack[] items;

public InventoryHandy_Chest(InventoryPlayer inventory)
{
inventoryPlayer = inventory;
currentItem = inventoryPlayer.getCurrentItem();

//InventorySize
items = new ItemStack[54];
}

@Override
public int getSizeInventory()
{
return items.length;
}

@Override
public ItemStack getStackInSlot(int slot)
{
return items[slot];
}

@Override
public ItemStack decrStackSize(int p_70298_1_, int p_70298_2_)
{
if (this.items[p_70298_1_] != null)
{
ItemStack itemstack;

if (this.items[p_70298_1_].stackSize <= p_70298_2_)
{
itemstack = this.items[p_70298_1_];
this.items[p_70298_1_] = null;
this.markDirty();
return itemstack;
}
else
{
itemstack = this.items[p_70298_1_].splitStack(p_70298_2_);

if (this.items[p_70298_1_].stackSize == 0)
{
this.items[p_70298_1_] = null;
}

this.markDirty();
return itemstack;
}
}
return null;
}

@Override
public ItemStack getStackInSlotOnClosing(int p_70304_1_)
{
if (this.items[p_70304_1_] != null)
{
ItemStack itemstack = this.items[p_70304_1_];
this.items[p_70304_1_] = null;
return itemstack;
}
return null;
}

@Override
public void setInventorySlotContents(int p_70299_1_, ItemStack p_70299_2_)
{
this.items[p_70299_1_] = p_70299_2_;

if (p_70299_2_ != null && p_70299_2_.stackSize > this.getInventoryStackLimit())
{
p_70299_2_.stackSize = this.getInventoryStackLimit();
}

this.markDirty();
}

@Override
public String getInventoryName()
{
return "container.HandyChest";
}

@Override
public boolean hasCustomInventoryName()
{
return false;
}

@Override
public int getInventoryStackLimit()
{
return 64;
}

@Override
public void markDirty() {}

@Override
public boolean isUseableByPlayer(EntityPlayer p_70300_1_)
{
return true;
}


@Override
public void openInventory()
{
if(!currentItem.hasTagCompound())
{
currentItem.setTagCompound(new NBTTagCompound());
currentItem.getTagCompound().setTag("Items", new NBTTagList());
}
NBTTagList tags = (NBTTagList)currentItem.getTagCompound().getTag("Items");

for(int i = 0; i < tags.tagCount(); i++)
{
NBTTagCompound tagCompound = tags.getCompoundTagAt(i);
int slot = tagCompound.getByte("Slot");
if(slot >= 0 && slot < items.length)
{
items[slot] = ItemStack.loadItemStackFromNBT(tagCompound);
}
}
}
@Override
public void closeInventory()
{
NBTTagList tagList = new NBTTagList();
for(int i = 0; i < items.length; i++)
{
if(items[i] != null)
{
NBTTagCompound compound = new NBTTagCompound();
compound.setByte("Slot", (byte)i);
items[i].writeToNBT(compound);
tagList.appendTag(compound);
}
}
ItemStack result = new ItemStack(currentItem.getItem(), 1);
result.setTagCompound(new NBTTagCompound());
result.getTagCompound().setTag("Items", tagList);
inventoryPlayer.mainInventory[inventoryPlayer.currentItem] = result;
}

@Override
public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_)
{
return true;
}
}

Container


import com.sampleMod.TileEntity.InventoryHandy_Chest;
import com.sampleMod.items.samplemodItems;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;

public class ContainerHandy_chest extends Container
{
public InventoryHandy_Chest inventory;
public ContainerHandy_chest(InventoryPlayer inventoryPlayer)
{
inventory = new InventoryHandy_Chest(inventoryPlayer);
inventory.openInventory();

int i = 2 * 18 + 1;

for (int j = 0; j < 6; ++j)
{
for (int k = 0; k < 9; ++k)
{
this.addSlotToContainer(new Slot(inventory, k + j * 9, 8 + k * 18, 18 + j * 18));
}
}

for (int j = 0; j < 3; ++j)
{
for (int k = 0; k < 9; ++k)
{
this.addSlotToContainer(new SlotHandy_chest(inventoryPlayer, k + j * 9 + 9, 8 + k * 18, 103 + j * 18 + i));
}
}

for (int j = 0; j < 9; ++j)
{
this.addSlotToContainer(new SlotHandy_chest(inventoryPlayer, j, 8 + j * 18, 161 + i));
}

}


@Override
public boolean canInteractWith(EntityPlayer p_75145_1_)
{
return true;
}

@Override
public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int p_82846_2_)
{
ItemStack itemStack = null;
Slot slot = (Slot) inventorySlots.get(p_82846_2_);
if (slot != null && slot.getHasStack()) {
ItemStack itemStack1 = slot.getStack();
itemStack = itemStack1.copy();
if (0 <= p_82846_2_ && p_82846_2_ < 54) {
if (!this.mergeItemStack(itemStack1, 54, 90, true)) {
return null;
}
} else {
if (!this.mergeItemStack(itemStack1, 0, 54, false)) {
return null;
}
else if(slot.getStack() != null && slot.getStack().getItem() == samplemodItems.ToolHandy_chest)
{
return null;
}
else if (!this.mergeItemStack(itemStack1, 0, this.inventory.getSizeInventory(), false))
{
return null;
}
if (itemStack1.stackSize == 0)
{
slot.putStack((ItemStack)null);
}
else
{
slot.onSlotChanged();
}
}
}
return itemStack;
}
@Override
public void onContainerClosed(EntityPlayer p_75134_1_)
{
super.onContainerClosed(p_75134_1_);
this.inventory.closeInventory();

}
}
stocheche
ID:6b9a3681
 

  • (PostNo.320308)

Re: インベントリにアイテムを入れるとおかしくなる

投稿記事by stocheche » 2018年9月17日(月) 17:44

追記します
Forge 10.13.4.1558です。
あと、マルチプレイではなぜか普通に使えます。
stocheche
ID:6b9a3681
 


Return to 質問:開発・制作関連

x