LuizB Postado Junho 15, 2017 Denunciar Compartilhar Postado Junho 15, 2017 (editado) Código: SimpleScoreboard ss = new SimpleScoreboard("Sla"); ss.add("Sla ", 1); ss.build(); ss.send(p); new BukkitRunnable() { @Override public void run() { // TODO Auto-generated method stub ss.update("Sla "+Integer.toString(new Random().nextInt(100000)), 1); } }.runTaskTimer(ff, 20, 20); SimpleScoreboard: import java.util.AbstractMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Objective; import org.bukkit.scoreboard.Scoreboard; import org.bukkit.scoreboard.Team; import com.google.common.base.Preconditions; import com.google.common.base.Splitter; import com.google.common.collect.Lists; import com.google.common.collect.Maps; public class SimpleScoreboard { private Scoreboard scoreboard; private Objective obj; private String title; private Map<String, Integer> scores; private List<Team> teams; public SimpleScoreboard(String title) { this.scoreboard = Bukkit.getScoreboardManager().getNewScoreboard(); this.title = title; this.scores = Maps.newLinkedHashMap(); this.teams = Lists.newArrayList(); } public void blankLine() { add(" "); } public void add(String text) { add(text, null); } public void add(String text, Integer score) { Preconditions.checkArgument(text.length() < 48, "text cannot be over 48 characters in length"); text = fixDuplicates(text); scores.put(text, score); } private String fixDuplicates(String text) { while (scores.containsKey(text)) text += "§r"; if (text.length() > 48) text = text.substring(0, 47); return text; } private Map.Entry<Team, String> createTeam(String text) { String result = ""; if (text.length() <= 16) return new AbstractMap.SimpleEntry<>(null, text); Team team = scoreboard.registerNewTeam("text-" + scoreboard.getTeams().size()); Iterator<String> iterator = Splitter.fixedLength(16).split(text).iterator(); team.setPrefix(iterator.next()); result = iterator.next(); if (text.length() > 32) team.setSuffix(iterator.next()); teams.add(team); return new AbstractMap.SimpleEntry<>(team, result); } @SuppressWarnings("deprecation") public void build() { obj = scoreboard.registerNewObjective((title.length() > 16 ? title.substring(0, 15) : title), "dummy"); obj.setDisplayName(title); obj.setDisplaySlot(DisplaySlot.SIDEBAR); int index = scores.size(); for (Map.Entry<String, Integer> text : scores.entrySet()) { Map.Entry<Team, String> team = createTeam(text.getKey()); Integer score = text.getValue() != null ? text.getValue() : index; OfflinePlayer player = Bukkit.getOfflinePlayer(team.getValue()); if (team.getKey() != null) team.getKey().addPlayer(player); obj.getScore(player).setScore(score); index -= 1; } } @SuppressWarnings("deprecation") public void update(String text, int score) { scores.put(text, score); for (Team t : teams) { if (t.getName() == text) { t.unregister(); } } Map.Entry<Team, String> team = createTeam(text); OfflinePlayer player = Bukkit.getOfflinePlayer(team.getValue()); if (team.getKey() != null) team.getKey().addPlayer(player); obj.getScore(player).setScore(score); } public void reset() { title = null; scores.clear(); for (Team t : teams) t.unregister(); teams.clear(); } public Scoreboard getScoreboard() { return scoreboard; } public void send(Player... players) { for (Player p : players) p.setScoreboard(scoreboard); } } Resultado: Editado Junho 15, 2017 por Cuthmf Link para o comentário Compartilhar em outros sites More sharing options...
FilipeNock Postado Junho 15, 2017 Denunciar Compartilhar Postado Junho 15, 2017 usa essa API, feita pelo meu amigo @GremoryDev https://pastebin.com/cVLgAjp2 public HashMap<Player, ScoreManager> scoreboard = new HashMap<>(); //invoca isso quando o player entrar no servidor public void AddPlayertoScoreboard(Player player) { ScoreManager board = new ScoreManager(player, "§E§LTITULO") { @Override public String placeHolders(String str) { return str.replace("%players%", Bukkit.getOnlinePlayers().size()+"").replace("%player%", player.getName()); } }; board.add("LINHA-1"); board.blank(); //ESPAÇO board.add("LINHA-2"); board.blank(); //ESPAÇO board.add("LINHA-3"); board.updateScoreboard(); if (scoreboard.containsKey(player)) { scoreboard.remove(player); } scoreboard.put(player, board); } public void onEnable() { Bukkit.getScheduler().runTaskTimer(this, new Runnable() { @Override public void run() { for (ScoreManager board : scoreboard.values()) { board.updateScoreboard(); } } }, 0, 20); } no onenable vc cria um scheduler para ele fazer update 1 Link para o comentário Compartilhar em outros sites More sharing options...
LuizB Postado Junho 15, 2017 Autor Denunciar Compartilhar Postado Junho 15, 2017 (editado) usa essa API, feita pelo meu amigo @GremoryDev https://pastebin.com/cVLgAjp2 public HashMap<Player, ScoreManager> scoreboard = new HashMap<>(); //invoca isso quando o player entrar no servidor public void AddPlayertoScoreboard(Player player) { ScoreManager board = new ScoreManager(player, "§E§LTITULO") { @Override public String placeHolders(String str) { return str.replace("%players%", Bukkit.getOnlinePlayers().size()+"").replace("%player%", player.getName()); } }; board.add("LINHA-1"); board.blank(); //ESPAÇO board.add("LINHA-2"); board.blank(); //ESPAÇO board.add("LINHA-3"); board.updateScoreboard(); if (scoreboard.containsKey(player)) { scoreboard.remove(player); } scoreboard.put(player, board); } public void onEnable() { Bukkit.getScheduler().runTaskTimer(this, new Runnable() { @Override public void run() { for (ScoreManager board : scoreboard.values()) { board.updateScoreboard(); } } }, 0, 20);}no onenable vc cria um scheduler para ele fazer update Uma dúvida, essa api feita pelo seu amigo, suporta quantas letras em uma linha ? @EDIT Fiz tudo certinho, porém não está atualizando Código: public static void showScoreboard(Player p) { ScoreManager sm = new ScoreManager(p, "------"); sm.add("-> "+ Integer.toString(new Random().nextInt(1000000000))); sm.updateScoreboard(); if (scoreboard.containsKey(p)) { scoreboard.remove(p); } scoreboard.put(p, sm); new BukkitRunnable() { @Override public void run() { for (ScoreManager board : scoreboard.values()) { board.updateScoreboard(); } } }.runTaskTimer(sw, 20, 20); @EDIT2 Fiz algumas alterações no código e funcionou certinho. Editado Junho 15, 2017 por Cuthmf Link para o comentário Compartilhar em outros sites More sharing options...
Gutyerrez Postado Junho 27, 2017 Denunciar Compartilhar Postado Junho 27, 2017 Sua dúvida foi marcada como [Resolvido] e movido à área de dúvidas resolvidas.Atenciosamente,Gamer's Board Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
LuizB
Código:
SimpleScoreboard:

Editado por CuthmfResultado:
Link para o comentário
Compartilhar em outros sites
3 respostass a esta questão
Posts Recomendados