Unable to Add Players to Teams

Discussion in 'Plugin Development' started by Jake_0403, Jan 12, 2021.

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

    Jake_0403

    Hello,
    I have been working on my first TDM plugin, it has been going fairly smooth but I have run into an issue that I can not figure out how to fix.

    When I try to add players to a team that is attached to a scoreboard in another class, they are not added.

    This is my scoreboard class, GameScoreboard:
    PHP:
    package me.Jake_0403.MiniGame1.scoreboards;

    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.entity.Player;
    import org.bukkit.scoreboard.DisplaySlot;
    import org.bukkit.scoreboard.NameTagVisibility;
    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;

    import me.Jake_0403.MiniGame1.TDM;

    public class 
    GameScoreboard {

        private 
    TDM plugin;
        public 
    int redScore;
        public 
    int blueScore;
        public 
    int playerScore;

        public 
    GameScoreboard(TDM plugin) {
            
    this.plugin plugin;
        }

        public 
    Scoreboard gameSB() {

            
    ScoreboardManager manager Bukkit.getScoreboardManager();
            
    Scoreboard toReturn manager.getNewScoreboard();

            
    Objective objective toReturn.registerNewObjective("PlayTime!""");
            
    objective.setDisplaySlot(DisplaySlot.SIDEBAR);
            
    objective.setDisplayName(ChatColor.RED "TDM");

            
    Team red toReturn.registerNewTeam("red");
            
    red.setDisplayName(ChatColor.RED "RED");
            
    red.setAllowFriendlyFire(false);
            
    red.setCanSeeFriendlyInvisibles(true);
            
    red.setNameTagVisibility(NameTagVisibility.ALWAYS);

            
    Team blue toReturn.registerNewTeam("blue");
            
    blue.setDisplayName(ChatColor.BLUE "BLUE" ChatColor.RESET);
            
    blue.setAllowFriendlyFire(false);
            
    blue.setCanSeeFriendlyInvisibles(true);
            
    blue.setNameTagVisibility(NameTagVisibility.ALWAYS);

            
    Score discordLink objective.getScore("discord.gg/BfWzRxfr");
            
    discordLink.setScore(1);

            
    Score blank2 objective.getScore("");
            
    blank2.setScore(2);

            
    Score blueTeam objective.getScore(ChatColor.BLUE "Blue: " ChatColor.WHITE String.valueOf(blueScore));
            
    blueTeam.setScore(3);

            
    Score redTeam objective.getScore(ChatColor.RED "Red: " ChatColor.WHITE String.valueOf(redScore));
            
    redTeam.setScore(4);

            
    Score blank5 objective.getScore("");
            
    blank5.setScore(5);

            
    Score playerKills objective.getScore("Kills: " String.valueOf(playerScore));
            
    playerKills.setScore(6);

            return 
    toReturn;
        }

        
    // SETTERS
        
    public void setBlueScore(int kills) {
            
    this.blueScore kills;
        }

        public 
    void setRedScore(int kills) {
            
    this.redScore kills;
        }

        public 
    void setPlayerScore(Player playerint kills) {
            
    Objective objective player.getScoreboard().getObjective("objective");
            
    Score playerKills objective.getScore("playerKills");
            
    kills Integer.valueOf(playerKills.getEntry());
            
    this.playerScore kills;
        }

        public 
    void setStartingPlayerScore(int zero) {
            
    this.playerScore zero;
        }

        
    // GETTERS
        
    public int getBlueScore() {
            return 
    this.blueScore;
        }

        public 
    int getRedScore() {
            return 
    this.redScore;
        }

        public 
    int getPlayerScore(Player player) {
            
    Objective objective player.getScoreboard().getObjective("objective");
            
    Score playerKills objective.getScore("playerKills");
            
    int kills Integer.valueOf(playerKills.getEntry());
            return 
    kills;
        }

    }
    And here is the method where I try to add players to the team (it is inside my Utils class):
    PHP:
        public void sortPlayers(Player playerLocation redStartLocLocation blueStartLoc) {

            if (
    gameScoreboard.gameSB().getTeam("red").getEntries().size() <= gameScoreboard.gameSB().getTeam("blue").getEntries().size()) {

                
    gameScoreboard.gameSB().getTeam("red").addPlayer(player);
                
    gameScoreboard.gameSB().getTeam("red").addEntry(player.getName());
                
    player.setPlayerListName(ChatColor.RED player.getName());
                
    player.teleport(redStartLoc);

            } else { 
    // if (gameScoreboard.gameSB().getTeam("red").getEntries().size() >
                        // gameScoreboard.gameSB().getTeam("blue").getEntries().size()) {

                
    gameScoreboard.gameSB().getTeam("blue").addPlayer(player);
                
    gameScoreboard.gameSB().getTeam("blue").addEntry(player.getName());
                
    player.setPlayerListName(ChatColor.BLUE player.getName());
                
    player.teleport(blueStartLoc);
            }
        }
    Lastly, here is my main class, TDM:
    PHP:
    package me.Jake_0403.MiniGame1;

    import org.bukkit.Bukkit;
    import org.bukkit.plugin.java.JavaPlugin;

    import me.Jake_0403.MiniGame1.listeners.ChatFormat;
    import me.Jake_0403.MiniGame1.listeners.GameStart;
    import me.Jake_0403.MiniGame1.listeners.PlayerJoinAndWait;
    import me.Jake_0403.MiniGame1.listeners.UpdateGameSB;
    import me.Jake_0403.MiniGame1.listeners.UpdateLobbySB;
    import me.Jake_0403.MiniGame1.scoreboards.GameScoreboard;
    import me.Jake_0403.MiniGame1.scoreboards.LobbyScoreboard;
    import me.Jake_0403.MiniGame1.utils.Utils;

    public class 
    TDM extends JavaPlugin {

        public 
    void onEnable() {
            
    saveDefaultConfig();
            
    getServer().getMessenger().registerOutgoingPluginChannel(this"BuneeCord");
            
    GameStart.gameStarted false;
            
    Bukkit.getServer().getWorld("world").setFullTime(0);

            
    // Commands

            // Listeners
            // new ChatFormat(this);
            
    new GameStart(this);
            new 
    PlayerJoinAndWait(this);
            new 
    UpdateGameSB(this);
            new 
    UpdateLobbySB(this);

            
    // GUIs

            // Scoreboards
            
    new GameScoreboard(this);
            new 
    LobbyScoreboard(this);

            
    // Utils
            
    new Utils(this);
        }
    }
    There are no error messages.
    Any help is welcome.
    Thanks in advance
     
  2. Offline

    Strahan

    You are creating a new Scoreboard every time you call gameSB in the GameScoreboard class. I don't work with scoreboards, so I'm guessing here, but if you are creating a new one every time then how can it possibly store players properly? I'd think you need it to maintain state.

    Code:
    getServer().getMessenger().registerOutgoingPluginChannel(this, "BuneeCord");
    BuneeCord? A rabbit on a string? lol
     
  3. Offline

    Jake_0403

    @Strahan Thanks for the response.

    So my BungeeCord thing works just fine lol, people have told me the same thing you did but right now I'm not going to fix what aint broke.

    Anyways, I went back and revamped my code and got this...

    gameScoreboard:
    PHP:
    package me.Jake_0403.MiniGame1.scoreboards;

    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.entity.Player;
    import org.bukkit.scoreboard.DisplaySlot;
    import org.bukkit.scoreboard.NameTagVisibility;
    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;

    import me.Jake_0403.MiniGame1.TDM;

    public class 
    GameScoreboard {

        private 
    TDM plugin;
     
        public 
    ScoreboardManager manager;
        public static 
    Scoreboard gameSB;
        public 
    Objective objective;
        public 
    Team red;
        public 
    Team blue;
        public 
    Score discordLink;
        public 
    Score blueTeam;
        public 
    Score redTeam;
        public 
    Score playerKills;
     
        public 
    int redScore;
        public 
    int blueScore;
        public 
    int playerScore;
     
        public 
    GameScoreboard(TDM plugin) {
            
    this.plugin plugin;
        }

        public 
    void gameSB() {

            
    manager Bukkit.getScoreboardManager();
            
    gameSB manager.getNewScoreboard();

            
    objective gameSB.registerNewObjective("PlayTime""");
            
    objective.setDisplaySlot(DisplaySlot.SIDEBAR);
            
    objective.setDisplayName(ChatColor.RED "TDM");

            
    red gameSB.registerNewTeam("red");
            
    red.setDisplayName(ChatColor.RED "RED");
            
    red.setAllowFriendlyFire(false);
            
    red.setCanSeeFriendlyInvisibles(true);
            
    red.setNameTagVisibility(NameTagVisibility.ALWAYS);

            
    blue gameSB.registerNewTeam("blue");
            
    blue.setDisplayName(ChatColor.BLUE "BLUE" ChatColor.RESET);
            
    blue.setAllowFriendlyFire(false);
            
    blue.setCanSeeFriendlyInvisibles(true);
            
    blue.setNameTagVisibility(NameTagVisibility.ALWAYS);

            
    discordLink objective.getScore("");
            
    discordLink.setScore(1);

            
    Score blank2 objective.getScore("");
            
    blank2.setScore(2);

            
    blueTeam objective.getScore(ChatColor.BLUE "Blue: " ChatColor.WHITE String.valueOf(blueScore));
            
    blueTeam.setScore(3);

            
    redTeam objective.getScore(ChatColor.RED "Red: " ChatColor.WHITE String.valueOf(redScore));
            
    redTeam.setScore(4);

            
    Score blank5 objective.getScore("");
            
    blank5.setScore(5);

            
    playerKills objective.getScore("Kills: " String.valueOf(playerScore));
            
    playerKills.setScore(6);
        }

        
    // SETTERS
        
    public void setBlueScore(int kills) {
            
    this.blueScore kills;
        }

        public 
    void setRedScore(int kills) {
            
    this.redScore kills;
        }

        public 
    void setPlayerScore(Player playerint kills) {
            
    Objective objective player.getScoreboard().getObjective("objective");
            
    Score playerKills objective.getScore("playerKills");
            
    kills Integer.valueOf(playerKills.getEntry());
            
    this.playerScore kills;
        }
     
        public 
    void resetPlayerScore() {
            
    this.playerScore 0;
        }

        
    // GETTERS
        
    public int getBlueScore() {
            return 
    this.blueScore;
        }

        public 
    int getRedScore() {
            return 
    this.redScore;
        }

        public 
    int getPlayerScore(Player player) {
            
    Objective objective player.getScoreboard().getObjective("objective");
            
    Score playerKills objective.getScore("playerKills");
            
    int kills Integer.valueOf(playerKills.getEntry());
            return 
    kills;
        }
    }

    I did this so the scoreboard is only created once, but I can still change things about it as events happen in the game.
    Buuuut... the first time I try to set scoreboard to a player it throws an error claiming gameSB is null.

    Stack Trace:
    Code:
    13.01 04:11:43 [Server] INFO java.lang.IllegalArgumentException: Scoreboard cannot be null
    13.01 04:11:43 [Server] INFO at org.apache.commons.lang.Validate.notNull(Validate.java:192) ~[spigot46.jar:git-Spigot-21fe707-e1ebe52]
    13.01 04:11:43 [Server] INFO at org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer.setScoreboard(CraftPlayer.java:1236) ~[spigot46.jar:git-Spigot-21fe707-e1ebe52]
    13.01 04:11:43 [Server] INFO at me.Jake_0403.MiniGame1.listeners.GameStart$1.run(GameStart.java:75) ~[?:?]
    13.01 04:11:43 [Server] INFO at org.bukkit.craftbukkit.v1_8_R3.scheduler.CraftTask.run(CraftTask.java:71) ~[spigot46.jar:git-Spigot-21fe707-e1ebe52]
    13.01 04:11:43 [Server] INFO at org.bukkit.craftbukkit.v1_8_R3.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:350) [spigot46.jar:git-Spigot-21fe707-e1ebe52]
    13.01 04:11:43 [Server] INFO at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:723) [spigot46.jar:git-Spigot-21fe707-e1ebe52]
    13.01 04:11:43 [Server] INFO at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [spigot46.jar:git-Spigot-21fe707-e1ebe52]
    13.01 04:11:43 [Server] INFO at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [spigot46.jar:git-Spigot-21fe707-e1ebe52]
    13.01 04:11:43 [Server] INFO at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [spigot46.jar:git-Spigot-21fe707-e1ebe52]
    13.01 04:11:43 [Server] INFO at java.lang.Thread.run(Thread.java:748) [?:1.8.0_211]
    And this is the class that is throwing the error, GameStart:
    PHP:
    package me.Jake_0403.MiniGame1.listeners;

    import java.util.ArrayList;

    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.GameMode;
    import org.bukkit.Location;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerJoinEvent;

    import me.Jake_0403.MiniGame1.TDM;
    import me.Jake_0403.MiniGame1.scoreboards.GameScoreboard;
    import me.Jake_0403.MiniGame1.scoreboards.LobbyScoreboard;
    import me.Jake_0403.MiniGame1.utils.Utils;

    public class 
    GameStart implements Listener {

        private 
    TDM plugin;
        public static 
    boolean gameStarted;
        public 
    Location redStartLoc;
        public 
    Location blueStartLoc;
        public 
    ArrayList<PlayerredPlayers;
        public 
    ArrayList<PlayerbluePlayers;

        
    Utils utils = new Utils(plugin);
        
    LobbyScoreboard lobbyScoreboard = new LobbyScoreboard(plugin);
        
    GameScoreboard gameScoreboard = new GameScoreboard(plugin);

        public 
    GameStart(TDM plugin) {
            
    this.plugin plugin;
            
    Bukkit.getPluginManager().registerEvents(thisplugin);
        }

        @
    EventHandler
        
    public void startGame(PlayerJoinEvent e) {
            
    Player p e.getPlayer();
            
    redStartLoc = new Location(p.getWorld(), 03850);
            
    blueStartLoc = new Location(p.getWorld(), 542, -35);

            if (
    Bukkit.getServer().getOnlinePlayers().size() >= && gameStarted == false) {

                
    // 30 Second Left
                
    countdownTitle(0"Tip: Swords Do Damage");
                
    // 20 Seconds Left
                
    countdownTitle(10"Tip: If You Want To Win, Don't Lose");
                
    // 10 Second Left
                
    countdownTitle(20"Tip: Press The Left Mouse Button To Hit Enemies");
                
    // 5 Seconds Left
                
    countdownTitle(25"");
                
    // 4 Seconds Left
                
    countdownTitle(26"");
                
    // 3 Seconds Left
                
    countdownTitle(27"");
                
    // 2 Seconds Left
                
    countdownTitle(28"");
                
    // 1 Second Left
                
    countdownTitle(29"");

                
    Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
                    @
    Override
                    
    public void run() {

                        
    GameStart.gameStarted true;

                        
    gameScoreboard.setRedScore(0);
                        
    gameScoreboard.setBlueScore(0);

                        for (
    Player player Bukkit.getOnlinePlayers()) {
                            
    player.resetTitle();
                            
    player.setGameMode(GameMode.SURVIVAL);
                            
    gameScoreboard.resetPlayerScore();
                            
    player.setScoreboard(GameScoreboard.gameSB);
                            
    player.setHealth(20);
                            
    player.setFoodLevel(20);
                            
    utils.sortPlayers(playerredStartLocblueStartLoc);
                        }
                    }
                }, 
    30 20); // This ensures that the game actually starts before putting players on teams,
                                // switching inventories, and teleport to start
            
    }
        }

        public 
    void countdownTitle(int secondsToWaitString subtitle) {
            
    Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
                @
    Override
                
    public void run() {
                    for (
    Player player Bukkit.getOnlinePlayers()) {
                        
    // TODO
                        
    player.resetTitle();
                        
    String title = (ChatColor.AQUA "Game Starts In " String.valueOf(30 secondsToWait));
                        
    player.sendTitle(titleChatColor.DARK_AQUA subtitle);
                    }
                }
            }, 
    secondsToWait 20);
        }
    }
    How would I fix this issue?

    Thanks
     
    Last edited: Jan 12, 2021
  4. Online

    timtower Administrator Administrator Moderator

    Locked
    Bungeecord requires offline mode.
    Offline mode is not supported by Bukkit
     
Thread Status:
Not open for further replies.

Share This Page