• 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 Asynchrone BukkitRunnable "schlafen" lassen?

Tomekk.

Minecrafter
Registriert
3 März 2018
Beiträge
13
Alter
26
Diamanten
307
Minecraft
Tomekk
Hey,

wär's möglich eine Asynchrone BukkitRunnable schlafen zu lassen?
ich habe jetzt ein wenig rumprobiert, aber es sieht echt so aus, als würde das "Thread.sleep(int);" einfach ignoriert werden.

Gibts da vielleicht eine andere vernünftige Methode das ganze zu machen?
 

Chojo-chan

Teammaid
Social Media
Moderator
Administrator
Registriert
24 März 2013
Beiträge
293
Alter
5
Diamanten
645
Minecraft
Hadde
Was hast du denn vor? Idr ist sleep auf einen Thread nicht das was man will.
Ein Bukkit Task sollte innerhalb eines Ticks ablaufen. Alles andere kann ungewollte nebeneffekte haben.
 

Tomekk.

Minecrafter
Registriert
3 März 2018
Beiträge
13
Alter
26
Diamanten
307
Minecraft
Tomekk
Naja, ich muss irgendwie ein CaseOpening etwas schohnender Coden und das ganze über den Hauptthread laufen lassen ist keine Option da es ja den ganzen Server freezed.

Oder hab ich bei soeinem Plugin irgendwie die Möglichkeit komplett auf sowas zu verzichten?
 

Chojo-chan

Teammaid
Social Media
Moderator
Administrator
Registriert
24 März 2013
Beiträge
293
Alter
5
Diamanten
645
Minecraft
Hadde
Mach einen self cancelable task.

Du übergibst dem Task ein Objekt, dass die Routine alle x ticks einen Schritt weiter durchführt. Wenn die routine abgelaufen ist, dann cancelt der task sich selber.
 

Chojo-chan

Teammaid
Social Media
Moderator
Administrator
Registriert
24 März 2013
Beiträge
293
Alter
5
Diamanten
645
Minecraft
Hadde
Du musst den Task mehrfach ausführen. Und er muss sich selber canceln wenn er fertig ist. Aus dem Task heraus.

Eventuell willst du sowas. Der State wäre der aktuelle State deines Case openings für einen Spieler. Alle 5 Ticks wird der State deines CaseOpenings einen Schritt weiter geführt. Wenn das Case opening fertig ist cancelt sich der Task selber.

Kann man natürlich noch weiter verbessern. Zudem das eine derzeit deprecatete methode benutzt. Aber auf dem aktuellen Stand funktioniert das.

Java:
        State playerState = new State(player);

        Bukkit.getScheduler.runTaskTimer(this, new BukkitRunnable() {
            State state = playerState;
            
            @Override
            public void run() {
                state.invoke();
                if (state.isDone()) {
                    cancel();
                }
            }
        }, 5, 5);
 

Chrisliebär❤️

nur echt mit ❤️
Moderator
Registriert
19 Mai 2014
Beiträge
1.675
Diamanten
830
Also zu aller erst: Egal welche Lösung dir mit sleep() einfällt, sie ist falsch. Das Problem kann mit sleep nicht gelöst werden. Was du brauchst ist eine Statemachine, die entweder periodisch vom Scheduler aufgerufen wird oder sich selbst über den Scheduler aufruft. Von daher an der Stelle von mir nur der Hinweis rauszufinden, was eine Statemachine genau ist, denn das ist ein wichtiges Muster, dass man, wie du siehst, beherschen sollte.

Bedenke auch, dass du deine API Aufrufe mit Bukkit im Hauptthread machen MUSST, da die API gar nicht threadsafe ist.
 
Oben