Unable to pass onCommand event to plugin

Discussion in 'Plugin Development' started by keto23, Nov 26, 2012.

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

    keto23

    I've got a class, not the main where I'm using onCommand()

    However, when I type the command I get an unhandled error exception...


    Code:
    package me.keto23.tmtitem;
     
    import org.bukkit.ChatColor;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
     
    public class ItemQueue implements CommandExecutor {
      private TMTItem plugin;
      private TMTItemFunctions functions = new TMTItemFunctions();
     
      public ItemQueue(TMTItem plugin) {
        this.plugin = plugin;
       
      }
      public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
        if (commandLabel.equalsIgnoreCase("itemqueue")) {
          CommandSender player = sender;
          if ((player.hasPermission("tmtitem.queue")) || (player.isOp()) || (!(player instanceof Player)) ) {
            // Do stuff here
            player.sendMessage(functions.getItemQueue());
            return true;
          } else {
              player.sendMessage(ChatColor.RED + "[TMTItem] You don't have permission to do this!");
              return true;
          }
     
        }
     
        return true;
      }
    }
     
  2. Offline

    raGan.

    Why would you do this:
    CommandSender player = sender;
     
  3. Offline

    ZeusAllMighty11

    I always return false for one.

    Second, as said above, 'CommandSender player = sender' isn't even worth the lines of code since you have int the method parameters (CommandSender sender, Command cmd, String label, String[] args){} which already defines sender for you
    If you wish to make the name 'player' and cast player, then do:

    Code:
    Player player = (Player) sender;
    
     
  4. Offline

    keto23

    I changed it to: Player player = (Player) sender; and I still get errors..
    I believe it has something to do with this method:

    Code:
        public void setupFile() {
            try {
                File dataFolder = plugin.getDataFolder();
                if(!dataFolder.exists()) {
                    dataFolder.mkdir();
                }
     
                File queue = new File(plugin.getDataFolder(), "queue.txt");
                if (!queue.exists()) {
                    queue.createNewFile();
                }
            } catch(IOException e) {}
         
        }
     
  5. Offline

    raGan.

    Why don't you post stacktrace ?
     
  6. Offline

    keto23

    Code:
    2012-11-26 14:29:48 [INFO] keto23 issued server command: /itemqueue
    2012-11-26 14:29:48 [SEVERE] null
    org.bukkit.command.CommandException: Unhandled exception executing command 'itemqueue' in plugin TMTItem v1.0
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46)
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:186)
    at org.bukkit.craftbukkit.CraftServer.dispatchCommand(CraftServer.java:502)
    at net.minecraft.server.NetServerHandler.handleCommand(NetServerHandler.java:985)
    at net.minecraft.server.NetServerHandler.chat(NetServerHandler.java:903)
    at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:858)
    at net.minecraft.server.Packet3Chat.handle(Packet3Chat.java:44)
    at net.minecraft.server.NetworkManager.b(NetworkManager.java:290)
    at net.minecraft.server.NetServerHandler.d(NetServerHandler.java:113)
    at net.minecraft.server.ServerConnection.b(SourceFile:39)
    at net.minecraft.server.DedicatedServerConnection.b(SourceFile:30)
    at net.minecraft.server.MinecraftServer.r(MinecraftServer.java:595)
    at net.minecraft.server.DedicatedServer.r(DedicatedServer.java:222)
    at net.minecraft.server.MinecraftServer.q(MinecraftServer.java:493)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:426)
    at net.minecraft.server.ThreadServerApplication.run(SourceFile:856)
    Caused by: java.lang.NullPointerException
    at me.keto23.tmtitem.TMTItemFunctions.setupFile(TMTItemFunctions.java:114)
    at me.keto23.tmtitem.TMTItemFunctions.getItemQueue(TMTItemFunctions.java:67)
    at me.keto23.tmtitem.ItemQueue.onCommand(ItemQueue.java:23)
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
    ..15 more
     
  7. Offline

    ZeusAllMighty11

    What is on line 114 of class "TMTItemFunctions"?


    Also, you should learn how to read stacktraces. It's pretty easy and fast to learn, plus you can basically debug on your own for the most part.
     
  8. Offline

    kyran_

    Random guess here, but try a null check on the dataFolder in the setupFile method.
     
  9. Offline

    keto23

    I believe the problem is coming from this:

    Code:
    package me.keto23.tmtitem;
     
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
     
    public class InventoryAdd implements CommandExecutor {
      private TMTItem plugin;
      private TMTItemFunctions functions = new TMTItemFunctions();
     
      public InventoryAdd(TMTItem plugin) {
        this.plugin = plugin;
      }
     
     
      public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
        if (commandLabel.equalsIgnoreCase("inventoryadd")) {
          Player player = (Player) sender;
          if ((player.hasPermission("tmtitem.inventoryadd")) || (player.isOp())) {
            if (args.length != 3) {
                sender.sendMessage(ChatColor.RED + "[TMTItem] Not enough arguments!");
                return true;
            }
            Player target = plugin.getServer().getPlayer(args[0]);
            if (target.isOnline()) {
                functions.giveItem(target, Integer.parseInt(args[1]), Integer.parseInt(args[2]));
                return true;
            } else {
                functions.addToQueue(target.getDisplayName(), args[1], args[2]);
                return true;
            }
          } else {
              player.sendMessage(ChatColor.RED + "[TMTItem] You don't have permission to do this!");
            return true;
          }
     
        }
     
        return true;
      }
    }
    It works fine, if the target player is online, if they are not online it throws an internal error occurred when trying to perform this command. It also doesn't work if you use the console.

    It uses this method if the player is not online - which I'm pretty sure is causing the errors.

    Code:
        public void addToQueue(String player, String id, String amount) {
            setupFile();
            try {
                String spot1 = player;
                String spot2 = id;
                String spot3 = amount;
                String spot4 = new BigInteger(130, random).toString(32);
                File Location = new File(Bukkit.getPluginManager().getPlugin("TMTItem").getDataFolder(), "queue");
                Location.mkdirs();
                File queue = new File(Location, "queue.txt");
                Writer output;
                output = new BufferedWriter(new FileWriter(queue, true));
                output.append(spot1 + ":" + spot2 + ":" + spot3 + ":" + spot4);
                output.close();   
            } catch (Exception e) {}
           
           
        }
    Error log:

    Code:
    2012-11-26 22:36:10 [SEVERE] null
    org.bukkit.command.CommandException: Unhandled exception executing command 'inventoryadd' in plugin TMTItem v1.0
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46)
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:186)
    at org.bukkit.craftbukkit.CraftServer.dispatchCommand(CraftServer.java:502)
    at net.minecraft.server.NetServerHandler.handleCommand(NetServerHandler.java:985)
    at net.minecraft.server.NetServerHandler.chat(NetServerHandler.java:903)
    at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:858)
    at net.minecraft.server.Packet3Chat.handle(Packet3Chat.java:44)
    at net.minecraft.server.NetworkManager.b(NetworkManager.java:290)
    at net.minecraft.server.NetServerHandler.d(NetServerHandler.java:113)
    at net.minecraft.server.ServerConnection.b(SourceFile:39)
    at net.minecraft.server.DedicatedServerConnection.b(SourceFile:30)
    at net.minecraft.server.MinecraftServer.r(MinecraftServer.java:595)
    at net.minecraft.server.DedicatedServer.r(DedicatedServer.java:222)
    at net.minecraft.server.MinecraftServer.q(MinecraftServer.java:493)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:426)
    at net.minecraft.server.ThreadServerApplication.run(SourceFile:856)
    Caused by: java.lang.NullPointerException
    at me.keto23.tmtitem.InventoryAdd.onCommand(InventoryAdd.java:28)
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
    
     
  10. Offline

    ZeusAllMighty11

    if(player == null){
    // player is offline, send message saying offline?
    }
     
  11. Offline

    keto23

    The whole point of the plugin is for offline-give support. If they type the command and they're online, it acts as the normal /give.. If not it adds them to a file like so: "name:itemid:amount:randomstring".

    It then checks when ever a player logs in to see if their name is in the file.. If so it gets the other details on the line and gives them their items
     
Thread Status:
Not open for further replies.

Share This Page