Сохранение (и считывание) FluidTank'а в NBT

Версия Minecraft
1.12.2
Пытаюсь разобраться с хранилищами жидкости. Столкнулся со следующей проблемой: при перезаходе в мир жидкость из бака пропадает. Прилагаю код методов записи и чтения NBT из класса TileEntity:
Java:
    @Override
    public void readFromNBT(NBTTagCompound compound)
    {
        super.readFromNBT(compound);

        this.inventory = NonNullList.<ItemStack>withSize(this.getSizeInventory(), ItemStack.EMPTY);
        ItemStackHelper.loadAllItems(compound, this.inventory);

        //<чтение нескольких числовых переменных>

        this.waterTank.readFromNBT(compound);
        this.steamTank.readFromNBT(compound);
    }

    @Override
    public NBTTagCompound writeToNBT(NBTTagCompound compound)
    {
        super.writeToNBT(compound);

        //<запись нескольких числовых переменных>

        ItemStackHelper.saveAllItems(compound, this.inventory);

        this.waterTank.writeToNBT(compound);
        this.steamTank.writeToNBT(compound);

        return compound;
    }

Буду благодарен за любую помощь.
 
Решение
У тебя 2 танка записываются с одинаковыми id.
Типо "жижа такая-то" "жижа такая-то"
А тебе надо разделить "вода -> жижа такая-то", "пар -> жижа такая-то"
Следовательно тебе нужно разделить FluidTank#writeToNBT.
Просто сделать compound.putTag("water", waterTank.write...);
(По поводу putTag - посмотри то, что принимает String и NBTBase)
3,005
192
592
У тебя 2 танка записываются с одинаковыми id.
Типо "жижа такая-то" "жижа такая-то"
А тебе надо разделить "вода -> жижа такая-то", "пар -> жижа такая-то"
Следовательно тебе нужно разделить FluidTank#writeToNBT.
Просто сделать compound.putTag("water", waterTank.write...);
(По поводу putTag - посмотри то, что принимает String и NBTBase)
 
5,018
47
783
3,005
192
592
@Maxik Круто, что ты показываешь класс с тайлом, который хранит жижу, но как-бы там юзается класс из MinecraftForge, а не свой.
К тому же там есть только 1 жижа, а челику нужно хранить 2.

~~~

Кстати, что там изучать? Он просто юзает класс форге и все.
 
У тебя 2 танка записываются с одинаковыми id.
Типо "жижа такая-то" "жижа такая-то"
А тебе надо разделить "вода -> жижа такая-то", "пар -> жижа такая-то"
Следовательно тебе нужно разделить FluidTank#writeToNBT.
Просто сделать compound.putTag("water", waterTank.write...);
(По поводу putTag - посмотри то, что принимает String и NBTBase)

То есть, стандартные методы записи и чтения подходят только для тайлов с 1 баком?
 
3,005
192
592
Ты и так и так будешь юзать стандартные методы записи.
У тебя они просто пересекаются из-за того, что у тебя 2 танка.

Возможно, setTag, просто я на 1.14 сейчас сижу, на 1.12 не много лень заходить.
 
Сделал следующее:
Java:
compound.setTag("waterTank", this.waterTank.writeToNBT(compound));
compound.setTag("steamTank", this.steamTank.writeToNBT(compound));

Теперь игра выдает исключение о забитии стэка, без краша...
Происходит это при заполнении бака жижей.
Exception in thread "File IO Thread" [17:27:37] [Server thread/INFO] [STDOUT]: [theorangeind.htu.objects.boiler.TileEntitySteamBoiler:update:158]: Water: 1000
[17:27:37] [File IO Thread/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]: java.lang.StackOverflowError
[17:27:37] [File IO Thread/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]: at java.io.DataOutputStream.write(DataOutputStream.java:107)
[17:27:37] [File IO Thread/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]: at java.io.DataOutputStream.writeUTF(DataOutputStream.java:401)
[17:27:37] [File IO Thread/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]: at java.io.DataOutputStream.writeUTF(DataOutputStream.java:323)
[17:27:37] [File IO Thread/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]: at net.minecraft.nbt.NBTTagString.write(NBTTagString.java:29)
[17:27:37] [File IO Thread/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]: at net.minecraft.nbt.NBTTagCompound.writeEntry(NBTTagCompound.java:581)
[17:27:37] [File IO Thread/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]: at net.minecraft.nbt.NBTTagCompound.write(NBTTagCompound.java:39)
[17:27:37] [File IO Thread/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]: at net.minecraft.nbt.NBTTagCompound.writeEntry(NBTTagCompound.java:581)
[17:27:37] [File IO Thread/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]: at net.minecraft.nbt.NBTTagCompound.write(NBTTagCompound.java:39)
...
 
3,005
192
592
Укажи новый таг, а не компоунд.
Плюс в реад тоже нужно указать не компоунд, а compound getCompoundTag water / steam
 
Сделал вот так:
Java:
compound.setTag("waterTank", this.waterTank.writeToNBT(new NBTTagCompound()));
compound.setTag("steamTank", this.steamTank.writeToNBT(new NBTTagCompound()));
Надеюсь, что правильно понял)

А по поводу getCompound... как его правильно применить. Мне же нужно приравнять бак к какому то значению при чтении, значит мне надо получить этот тег, а как потом из него извлечь сам бак?
 
3,005
192
592
Понял правильно.

this.waterTank.readFromNBT(compound); this.steamTank.readFromNBT(compound);
Ты вот тут просто указываешь не compound, а compound.getTag("water") и так же с паром.

По поводу "прировнять" - в коде, что в #1 нету.
 
Сверху