package com.laytonsmith.abstraction.bukkit; import com.laytonsmith.PureUtilities.Common.ReflectionUtils; import com.laytonsmith.abstraction.MCObjective; import com.laytonsmith.abstraction.MCOfflinePlayer; import com.laytonsmith.abstraction.MCScore; import com.laytonsmith.abstraction.MCScoreboard; import com.laytonsmith.abstraction.MCTeam; import com.laytonsmith.abstraction.enums.MCDisplaySlot; import com.laytonsmith.abstraction.enums.bukkit.BukkitMCDisplaySlot; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.scoreboard.Objective; import org.bukkit.scoreboard.Score; import org.bukkit.scoreboard.Scoreboard; import org.bukkit.scoreboard.Team; import java.util.HashSet; import java.util.Set; public class BukkitMCScoreboard implements MCScoreboard { Scoreboard s; public BukkitMCScoreboard(Scoreboard sb) { s = sb; } public Scoreboard _scoreboard() { return s; } @Override public void clearSlot(MCDisplaySlot slot) { s.clearSlot(BukkitMCDisplaySlot.getConvertor().getConcreteEnum(slot)); } @Override public MCObjective getObjective(MCDisplaySlot slot) { Objective o = s.getObjective(BukkitMCDisplaySlot.getConvertor().getConcreteEnum(slot)); if (o == null) { return null; } return new BukkitMCObjective(o); } @Override public MCObjective getObjective(String name) { Objective o = s.getObjective(name); if (o == null) { return null; } return new BukkitMCObjective(o); } @Override public Set<MCObjective> getObjectives() { Set<MCObjective> ret = new HashSet<MCObjective>(); for (Objective o : s.getObjectives()) { ret.add(new BukkitMCObjective(o)); } return ret; } @Override public Set<MCObjective> getObjectivesByCriteria(String criteria) { Set<MCObjective> ret = new HashSet<MCObjective>(); for (Objective o : s.getObjectivesByCriteria(criteria)) { ret.add(new BukkitMCObjective(o)); } return ret; } @Override public Set<String> getEntries() { try { return s.getEntries(); } catch(NoSuchMethodError ex){ // Probably 1.7.8 or prior Set<String> ret = new HashSet<>(); for (OfflinePlayer o : (Set<OfflinePlayer>) ReflectionUtils.invokeMethod(s, "getPlayers")) { ret.add(o.getName()); } return ret; } } @Override public MCTeam getPlayerTeam(MCOfflinePlayer player) { Team t = s.getPlayerTeam((OfflinePlayer) player.getHandle()); if(t == null) { return null; } return new BukkitMCTeam(t); } @Override public Set<MCScore> getScores(String entry) { Set<MCScore> ret = new HashSet<>(); try { for (Score o : s.getScores(entry)) { ret.add(new BukkitMCScore(o)); } } catch(NoSuchMethodError ex){ // Probably 1.7.8 or prior OfflinePlayer player = Bukkit.getOfflinePlayer(entry); for (Score o : (Set<Score>) ReflectionUtils.invokeMethod(s, "getScores", player)) { ret.add(new BukkitMCScore(o)); } } return ret; } @Override public MCTeam getTeam(String teamName) { Team t = s.getTeam(teamName); if(t == null) { return null; } return new BukkitMCTeam(t); } @Override public Set<MCTeam> getTeams() { Set<MCTeam> ret = new HashSet<>(); for (Team t : s.getTeams()) { ret.add(new BukkitMCTeam(t)); } return ret; } @Override public MCObjective registerNewObjective(String name, String criteria) { return new BukkitMCObjective(s.registerNewObjective(name, criteria)); } @Override public MCTeam registerNewTeam(String name) { return new BukkitMCTeam(s.registerNewTeam(name)); } @Override public void resetScores(String entry) { try { s.resetScores(entry); } catch(NoSuchMethodError ex){ // Probably 1.7.8 or prior OfflinePlayer player = Bukkit.getOfflinePlayer(entry); ReflectionUtils.invokeMethod(s, "resetScores", player); } } @Override public boolean equals(Object obj) { if (obj instanceof MCScoreboard) { return s.equals(((BukkitMCScoreboard) obj).s); } return false; } @Override public int hashCode() { return s.hashCode(); } }