NBT не определен

Версия Minecraft
1.12+
102
3
77
Портирую мод с 1.6.4 до 1.12 и наткнулся на проблему при выводе информации у предмета.

Вот пример самого простого предмета, у которого будет накручиваться счетчик при нажатии ПКМ и выводится в консоль.

Java:
package ddooss.allods.item;

import java.util.List;

import ddooss.allods.Allods;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumHand;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class ItemAllodMap extends Item {

    public ItemAllodMap(String name) {
        this.setUnlocalizedName(name);
        this.setRegistryName(name);
    }

    @Override
    public void registerModels() {
        Allods.proxy.registerItemRenderer(this, 0, "inventory");
    }

    @Override
    public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) {
        if (!playerIn.isRiding() && playerIn instanceof EntityPlayerMP) {
            ItemStack itemstack = playerIn.getActiveItemStack();
            NBTTagCompound nbt = itemstack.getTagCompound();

            if (nbt != null) {
                int count = nbt.getInteger("count");
                System.out.println(count + 1);
                nbt.setInteger("count", count + 1);
            } else {
                System.out.println("new");
                nbt = new NBTTagCompound();
                nbt.setInteger("count", 0);
                itemstack.setTagCompound(nbt);
            }
        }

        return new ActionResult<ItemStack>(EnumActionResult.PASS, playerIn.getHeldItem(handIn));
    }

    @Override
    @SideOnly(Side.CLIENT)
    public void addInformation(ItemStack itemstack, World worldIn, List<String> tooltip, ITooltipFlag flagIn) {
        NBTTagCompound nbt = itemstack.getTagCompound();

        if (nbt != null) {
            int count = nbt.getInteger("count");
            tooltip.add(TextFormatting.GREEN + "Count: " + count);
        } else {
            tooltip.add(TextFormatting.RED + "Oops!");
        }
    }
}

В консоли все как надо, но вот информация предмета не меняется потому что он считает, что itemstack.getTagCompound() в addInformation не определен, хотя на самом деле наоборот.

1.jpg

Версия Minecraft 1.12
Версия Forge 14.21.1.2387
 
Последнее редактирование:
243
28
202
Всё дело в отсутствии синхронизации с клиентом. Создаёшь и изменяешь ты NBT только на сервере (потому что проверяешь на EntityPlayerMP). А метод addInformation() клиентский и NBT у предмета на клиенте нет.

UPD: Не в тему...
 
Последнее редактирование:
102
3
77
Всё дело в отсутствии синхронизации с клиентом. Создаёшь и изменяешь ты NBT только на сервере (потому что проверяешь на EntityPlayerMP). А метод addInformation() клиентский и NBT у предмета на клиенте нет.
Информация как не менялась, так и не меняется.
 
102
3
77
Решение оказалось как всегда простым до невозможности.
В методе onItemRightClick вместо
Java:
ItemStack itemstack = playerIn.getActiveItemStack();
нужно вставить
Код:
ItemStack itemstack = playerIn.getHeldItem(handIn);
т.к. второй случай возвращает непосредственно наш предмет в руке (что возвращал первый я не стал смотреть).
 
Сверху