Не сохраняются предметы в предмете

Версия Minecraft
1.11.2
1,015
9
102
save вызывается при изменении любого слота, а load при открытии инвентаря. Когда кладу предмет в слот, закрываю инвентарь и открываю его обратно - его нет. Когда дебажил понял, что save проходит нормально, но когда наступает load тег Items всегда пустой. В чём может быть проблема?
Код:
   public void save(){
        NBTTagCompound category = getNotNullCategory(sword);
        NBTTagList list = new NBTTagList();
        for (int i = 0; i < this.getSizeInventory(); ++i) {
            if (!this.getStackInSlot(i).isEmpty()) {
                NBTTagCompound stackTag = new NBTTagCompound();
                stackTag.setByte("Slot", (byte) i);
                this.getStackInSlot(i).writeToNBT(stackTag);
                list.appendTag(stackTag);
            }
        }
        category.setTag("Items", list);
        sword.getTagCompound().setTag(ExtremeEnergy.NBT_CATEGORY, category);
    }

    public void load(){
        NBTTagCompound category = getNotNullCategory(sword);
        NBTTagList list = category.getTagList("Items", 10);
        for (int i = 0; i < list.tagCount(); ++i) {
            NBTTagCompound stackTag = list.getCompoundTagAt(i);
            this.slots[i] = new ItemStack(stackTag);
        }
    }

    public static NBTTagCompound getNotNullCategory(ItemStack stack) {
        if (!stack.hasTagCompound()) {
            stack.setTagCompound(new NBTTagCompound());
            stack.getTagCompound().setTag(ExtremeEnergy.NBT_CATEGORY, new NBTTagCompound());
        }
        return stack.getTagCompound().getCompoundTag(ExtremeEnergy.NBT_CATEGORY);
    }
 
1,015
9
102
Другие переменные сохраняются, но не айтемы


Вот это в конструкторе IInventory
Код:
        if (!ModUtils.getNotNullCategory(sword).hasKey("Items"))
            save();
        else
            load();

Вот сохронка
Код:
    @Override
    public void markDirty() {
        save();
    }
 
4,046
63
645
Minebot написал(а):
Liahim написал(а):
Ты, как бы, сохраняешь int, а достать пытаешься ItemStack?

Где int? Вот, сохрняеться номер слота и сам предмет
Код:
stackTag.setByte("Slot", (byte) i);
this.getStackInSlot(i).writeToNBT(stackTag);

Сейчас не могу проверить, что там возвращается, но может быть нужно как-то так?
Код:
stackTag = this.getStackInSlot(i).writeToNBT(stackTag);

Или попробовать поменять местами?


В смысле, сперва сохранять стак, а потом присваивать номер слота.
 
1,015
9
102
Ммм, нет, ничего не изменилось. Я попробовал убрать свою категорию и сохранять лист с предметами прямо в тег и всё заработало. Аномально, но мне надо с категорией
Код:
public void save(){
        if (!world.isRemote) {
            System.out.println("save");
            NBTTagList list = new NBTTagList();
            for (int i = 0; i < this.getSizeInventory(); ++i) {
                if (!this.getStackInSlot(i).isEmpty()) {
                    NBTTagCompound stackTag = new NBTTagCompound();
                    stackTag.setByte("Slot", (byte) i);
                    stackTag = this.getStackInSlot(i).writeToNBT(stackTag);
                    list.appendTag(stackTag);
                }
            }
            sword.getTagCompound().setTag("Items", list);
        }
    }

    public void load(){
        System.out.println("load");
        NBTTagList list = sword.getTagCompound().getTagList("Items", 10);
        for (int i = 0; i < list.tagCount(); ++i) {
            NBTTagCompound stackTag = list.getCompoundTagAt(i);
            this.slots[i] = new ItemStack(stackTag);
        }
    }
 
2,505
81
397
Код:
public static NBTTagCompound getNotNullCategory(ItemStack stack)
{
    if (!stack.hasTagCompound()) {
        stack.setTagCompound(new NBTTagCompound());
    }
    if (!stack.getTagCompound().hasKey(ExtremeEnergy.NBT_CATEGORY)) {
        stack.getTagCompound().setTag(ExtremeEnergy.NBT_CATEGORY, new NBTTagCompound());
    }
    return stack.getTagCompound().getCompoundTag(ExtremeEnergy.NBT_CATEGORY);
}
 
1,015
9
102
Dahaka написал(а):
Код:
public static NBTTagCompound getNotNullCategory(ItemStack stack)
{
    if (!stack.hasTagCompound()) {
        stack.setTagCompound(new NBTTagCompound());
    }
    if (!stack.getTagCompound().hasKey(ExtremeEnergy.NBT_CATEGORY)) {
        stack.getTagCompound().setTag(ExtremeEnergy.NBT_CATEGORY, new NBTTagCompound());
    }
    return stack.getTagCompound().getCompoundTag(ExtremeEnergy.NBT_CATEGORY);
}

Не работает  :( Похоже, придется без категории. Но всё равно спасибо
 
1,015
9
102
Ivasik написал(а):
О Боже! А чтение нужно делать так:
ItemStack stack = ItemStack.loadItemStackFromNBT(stackTag); и не стак, а слот...
В ItemStack нет такого метода

Ivasik написал(а):
Эм, почему байты то? У тебя id слота integer, а не byte.
stackTag.setByte("Slot", (byte) i);
попробуй
stackTag.setInteger("Slot", i);
Для меньшей нагрузки. Да и всё равно я эту переменную пока не использую
 
2,505
81
397
Minebot написал(а):
Не знаю, чего у тебя там не работает. Должно работать. Ты уверен, что правильно скопипастил?
Твой вариант неправильно работает, т.к. getCompoundTag возвращает чистый тэг, если такого ключа нет. Причем этот тэг не содержится в теге-родителе. Этакая заглушка-костыль. Чтобы при считывании из тэга ничего не считалось (костыль, потому что в таких случаях обычно возвращают статический константный объект с которым ничего нельзя делать, а тут создается новый тэг).
 
1,015
9
102
Dahaka написал(а):
Minebot написал(а):
Не знаю, чего у тебя там не работает. Должно работать. Ты уверен, что правильно скопипастил?
Твой вариант неправильно работает, т.к. getCompoundTag возвращает чистый тэг, если такого ключа нет. Причем этот тэг не содержится в теге-родителе. Этакая заглушка-костыль. Чтобы при считывании из тэга ничего не считалось (костыль, потому что в таких случаях обычно возвращают статический константный объект с которым ничего нельзя делать, а тут создается новый тэг).

Да, я понял, но тут скорее всего более глубокий баг. Под конец сохронки ставил брейкпоинт и смотрел объект стака, и в категории был NBTList с предметом в нём. А в начале загрузки айтемстак уже содержал в категории пустой NBTList, без предмета
 
Сверху