Plugin working but generating a exception and cannot find out why.

Discussion in 'Plugin Development' started by damo1995, Feb 28, 2012.

Thread Status:
Not open for further replies.
  1. Hello all,

    I wondered if anybody could help me, I have wrote this plugin from scratch and it works. Now the problem is its generating this exception:
    Code:
    2012-02-29 02:36:14 [SEVERE] Could not pass event org.bukkit.event.player.PlayerInteractEvent to NoLongGrassExploit
    org.bukkit.event.EventException
    at org.bukkit.plugin.java.JavaPluginLoader$103.execute(JavaPluginLoader.java:1026)
    at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:57)
    at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:453)
    at org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:187)
    at org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:157)
    at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:570)
    at net.minecraft.server.Packet15Place.handle(SourceFile:39)
    at net.minecraft.server.NetworkManager.b(NetworkManager.java:226)
    at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:100)
    at net.minecraft.server.NetworkListenThread.a(NetworkListenThread.java:78)
    at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:537)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:435)
    at net.minecraft.server.ThreadServerApplication.run(SourceFile:465)
    Caused by: java.lang.reflect.InvocationTargetException
    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 org.bukkit.plugin.java.JavaPluginLoader$103.execute(JavaPluginLoader.java:1024)
    ... 12 more
    Caused by: java.lang.NullPointerException
    at me.damo1995.NLGE.nlgePlayerListener.onPlayerInteract(nlgePlayerListener.java:25)
    ... 17 more
    Now the actual thing works but when i right click air every now and again it throws this and i have no clue why. im guessing i have missed a return somewhere.

    Here is my actual event code:
    Code:
    package me.damo1995.NLGE;
    import org.bukkit.Bukkit;
    import org.bukkit.Material;
    import org.bukkit.block.Block;
    import org.bukkit.block.BlockFace;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.inventory.ItemStack;
     
    public class nlgePlayerListener implements Listener {
     
    private nlge plugin;
     
    public nlgePlayerListener(nlge instance) {
      this.plugin = instance;
    }
    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent e){
      Player player = e.getPlayer();
      Block block = e.getClickedBlock().getRelative(BlockFace.UP);
      int lightl = e.getClickedBlock().getRelative(BlockFace.UP).getLightLevel();
      String LightLevel = Integer.toString(lightl);
     
      ItemStack holding = player.getItemInHand();
            if(e.getAction() == Action.RIGHT_CLICK_BLOCK && holding.getType() == Material.INK_SACK && holding.getDurability() == 15){
                if(block.getLightLevel() < 1){
                if(this.plugin.getConfig().getBoolean("debug") == true){
                    player.sendMessage("Debug: Light Level Lower then 3, Event Cancled");
                    player.sendMessage(LightLevel);
                }
                if(this.plugin.getConfig().getBoolean("notify-use")){
                  player.sendMessage(this.plugin.getConfig().getString("notify-msg"));
                }
                if(this.plugin.getConfig().getBoolean("notify-admin") == true){
                  for (Player onlinePlayer : Bukkit.getServer().getOnlinePlayers()){
                  if(onlinePlayer.hasPermission("nlge.admin") || onlinePlayer.isOp()){
                    onlinePlayer.sendMessage(player.getName() + " " + "Attempted to exploit @ " + "X: " + block.getX() + " " + "Y: " + block.getY() + " " + "Z: " + block.getZ());
                  this.plugin.logMessage(player.getName() + " " + "Attempted to exploit @ " + "X: " + block.getX() + " " + "Y: " + block.getY() + " " + "Z: " + block.getZ());
                  }
                  }
                }
                    e.setCancelled(true);
                    return;
                }else{
    if (block.getLightLevel() > 1){
    if(this.plugin.getConfig().getBoolean("debug") == true){
                    player.sendMessage("Debug: Light level greater then 3, Event continue.");
                    player.sendMessage(LightLevel);
    }
                    return;
                }
            }
        }
            else{
            return;
            }
    }
    }
    
    If somebody could take a look and tell me where i have gone wrong?

    Thanks.
     
  2. Offline

    stelar7

    nlgePlayerListener.java:25

    Looking at your code, it seems that "String LightLevel = Integer.toString(lightl);" is the specified line...

    why would you even need to do that?
     
  3. damo1995 regarding stelar7 's post, if you're worried about the editor's warnings on this line:
    Code:
    player.sendMessage(LightLevel);
    you can just do:
    Code:
    player.sendMessage("" + lightl);
    Still, sending another message is kinda pointless, just integrate it in your debug message...
    Code:
    player.sendMessage("Debug: Light Level = " + lightl + ", Lower then 3, Event Cancled");
     
  4. The problem with just sending lightl is its a integer not a string and sendmessage will only accept a string?
    This is the reason i converted it to a string.
     
  5. Yes, but you can instantly convert any object to string by parsing it into a string, like I explained above.
     
  6. Ah ha, Dident realise you could do it like that.

    Thank you. I shall test it now and see if it still errors.

    now im getting
    Code:
    2012-02-29 22:11:53 [SEVERE] Could not pass event org.bukkit.event.player.PlayerInteractEvent to NoLongGrassExploit
    org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$103.execute(JavaPluginLoader.java:1026)
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:57)
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:453)
        at org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:187)
        at org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:157)
        at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:570)
        at net.minecraft.server.Packet15Place.handle(SourceFile:39)
        at net.minecraft.server.NetworkManager.b(NetworkManager.java:226)
        at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:100)
        at net.minecraft.server.NetworkListenThread.a(NetworkListenThread.java:78)
        at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:537)
        at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:435)
        at net.minecraft.server.ThreadServerApplication.run(SourceFile:465)
    Caused by: java.lang.reflect.InvocationTargetException
        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 org.bukkit.plugin.java.JavaPluginLoader$103.execute(JavaPluginLoader.java:1024)
        ... 12 more
    Caused by: java.lang.NullPointerException
        at me.damo1995.NLGE.nlgePlayerListener.onPlayerInteract(nlgePlayerListener.java:25)
        ... 17 more
    
    with
    Code:
    package me.damo1995.NLGE;
    
    import org.bukkit.Bukkit;
    import org.bukkit.Material;
    import org.bukkit.block.Block;
    import org.bukkit.block.BlockFace;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.inventory.ItemStack;
    
    
    public class nlgePlayerListener implements Listener {
        
        private nlge plugin;
        
        public nlgePlayerListener(nlge instance) {
            this.plugin = instance;
        }
        @EventHandler
        public void onPlayerInteract(PlayerInteractEvent e){
            Player player = e.getPlayer();
            Block block = e.getClickedBlock().getRelative(BlockFace.UP);
            int lightl = e.getClickedBlock().getRelative(BlockFace.UP).getLightLevel();
            
            ItemStack holding = player.getItemInHand();
            if(e.getAction() == Action.RIGHT_CLICK_BLOCK && holding.getType() == Material.INK_SACK && holding.getDurability() == 15){
                if(block.getLightLevel() < 1){
                    if(this.plugin.getConfig().getBoolean("debug") == true){
                    player.sendMessage("Debug:" + " " + "Light Level = " + " " + lightl + "Light Level Lower then 3, Event Cancled");
                    }
                    if(this.plugin.getConfig().getBoolean("notify-use")){
                        player.sendMessage(this.plugin.getConfig().getString("notify-msg"));
                    }
                    if(this.plugin.getConfig().getBoolean("notify-admin") == true){
                        for (Player onlinePlayer : Bukkit.getServer().getOnlinePlayers()){
                            if(onlinePlayer.hasPermission("nlge.admin") || onlinePlayer.isOp()){
                                onlinePlayer.sendMessage(player.getName() + " " + "Attempted to exploit @ " + "X: " + block.getX() + " " + "Y: " + block.getY() + " " + "Z: " + block.getZ());
                            this.plugin.logMessage(player.getName() + " " + "Attempted to exploit @ " + "X: " + block.getX() + " " + "Y: " + block.getY() + " " + "Z: " + block.getZ());
                            }
                        }
                    }
                    e.setCancelled(true);
                    return;
                }else{
    if (block.getLightLevel() > 1){
        if(this.plugin.getConfig().getBoolean("debug") == true){
            player.sendMessage("Debug:" + " " + "Light Level = " + lightl + ", Lower then 1, Event Cancled");
                   
        }
                    return;
                }
            }
        }
            else{
                return;
            }
    }
    
    }
    
    I dont know why, Sorry im no good when it comes to debuging again it says lign 25.

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 24, 2016
  7. Offline

    stelar7

    Line 25 is:
    Block block = e.getClickedBlock().getRelative(BlockFace.UP);

    it's not certain that a block was clicked, so add a check for it...
     
  8. Code:
            Block block = e.getClickedBlock().getRelative(BlockFace.UP);
    The problem there is that getClickedBlock() can be null if the player doesn't aim at a block when hitting/interacting.
    So check it against null before calling a method on it.
    The lightl variable has the same problem, apart from using useless repeatitive code.

    EDIT: A quick way to fix that is to move block and lightl in the first condition, because you check if action is click on block so it's guaranteed that getClickedBlock() has a block.

    Also, next time specify which is the line you get the error on, it'll save time.
     
  9. Thanks for all the help guys, Finaly got it working without any errors, And im sorry also for not being very good at telling you where the error was.
     
Thread Status:
Not open for further replies.

Share This Page