Ir para conteúdo
  • 0

Linhas da scoreboard duplicando


LuizB

Pergunta

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:

5Ur1z9y.png

Editado por Cuthmf
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

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

Link para o comentário
Compartilhar em outros sites

 

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 por Cuthmf
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...