• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Scoreboard richtig updaten?

B

Blindhero

Guest
Hallo Liebe Minecraft Community. Ich habe bisher wenige Scoreboard tutorials gefunden also wollte ich mal fragen wie ich das mache, dass ich ein Scoreboard gut update ohne dass es Flackert? Jeden ServerTick wird einer Hashmap das aktuelle Leben des Spielers zugewiesen und das Scoreboard geupdated:

Code:
this.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
	public void run() {
                     for(Player p : getServer().getOnlinePlayers()) {		
			oldHealth.put(p, (int) (((Damageable) p).getHealth()));
		    }
                    for(Clan c : clans) {
			if(c.getOnlineMember().size() > 0) {
				showClanboard(c);
			}
		}
	}
}, 20L, 0L);

So und hier die Scoreboard Methode:

Code:
public void showClanboard(Clan c) {
	if(c != null) {
		ScoreboardManager manager = Bukkit.getScoreboardManager();
		Scoreboard board = manager.getNewScoreboard();
		Objective clanboard = board.getObjective("clanboard");
			if(clanboard == null) {
				clanboard = board.registerNewObjective("clanboard", "health");
				clanboard.setDisplaySlot(DisplaySlot.SIDEBAR);
				clanboard.setDisplayName(ChatColor.YELLOW + c.getName() + ChatColor.GREEN +" Health in %");
			}
			Team team = board.getTeam(c.getName());
				if(team == null) {
					team = board.registerNewTeam(c.getName());
				}
			for(OfflinePlayer m : team.getPlayers()) {
				if(!m.isOnline()) {
					team.removePlayer(m);
				}
			}				
			boolean update = false;
			for(Player m : c.getOnlineMember()) {		
				Score score = clanboard.getScore(m);		
				int s = (int) ((oldHealth.get(m) / ((Damageable) m).getMaxHealth()) * 100);
					if(s != score.getScore() || !team.hasPlayer(m)) {
						update = true;
					}		
				}
			if(update) {
				for(Player m : c.getOnlineMember()) {
					if(!team.hasPlayer(m)) {
						team.addPlayer(m);		
					}		
				m.setScoreboard(board);
				Score score = clanboard.getScore(m);	
				score.setScore((int) (((Damageable) m).getHealth() / ((Damageable) m).getMaxHealth() * 100));	
				}
			}
		}
	}

Leider flackert das immer wenn mehrere Clans online sind. Jemand ne Idee wie man das richtig bzw besser machen könnte? :D
 

Pappi

Schafhirte
Gesperrt
Registriert
28 Oktober 2012
Beiträge
141
Alter
41
Diamanten
0
Minecraft
Pappi / PapaHarni
Code:
public void showClanboard(Clan c) {
	if(c != null) {
		ScoreboardManager manager = Bukkit.getScoreboardManager();
[COLOR="#00FF00"]                Scoreboard board = player.getScoreboard();
                if(board == null)
		        Scoreboard board = manager.getNewScoreboard();[/COLOR]

		Objective clanboard = board.getObjective("clanboard");
			if(clanboard == null) {
				clanboard = board.registerNewObjective("clanboard", "health");
				clanboard.setDisplaySlot(DisplaySlot.SIDEBAR);
				clanboard.setDisplayName(ChatColor.YELLOW + c.getName() + ChatColor.GREEN +" Health in %");
			}
			Team team = board.getTeam(c.getName());
				if(team == null) {
					team = board.registerNewTeam(c.getName());
				}
			for(OfflinePlayer m : team.getPlayers()) {
				if(!m.isOnline()) {
					team.removePlayer(m);
				}
			}				
			boolean update = false;
			for(Player m : c.getOnlineMember()) {		
				Score score = clanboard.getScore(m);		
				int s = (int) ((oldHealth.get(m) / ((Damageable) m).getMaxHealth()) * 100);
					if(s != score.getScore() || !team.hasPlayer(m)) {
						update = true;
					}		
				}
			if(update) {
				for(Player m : c.getOnlineMember()) {
					if(!team.hasPlayer(m)) {
						team.addPlayer(m);		
					}		
				m.setScoreboard(board);
				Score score = clanboard.getScore(m);	
				score.setScore((int) (((Damageable) m).getHealth() / ((Damageable) m).getMaxHealth() * 100));	
				}
			}
		}
	}
Update ist Farblich Makiert.

Schau wo du die Player class hier bekommst bei dem Update.
 

Pappi

Schafhirte
Gesperrt
Registriert
28 Oktober 2012
Beiträge
141
Alter
41
Diamanten
0
Minecraft
Pappi / PapaHarni
Ah also frage ich ab ob dieser spieler ein offenes scoreboard hat? Zählen aber nich auch 2. Name tags bzw. Das tab board dazu?

Dafür hast du ja dieses :

Objective clanboard = board.getObjective("clanboard");
if(clanboard == null) {
clanboard = board.registerNewObjective("clanboard", "health");
clanboard.setDisplaySlot(DisplaySlot.SIDEBAR);
clanboard.setDisplayName(ChatColor.YELLOW + c.getName() + ChatColor.GREEN +" Health in %");
}

Und kannst Ja auch noch abfragen ob es dem DisplaySlot hat.

if(clanboard.getDisplaySlot() != DisplaySlot.SIDEBAR) {
clanboard.setDisplaySlot(DisplaySlot.SIDEBAR);
}
 
Oben