Discord

  • 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!

Erledigt Scoreboard fügt eine Zeile immer dazu?

Mr_Redstone19

Schafhirte
Mitglied seit
31 Januar 2018
Beiträge
101
Alter
44
Hallo.
Ich programmier gerade ein Scoreboard für mein KnockFFA-System.
Ich lasse über das Scoreboard farbige Spielernamen und ein Scoreboard laufen. In dem Scoreboard wird dann aus der MySQL ausgelesen, wie viele Tode der Spieler hat. Diese werden bei einem DeathListener gesetzt. Wenn der Spieler einen Tod dazu bekommt, dann wird ihm kurz danach das Scoreboard gesetzt. Wenn im Scoreboard z.B. schon Tode : 1 steht, dann sieht der Todesabschnitt danach so aus:
Tode : 1
Tode : 2
Das System fügt also immer eine Zeile hinzu, anstatt sie zu updaten. Hier der Code dazu:
Java:
package me.madebyproxxy.spigot.knockffa.utils;

import org.bukkit.Bukkit;
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 me.madebyproxxy.spigot.coinsystem.util.SQLStats;

public class NameTags {
    
    static Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
    
    public static void setNameTag(Player p, String prefix) {
        
        Team random = scoreboard.getTeam(prefix);
        
        if(random == null) {
            random = scoreboard.registerNewTeam(prefix);
        }
        
        random.setPrefix(prefix);
        random.addPlayer(p);
        
        
        for(Player all : Bukkit.getOnlinePlayers()) {
            all.setScoreboard(scoreboard);
        }
    }
    
    public static void setScoreboard(Player p) {
        final Objective obj = scoreboard.getObjective("test") != null ? scoreboard.getObjective("test") : scoreboard.registerNewObjective("test", "dummy");
        obj.setDisplaySlot(DisplaySlot.SIDEBAR);
        obj.setDisplayName("§b§lKnockFFA");
        obj.getScore("§a").setScore(10);
        obj.getScore("§7Coins:").setScore(9);
        obj.getScore(" §e» " + SQLStats.getCoins(p.getUniqueId().toString())).setScore(8);
        obj.getScore("§b").setScore(7);
        obj.getScore("§7Kills:").setScore(6);
        obj.getScore(" §e» " + me.madebyproxxy.spigot.knockffa.utils.SQLStats.getKills(p.getUniqueId().toString())).setScore(5);
        obj.getScore("§c").setScore(4);
        obj.getScore("§7Deaths:").setScore(3);
        obj.getScore(" §e» " + me.madebyproxxy.spigot.knockffa.utils.SQLStats.getDeaths(p.getUniqueId().toString())).setScore(2);
    }
    
    public static void updateScoreboard(Player p){
        Objective obj = p.getScoreboard().getObjective("test") != null ? p.getScoreboard().getObjective("test") : p.getScoreboard().registerNewObjective("test", "dummy");   
    }

}
Woran liegt das?
Und ich habe eine weitere Frage.
Gibt es noch eine andere Möglichkeit Scoreboards zu erstellen? Weil bei dieser methode ist mir aufgefallen, dass sie immer flackern beim Updaten... jedenfalls wenn ich sie mache.
Vielen Dank,
Mr_Redstone_19
 

DerFrZocker

Miner
Mitglied seit
10 Dezember 2017
Beiträge
161
Alter
20
Minecraft
DerFrZocker
Tag,

das nicht lagern und die neue Zeilen kannst du ganz einfach mit Teams umgehen, da du bei diesen eigene Entrys, prefixe, suffixe etc hast.
Das könnte dan so zum Beispiel aussehen:

Code:
obj.setDisplayName("§b§lKnockFFA");
obj.getScore("§a").setScore(10);
obj.getScore("§7Coins:").setScore(9);

Team team = scoreboard.getTeam("coins") == null ? scoreboard.registerNewTeam("coins") : scoreboard.getTeam("coins");
team.setPrefix(" §e» <some number>");
team.addEntry("§r");

obj.getScore("§r").setScore(8);

obj.getScore("§b").setScore(7);
obj.getScore("§7Kills:").setScore(6);
und wenn du die Zahl updaten willst kannst du einfach nur die zwei Zeilen ausführen:
Code:
Team team = scoreboard.getTeam("coins") == null ? scoreboard.registerNewTeam("coins") : scoreboard.getTeam("coins");
team.setPrefix(" §e» <some number>");
 
Zuletzt bearbeitet:

Mr_Redstone19

Schafhirte
Mitglied seit
31 Januar 2018
Beiträge
101
Alter
44
Danke. Muss dann also in den UpdateTeil einfach nur das Team
Team team = scoreboard.getTeam("kills") == null ? scoreboard.registerNewTeam("kills") : scoreboard.getTeam("kills");
team.setPrefix(" §e» <some number>");
und mehr nicht?
Und ich muss dann auch nur das updateScoreboard ausführen?
 

DerFrZocker

Miner
Mitglied seit
10 Dezember 2017
Beiträge
161
Alter
20
Minecraft
DerFrZocker
Ja, du musst nur einmal das Scoreboard setzen, und danach einfach die prefixe deiner jeweiligen teams mit der neuen Zahl füttern. Mehr nicht.
(Pro veränderbaren score, ein extra team und ein andere entry, das sollte aber logisch sein)
 

Mr_Redstone19

Schafhirte
Mitglied seit
31 Januar 2018
Beiträge
101
Alter
44
Ja das ist logisch. Wenn ich das jz aber über updateScoreboard ändere, dann bekommt jeder Spieler das Scoreboard, für den es zuletzt geupdatet wurde. Ich habe kein forEach oder keine for-Schleife... Trotzdem bekommt dann jeder Spieler im Scoreboard z.B. 100 Coins
 

DerFrZocker

Miner
Mitglied seit
10 Dezember 2017
Beiträge
161
Alter
20
Minecraft
DerFrZocker
Das liegt daran das jeder Spieler wenn er auf den server joint, das gleich scoreboard object hat.

kann man so zum Beispiel testen:
Code:
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event){

   if( Bukkit.getScoreboardManager().getMainScoreboard() == event.getPlayer().getScoreboard())
       System.out.println("true");
   else
       System.out.println("false");
}
das heißt du musst dem Spieler, wenn du ihm das erste mal das scoreboard gibst, ein neues scoreboard object erzeugen und dem spieler geben.

Code:
Scoreboard scoreboard;
if( Bukkit.getScoreboardManager().getMainScoreboard() == player.getScoreboard()){
scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
player.setScoreboard(scoreboard);
}
else
scoreboard = player.getScoreboard();
edit:
Habe mir nochmal dein code angeschaut und gesehen das du das scoreboard static hast. Dan funktioniert es erst recht nicht. Wenn du wirklich immer das Main Scoreboard benutzt. Da musst du wirklich jedem Spieler ein extra Scoreboard geben. Damit auch jeder was anderes sieht. Wie will sonst Spigot / Bukkit / Minecraft wissen das es die daten nur für den einen Spieler ändern soll?
 
Zuletzt bearbeitet:

Mr_Redstone19

Schafhirte
Mitglied seit
31 Januar 2018
Beiträge
101
Alter
44
Ich habe das Scoreboard static, damit ich auch die NameTags benutzen kann. Wenn ich das nicht mache, dann überschreiben entweder die NameTags das Scoreboard oder andersherum. Jedenfalls war das so, als ich das gemacht hab
 

DerFrZocker

Miner
Mitglied seit
10 Dezember 2017
Beiträge
161
Alter
20
Minecraft
DerFrZocker
Dan gib jedem Spieler gleich beim joinen ein extra scoreboard, solange das name tag plugin mit Player#getScoreboard arbeitet sollte es klappen. Wichtig hierbei ist das du als Event Priority lowest angibts, damit dein Code auch als erstes beim joinen ausgeführt wird. Und nicht erst nach dem NameTag plugin.

Code:
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerJoin(PlayerJoinEvent event){
    if( Bukkit.getScoreboardManager().getMainScoreboard() == event.getPlayer().getScoreboard())
        event.getPlayer().setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard());
}
und in deiner set / update Methode verwendest du dann Player#getScoreboard.
 

Mr_Redstone19

Schafhirte
Mitglied seit
31 Januar 2018
Beiträge
101
Alter
44
Okay. Danke. Das versteh ich aber irgendwie noch nicht so ganz. Wo muss jetzt das hier hin?
Java:
Scoreboard scoreboard;
if( Bukkit.getScoreboardManager().getMainScoreboard() == player.getScoreboard()){
scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
player.setScoreboard(scoreboard);
}
else
scoreboard = player.getScoreboard();
Und wann muss ich die NameTags setzen? Muss das Scoreboard jetzt static sein oder nicht? Ich versteh das irgendwie nicht so ganz. Wär sehr nett, wenn du mir das nochmal zusammenfassen könntest.
Vielen Dank c:
 

DerFrZocker

Miner
Mitglied seit
10 Dezember 2017
Beiträge
161
Alter
20
Minecraft
DerFrZocker
ok,

1. Immer wenn ein Spieler auf dem Server joint, bekommt er das Main Scoreboard, das ist immer das selbe Object (Notiz am Rande: Spigot Speichert auch das Main Scoreboard ab, das heist selbt nach einem Server neustard sind die Teams und Objective noch vorhanden (zum mindest in dir 1.13.2, wie es bei älteren version aussieht weis ich gerade nicht, da es mir erst dort aufgefallen ist).

Dies kannst du wie schon geschrieben so sehen / überprüfen:
Code:
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event){

   if( Bukkit.getScoreboardManager().getMainScoreboard() == event.getPlayer().getScoreboard())
       System.out.println("true");
   else
       System.out.println("false");
}
2. Daraus lässt sich Schließen, dass immer wenn du was bei einem Scoreboard änderst, jeder Spieler betroffen ist wo das Scoreboard gesetzt bekommen hat.

3. Da du immer das Main Scoreboard änderst und jeder Spieler das Main Scoreboard hat, bekommt jeder Spieler immer das gleiche Scoreboard zu Gesicht.

4. Deswegen musst du jedem Spieler ein extra Scoreboard geben. Damit du keine Probleme mit anderen Plugins bekommst, empfehle ich immer dan wenn jeder Spieler ein extra Scoreboard benötigt, ihm diesen direkt beim Joinen zu geben. Und diese am besten mit der EventPriority.LOWEST damit dein Listener als erstes ausgeführt wird, wenn ein Spieler Joint. Das hat den Hindergrund damit andere Plugins wo direkt beim Joinen das Scoreboard benutzen. Nicht das Main Scoreboard benutzen sonder das von dem Spieler. (voraus gesetz sie benutzen Player#getScoreboard und setzen selber kein neues)

Code:
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerJoin(PlayerJoinEvent event){
    if( Bukkit.getScoreboardManager().getMainScoreboard() == event.getPlayer().getScoreboard())
        event.getPlayer().setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard());
}
(Die abfrage ob es das Main Scoreboard ist mache ich persönlich immer noch hin, damit falls ein anderes plugin auch ein Scoreboard mit der priority Lowest setzt es da nicht zu Problemen kommt)

5. Ich würde dir empfehlen nie das Scoreboard Object (Also mit der Methode Player#setScoreboard) während der Spieler auf dem Server ist zu ändern (und erst recht nicht wenn es nicht wenn der Spieler nicht Main Scoreboard hat und du ihm keins gegeben hast. Das deutet nähmlich darauf hin, dass schon ein anderes Plugin dem Spieler ein Costum Scoreboard gegeben hat), um wieder Probleme mit anderen Plugins zu vermeiden.

6. Wenn du nun im weiteren verlauf das Scoreboard updaten / das objective und die Teams erstellen willst nutzt die Methode:

Code:
Scoreboard scoreboard = player.getScoreboard();
Um das Scoreboard zu bekommen.
Und das immer wen du was ändern willst, das heißt keine Statische Variable.

7. Wenn du das Richtig umgesetzt hast und dein NameTag plugin auch die Methode Player#getScoreboard benutzt und ihm nicht das Main Scoreboard setzt, solltest du wenig Probleme haben mit der Kompatibilität.

Diese Notizen solltest du dir immer im Hinterkopf behalten. Damit deine Plugins gut mit anderen Plugins aus kommt, welche auch das Scoreboard benutzen.
 
Oben