- 355
- 2
- 17
Около недели провозился с этой проблемой и пришел к выводу, что стоит обратится к знающим, кто сталкивался с кастомным интерфейсом игрока.
Основная задача
Заменить ванильный интерфейс на свой, которые содержит:
Проблема
Когда происходит клик по вещи с хот-бара, да и с рюкзака тоже, вылетает с ошибкой:
(Зачастую после перезахода в одиночный мир, когда в первый раз одеваешь рюкзак и тыкаешь предметы, вроде как все нормально).
java.lang.IndexOutOfBoundsException: Index: 42, Size: 16
Мол пытаюсь вызвать слот, которого нет в массиве.
Хотя длина массива этих слотов 46.
И тут стоит вопрос, откуда он еще берет эти значения, где еще регистрируются слота, уже все перекопал.
P.S.
Заранее уточню, что гуглил везде где только можно, статью coolAlias тоже смотрел, все по сути работает если делать на основе ванильных слотов, но мне нужно вызывать содержимое и слота рюкзака и создавать собственно под них различные исключения.
Ну и в коде существуют переменные которые скорее не используются, это из-за различных вариаций замены инвентаря.
Основная задача
Заменить ванильный интерфейс на свой, которые содержит:
- 4 слота для брони
- 2-4 уникальных слота (Маска, рюкзак.. )
- 5-30 уникальных слотов рюкзака
- 5 ванильных слотов хот-бара.
Проблема
Когда происходит клик по вещи с хот-бара, да и с рюкзака тоже, вылетает с ошибкой:
(Зачастую после перезахода в одиночный мир, когда в первый раз одеваешь рюкзак и тыкаешь предметы, вроде как все нормально).
java.lang.IndexOutOfBoundsException: Index: 42, Size: 16
Мол пытаюсь вызвать слот, которого нет в массиве.
Хотя длина массива этих слотов 46.
И тут стоит вопрос, откуда он еще берет эти значения, где еще регистрируются слота, уже все перекопал.
P.S.
Заранее уточню, что гуглил везде где только можно, статью coolAlias тоже смотрел, все по сути работает если делать на основе ванильных слотов, но мне нужно вызывать содержимое и слота рюкзака и создавать собственно под них различные исключения.
Ну и в коде существуют переменные которые скорее не используются, это из-за различных вариаций замены инвентаря.
Java:
public class PlayerContainerCustom
extends ContainerPlayer
{
protected static EntityPlayer thePlayer;
private InventoryPlayer inventoryPlayer;
private PlayerInventoryCustom inventoryCustom;
private InventoryBackpack inventoryBackpack;
ItemStack prevIt = null;
private int backslots = 0;
public PlayerContainerCustom(EntityPlayer player, InventoryPlayer inventoryPlayer, PlayerInventoryCustom inventoryCustom)
{
super(inventoryPlayer, player.worldObj.isRemote, player);
thePlayer = player;
this.inventoryPlayer = inventoryPlayer;
this.inventoryCustom = inventoryCustom;
inventoryCustom.setPlayerContainerCustom(this);
initContainer(player);
}
public void initContainer(EntityPlayer player)
{
this.inventorySlots.clear();
this.inventoryItemStacks.clear();
this.addSlotToContainer(new SlotCrafting(player, inventoryPlayer, craftResult, 0, 68, 100));
/*
* 4x4 craft matrix
* */
for(int i = 0; i < 2; ++i)
for(int createdinv = 0; createdinv < 2; ++createdinv)
this.addSlotToContainer(new Slot(this.craftMatrix, createdinv + i * 2, 10 + createdinv * 20, 90 + i * 20));
for (int i = 0; i < 4; ++i)
this.addSlotToContainer(new SlotArmor(player, inventoryPlayer, inventoryPlayer.getSizeInventory() - 1 - i, 8, 8 + i * 20, i));
this.addSlotToContainer(new SlotMask(player, inventoryCustom, 0, 80, 8, 8));
this.addSlotToContainer(new SlotBackpack(player, inventoryCustom, 1, 80, 28, 8));
inventoryCustom.editing = true;
ExtendedPlayer extendedPlayer = ExtendedPlayer.get(player);
if ((extendedPlayer.getBackpack() != null) && (extendedPlayer.getBackpack().getItem() instanceof ItemBackpack))
{
ItemBackpack backpack = (ItemBackpack) extendedPlayer.getBackpack().getItem();
InventoryBackpack invBackpack = new InventoryBackpack(extendedPlayer, this);
invBackpack.adding = true;
int backpackSize = ((ItemBackpack) extendedPlayer.getBackpack().getItem()).backpackSize;
backslots = backpackSize;
int rows = (int) Math.ceil(backpackSize / 5.0);
int row = 0;
int indexSlot = 0;
while (backpackSize != 0)
{
if (indexSlot >= 5)
{
row++;
indexSlot = 0;
}
this.addSlotToContainer(new Slot(invBackpack, backpackSize, 104 + indexSlot * 20, ((rows == 1) ? 28 + row * 20 : 10 + row * 20))
{
public boolean isItemValid(ItemStack itemStack)
{
if (itemStack == null) return false;
return !(itemStack.getItem() instanceof ItemBackpack);
}
});
indexSlot++;
backpackSize--;
}
invBackpack.adding = false;
}
inventoryCustom.editing = false;
for (int i = 0; i < 5; ++i)
this.addSlotToContainer(new SlotCustom(inventoryPlayer, i, 40 + i * 20, 142));
this.onCraftMatrixChanged(this.craftMatrix);
MainClass.log("Inventory Slots:");
MainClass.log(" Length: " + inventorySlots.size());
for(Object s : inventorySlots)
{
Slot slot = (Slot) s;
MainClass.log(" > index: " + slot.getSlotIndex() + " II: " + slot.inventory.toString());
}
}
@Override
public boolean canInteractWith(EntityPlayer player)
{
return true;
}
@Override
public ItemStack slotClick(int slotId, int clickedButton, int mode, EntityPlayer player)
{
ItemStack itemstack = super.slotClick(slotId, clickedButton, mode, player);
if ((player.inventory.getItemStack() != this.prevIt) && (!player.worldObj.isRemote) && (slotId < 16 + this.backslots))
{
MainClass.networkWrapper.sendTo(new MSG_InvStack(player.inventory.getItemStack()), (EntityPlayerMP) player);
}
return itemstack;
}
// Shift-click отключен, сначала нужно решить проблему с индексацией слотов.
public ItemStack transferStackInSlot(EntityPlayer player, int par2)
{
return null;
}
}
Java:
public class PlayerInventoryCustom
implements IInventory
{
private final String name = "Inventory";
private final String tagName = "CustomInventory";
private EntityPlayer player;
public boolean editing = false;
private PlayerContainerCustom playerContainerCustom;
public static final int INV_SIZE = 48;
public ItemStack[] inventory = new ItemStack[INV_SIZE];
public PlayerInventoryCustom(EntityPlayer player)
{
this.player = player;
}
public void setPlayerContainerCustom(PlayerContainerCustom playerContainerCustom)
{
this.playerContainerCustom = playerContainerCustom;
}
@Override
public int getSizeInventory()
{
return this.inventory.length;
}
@Override
public ItemStack getStackInSlot(int slot)
{
return this.inventory[slot];
}
@Override
public ItemStack decrStackSize(int slot, int amount)
{
ItemStack stack = this.getStackInSlot(slot);
if(stack != null)
{
if(stack.stackSize > amount)
{
stack = stack.splitStack(amount);
if(stack.stackSize == 0)
this.setInventorySlotContents(slot, (ItemStack) null);
} else {
this.setInventorySlotContents(slot, (ItemStack) null);
}
this.markDirty();
}
return stack;
}
@Override
public ItemStack getStackInSlotOnClosing(int slot)
{
ItemStack stack = this.getStackInSlot(slot);
if(stack != null) {
this.setInventorySlotContents(slot, (ItemStack)null);
}
return stack;
}
public void dropAllItems(EntityPlayer player)
{
ItemStack[] items = this.inventory;
int itemsLength = items.length;
for(int i = 0; i < itemsLength; ++i)
{
ItemStack is = items[i];
if(is != null)
{
player.func_146097_a(is, false, false);
is = null;
}
}
this.markDirty();
}
public ItemStack removeStackFromSlot(int slot)
{
ItemStack stack = this.getStackInSlot(slot);
if(stack != null)
this.setInventorySlotContents(slot, (ItemStack)null);
return stack;
}
@Override
public void setInventorySlotContents(int slot, ItemStack itemStack)
{
this.inventory[slot] = itemStack;
if(itemStack != null && itemStack.stackSize > this.getInventoryStackLimit())
itemStack.stackSize = this.getInventoryStackLimit();
this.markDirty();
}
@Override
public String getInventoryName()
{
return "Inventory";
}
@Override
public boolean hasCustomInventoryName()
{
return true;
}
@Override
public int getInventoryStackLimit() {
return 1;
}
@Override
public void markDirty()
{
for(int i = 0; i < this.getSizeInventory(); ++i) {
if(this.getStackInSlot(i) != null && this.getStackInSlot(i).stackSize == 0) {
this.setInventorySlotContents(i, (ItemStack)null);
}
}
if (!this.editing)
{
ExtendedPlayer extendedPlayer = ExtendedPlayer.get(player);
if ((extendedPlayer.getBackpack() != getStackInSlot(1)) && ((getStackInSlot(1) == null) || getStackInSlot(1).getItem() instanceof ItemBackpack))
{
extendedPlayer.setBackpack(getStackInSlot(1));
this.player.inventory.setItemStack(null);
this.playerContainerCustom.initContainer(player);
}
}
}
@Override
public boolean isUseableByPlayer(EntityPlayer entityPlayer)
{
return true;
}
@Override
public void openInventory()
{}
@Override
public void closeInventory()
{}
@Override
public boolean isItemValidForSlot(int slot, ItemStack itemStack)
{
return true;
}
public void writeToNBT(NBTTagCompound compound)
{
NBTTagList items = new NBTTagList();
for(int i = 0; i < this.getSizeInventory(); ++i)
{
if(this.getStackInSlot(i) != null)
{
NBTTagCompound item = new NBTTagCompound();
item.setByte("Slot", (byte)i);
this.getStackInSlot(i).writeToNBT(item);
items.appendTag(item);
}
}
compound.setTag("MainInventory", items);
}
public void readFromNBT(NBTTagCompound compound)
{
NBTTagList items = compound.getTagList("MainInventory", compound.getId());
for (int i = 0; i < items.tagCount(); ++i)
{
NBTTagCompound item = items.getCompoundTagAt(i);
byte slot = item.getByte("Slot");
if (slot >= 0 && slot < getSizeInventory())
{
inventory[slot] = ItemStack.loadItemStackFromNBT(item);
}
}
}
}