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

Countdown läuft komisch ab

Jannis | HerrLegit

Minecrafter
Registriert
23 Juli 2017
Beiträge
4
Alter
23
Diamanten
300
Minecraft
HerrLegit
Guten Tag,
ich habe ein Problem mit meinem Countdown.
Ich habe einen Scheduler genommen und einen Int. Jede Sekunde wird von dem Int -1 abgerechnet.
Irgendwie sieht das in Minecraft aber sehr unregelmäßig aus..
Ich würde mich sehr freuen, wenn ihr mir bei meinem Problem helfen könntet.

Liebe Grüße
Jannis

Javascript:
    public void sendCountdown() {
        count = Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
         
            @Override
            public void run() {
                start = start -1;
             
                for(Player all : Bukkit.getOnlinePlayers()) {
                    if(start == 5) {
                        all.sendMessage(Main.prefix +"Der Countdown beträgt §a" + start);
                    }
                 
                    if(start == 4) {
                        all.sendMessage(Main.prefix +"Der Countdown beträgt §a" + start);
                    }
                 
                    if(start == 3) {
                        all.sendMessage(Main.prefix +"Der Countdown beträgt §a" + start);
                    }
                 
                    if(start == 2) {
                        all.sendMessage(Main.prefix +"Der Countdown beträgt §a" + start);
                    }
                 
                    if(start == 1) {
                        all.sendMessage(Main.prefix +"Der Countdown beträgt §a" + start);
                    }
                 
                    if(start == 0) {
                        start = 6;
                        Bukkit.getServer().getScheduler().cancelAllTasks();
                        Main.online.remove(all.getName());
                    }
                }
            }
        }, 0L, 20L);
    }

//Dean: Logs, Configs & Code bitte entweder als Code einfügen oder als Dateianhang, bzw.auf pastebin.com hochladen! Danke!
 
Zuletzt bearbeitet von einem Moderator:

Chrisliebär❤️

nur echt mit ❤️
Moderator
Registriert
19 Mai 2014
Beiträge
1.675
Diamanten
830
Also erstmal wär es schön, wenn du Code Tags verwendest, sonst wird größerer Code unlesbar. Und zum eigentlich Problem: Was willst du hier zählen? Du weißt, dass der Scheduler nur in Ticks arbeitet vermute ich. 20 Ticks entsprechen aber nicht immer einer Sekunde. Das ganze unterliegt einem gewissen Drift, der dadurch entsteht, dass ein Tick niemals negative Laufzeiten haben kann aber manchmal länger braucht. Ingesamt sind Ticks eine sehr ungenaue Zeitquelle, wenn du in echter Zeit zählen willst. Wie solltest du das also sonst machen?

Am einfachsten wäre, wenn du mit Timestamps arbeitest. Falls dir das nichts sagt, frag Google. Dann speicherst du dir einfach einmal den Start oder Endpunkt und prüfst in jedem Tick, wieviel Zeit wirklich vergangen ist (System.microseconds() oder sowas). Wenn du mehrerer dieser Tasks hast, lohnt es sich irgendwann auch ein richtiges Framework dafür zu bauen.

Was du auch machen kannst, wenn du nicht jeden Tick den zähler überprüfen willst ist ein Asynchroner Zähler (glaub das ist die Timer Klasse von Java). Der Zähler läuft dann in einem eigenen Thread. Du musst dann nur beim Ablauf des Timers wieder einen Task in den Scheduler packen, der beim nächsten Tick ausgeführt wird. Die Scheduler Methoden sind laut Dokumentation alle Threadsafe.

So ein externer Zähler, der sich nach Ablauf mit dem Mainloop synchronisiert ist grundsätzlich auch eine schöne Übungsaufgabe. Wenn du es richtig machen willst, brauchst du nicht mehr als einen seperaten Thread, der jeweils nur immer so lange wartet, bis der nächste "Task" bereit ist.

Nützliche Links:
http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_14_007.htm
https://hub.spigotmc.org/javadocs/s...-org.bukkit.plugin.Plugin-java.lang.Runnable-
https://docs.oracle.com/javase/8/docs/api/java/util/TimerTask.html
https://davejingtian.org/2013/09/28/timer-queue-a-way-to-handle-multiple-timers-using-one-thread/ (allgemeine Beschreibung vom letzten Lösungansatz)
 
Zuletzt bearbeitet:

BlackHole

Workaholic
Registriert
1 Juli 2012
Beiträge
752
Diamanten
0
Minecraft
BlackHole
Bitte niemals diese Codezeile verwenden!
Code:
Bukkit.getServer().getScheduler().cancelAllTasks();

Mit dem Befehl /tps kannst du dir anzeigen, wie viele Ticks pro Sekunde der Server gerade schafft. Idealerweise sind es diese 20, aber sein Server hat dafür scheinbar nicht genug Leistung.
 
Oben