package com.github.jamesnorris.ablockalypse.aspect;
import java.util.ArrayList;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Score;
import org.bukkit.scoreboard.Scoreboard;
import com.github.jamesnorris.ablockalypse.Ablockalypse;
import com.github.jamesnorris.ablockalypse.DataContainer;
import com.github.jamesnorris.ablockalypse.behavior.GameAspect;
import com.github.jamesnorris.ablockalypse.enumerated.Setting;
import com.github.jamesnorris.ablockalypse.threading.RepeatingTask;
public class GameScoreboard implements GameAspect {
private Game game;
private Scoreboard board;
private Objective points, health;
private DataContainer data = Ablockalypse.getData();
public GameScoreboard(Game game) {
this.game = game;
board = Bukkit.getScoreboardManager().getNewScoreboard();
points = board.registerNewObjective("points", "dummy");
points.setDisplaySlot(DisplaySlot.SIDEBAR);
points.setDisplayName(game.getName() + " - " + game.getLevel());
if ((Boolean) Setting.DISPLAY_PLAYER_HEALTH.getSetting()) {
health = board.registerNewObjective("health", "health");
health.setDisplaySlot(DisplaySlot.BELOW_NAME);
health.setDisplayName("/ 20");
}
startScan();
game.addObject(this);
data.objects.add(this);
}
@Override public Block getDefiningBlock() {
return null;
}
@Override public ArrayList<Block> getDefiningBlocks() {
return null;
}
@Override public Game getGame() {
return game;
}
@Override public int getLoadPriority() {
return 3;
}
@Override public void onGameEnd() {}
@Override public void onGameStart() {}
@Override public void onLevelEnd() {}
@Override public void onNextLevel() {}
@Override public void remove() {
game.removeObject(this);
data.objects.remove(this);
}// board should be removed onDisable
public void startScan() {
new RepeatingTask(20, true) {
@Override public void run() {
for (OfflinePlayer offline : board.getPlayers()) {
if (offline.isOnline()) {
Player player = offline.getPlayer();
if (data.isZAPlayer(player)) {
ZAPlayer zap = data.getZAPlayer(player);
if (zap.getGame() != game) {
removePlayerScoreboard(player);
}
} else {
removePlayerScoreboard(player);
}
}
}
for (ZAPlayer zap : game.getPlayers()) {
Player player = zap.getPlayer();
boolean unLoaded = false;
if (player.getScoreboard() != board) {
player.setScoreboard(board);
unLoaded = true;
}
Score score = points.getScore(player);
if (unLoaded) {
score.setScore(-1);
}
score.setScore(zap.getPoints());
}
points.setDisplayName(game.getName() + " - " + game.getLevel());
}
private void removePlayerScoreboard(Player player) {
player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
}
};
}
}