Solved problem with command arguments

Discussion in 'Plugin Development' started by Cri16228, Jan 6, 2018.

Thread Status:
Not open for further replies.
  1. I have problems with commands arguments, I've tried to make an "economy" code for my server with friends but I have problem with the command /coins pay <name> <amount>
    this is my class
    Code:
    package it.capitancold.VanillaPlus.Commands;
    
    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;
    
    import it.capitancold.VanillaPlus.Main;
    import it.capitancold.VanillaPlus.Events.SB;
    import it.capitancold.VanillaPlus.YamlFiles.EconomyFile;
    
    public class CoinsCommand implements CommandExecutor {
    
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            if (cmd.getName().equalsIgnoreCase("coins")) {
                Player p = (Player) sender;
                if (args.length == 0) {
                    if (!(p.hasPermission("enonomy.coins"))) {
                        p.sendMessage(ChatColor.translateAlternateColorCodes('&',
                                Main.instance.getConfig().getString("Messages.Prefix")) + " "
                                + ChatColor.translateAlternateColorCodes('&',
                                        Main.instance.getConfig().getString("Messages.No-Perm")));
                    } else {
                        p.sendMessage("§1[§bCoins Economy§1] §c/coins pay <player> <quantità>");
                    }
                } else if (args[0].equalsIgnoreCase("pay")) {
                    if (args.length == 0) {
                        if (!(p.hasPermission("economy.pay"))) {
                            p.sendMessage("§1[§bCoins Economy§1]" + " " + ChatColor.translateAlternateColorCodes('&',
                                    Main.instance.getConfig().getString("Messages.No-Perm")));
                        }
                    } else {
                        p.sendMessage("§1[§bCoins Economy§1] §c/coins pay <player> <quantità>");
                        p.sendMessage("§1[§bCoins Economy§1] §cSpecifica il player");
                        System.out.println("0: " + args[0] + " 1: " + args[1] + " 2: " + args[2]);
                    }
                } else if (args.length == 1) {
                    String name = args[1];
                    Player target = Bukkit.getPlayer(name);
                    if (target != null) {
                        p.sendMessage("§1[§bCoins Economy§1] §c/coins pay <player> <quantità>");
                        p.sendMessage("§1[§bCoins Economy§1] §cSpecifica la quantità");
                    }
                } else if (args.length == 2) {
                    Player whopay = (Player) sender;
                    String name = args[1];
                    int payment = Integer.valueOf(args[2]);
                    int whopaybal = EconomyFile.getEconomy().getInt("LuckyPoints." + whopay.getName());
                    Player target = Bukkit.getPlayer(name);
                    if (target != null) {
                        if (target != sender) {
                            if (whopaybal < payment) {
                                p.sendMessage(
                                        "§1[§bCoins Economy§1] §cNon hai i coins necessari per affrontare questo pagamento");
                            } else if (whopaybal > payment || whopaybal == payment) {
                                EconomyFile.getEconomy().set("LuckyPoints." + whopay.getName(),
                                        EconomyFile.getEconomy().getInt("LuckyPoints." + whopay.getName()) - payment);
                                EconomyFile.getEconomy().set("LuckyPoints." + target,
                                        EconomyFile.getEconomy().getInt("LuckyPoints." + p.getName()) + payment);
                                EconomyFile.saveEconomyFile();
                                p.setScoreboard(SB.scoreboard(p));
                                whopay.sendMessage(
                                        "§1[§bCoins Economy§1] §aHai pagato " + payment + " §bcoins §aa §3" + target);
                                target.sendMessage(
                                        "§1[§bCoins Economy§1] §aHai ricevuto " + payment + " §bcoins §ada §3" + whopay);
                            } else if (target != null) {
                                if (target == sender) {
                                    p.sendMessage("§1[§bCoins Economy§1] §cNon puoi inviarti soldi da solo");
                                }
                            }
                        }
                    }
                }
            }
            return false;
        }
    }
    And here the console error
    Console error (open)

    Code:
    null
    org.bukkit.command.CommandException: Unhandled exception executing command 'coins' in plugin VanillaPlus v0.2
            at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[spigot-1.12.2.jar:git-Spigot-109b080-ab09b27]
            at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) ~[spigot-1.12.2.jar:git-Spigot-109b080-ab09b27]
            at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:648) ~[spigot-1.12.2.jar:git-Spigot-109b080-ab09b27]
            at net.minecraft.server.v1_12_R1.PlayerConnection.handleCommand(PlayerConnection.java:1397) [spigot-1.12.2.jar:git-Spigot-109b080-ab09b27]
            at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1232) [spigot-1.12.2.jar:git-Spigot-109b080-ab09b27]
            at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:45) [spigot-1.12.2.jar:git-Spigot-109b080-ab09b27]
            at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:1) [spigot-1.12.2.jar:git-Spigot-109b080-ab09b27]
            at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot-1.12.2.jar:git-Spigot-109b080-ab09b27]
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_112]
            at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_112]
            at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46) [spigot-1.12.2.jar:git-Spigot-109b080-ab09b27]
            at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748) [spigot-1.12.2.jar:git-Spigot-109b080-ab09b27]
            at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot-1.12.2.jar:git-Spigot-109b080-ab09b27]
            at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.12.2.jar:git-Spigot-109b080-ab09b27]
            at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.12.2.jar:git-Spigot-109b080-ab09b27]
            at java.lang.Thread.run(Thread.java:745) [?:1.8.0_112]
    Caused by: java.lang.ArrayIndexOutOfBoundsException: 2
            at it.capitancold.VanillaPlus.Commands.CoinsCommand.onCommand(CoinsCommand.java:38) ~[?:?]
            at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[spigot-1.12.2.jar:git-Spigot-109b080-ab09b27]
            ... 15 more

    I need help because I don't know how fix this
     
  2. Offline

    AdamDev

    @Cri16228
    What is line 38 in CoinsCommand.java?
    "at it.capitancold.VanillaPlus.Commands.CoinsCommand.onCommand(CoinsCommand.java:38) ~[?:?]"
     
  3. Offline

    timtower Administrator Administrator Moderator

    @Cri16228 You have 2 checks for length == 0
    One where you check args[0]
    I think that you just need to increase the numbers on the checks
     
  4. Can you tell me the args of this command?
    /coins pay <name> <amount>
    Like args[0], args[1], args[2], etc...
     
  5. Offline

    timtower Administrator Administrator Moderator

    @Cri16228 Just like that, but the length checks have the wrong numbers
     
  6. So the args are:
    /coins pay <name> <amount>
    pay = args[0]
    name = args[1]
    amount = args[2]

    Or
    /coins pay <name> <amount>
    coins = args[0]
    pay = args[1]
    name = args[2]
    amount = args[3]
     
  7. Offline

    timtower Administrator Administrator Moderator

    @Cri16228 First option.
    Coins is the command
     
  8. This is my code now:
    Code:
    package it.capitancold.VanillaPlus.Commands;
    
    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;
    
    import it.capitancold.VanillaPlus.Main;
    import it.capitancold.VanillaPlus.Events.SB;
    import it.capitancold.VanillaPlus.YamlFiles.EconomyFile;
    
    public class CoinsCommand implements CommandExecutor {
    
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            if (cmd.getName().equalsIgnoreCase("coins")) {
                Player p = (Player) sender;
                if (args.length == 0) {
                    if (!(p.hasPermission("enonomy.coins"))) {
                        p.sendMessage(ChatColor.translateAlternateColorCodes('&',
                                Main.instance.getConfig().getString("Messages.Prefix")) + " "
                                + ChatColor.translateAlternateColorCodes('&',
                                        Main.instance.getConfig().getString("Messages.No-Perm")));
                    } else {
                        p.sendMessage("§1[§bCoins Economy§1] §c/coins pay <player> <quantità>");
                    }
                } else if (args.length == 1) {
                    if (args[0].equalsIgnoreCase("pay")) {
                        // coins pay
                        if (!(p.hasPermission("economy.pay"))) {
                            p.sendMessage("§1[§bCoins Economy§1]" + " " + ChatColor.translateAlternateColorCodes('&',
                                    Main.instance.getConfig().getString("Messages.No-Perm")));
                        } else {
                            p.sendMessage("§1[§bCoins Economy§1] §c/coins pay <player> <quantità>");
                            p.sendMessage("§1[§bCoins Economy§1] §cSpecifica il player");
                            System.out.println("arg 0: " + args[0]);
                        }
                    }
                } else if (args.length == 2) {
                    String name = args[1];
                    Player target = Bukkit.getPlayer(name);
                    if (target != null) {
                        p.sendMessage("§1[§bCoins Economy§1] §c/coins pay <player> <quantità>");
                        p.sendMessage("§1[§bCoins Economy§1] §cSpecifica la quantità");
                        System.out.println("arg 0: " + args[0] + " arg 1: " + args[1]);
                    }
                } else if (args.length == 3) {
                    System.out.println("arg 0: " + args[0] + " arg 1: " + args[1] + " arg 2: " + args[2]);
                    Player whopay = (Player) sender;
                    String name = args[1];
                    int payment = Integer.valueOf(args[2]);
                    int whopaybal = EconomyFile.getEconomy().getInt("LuckyPoints." + whopay.getName());
                    Player target = Bukkit.getPlayer(name);
                    if (target != null) {
                        if (target != sender) {
                            if (whopaybal < payment) {
                                p.sendMessage(
                                        "§1[§bCoins Economy§1] §cNon hai i coins necessari per affrontare questo pagamento");
                            } else if (whopaybal > payment || whopaybal == payment) {
                                EconomyFile.getEconomy().set("LuckyPoints." + whopay.getName(),
                                        EconomyFile.getEconomy().getInt("LuckyPoints." + whopay.getName()) - payment);
                                EconomyFile.getEconomy().set("LuckyPoints." + target,
                                        EconomyFile.getEconomy().getInt("LuckyPoints." + p.getName()) + payment);
                                EconomyFile.saveEconomyFile();
                                p.setScoreboard(SB.scoreboard(p));
                                whopay.sendMessage(
                                        "§1[§bCoins Economy§1] §aHai pagato " + payment + " §bcoins §aa §3" + target);
                                target.sendMessage(
                                        "§1[§bCoins Economy§1] §aHai ricevuto " + payment + " §bcoins §ada §3" + whopay);
                            } else if (target != null) {
                                if (target == sender) {
                                    p.sendMessage("§1[§bCoins Economy§1] §cNon puoi inviarti soldi da solo");
                                }
                            }
                        }
                    }
                }
            }
            return false;
        }
    }
    Works until reach the args.length == 3
    No console output. I've added after every args length check a System.out.println to check the args and this is the output:
    Code:
    Cris_96 issued server command: /coins pay
    [17:22:46 INFO]: arg 0: pay
    [17:22:50 INFO]: Cris_96 issued server command: /coins pay Cris_96
    [17:22:50 INFO]: arg 0: pay arg 1: Cris_96
    [17:22:58 INFO]: Cris_96 issued server command: /coins pay Cris_96 100
    [17:22:58 INFO]: arg 0: pay arg 1: Cris_96 arg 2: 100
    but If I try to give myself some coins no output instead of
    Code:
    } else if (target != null) {
                                if (target == sender) {
                                    p.sendMessage("§1[§bCoins Economy§1] §cNon puoi inviarti soldi da solo");
                 }
    }
     
  9. Offline

    timtower Administrator Administrator Moderator

    @Cri16228 Compare the uuid of the target and the sender using equals
     
  10. Work all except for the final line:

    Code:
    } else if (tuuid != null) {
                        if (tuuid == uuidpay) {
                            p.sendMessage("§1[§bCoins Economy§1] §cNon puoi inviarti soldi da solo");
                        }
                    }
    Code:
    package it.capitancold.VanillaPlus.Commands;
    
    import java.util.UUID;
    
    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;
    
    import it.capitancold.VanillaPlus.Main;
    import it.capitancold.VanillaPlus.Events.SB;
    import it.capitancold.VanillaPlus.YamlFiles.EconomyFile;
    
    public class CoinsCommand implements CommandExecutor {
    
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            if (cmd.getName().equalsIgnoreCase("coins")) {
                Player p = (Player) sender;
                if (args.length == 0) {
                    if (!(p.hasPermission("enonomy.coins"))) {
                        p.sendMessage(ChatColor.translateAlternateColorCodes('&',
                                Main.instance.getConfig().getString("Messages.Prefix")) + " "
                                + ChatColor.translateAlternateColorCodes('&',
                                        Main.instance.getConfig().getString("Messages.No-Perm")));
                    } else {
                        p.sendMessage("§1[§bCoins Economy§1] §c/coins pay <player> <quantità>");
                    }
                } else if (args.length == 1) {
                    if (args[0].equalsIgnoreCase("pay")) {
                        // coins pay
                        if (!(p.hasPermission("economy.pay"))) {
                            p.sendMessage("§1[§bCoins Economy§1]" + " " + ChatColor.translateAlternateColorCodes('&',
                                    Main.instance.getConfig().getString("Messages.No-Perm")));
                        } else {
                            p.sendMessage("§1[§bCoins Economy§1] §c/coins pay <player> <quantità>");
                            p.sendMessage("§1[§bCoins Economy§1] §cSpecifica il player");
                        }
                    }
                } else if (args.length == 2) {
                    String name = args[1];
                    Player target = Bukkit.getPlayer(name);
                    if (target != null) {
                        p.sendMessage("§1[§bCoins Economy§1] §c/coins pay <player> <quantità>");
                        p.sendMessage("§1[§bCoins Economy§1] §cSpecifica la quantità");
                    }
                } else if (args.length == 3) {
                    Player whopay = (Player) sender;
                    String name = args[1];
                    int payment = Integer.valueOf(args[2]);
                    int whopaybal = EconomyFile.getEconomy().getInt("LuckyPoints." + whopay.getName());
                    Player target = Bukkit.getPlayer(name);
                    UUID uuidpay = whopay.getUniqueId();
                    UUID tuuid = target.getUniqueId();
                    if (tuuid != null && tuuid != uuidpay) {
                        if (whopaybal < payment) {
                            p.sendMessage(
                                    "§1[§bCoins Economy§1] §cNon hai i coins necessari per affrontare questo pagamento");
                        } else if (whopaybal > payment || whopaybal == payment) {
                            EconomyFile.getEconomy().set("Coins." + whopay.getName(),
                                    EconomyFile.getEconomy().getInt("Coins." + whopay.getName()) - payment);
                            EconomyFile.getEconomy().set("Coins." + target.getName(),
                                    EconomyFile.getEconomy().getInt("Coins." + target.getName()) + payment);
                            EconomyFile.saveEconomyFile();
                            p.setScoreboard(SB.scoreboard(p));
                            whopay.sendMessage(
                                    "§1[§bCoins Economy§1] §aHai pagato " + payment + " §bcoins §aa §3" + target.getName());
                            target.sendMessage("§1[§bCoins Economy§1] §aHai ricevuto " + payment + " §bcoins §ada §3"
                                    + whopay.getName());
                        }
                    } else if (tuuid != null) {
                        if (tuuid == uuidpay) {
                            p.sendMessage("§1[§bCoins Economy§1] §cNon puoi inviarti soldi da solo");
                        }
                    }
                }
            }
            return false;
        }
    }
     
  11. Offline

    timtower Administrator Administrator Moderator

    @Cri16228 Compare them using equals, and those UUID's will not be null, null checks still need to be performed on the player.
     
  12. Solved. Thanks
     
Thread Status:
Not open for further replies.

Share This Page