Solved Why the hell is this ItemStack null??

Discussion in 'Plugin Development' started by RoflFrankoc, Jul 17, 2016.

Thread Status:
Not open for further replies.
  1. Offline

    RoflFrankoc

    I am just confused. Why is
    Code:
    inventory.getContents();
    giving me itemstacks that are literally null??
    I am trying to make a plugin that allows players to stack all the same items into one stack. Here is my code
    Getting how much items the player has in total:
    Code:
    public int getAmount(PlayerInventory pi, Material m){
            int r = 0;
            ItemStack[] is = pi.getContents();
            for (ItemStack i : is){
                if (i != null){
                    if (i.getType() == m){
                        r += i.getAmount();
                    }
                }
            }
            return r;
        }
    
    removing items:
    Code:
        public void remove(PlayerInventory pi, Material m, int amount){
            int leftamount = amount;
            ItemStack[] is = pi.getContents();
            for (ItemStack i : is){
                if (i != null){
                    if (i.getType() == m){
                        if (i.getAmount() > leftamount){
                            i.setAmount(i.getAmount() - leftamount);
                            break;
                        }
                        if (i.getAmount() < leftamount){
                            leftamount = leftamount - i.getAmount();
                            pi.remove(i);
                        }
                        if (i.getAmount() == leftamount){
                            pi.remove(i);
                            break;
                        }
                    }
                }
            }
        }
    
    stacking the items:
    Code:
    public void stack(PlayerInventory pi, Material m, Player p){
            int amount = getAmount(pi, m) - 1;
            remove(pi, m, amount);
            pi.addItem(new ItemStack(m, amount));
            p.updateInventory();
        }
    
    Here's the error:
    Code:
    [15:08:41 ERROR]: Could not pass event AsyncPlayerChatEvent to MMOGame v1.0
    org.bukkit.event.EventException at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:297) ~[craftbukkit.jar:git-Bukkit-3fc97ff] at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav
    a:62) ~[craftbukkit.jar:git-Bukkit-3fc97ff] at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.j
    ava:501) [craftbukkit.jar:git-Bukkit-3fc97ff] at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j
    ava:483) [craftbukkit.jar:git-Bukkit-3fc97ff] at net.minecraft.server.v1_8_R1.PlayerConnection.chat(PlayerConnection.j
    ava:983) [craftbukkit.jar:git-Bukkit-3fc97ff] at net.minecraft.server.v1_8_R1.PlayerConnection.a(PlayerConnection.java
    :933) [craftbukkit.jar:git-Bukkit-3fc97ff] at net.minecraft.server.v1_8_R1.PacketPlayInChat.a(SourceFile:37) [craft
    bukkit.jar:git-Bukkit-3fc97ff] at net.minecraft.server.v1_8_R1.PacketPlayInChat.a(SourceFile:9) [craftb
    ukkit.jar:git-Bukkit-3fc97ff] at net.minecraft.server.v1_8_R1.NetworkManager.a(NetworkManager.java:75)
    [craftbukkit.jar:git-Bukkit-3fc97ff] at net.minecraft.server.v1_8_R1.NetworkManager.channelRead0(NetworkManag
    er.java:236) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChanne
    lInboundHandler.java:103) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(Abst
    ractChannelHandlerContext.java:332) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(Abstra
    ctChannelHandlerContext.java:318) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessage
    Decoder.java:163) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(Abst
    ractChannelHandlerContext.java:332) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(Abstra
    ctChannelHandlerContext.java:318) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessage
    Decoder.java:163) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(Abst
    ractChannelHandlerContext.java:332) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(Abstra
    ctChannelHandlerContext.java:318) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessage
    Decoder.java:163) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(Abst
    ractChannelHandlerContext.java:332) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(Abstra
    ctChannelHandlerContext.java:318) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.handler.timeout.ReadTimeoutHandler.channelRead(ReadTimeoutHa
    ndler.java:150) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(Abst
    ractChannelHandlerContext.java:332) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(Abstra
    ctChannelHandlerContext.java:318) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChanne
    lPipeline.java:787) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(Abstra
    ctNioByteChannel.java:125) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.jav
    a:507) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEve
    ntLoop.java:464) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.ja
    va:378) [craftbukkit.jar:git-Bukkit-3fc97ff] at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:350) [craftbu
    kkit.jar:git-Bukkit-3fc97ff] at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThread
    EventExecutor.java:116) [craftbukkit.jar:git-Bukkit-3fc97ff] at java.lang.Thread.run(Unknown Source) [?:1.8.0_73]
    Caused by: java.lang.NullPointerException at org.bukkit.inventory.ItemStack.<init>(ItemStack.java:68) ~[craftbukki
    t.jar:git-Bukkit-3fc97ff]
            at mmo.game.MMOGame.stack(MMOGame.java:418) ~[?:?]
            at mmo.game.MMOGame.chat(MMOGame.java:684) ~[?:?]
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_73]
            at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_73]
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_73]
            at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_73]
            va:295) ~[craftbukkit.jar:git-Bukkit-3fc97ff]
            ... 32 more
    
    I've added
    Code:
     if (itemstack != null) 
    because if is not there i get an Nullpointer Exception telling me that i can't do anything with an ItemStack that is null.
    (Also no items are getting added or deleted)
    Line 418:
    Code:
    pi.addItem(new ItemStack(m, amount));
    out of the Method
    Code:
    stack(PlayerInventory pi, Material m, Player p)
    The AsyncChatEvent is what triggeres it all:
    Code:
    if (e.getMessage().equalsIgnoreCase("stack")){
                stack(e.getPlayer().getInventory(), getCoins(e.getPlayer()), e.getPlayer());
            }
    
     
  2. Offline

    thapengwin

    ItemStacks are null when they are empty. If you're getting the contents of an inventory, there are bound to be quite a few of those.
     
    PistoFrancoPuumm likes this.
  3. Offline

    RoflFrankoc

  4. @RoflFrankoc
    It seems to me that you're using an AsyncPlayerChatEvent to change some in-game variables, which I'm pretty sure is not thread-safe. What I would recommend doing is scheduling a sync task to run your code in.
     
Thread Status:
Not open for further replies.

Share This Page