Предмет с NBT

Статус
В этой теме нельзя размещать новые ответы.
Версия Minecraft
1.7.10

awl

40
7
Вообщем я записываю в NBT определенные штуки
Java:
public void writeTagCompound(ItemStack stack, EntityPlayer player) {
    stack.setTagCompound(new NBTTagCompound());
    stack.getTagCompound().setInteger("currentAmmo", this.currentAmmo);
}
Дальше к примеру при нажатии ЛКМ, пробую вычитать из НБТ тэга значение
stack.getTagCompound().setInteger("currentAmmo", - 1);
В игре при нажатии на ЛКМ крашит (краш-лог прикрепил собсна). Что-то не понимаю в чем проблема, думаю я даун и неправильно работаю с NBT. Если это так, то может кто-то обьяснить с примером как четко и аккуратно создавать НБТ, хранить, изменять и получать.
 
Краш-лог
Time: 23.11.19 0:58
Description: Ticking entity

java.lang.NullPointerException: Ticking entity
at shilov.items.ItemWeapon.shoot(ItemWeapon.java:59)
at shilov.items.ItemWeapon.handleMouse(ItemWeapon.java:70)
at shilov.items.ItemWeapon.onUpdate(ItemWeapon.java:54)
at net.minecraft.item.ItemStack.updateAnimation(ItemStack.java:476)
at net.minecraft.entity.player.InventoryPlayer.decrementAnimations(InventoryPlayer.java:347)
at net.minecraft.entity.player.EntityPlayer.onLivingUpdate(EntityPlayer.java:610)
at net.minecraft.client.entity.EntityPlayerSP.onLivingUpdate(EntityPlayerSP.java:299)
at net.minecraft.entity.EntityLivingBase.onUpdate(EntityLivingBase.java:1816)
at net.minecraft.entity.player.EntityPlayer.onUpdate(EntityPlayer.java:327)
at net.minecraft.client.entity.EntityClientPlayerMP.onUpdate(EntityClientPlayerMP.java:96)
at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2298)
at net.minecraft.world.World.updateEntity(World.java:2258)
at net.minecraft.world.World.updateEntities(World.java:2108)
at net.minecraft.client.Minecraft.runTick(Minecraft.java:2097)
at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1039)
at net.minecraft.client.Minecraft.run(Minecraft.java:962)
at net.minecraft.client.main.Main.main(Main.java:164)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
at net.minecraftforge.gradle.GradleStartCommon.launch(Unknown Source)
at GradleStart.main(Unknown Source)
Краш-лог:
Time: 23.11.19 0:58
Description: Ticking entity

java.lang.NullPointerException: Ticking entity
	at shilov.items.ItemWeapon.shoot(ItemWeapon.java:59)
	at shilov.items.ItemWeapon.handleMouse(ItemWeapon.java:70)
	at shilov.items.ItemWeapon.onUpdate(ItemWeapon.java:54)
	at net.minecraft.item.ItemStack.updateAnimation(ItemStack.java:476)
	at net.minecraft.entity.player.InventoryPlayer.decrementAnimations(InventoryPlayer.java:347)
	at net.minecraft.entity.player.EntityPlayer.onLivingUpdate(EntityPlayer.java:610)
	at net.minecraft.client.entity.EntityPlayerSP.onLivingUpdate(EntityPlayerSP.java:299)
	at net.minecraft.entity.EntityLivingBase.onUpdate(EntityLivingBase.java:1816)
	at net.minecraft.entity.player.EntityPlayer.onUpdate(EntityPlayer.java:327)
	at net.minecraft.client.entity.EntityClientPlayerMP.onUpdate(EntityClientPlayerMP.java:96)
	at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2298)
	at net.minecraft.world.World.updateEntity(World.java:2258)
	at net.minecraft.world.World.updateEntities(World.java:2108)
	at net.minecraft.client.Minecraft.runTick(Minecraft.java:2097)
	at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1039)
	at net.minecraft.client.Minecraft.run(Minecraft.java:962)
	at net.minecraft.client.main.Main.main(Main.java:164)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
	at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
	at net.minecraftforge.gradle.GradleStartCommon.launch(Unknown Source)
	at GradleStart.main(Unknown Source)
Решение
Ну я думаю уже многим понятно, что когда человек произносит такую фразу от него и помощи ждать не стоит и чего-то умного вряд ли вылезет
Я просто не понимаю, почему приходя на форум вы считаете себя баринами, которым все должны беспрекословно помогать, хотя сами не можете даже в азы языка??? Агравейну за несколько тем твоего авторства с подобными картонными вопросами стоило отправить тебя далеко и надолго.
По теме: в методе обновления сделай проверку на то, что у стака нет нбт и там вызывай свой метод writeTagCompound()

awl

40
7
Огласите весь код пожалуйста
Зачем? Все же и так ясно, код того как регаю НБТ кинул, а значение я строку то же кинул как меняю, а меняю я ее при простом нажатии ЛКМ.

По поводу НБТ, вам сюда
Ну и что там интересно? Регаю я собсна так, а там он только регает и получает, а как где хранить можно в классе, как изменять значение и т.п. нет. Если кратко туториал от балды.. :cautious:
 

awl

40
7
Попробовал сейчас вывести в описание чтобы хотя бы глянуть на значение - краш
Java:
Time: 23.11.19 1:14
Description: Rendering screen

java.lang.NullPointerException: Rendering screen
    at shilov.items.ItemWeapon.addInformation(ItemWeapon.java:85)
    at net.minecraft.item.ItemStack.getTooltip(ItemStack.java:641)
    at net.minecraft.client.gui.GuiScreen.renderToolTip(GuiScreen.java:124)
    at net.minecraft.client.gui.inventory.GuiContainerCreative.renderToolTip(GuiContainerCreative.java:769)
    at net.minecraft.client.gui.inventory.GuiContainer.drawScreen(GuiContainer.java:186)
    at net.minecraft.client.renderer.InventoryEffectRenderer.drawScreen(InventoryEffectRenderer.java:44)
    at net.minecraft.client.gui.inventory.GuiContainerCreative.drawScreen(GuiContainerCreative.java:673)
    at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1137)
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1067)
    at net.minecraft.client.Minecraft.run(Minecraft.java:962)
    at net.minecraft.client.main.Main.main(Main.java:164)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
    at net.minecraftforge.gradle.GradleStartCommon.launch(Unknown Source)
    at GradleStart.main(Unknown Source)
Код из описания

Java:
int currentAmmo = stack.stackTagCompound.getInteger("currentAmmo");
list.add("current_ammo: " + currentAmmo);
 
  • Like
Реакции: lnti

awl

40
7
Огласите весь код пожалуйста
А можно весь класс дать? Или ты эту галочку не читая ставил?
Прошу
Java:
public class ItemWeapon extends CustomItem {
    int next = 0;
    String textureName;
    float damage;
    int currentAmmo;
    int maxAmmo;
    int currentDurability;
    int maxDurability;
    
    public ItemWeapon(String name, float damage, int currentAmmo, int maxAmmo, int currentDurability, int maxDurability, String textureName) {
        super.maxStackSize = 1;
        this.setUnlocalizedName("weapon" + ++next);
        LanguageRegistry.addName(this, name);
        this.setCreativeTab(CreativeTabs.tabFood);
        this.textureName = textureName;
        this.damage = damage;
        this.currentAmmo = currentAmmo;
        this.maxAmmo = maxAmmo;
        this.currentDurability = maxDurability;
        this.maxDurability = maxDurability;
    }
    
    public void writeTagCompound(ItemStack stack, EntityPlayer player) {
        stack.setTagCompound(new NBTTagCompound());
        stack.getTagCompound().setInteger("currentAmmo", this.currentAmmo);
        stack.getTagCompound().setInteger("currentDurability", this.currentDurability);


    }
    
    public void onUpdate(ItemStack stack, World world, Entity entity, int p_77663_4_, boolean p_77663_5_) {
        handleMouse(stack);
    }
    
    private void shoot(ItemStack stack) {
        stack.getTagCompound().setInteger("currentAmmo", - 1);
    }
    
    private void handleMouse(ItemStack stack) {
        Minecraft mc = Minecraft.getMinecraft();
        if (mc.inGameHasFocus && mc.currentScreen == null) {
            if (Mouse.isButtonDown(0)) {
                this.shoot(stack);
            }
        }
    }
    
    @SideOnly(Side.CLIENT)
    public void registerIcons(IIconRegister register) {
        this.itemIcon = register.registerIcon("shilov:" + this.textureName + ".png");

    }
    
    @SideOnly(Side.CLIENT)
    public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) {
        list.add("unlocalized_name: " + "weapon" + this.next);
        int currentAmmo = stack.stackTagCompound.getInteger("currentAmmo");
        list.add("current_ammo: " + currentAmmo);
        list.add("max_ammo: " + this.maxAmmo);
        list.add("texture_name: " + this.textureName);
    }
    
}
 

awl

40
7
Таг по-умолчанию нулл в стаке. Ты нигде его не инициализируешь. Вижу метод, но он нигде не вызывается.
Тогда вопрос почему, если я изначально ставлю значение - переменной this.currentAmmo, а ей путем конструктора присваивается в данном случае значение 30.

Вижу метод, но он нигде не вызывается.
А если это не так работает как я думаю (выше написал), то где и как мне его вызвать и сделать вообще это?)
 
627
72
178
Как говорил бывший участник этого форума: Учи джаву чтобы не задавать такие казуальные вопросы....
Специально для тебя есть гайды от бургеров на ютубе, там очень много рассказывается про NBT стаков.
 
  • Чего!?
Реакции: awl

awl

40
7
Как говорил бывший участник этого форума: Учи джаву чтобы не задавать такие казуальные вопросы....
Ну я думаю уже многим понятно, что когда человек произносит такую фразу от него и помощи ждать не стоит и чего-то умного вряд ли вылезет. И что мне рассказывать про NBT, мне нужно понять как записать правильно его в предмете. Agravaine выше мне написал, что проблема в том, что я его не инициализирую. Но я же даю ему переменную this.currentAmmo, а она через конструктор принимает у меня значение.
 

tox1cozZ

aka Agravaine
8,454
598
2,890
Причем тут переменная твоя? ItemStack.stackTagCompound нулл у тебя, инициализируешь его ты в методе writeTagCompound, но нигде его, блен, не вызываешь!
P.S Терпение не безгранично, такие вопросы следуют из незнания и непонимания языка.
 
627
72
178
Ну я думаю уже многим понятно, что когда человек произносит такую фразу от него и помощи ждать не стоит и чего-то умного вряд ли вылезет
Я просто не понимаю, почему приходя на форум вы считаете себя баринами, которым все должны беспрекословно помогать, хотя сами не можете даже в азы языка??? Агравейну за несколько тем твоего авторства с подобными картонными вопросами стоило отправить тебя далеко и надолго.
По теме: в методе обновления сделай проверку на то, что у стака нет нбт и там вызывай свой метод writeTagCompound()
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху