Solved Command & scoreboard help

Discussion in 'Plugin Development' started by tovd1234, Dec 29, 2014.

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

    tovd1234

    Hello everyone, I am busy with a new plugin. I have created 2 teams, red and blue. And I also created a scoreboard with the Kills displayed. When I execute /red or /blue I should join one of the teams. But that gives me an internal error. Also the for loop is not working. Help me please.

    Code:
    package nl.tovd1234.sw;
    
    import java.util.ArrayList;
    
    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.Sound;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.SignChangeEvent;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.scoreboard.DisplaySlot;
    import org.bukkit.scoreboard.Objective;
    import org.bukkit.scoreboard.Score;
    import org.bukkit.scoreboard.Scoreboard;
    import org.bukkit.scoreboard.ScoreboardManager;
    import org.bukkit.scoreboard.Team;
    
    public class Main extends JavaPlugin implements Listener {
       
        // Teams
        ArrayList<String> blue = new ArrayList();
        ArrayList<String> red = new ArrayList();
       
        // Objectives (So I can set spawnpoints)
        ArrayList<String> ob1 = new ArrayList();
        ArrayList<String> ob2 = new ArrayList();
        ArrayList<String> ob3 = new ArrayList();
       
        // Kits
        ArrayList<String> kw1 = new ArrayList(); // Knockback Wand level 3
        ArrayList<String> kw2 = new ArrayList(); // Knockback Wand level 3
        ArrayList<String> kw3 = new ArrayList(); // Knockback Wand level 3
       
        ArrayList<String> sw1 = new ArrayList(); // Sword level 1
        ArrayList<String> sw2 = new ArrayList(); // Sword level 2
        ArrayList<String> sw3 = new ArrayList(); // Sword level 3
       
       
        ArrayList<String> fw1 = new ArrayList(); // Fire wand level 1
        ArrayList<String> fw2 = new ArrayList(); // Fire wand level 2
        ArrayList<String> fw3 = new ArrayList(); // Fire wand level 3
       
        @Override
        public void onEnable() {
            getServer().getPluginManager().registerEvents(this, this);
            getServer().getLogger().info("Sky Warriors Successfully Started");
       
        // Teams
            ScoreboardManager sbManager = Bukkit.getScoreboardManager();
            Scoreboard sBoard = sbManager.getNewScoreboard();
           
            Team red = sBoard.registerNewTeam("red");
            Team blue = sBoard.registerNewTeam("blue");
           
            red.setAllowFriendlyFire(false);
            blue.setAllowFriendlyFire(false);
           
            red.setCanSeeFriendlyInvisibles(true);
            blue.setCanSeeFriendlyInvisibles(true);
           
            red.setPrefix("§c");
            blue.setPrefix("§9");
           
           
            // Stats
            Objective stats = sBoard.registerNewObjective("stats", "dummy");
            stats.setDisplaySlot(DisplaySlot.SIDEBAR);
            stats.setDisplayName("&4Statistics");
           
            Objective kills = sBoard.registerNewObjective("kills", "playerKillCount");
            kills.setDisplaySlot(DisplaySlot.SIDEBAR);
            kills.setDisplayName("§6Kills");
           
            Objective deaths = sBoard.registerNewObjective("deaths", "deathCount");
            deaths.setDisplaySlot(DisplaySlot.SIDEBAR);
            deaths.setDisplayName("§6Deaths");
           
            Score scorek = kills.getScore(Bukkit.getOfflinePlayer("Kills"));
            scorek.setScore(1);
           
           
            for (Player player : Bukkit.getOnlinePlayers()) {
                player.setScoreboard(sBoard);
            }
           
           
        }
       
        // Team command
        @Override
        public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
            Player player = (Player) sender;
            Location loc = player.getLocation();
            if ((label.equalsIgnoreCase("red"))) {
                if (sender instanceof Player) {
                ((Team)blue).removePlayer(player);
                ((Team)red).addPlayer(player);
                player.sendMessage("§cYou have joined the red team");
                player.playSound(loc, Sound.NOTE_PLING, 1, 1);
                } else {
                   
                }
            }
            if ((label.equalsIgnoreCase("blue"))) {
                if (sender instanceof Player) {
                ((Team)red).removePlayer(player);
                ((Team)blue).addPlayer(player);
                player.sendMessage("&9You have joined the blue team");
                player.playSound(loc, Sound.NOTE_PLING, 1, 1);
                } else {
                   
                }
            }
           
            return false;
        }
       
       
       
       
        // On sign creation do this.
        public void onSignCreate(SignChangeEvent e) {
            Player player = e.getPlayer();
            if (e.getLine(0).equalsIgnoreCase("kit")) {
               
                if (e.getLine(1).equalsIgnoreCase("kw1")) {
                    e.setLine(0, "§4Kit");
                    e.setLine(1, "§6Knockback Wand");
                    e.setLine(2, "§6Level 1");
                    e.setLine(3, "");
                }
               
                if (e.getLine(1).equalsIgnoreCase("kw2")) {
                    e.setLine(0, "§4Kit");
                    e.setLine(1, "§6Knockback Wand");
                    e.setLine(2, "§6Level 2");
                    e.setLine(3, "");
                }
    
                if (e.getLine(1).equalsIgnoreCase("kw3")) {
                    e.setLine(0, "§4Kit");
                    e.setLine(1, "§6Knockback Wand");
                    e.setLine(2, "§6Level 2");
                    e.setLine(3, "");
                }
    
                if (e.getLine(1).equalsIgnoreCase("sw1")) {
    
                }
    
                if (e.getLine(1).equalsIgnoreCase("sw2")) {
    
                }
    
                if (e.getLine(1).equalsIgnoreCase("sw3")) {
    
                }
    
                if (e.getLine(1).equalsIgnoreCase("fw1")) {
    
                }
    
                if (e.getLine(1).equalsIgnoreCase("fw2")) {
    
                }
    
                if (e.getLine(1).equalsIgnoreCase("fw3")) {
    
                }
               
            }
        }
    
    }
    
     
  2. Offline

    1Rogue

    Don't use a list with raw types, add the diamond operator or specify your generics depending on java version:

    (Also use the abstract type for storing a variable)
    Code:java
    1. List<String> example = new ArrayList<>();


    You're casting before you're checking the class type as well, you shouldn't cast until you check first. This is also true of your lists, you can't just arbitrarily cast an ArrayList<String> to Team, they're not the same class.
     
  3. Offline

    tovd1234

    Okay, but the List of the teams (red & blue) don't are not the actual teams. Its just a list with the players in a team. And then the objectives decide where they spawn.

    Nevermind, the Team already does that. But is this what you meant:

    Code:
    @Override
        public void onEnable() {
            getServer().getPluginManager().registerEvents(this, this);
            getServer().getLogger().info("Sky Warriors Successfully Started");
     
            // Teams
            ScoreboardManager sbManager = Bukkit.getScoreboardManager();
            Scoreboard sBoard = sbManager.getNewScoreboard();
         
            Team red = sBoard.registerNewTeam("red");
            Team blue = sBoard.registerNewTeam("blue");
         
            red.setAllowFriendlyFire(false);
            blue.setAllowFriendlyFire(false);
         
            red.setCanSeeFriendlyInvisibles(true);
            blue.setCanSeeFriendlyInvisibles(true);
         
            red.setPrefix("§c");
            blue.setPrefix("§9");
         
         
            // Stats
            Objective stats = sBoard.registerNewObjective("stats", "dummy");
            stats.setDisplaySlot(DisplaySlot.SIDEBAR);
            stats.setDisplayName("&4Statistics");
         
            Objective kills = sBoard.registerNewObjective("kills", "playerKillCount");
            kills.setDisplaySlot(DisplaySlot.SIDEBAR);
            kills.setDisplayName("§6Kills");
         
            Objective deaths = sBoard.registerNewObjective("deaths", "deathCount");
            deaths.setDisplaySlot(DisplaySlot.SIDEBAR);
            deaths.setDisplayName("§6Deaths");
         
            Score scorek = kills.getScore(Bukkit.getOfflinePlayer("Kills"));
            scorek.setScore(1);
         
         
            for (Player player : Bukkit.getOnlinePlayers()) {
                player.setScoreboard(sBoard);
            }
         
         
            // Objectives (So I can set spawnpoints)
            List<String> ob1 = new ArrayList<>();
            List<String> ob2 = new ArrayList<>();
            List<String> ob3 = new ArrayList<>();
         
            // Kits
            List<String> kw1 = new ArrayList<>(); // Knockback Wand level 1
            List<String> kw2 = new ArrayList<>(); // Knockback Wand level 2
            List<String> kw3 = new ArrayList<>(); // Knockback Wand level 3
         
            List<String> sw1 = new ArrayList<>(); // Sword level 1
            List<String> sw2 = new ArrayList<>(); // Sword level 2
            List<String> sw3 = new ArrayList<>(); // Sword level 3
         
         
            List<String> fw1 = new ArrayList<>(); // Fire wand level 1
            List<String> fw2 = new ArrayList<>(); // Fire wand level 2
            List<String> fw3 = new ArrayList<>(); // Fire wand level 3
    If that is correct, I still have an error at my onCommand.

    Code:
    @Override
        public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
            Player player = (Player) sender;
            Location loc = player.getLocation();
            if ((label.equalsIgnoreCase("red"))) {
                if (sender instanceof Player) {
                ((Team)blue).removePlayer(player);
                ((Team)red).addPlayer(player);
                player.sendMessage("§cYou have joined the red team");
                player.playSound(loc, Sound.NOTE_PLING, 1, 1);
                } else {
                    player.sendMessage("§4You're not a player!");
                }
            }
            return false;
         
            if ((label.equalsIgnoreCase("blue"))) {
                if (sender instanceof Player) {
                ((Team)red).removePlayer(player);
                ((Team)blue).addPlayer(player);
                player.sendMessage("&9You have joined the blue team");
                player.playSound(loc, Sound.NOTE_PLING, 1, 1);
                } else {
                    player.sendMessage("§4You're not a player!");
                }
            }
         
            return false;
    The teams, red and blue aren't resolved to a variable. It worked before but now it doesnt anymore. (Sorry that I'm asking so many questions!)
     
    Last edited: Dec 29, 2014
  4. Offline

    JordyPwner

    use cmd.getName instead of label. Also are you watching a tutorial?
     
  5. Offline

    tovd1234

    Nope, I'm doing this out of my head. (I have watched scoreboard tutorials before)
     
  6. Offline

    1Rogue

    You have the fields:

    Code:java
    1. // Teams
    2. ArrayList<String> blue = new ArrayList();
    3. ArrayList<String> red = new ArrayList();


    You proceed to do:
    Code:java
    1. ((Team)blue).removePlayer(player);
    2. ((Team)red).addPlayer(player);


    Furthermore, you're still casting to Player without checking the type first.

    What specific error are you getting?
     
  7. Offline

    tovd1234

    I got this now:
    Code:
    List<String> ob1 = new ArrayList<>();
            List<String> ob2 = new ArrayList<>();
            List<String> ob3 = new ArrayList<>();
           
            // Kits
            List<String> kw1 = new ArrayList<>(); // Knockback Wand level 1
            List<String> kw2 = new ArrayList<>(); // Knockback Wand level 2
            List<String> kw3 = new ArrayList<>(); // Knockback Wand level 3
           
            List<String> sw1 = new ArrayList<>(); // Sword level 1
            List<String> sw2 = new ArrayList<>(); // Sword level 2
            List<String> sw3 = new ArrayList<>(); // Sword level 3
           
           
            List<String> fw1 = new ArrayList<>(); // Fire wand level 1
            List<String> fw2 = new ArrayList<>(); // Fire wand level 2
            List<String> fw3 = new ArrayList<>(); // Fire wand level 3

    The error is at the (Team(red)) and the (Team(blue)). The error is red/blue cannot be resolved to a variable.

    Code:
    @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            Player player = (Player) sender;
            Location loc = player.getLocation();
            if ((cmd.getName().equalsIgnoreCase("red"))) {
                if (sender instanceof Player) {
                ((Team)blue).removePlayer(player);
                ((Team)red).addPlayer(player);
                player.sendMessage("§cYou have joined the red team");
                player.playSound(loc, Sound.NOTE_PLING, 1, 1);
                } else {
                    player.sendMessage("§4You're not a player!");
                }
            }
            return false;
           
            if ((cmd.getName().equalsIgnoreCase("blue"))) {
                if (sender instanceof Player) {
                ((Team)red).removePlayer(player);
                ((Team)blue).addPlayer(player);
                player.sendMessage("&9You have joined the blue team");
                player.playSound(loc, Sound.NOTE_PLING, 1, 1);
                } else {
                    player.sendMessage("§4You're not a player!");
                }
            }
           
            return false;
        }
     
  8. Offline

    CraftBang

    Okay these arraylist you use from the teams are useless since you're using the scoreboard for that.
    Also you're MAKING the variables in the onEnable void so you can't reach m anyother way now.
    Code:
    package nl.tovd1234.sw;
    
    import java.util.ArrayList;
    
    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.Sound;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.SignChangeEvent;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.scoreboard.DisplaySlot;
    import org.bukkit.scoreboard.Objective;
    import org.bukkit.scoreboard.Score;
    import org.bukkit.scoreboard.Scoreboard;
    import org.bukkit.scoreboard.ScoreboardManager;
    import org.bukkit.scoreboard.Team;
    
    public class Main extends JavaPlugin implements Listener {
       
        // Teams
        ArrayList<String> blue = new ArrayList();
        ArrayList<String> red = new ArrayList();
       
        // Objectives (So I can set spawnpoints)
        ArrayList<String> ob1 = new ArrayList();
        ArrayList<String> ob2 = new ArrayList();
        ArrayList<String> ob3 = new ArrayList();
       
        // Kits
        ArrayList<String> kw1 = new ArrayList(); // Knockback Wand level 3
        ArrayList<String> kw2 = new ArrayList(); // Knockback Wand level 3
        ArrayList<String> kw3 = new ArrayList(); // Knockback Wand level 3
       
        ArrayList<String> sw1 = new ArrayList(); // Sword level 1
        ArrayList<String> sw2 = new ArrayList(); // Sword level 2
        ArrayList<String> sw3 = new ArrayList(); // Sword level 3
       
       
        ArrayList<String> fw1 = new ArrayList(); // Fire wand level 1
        ArrayList<String> fw2 = new ArrayList(); // Fire wand level 2
        ArrayList<String> fw3 = new ArrayList(); // Fire wand level 3
       
        @Override
        public void onEnable() {
            getServer().getPluginManager().registerEvents(this, this);
            getServer().getLogger().info("Sky Warriors Successfully Started");
       
        // Teams
            ScoreboardManager sbManager = Bukkit.getScoreboardManager();
            Scoreboard sBoard = sbManager.getNewScoreboard();
           
            Team red = sBoard.registerNewTeam("red");
            Team blue = sBoard.registerNewTeam("blue");
           
            red.setAllowFriendlyFire(false);
            blue.setAllowFriendlyFire(false);
           
            red.setCanSeeFriendlyInvisibles(true);
            blue.setCanSeeFriendlyInvisibles(true);
           
            red.setPrefix("§c");
            blue.setPrefix("§9");
           
           
            // Stats
            Objective stats = sBoard.registerNewObjective("stats", "dummy");
            stats.setDisplaySlot(DisplaySlot.SIDEBAR);
            stats.setDisplayName("&4Statistics");
           
            Objective kills = sBoard.registerNewObjective("kills", "playerKillCount");
            kills.setDisplaySlot(DisplaySlot.SIDEBAR);
            kills.setDisplayName("§6Kills");
           
            Objective deaths = sBoard.registerNewObjective("deaths", "deathCount");
            deaths.setDisplaySlot(DisplaySlot.SIDEBAR);
            deaths.setDisplayName("§6Deaths");
           
            Score scorek = kills.getScore(Bukkit.getOfflinePlayer("Kills"));
            scorek.setScore(1);
           
           
            for (Player player : Bukkit.getOnlinePlayers()) {
                player.setScoreboard(sBoard);
            }
        }
    }
    
    You should change that to this :
    Code:
    package nl.tovd1234.sw;
    
    import java.util.ArrayList;
    
    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.Sound;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.SignChangeEvent;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.scoreboard.DisplaySlot;
    import org.bukkit.scoreboard.Objective;
    import org.bukkit.scoreboard.Score;
    import org.bukkit.scoreboard.Scoreboard;
    import org.bukkit.scoreboard.ScoreboardManager;
    import org.bukkit.scoreboard.Team;
    
    public class Main extends JavaPlugin implements Listener {
       
        // Teams you create m here, but you give them a value in the onenable function! Now you can use these two team variables and you can add the players.
       
      Team red,blue;
    
        // Objectives (So I can set spawnpoints)
        ArrayList<String> ob1 = new ArrayList();
        ArrayList<String> ob2 = new ArrayList();
        ArrayList<String> ob3 = new ArrayList();
       
        // Kits
        ArrayList<String> kw1 = new ArrayList(); // Knockback Wand level 3
        ArrayList<String> kw2 = new ArrayList(); // Knockback Wand level 3
        ArrayList<String> kw3 = new ArrayList(); // Knockback Wand level 3
       
        ArrayList<String> sw1 = new ArrayList(); // Sword level 1
        ArrayList<String> sw2 = new ArrayList(); // Sword level 2
        ArrayList<String> sw3 = new ArrayList(); // Sword level 3
       
       
        ArrayList<String> fw1 = new ArrayList(); // Fire wand level 1
        ArrayList<String> fw2 = new ArrayList(); // Fire wand level 2
        ArrayList<String> fw3 = new ArrayList(); // Fire wand level 3
       
        @Override
        public void onEnable() {
            getServer().getPluginManager().registerEvents(this, this);
            getServer().getLogger().info("Sky Warriors Successfully Started");
       
        // Teams
            ScoreboardManager sbManager = Bukkit.getScoreboardManager();
            Scoreboard sBoard = sbManager.getNewScoreboard();
           
            red = sBoard.registerNewTeam("red");
            blue = sBoard.registerNewTeam("blue");
           
            red.setAllowFriendlyFire(false);
            blue.setAllowFriendlyFire(false);
           
            red.setCanSeeFriendlyInvisibles(true);
            blue.setCanSeeFriendlyInvisibles(true);
           
            red.setPrefix("§c");
            blue.setPrefix("§9");
           
           
            // Stats
            Objective stats = sBoard.registerNewObjective("stats", "dummy");
            stats.setDisplaySlot(DisplaySlot.SIDEBAR);
            stats.setDisplayName("&4Statistics");
           
            Objective kills = sBoard.registerNewObjective("kills", "playerKillCount");
            kills.setDisplaySlot(DisplaySlot.SIDEBAR);
            kills.setDisplayName("§6Kills");
           
            Objective deaths = sBoard.registerNewObjective("deaths", "deathCount");
            deaths.setDisplaySlot(DisplaySlot.SIDEBAR);
            deaths.setDisplayName("§6Deaths");
           
            Score scorek = kills.getScore(Bukkit.getOfflinePlayer("Kills"));
            scorek.setScore(1);
           
           
            for (Player player : Bukkit.getOnlinePlayers()) {
                player.setScoreboard(sBoard);
            }
        }
    }
    
    About your for loop, it does work.
    But please think twice, you're using a for loop in the onEnable method. only if you reload the plugin people will get the scoreboard.
    Use the PlayerJoinEvent and set the players scoreboard there.
     
Thread Status:
Not open for further replies.

Share This Page