Предмет и инвентарь

Версия Minecraft
1.7.10
API
Forge
24
1
1
Хочу создать предмет который будет иметь интерфейс, кароче примитивную сумку, чтобы не запариваться и придумать что то правильно решил сделать отдельный враппер под ItemStack чтобы можно переиспользовать в будущем, но проблема в том, що как только предметы попадут в слоты "предмета" при следующем открытии их не будет
Дебажил до момента записи нбт, запись идет в стак, после открытия нбт пустое
Смотрел разные реализации, в драконике, термал, таумкрафт, все используют сильно модульные класы, что приводит к непониманию
Код враппера public class ItemStackInventory implements IInventory { private final Entit - Pastebin.com

В предмете, дабы сильно не мудрить решил сделать "заглушкой" оно работает, и не крашит, мне этого достаточно
Java:
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
        if (!world.isRemote && player.isSneaking()) {
            ItemStack currentItem = player.inventory.getCurrentItem();
            if (currentItem != null) {
                if (currentItem.getItem() == this) {
                    ItemStackInventory inventory = new ItemStackInventory(player, currentItem, 36);
                    player.displayGUIChest(inventory);
                }
            }
        }

        return stack;
    }

Пытался и хранить еще и само нбт может оно как сбрасывается, и в него записывать, сохранять при любом действии, не помогло
Есть предположение что мне передается левый стак, который не правильный, потому что логи в onUpdate пустые при любых действиях или надо писать свой контейнер, и в нем уже сохранять при закрытии, но мне кажется бред что setInventorySlotContents с обновлением нбт не сохраняет, а при контейнере будет..
Тестил только в локале, чтобы без синхронизации

При закрытии сохраняет
[Server thread/INFO] [STDOUT]: [.api.ItemStackInventory:closeInventory:121]: {Items:[0:{Slot:21b,id:225s,Count:1b,Damage:0s},1:{Slot:30b,id:225s,Count:1b,Damage:0s}]}
Но как только начинаю открывать,

[Server thread/INFO] [STDOUT]: [:eek:nUpdate:81]: {}
[Client thread/INFO] [STDOUT]: [:eek:nUpdate:81]: {}
 
Решение
пробовать в saveToNBT() сохранять данные в стак, а потом делать player.inventory.setCurrentItem()
private void saveToNBT():
private void saveToNBT() {
System.out.printf("Item %s == %s: %s%n", player.getCurrentEquippedItem(), itemStack, player.getCurrentEquippedItem() == itemStack);
if (!itemStack.hasTagCompound()) {
itemStack.setTagCompound(new NBTTagCompound());
    }
NBTTagList tagList = new NBTTagList();
for (int i = 0; i < inventory.length; i++) {
if (inventory[i] != null) {
NBTTagCompound tag = new NBTTagCompound();
tag.setByte("Slot", (byte) i);
 inventory[i].writeToNBT(tag);
            tagList.appendTag(tag);
        }
    }
itemStack.getTagCompound().setTag("Items", tagList);

// Замена предмета
int currentItem =...
Оказалось все намного интересней, при вызове ItemStack#onItemRightClick(ItemStack stack, World world, EntityPlayer player)
Создается новый стак, поэтому я и не могу прочитать нбт, а куда девается предыдущий стак с сохраненным нбт, я не знаю...
 
Создается новый стак, поэтому я и не могу прочитать нбт
Это очень странно. Такое может происходить только на стороне клиента, при обновлении стака из пакета. На сервере нет причины его заменять.
 
Назад
Сверху