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!

Spigot Erledigt Scoreboard update vom Kontostand

dmmk218

Redstoneengineer
Mitglied seit
28 Juni 2018
Beiträge
42
Alter
21
Hallo zusammen,

ich habe eine Frage und zwar habe ich eine Frage zum updaten vom Scoreboard.

Ich habe folgenden Code geschrieben (ein paar Sachen sind auskommentiert weil ich etwas testen wollte):

Java:
package net.woodpixel.scoreboard.testserver;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.ScoreboardManager;

import net.milkbowl.vault.economy.Economy;

@SuppressWarnings("unused")
public class Main extends JavaPlugin implements Listener {
    
    @Override
    public void onEnable() {
    
        this.getServer().getPluginManager().registerEvents(this, this);
        setupEconomy();
        for (Player p : Bukkit.getOnlinePlayers()) {
        Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
            @Override
            public void run() {
                playerBalance(p, null);
            }
        }, 1, 1);
    }   
    }
    
    public static Economy econ = null;
    
    public static String playerBalance(Player p, Double amount) {
        double balance = econ.getBalance(p);
        String formart = econ.format(balance);
      
        return formart;
    }
    
    private boolean setupEconomy() {
        if (getServer().getPluginManager().getPlugin("Vault") == null) {
            return false;
        }
      
        RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
            if (rsp == null) {
                return false;
            }
          
        econ = (Economy)rsp.getProvider();
            return econ != null;
    }
    
    public void setScoreboard(Player p) {
        
    ScoreboardManager sm = Bukkit.getScoreboardManager();
    final Scoreboard board = sm.getNewScoreboard();
    final Objective o = board.registerNewObjective("test", "dummy");
    
    o.setDisplaySlot(DisplaySlot.SIDEBAR);
    o.setDisplayName("§e§lWOOD§4§lPIXEL");
    
    o.getScore("§a ").setScore(11);
    o.getScore("§8§l»§3§lRang").setScore(10);
    
    
    if (p.hasPermission("wps.score.admin")) {
        o.getScore("§4§lOwner").setScore(9);
    }
    else if (p.hasPermission("wps.score.coadmin")) {
        o.getScore("§4§lAdmin").setScore(9);
    }
    else if (p.hasPermission("wps.score.headmod")){
        o.getScore("§c§lHeadmod").setScore(9);
    }
    else if (p.hasPermission("wps.score.mod")) {
        o.getScore("§c§lModerator").setScore(9);
    }
    else if (p.hasPermission("wps.score.dev")) {
        o.getScore("§b§lDeveloper").setScore(9);
    }
    else if (p.hasPermission("wps.score.sup")) {
        o.getScore("§2§lSupporter").setScore(9);
    }
    else if (p.hasPermission("wps.score.design")) {
        o.getScore("§3§lDesigner").setScore(9);
    }
    else if (p.hasPermission("wps.score.builder")) {
        o.getScore("§e§lBuilder").setScore(9);
    }
    else if (p.hasPermission("wps.score.ytp")) {
        o.getScore("§5§lYouTuber§c+").setScore(9);
    }
    else if (p.hasPermission("wps.score.yt")) {
        o.getScore("§5§lYouTuber").setScore(9);
    }
    else if (p.hasPermission("wps.score.supreme")) {
        o.getScore("§d§lSupreme").setScore(9);
    }
    else if (p.hasPermission("wps.score.pixel")) {
        o.getScore("§9§lPixel").setScore(9);
    }
    else if (p.hasPermission("wps.score.legende")) {
        o.getScore("§5§lLegende").setScore(9);
    }
    else if (p.hasPermission("wps.score.premium")) {
        o.getScore("§6§lPremium").setScore(9);
    }
    else {
        o.getScore("§7Spieler").setScore(9);
    }
    

    o.getScore("§3 ").setScore(8);
    o.getScore("§8§l»§3§lServer").setScore(7);
    o.getScore("§fCB-1").setScore(6);
    o.getScore("§b ").setScore(5);
    o.getScore("§8»§3§lKontostand ").setScore(4);
    o.getScore("§f" + playerBalance(p, null)).setScore(3);
    o.getScore("§f ").setScore(2);
    o.getScore("§8§l»§3§lShop").setScore(1);
    o.getScore("§f/shop").setScore(0);
        
    p.setScoreboard(board);
    
    }
    
    @EventHandler
    public void onJoin(PlayerJoinEvent e) {
        Player p = (Player)e.getPlayer();
        
        //new BukkitRunnable() {
        //    @Override
        //    public void run() {
        //       
        //        for (Player all : Bukkit.getOnlinePlayers()) {
        //            setScoreboard(all);
        //        }
        //       
        //    }
        //}.runTaskLater(this, 1);
        setScoreboard(p);
    }
    
    //@EventHandler
    //public void onQuit(PlayerQuitEvent e) {
        
    //    new BukkitRunnable() {   
    //        @Override
    //        public void run() {
                
    //            for (Player all : Bukkit.getOnlinePlayers()) {
    //                setScoreboard(all);
    //            }
                
    //        }
    //    }.runTaskLater(this, 1);
    //}

}
Wenn ich in der onEnable Methode den im RepeatingTask bei der run Methode setScoreboard(p); angebe funktioniert alles wie gewünscht nur flackert das Score abnormal. Wenn ich sie weglasse updated das Geld nicht mehr.

Jetzt habe ich einiges darüber gelesen jedoch sagt jeder etwas anderes. Die einen sagen ich muss Teams verwenden, wieder jemand anderes sagt mit einem Asynchronen Task würde es funktionieren und der nächste sagt ich brauche eine extra update Methode. Ich bin verwirrt was ist denn nun der richtige weg?

LG dmmk218
 

DerFrZocker

Miner
Osterei Experte
Mitglied seit
10 Dezember 2017
Beiträge
155
Alter
19
Minecraft
DerFrZocker
So eine ähnlich frage wurde vor ein par Tagen hier bereits beantwortet: https://minecraft-server.eu/forum/threads/scoreboard-fügt-eine-zeile-immer-dazu.53156/

Generell brauchst du zwei methoden, eine die das Scoreboard setzt und eine die es updatet. Das setzen rufst du im PlayerJoinEvent auf, und das updaten wenn du ein wert ändern willst. Veränderbare Zeilen registrierst du dabei als Team und feste Zeilen als normalen Score. Und beim updaten, uptedest du nur die Teams, dann sollte es auch nicht flackern. Genaueres kannst du dem anderen Beitrag entnehmen.
 

dmmk218

Redstoneengineer
Mitglied seit
28 Juni 2018
Beiträge
42
Alter
21
Okay ich glaube (ich bin noch nicht erfahren mit Java) ich habe es soweit verstanden und glaube auch es richtig umgesetzt zu haben.
Aber es passiert nichts...

Meine Änderungen:
Java:
@Override
    public void onEnable() {
    
        this.getServer().getPluginManager().registerEvents(this, this);
        setupEconomy();
        for (Player p : Bukkit.getOnlinePlayers()) {
        Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
            @Override
            public void run() {
                updateScoreboard(p);
            }
        }, 1, 1);
        }
    }
Java:
    public void updateScoreboard(Player p) {
        Scoreboard board = p.getScoreboard();
        Team team = board.getTeam("money") == null ? board.registerNewTeam("money") : board.getTeam("money");
        team.setPrefix("§f" + playerBalance(p, null));
    }
Java:
    o.getScore("§3 ").setScore(8);
    o.getScore("§8§l»§3§lServer").setScore(7);
    o.getScore("§f" + getNameserver()).setScore(6);
    o.getScore("§b ").setScore(5);
    o.getScore("§8»§3§lKontostand ").setScore(4);
    
    Team team = board.getTeam("money") == null ? board.registerNewTeam("money") : board.getTeam("money");
    team.setPrefix("§f" + playerBalance(p, null));
    team.addEntry("§r");
    
    o.getScore("§r").setScore(3);
    o.getScore("§f ").setScore(2);
    o.getScore("§8§l»§3§lShop").setScore(1);
    o.getScore("§f/shop").setScore(0);
        
    p.setScoreboard(board);
Was habe ich falsch gemacht?
 

DerFrZocker

Miner
Osterei Experte
Mitglied seit
10 Dezember 2017
Beiträge
155
Alter
19
Minecraft
DerFrZocker
Was genau funktioniert nicht? wird das scoreboard nicht gesetzt oder nicht upgedatet?

for (Player p : Bukkit.getOnlinePlayers()) { Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable() { @Override public void run() { updateScoreboard(p); } }, 1, 1); }
Wenn du es so machst, wird nur einaml beim Server Start jeweils für jeden Spieler wo momentan online ist (heißt für 0 Spieler), ein Schedular gesetz wo das Scoreboard updatet.
Das müsste dan eher so aussehen:

Java:
Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, () -> Bukkit.getOnlinePlayers().forEach(this::updateScoreboard), 1, 1);

//bzw ausgeschrieben

    Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
            @Override
            public void run() {
                for(Player p : Bukkit.getOnlinePlayers())
                    updateScoreboard(p);
            }
        }, 1, 1);
ps: bis du sicher das du das Scoreboard jeden tick sync updaten willst?
 

dmmk218

Redstoneengineer
Mitglied seit
28 Juni 2018
Beiträge
42
Alter
21
Was genau funktioniert nicht? wird das scoreboard nicht gesetzt oder nicht upgedatet?



Wenn du es so machst, wird nur einaml beim Server Start jeweils für jeden Spieler wo momentan online ist (heißt für 0 Spieler), ein Schedular gesetz wo das Scoreboard updatet.
Das müsste dan eher so aussehen:

Java:
Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, () -> Bukkit.getOnlinePlayers().forEach(this::updateScoreboard), 1, 1);

//bzw ausgeschrieben

    Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
            @Override
            public void run() {
                for(Player p : Bukkit.getOnlinePlayers())
                    updateScoreboard(p);
            }
        }, 1, 1);
ps: bis du sicher das du das Scoreboard jeden tick sync updaten willst?
Das Scoreboard wird gesetzt nur das Geld wird nicht geupdated. Nein ist schon geänder auf 0L, 20L also jede Sekunde.
 

DerFrZocker

Miner
Osterei Experte
Mitglied seit
10 Dezember 2017
Beiträge
155
Alter
19
Minecraft
DerFrZocker
Das liegt an dem, was ich dir ein Beitrag vorher geschrieben habe.
 

XenoPyax

Minecrafter
Mitglied seit
5 Juli 2015
Beiträge
23
Alter
22
Minecraft
XenoPyax
Code:
team.setPrefix("§f" + playerBalance(p, null) + "$");
So sollte es reichen
 

dmmk218

Redstoneengineer
Mitglied seit
28 Juni 2018
Beiträge
42
Alter
21
Code:
team.setPrefix("§f" + playerBalance(p, null) + "$");
So sollte es reichen
Naja nein das '$' wird vom format Block in meiner Methode gesetzt dann hätte ich 2 mal '$' einmal vorne einmal hinten.

Wenn ich die Formatierungsmethode weglasse dann wird der Kontostand ab nem gewissen betrag mit Buchstaben angezeigt.
 

DerFrZocker

Miner
Osterei Experte
Mitglied seit
10 Dezember 2017
Beiträge
155
Alter
19
Minecraft
DerFrZocker
Wenn du ein gutes eco plugin hast, kannst du das format in der config einstellen.
 

dmmk218

Redstoneengineer
Mitglied seit
28 Juni 2018
Beiträge
42
Alter
21
Wenn du ein gutes eco plugin hast, kannst du das format in der config einstellen.
Naja nohate aber es geht nicht darum wie gut / schlecht das Plugin ist sondern um eine Lösung. Ich benutze Vault und das ist ein sehr weit verbreitetes Eco Plugin was sogar große Server wie GrieferGames benutzen.
 

DerFrZocker

Miner
Osterei Experte
Mitglied seit
10 Dezember 2017
Beiträge
155
Alter
19
Minecraft
DerFrZocker
Da hast du was miss verstanden Vault liefert nur Interfaces und abstracte classen (und impl für bestimmte plugins), damit man sein plugin nicht für jedes eco plugin kompatibel machen muss. Das heist es braucht auch ein passendes eco plugin wo Vault unterstützt und das interface impl sowie im Bukkit Service registriert. Und da brauchst du ein gutes plugin, wo dir das Format einstellen lässt.

Wenn dein eco plugin das nicht unterstützt kannst du es auch selber formatieren. Dazu kannst du z.b. die String#format Methode verwenden: https://dzone.com/articles/java-string-format-examples
 

dmmk218

Redstoneengineer
Mitglied seit
28 Juni 2018
Beiträge
42
Alter
21
Da hast du was miss verstanden Vault liefert nur Interfaces und abstracte classen (und impl für bestimmte plugins), damit man sein plugin nicht für jedes eco plugin kompatibel machen muss. Das heist es braucht auch ein passendes eco plugin wo Vault unterstützt und das interface impl sowie im Bukkit Service registriert. Und da brauchst du ein gutes plugin, wo dir das Format einstellen lässt.

Wenn dein eco plugin das nicht unterstützt kannst du es auch selber formatieren. Dazu kannst du z.b. die String#format Methode verwenden: https://dzone.com/articles/java-string-format-examples
Ich benutze ergänzend Essentials X
 

XenoPyax

Minecrafter
Mitglied seit
5 Juli 2015
Beiträge
23
Alter
22
Minecraft
XenoPyax
dann hole dir den Balance String mach replace('$','') und dan mach es sowie ich geschrieben habe.
 
Oben