• 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 Scheduler arbeitet bei nicht zutreffender Abfrage dennoch weiter.

Shoqrii

Redstoneengineer
Registriert
16 Juni 2018
Beiträge
46
Diamanten
301
Minecraft
Shoqrii
Hey,

Ich möchte gerne das wenn der Spieler im GameMode ist das es nicht weiter geht.
Allerdings arbeitet der Scheduler trotz Abfrage einfach weiter.

Genutzt habe ich folgende Abfrage:
Java:
 if(!all.getGameMode().equals(GameMode.CREATIVE) || !all.getGameMode().equals(GameMode.SPECTATOR)) {

Ganzer Code:
Java:
    public static void startThirstDisplay() {
        
        Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getPlugin(), new Runnable() {
            
            @Override
            public void run() {
                
                for(Player all : Bukkit.getOnlinePlayers()) {
                    int t = CFG.cfg.getInt(all.getUniqueId() + ".Anzeigen.Durst");
                    
                    int random = 0;
                    Random r = new Random();
                    int trem = r.nextInt(4);
                    
                    switch(trem) {
                    case 0:
                        random = 4;
                        break;
                    case 1:
                        random = 8;
                        break;
                    case 2:
                        random = 5;
                        break;
                    case 3:
                        random = 6;
                        break;
                    case 4:
                        random = 3;
                        break;
                    }
                    
                    if(!all.getGameMode().equals(GameMode.CREATIVE) || !all.getGameMode().equals(GameMode.SPECTATOR)) {
                        if(t >= 0) {
                            
                            CFG.cfg.set(all.getUniqueId() + ".Anzeigen.Durst", (t - random));
                            Main.getPlugin().saveConfig();
                            PlayerAPI.updateScoreBoard(all);
                            
                        } else {
                            CFG.cfg.set(all.getUniqueId() + ".Anzeigen.Durst", 100);
                            CFG.cfg.set(all.getUniqueId() + ".Anzeigen.Hunger", 100);
                            Main.getPlugin().saveConfig();
                            PlayerAPI.updateScoreBoard(all);
                            all.setHealth(0);
                            all.sendMessage(Main.prefix + "Du bist §cgestorben §7da du verurstet bist.");
                        }
                    }
                }
                
            }
        }, 0, 20*50*5);
        
    }
 

Luki_xx

Schafhirte
Registriert
12 Juni 2019
Beiträge
107
Diamanten
378
Minecraft
Luki_xx
Hallo.
Ich hab mir nur deine If Abfrage angeschaut und denke, dass darin der Fehler sein könnte/sein wird.

Bei dir schaut die If Abfrage so aus wenn du Creative bist: if(false||true). Dadurch ist die Abfrage auf true/wahr und dein Code wird ausgeführt.

Du brauchst also ein und statt einem oder.

Java:
 if(!all.getGameMode().equals(GameMode.CREATIVE) &!!all.getGameMode().equals(GameMode.SPECTATOR)) {

Ich hoffe ich konnte dir weiterhelfen.
~Luki


Edit: Glaube das du das meinst, die Formulierung ist eigentlich falsch .
 
Zuletzt bearbeitet:

Chrisliebär❤️

nur echt mit ❤️
Moderator
Registriert
19 Mai 2014
Beiträge
1.675
Diamanten
830
Guck doch was du aufrufst "scheduleSyncRepeatingTask". Hab den wichtigen Teil markiert. Warum sollte der Task plötzlich nicht mehr aufgerufen werden, das ist keine Schleife, das ist ein Callback, das periodisch aufgerufen wird. Wenn du den Task beenden willst musst du in canceln und nicht einfach nur den Callback verlassen. Ich vermute das geht auch über ne Methode in der annonymen Task Klasse, weiß ich auch nicht auswendig.
 

Shoqrii

Redstoneengineer
Registriert
16 Juni 2018
Beiträge
46
Diamanten
301
Minecraft
Shoqrii
Guck doch was du aufrufst "scheduleSyncRepeatingTask". Hab den wichtigen Teil markiert. Warum sollte der Task plötzlich nicht mehr aufgerufen werden, das ist keine Schleife, das ist ein Callback, das periodisch aufgerufen wird. Wenn du den Task beenden willst musst du in canceln und nicht einfach nur den Callback verlassen. Ich vermute das geht auch über ne Methode in der annonymen Task Klasse, weiß ich auch nicht auswendig.
Ich will den Scheduler ja Garnicht Beenden, sondern nur für die Spieler die im GM 1 sind überspringen und Auslassen.
 

Shoqrii

Redstoneengineer
Registriert
16 Juni 2018
Beiträge
46
Diamanten
301
Minecraft
Shoqrii
Hallo.
Ich hab mir nur deine If Abfrage angeschaut und denke, dass darin der Fehler sein könnte/sein wird.

Bei dir schaut die If Abfrage so aus wenn du Creative bist: if(false||true). Dadurch ist die Abfrage auf true/wahr und dein Code wird ausgeführt.

Du brauchst also ein und statt einem oder.

Java:
 if(!all.getGameMode().equals(GameMode.CREATIVE) &!!all.getGameMode().equals(GameMode.SPECTATOR)) {

Ich hoffe ich konnte dir weiterhelfen.
~Luki


Edit: Glaube das du das meinst, die Formulierung ist eigentlich falsch .
Danke, ich schaue morgen ob das vielleicht funktioniert.
 

SirYwell

PlotSquared Entwickler
Registriert
30 Juni 2017
Beiträge
540
Diamanten
488
Minecraft
SirYwell
Es liegt tatsächlich an der if-Abfrage. Da die Menge an Spielmodi recht übersichtlich ist, kann man sich da auch noch eine Wahrheitstabelle anlegen, dann wird ersichtlich, wo sich der Fehler eingeschlichen hat.

Ich habe mal zwei Möglichkeit mit den richtigen Wahrheitswerten angeben, vielleicht war das mit der Klammerung sogar deine ursprüngliche Idee:

Spielmodus / Formelnot Creative or not
Spectator​
not Creative and not Spectator
not (Creative or Spectator)
Survivaltrue or true => truetrue and true => truenot false => true
Adventuretrue or true => true
true and true => true
not false => true
Creativefalse or true => truefalse and true => falsenot true => false
Spectatortrue or false => truetrue and false => falsenot true => false
 

Shoqrii

Redstoneengineer
Registriert
16 Juni 2018
Beiträge
46
Diamanten
301
Minecraft
Shoqrii
Hallo.
Ich hab mir nur deine If Abfrage angeschaut und denke, dass darin der Fehler sein könnte/sein wird.

Bei dir schaut die If Abfrage so aus wenn du Creative bist: if(false||true). Dadurch ist die Abfrage auf true/wahr und dein Code wird ausgeführt.

Du brauchst also ein und statt einem oder.

Java:
 if(!all.getGameMode().equals(GameMode.CREATIVE) &!!all.getGameMode().equals(GameMode.SPECTATOR)) {

Ich hoffe ich konnte dir weiterhelfen.
~Luki


Edit: Glaube das du das meinst, die Formulierung ist eigentlich falsch .
Funktioniert zwar, allerdings geht's auch im GameMode 0 nicht weiter
 

SirYwell

PlotSquared Entwickler
Registriert
30 Juni 2017
Beiträge
540
Diamanten
488
Minecraft
SirYwell
Ich würde dir empfehlen, kurze Debug-Nachrichten in die einzelnen Code-Teile reinzupacken. Also beispielsweise direkt in der ersten Zeile der run()-Methode, innerhalb der for-Schleife und nach der if-Abfrage. So kannst du schauen, was alles ausgeführt wird. Und den Task würde ich zum Testen auch öfter laufen lassen, >4 Minuten warten jedes Mal ist wohl etwas zeitraubend ^^
 

Shoqrii

Redstoneengineer
Registriert
16 Juni 2018
Beiträge
46
Diamanten
301
Minecraft
Shoqrii
Ich würde dir empfehlen, kurze Debug-Nachrichten in die einzelnen Code-Teile reinzupacken. Also beispielsweise direkt in der ersten Zeile der run()-Methode, innerhalb der for-Schleife und nach der if-Abfrage. So kannst du schauen, was alles ausgeführt wird. Und den Task würde ich zum Testen auch öfter laufen lassen, >4 Minuten warten jedes Mal ist wohl etwas zeitraubend ^^
Na, da es beim Reload sowieso einmal ausgeführt wird sehe ich ja dann ob es klappt. :)
Funktioniert jedenfalls zwar nun im GM 1 nicht, aber im 0 auch nicht.
 

Luki_xx

Schafhirte
Registriert
12 Juni 2019
Beiträge
107
Diamanten
378
Minecraft
Luki_xx
Ich hoffe ich habe das jetzt alles richtig verstanden.
Du lässt das ganze nur ein einziges durchlaufen und das beim reload? Der Teil der in der If Abfrage steht wird weder im Creative Modus noch im Survival Modus ausgeführt?

Ich würde erstmal empfehlen die Zeit, wie bereits geschrieben, herabzusetzen. Baue zusätzlich auch Debug Nachrichten ein. Vielleicht ist es möglich das beim ersten Durchlauf noch nicht alles richtig geladen ist, wieso auch immer. Lasse deshalb den Scheduler beim ersten mal mit einer Verzögerung von ~10 Ticks laufen, vielleicht funktioniert es ja dann. Ansonsten fällt mir alerding gerade auch nichts auf/ein was da nicht klappen köönte.
 
Oben