• 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 startet nicht

Status
Nicht offen für weitere Antworten.

SkyPlayerTV

Minecrafter
Mitglied seit
6 August 2017
Beiträge
20
Minecraft
SkyPlayerTV
Hallo,

ich programmiere zur Zeit ein Fußballplugin und komme gerade nicht weiter. Ich habe eine methode, welche einen Countdown im Chat anzeigt, jedohc wird der Schdeuler dazu nicht ausgeführt.

Im Log sind keine Fehler.


Code:
package de.dsltrans.soccer.game;

import java.util.ArrayList;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;

import de.dsltrans.soccer.main.Main;

public class EveryTick {

    public static final String error =  Main.error;
    public static final String info = Main.info;
    public static final String succes = Main.succes;
    
    private Plugin plugin = Main.getPlugin();
    private ArrayList<Player> players = Players.getPlayers();
    private int countdown = 10;
    private int taskID;
    
    public void startContdown() {
        System.out.println("hallo!");
        taskID = plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() {
            
            @Override
            public void run() {
                if(players.size() % 2 != 0) {
                    if(countdown > 1) {
                        new Players().sendMessage(players, info + "Das Spiel startet in " + succes + countdown + info + "Sekunden!");
                        countdown--;
                    }else if(countdown == 1) {
                        new Players().sendMessage(players, info + "Das Spiel startet in " + succes + "einer " + info + "Sekunde!");
                        countdown--;
                    }else {
                        countdown--;
                        new Players().sendMessage(players, info + "Das Spiel startet " + succes + "jetzt" + info +"!");
                    }
                    
                }else {
                    new Players().sendMessage(players, error + "Abbruch! Die Spieleranzahl muss gerade sein!");
                    countdown = 10;
                    
                    
                }
                
            }
        }, 0, 20);
        
        
        
    }
    
    
}
Sorry für die rechtschreibfehler, bin gerade in eile
 

SirYwell

Vorarbeiter
Osterei Experte
Mitglied seit
30 Juni 2017
Beiträge
266
Alter
20
Minecraft
SirYwell
Zeile 28: players.size() % 2 != 0 bedeutet, alles innerhalb deiner if-Abfrage wird genau dann ausgeführt, wenn die Größe der ArrayList Modulo 2 nicht 0 ist. Das widerspricht allerdings deinem else bzw. der Meldung in Zeile 41.

Allerdings würde ich dir sowieso dazu raten, erst einmal die Grundlagen von Java ordentlich zu lernen. Ich lasse dir mal diesen Link da.
 

SkyPlayerTV

Minecrafter
Mitglied seit
6 August 2017
Beiträge
20
Minecraft
SkyPlayerTV
Hallo,
Und Danke für die schnelle Antwort.
Das Plugin ist für mich zum üben. Aber sind arrayLists nicht so, dass die Size, wenn 2 Player drin sind 1 ist?

SkyPlayerTV

PS: Das Buch hab ich schon, bin dann nur bei der OOP nicht mehr durchgestiegen. Hab den Teil dann über YT Tutorials gelernt. So halb wie vermute.
 

SirYwell

Vorarbeiter
Osterei Experte
Mitglied seit
30 Juni 2017
Beiträge
266
Alter
20
Minecraft
SirYwell
Du verwechselts hier den Index mit der Größe. Der Index gibt die Stelle an, an welcher ein Element ist, die Größe gibt die Anzahl an Elementen an. Ich versuche das mal zu verdeutlichen:
| 0 | 1 | 2 | 3 | 4 | 5 | <-- Index
| A | B | C | D | E | F | <-- Elemente
Es sind nun 6 Elemente in der Liste, aber der maximale Index ist 5. Wären A-F nun Spieler, hättest du eine Liste mit 6 Spielern (also eine gerade Anzahl) und eine Liste mit der Größe 6.

Dass der Index in Java und in vielen anderen Programmiersprachen bei 0 anfängt, ist anfangs vielleicht gewöhnungsbedürftig, aber hat verschiedene Gründe. Wenn du dir das genauer anschauen möchtest, kannst du dir ja mal diese Antwort auf StackOverflow durchlesen.
 

SkyPlayerTV

Minecrafter
Mitglied seit
6 August 2017
Beiträge
20
Minecraft
SkyPlayerTV
Hallo,
okay, dann ist mir das jetzt auch klar. Ich hatte es davor auch schon anders rum, hat aber auch nicht funktioniert. Also würde ich jetzt Mal im Scheduler eine logausgabe machen lassen, und wenn sie funktioniert das Problem in der Players.sendMessage() Methode suchen. Kann es was damit zu tun haben, das es nicht static ist?
 
Zuletzt bearbeitet:

SirYwell

Vorarbeiter
Osterei Experte
Mitglied seit
30 Juni 2017
Beiträge
266
Alter
20
Minecraft
SirYwell
Ich weiß nicht, was deine Players-Klasse macht, allerdings deutet es oftmals auf geringe Erfahrung und dadurch entstehende Fehler hin, wenn du zu viele statische Variablen und Methoden hast. Am besten wäre es daher, wenn du erläuterst, was genau der Sinn dieser Klasse ist.
 

SkyPlayerTV

Minecrafter
Mitglied seit
6 August 2017
Beiträge
20
Minecraft
SkyPlayerTV
Sie verwaltet die mitspielenden Player, da ich gerade am PC bin, hab ich mal den Code von ihr:

Java:
package de.dsltrans.soccer.game;

import java.util.ArrayList;

import org.bukkit.entity.Player;

public class Players {

    private static ArrayList<Player> players = new ArrayList<>();

    public static ArrayList<Player> getPlayers() {
        return players;
    }

    public void setPlayers(ArrayList<Player> players) {
        Players.players = players;
    }
    // Die fragliche Methode
    public void sendMessage(ArrayList<Player> receivers, String msg) {
        for(int i = 0; i >= receivers.size(); i++) {
            receivers.get(i).sendMessage(msg);
        }
    }
    
    public void addPlayer(Player p) {
        players.add(p);
    }
    
    
    
    
}
Kann es was damit zu tun haben, das es nicht static ist?
Hab mich da vertan, nur die ArrayList ist static, sowie der zugehörige Getter.
Ich mach jetzt mal das mit der Logausgabe und melde mich dann nochmal.
 

SkyPlayerTV

Minecrafter
Mitglied seit
6 August 2017
Beiträge
20
Minecraft
SkyPlayerTV
Ok, es funktioniert. Also ist die .sendMessage Methode falsch.
 

Brickchef

Schafhirte
Osterei Experte
Mitglied seit
8 Oktober 2017
Beiträge
120
Alter
19
Minecraft
Brickchef
Da List das Iterator Interface implementiert kannst du die for Schleife kannst du auch leserlicher gestalten:
Java:
for (Player p : reveivers) {
   p.sendMessage(msg);
}
Davon abgesehen implementiert ArrayList das List Interface welches ich als Datentyp für die players Variable sowie für die Parameter verwenden würde, da die Implementierung der Liste hier nicht relevant ist.
 

SkyPlayerTV

Minecrafter
Mitglied seit
6 August 2017
Beiträge
20
Minecraft
SkyPlayerTV
Also als forEach-Schleife, oder? Jedenfalls funktioniert es damit. Wird das Listinterface von
java.util.List; importiert?
 

SkyPlayerTV

Minecrafter
Mitglied seit
6 August 2017
Beiträge
20
Minecraft
SkyPlayerTV
Ok, jetzt noch eine Frage: warum wird, wenn ich den Scheduler auf einen Intervall von 20 Ticks setze jede Nachricht 2mal ausgegegben?
 

SkyPlayerTV

Minecrafter
Mitglied seit
6 August 2017
Beiträge
20
Minecraft
SkyPlayerTV
ihr habt den code....

Hallo,

ich programmiere zur Zeit ein Fußballplugin und komme gerade nicht weiter. Ich habe eine methode, welche einen Countdown im Chat anzeigt, jedohc wird der Schdeuler dazu nicht ausgeführt.

Im Log sind keine Fehler.


Code:
package de.dsltrans.soccer.game;

import java.util.ArrayList;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;

import de.dsltrans.soccer.main.Main;

public class EveryTick {

    public static final String error =  Main.error;
    public static final String info = Main.info;
    public static final String succes = Main.succes;
   
    private Plugin plugin = Main.getPlugin();
    private ArrayList<Player> players = Players.getPlayers();
    private int countdown = 10;
    private int taskID;
   
    public void startContdown() {
        System.out.println("hallo!");
        taskID = plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() {
           
            @Override
            public void run() {
                if(players.size() % 2 != 0) {
                    if(countdown > 1) {
                        new Players().sendMessage(players, info + "Das Spiel startet in " + succes + countdown + info + "Sekunden!");
                        countdown--;
                    }else if(countdown == 1) {
                        new Players().sendMessage(players, info + "Das Spiel startet in " + succes + "einer " + info + "Sekunde!");
                        countdown--;
                    }else {
                        countdown--;
                        new Players().sendMessage(players, info + "Das Spiel startet " + succes + "jetzt" + info +"!");
                    }
                   
                }else {
                    new Players().sendMessage(players, error + "Abbruch! Die Spieleranzahl muss gerade sein!");
                    countdown = 10;
                   
                   
                }
               
            }
        }, 0, 20); //Hier ist die Intervallangabe
       
       
       
    }
   
   
}
Sorry für die rechtschreibfehler, bin gerade in eile
 

SirYwell

Vorarbeiter
Osterei Experte
Mitglied seit
30 Juni 2017
Beiträge
266
Alter
20
Minecraft
SirYwell
Vielleicht rufst du deine Methode irgendwie zwei mal auf oder hast Spieler doppelt in der Liste
 

DerFrZocker

Miner
Osterei Experte
Mitglied seit
10 Dezember 2017
Beiträge
155
Alter
19
Minecraft
DerFrZocker
Um doppelt Spieler in der Liste zu verhindern, würde sich eine set empfehlen.
 

SkyPlayerTV

Minecrafter
Mitglied seit
6 August 2017
Beiträge
20
Minecraft
SkyPlayerTV
Naja, wenn ich den Intervall auf 40 Ticks also 2 sekunden stelle, kommt nur eine Nachricht
 

SkyPlayerTV

Minecrafter
Mitglied seit
6 August 2017
Beiträge
20
Minecraft
SkyPlayerTV
Hab jetzt, wenn ich das richtig verstanden hab was @DerFrZocker geschrieben hat, addPlayer() der Playerklasse hinzugefügt. Jetzt geht es auch mit Intervall auf 20.
 
Status
Nicht offen für weitere Antworten.
Allgemein
Hilfe Benutzer
  • AntiThunder AntiThunder:
    Zitat von Majoox:
    Wer gerade so weiß wie Bungeecord funktioniert wird niemals im Leben blicken, dass man das markieren kann um es zu lesen.
  • AntiThunder AntiThunder:
    ich kenne den "inlinespoiler" einfach draufklicken reicht sogar, markieren ist unnötig
  • Majoox Majoox:
    Ich dachte erst ich muss meine Brille aufsetzen
  • ❤️可愛いちゃん️❤️ ❤️可愛いちゃん️❤️:
    @Majoox Du wüsstest das, wenn du häufiger Discord nutzen würdest.
  • Hadde-chan Hadde-chan:
    muss sagen, dass der thread in dem majoox seine verwarnung kassiert hat echt gold ist
  • AntiThunder AntiThunder:
    Guten Morgen
  • Matthias Matthias:
    Guten Morgen
  • LottaXL LottaXL:
    Moin, moin =)
  • SirYwell SirYwell:
    Wie wo was?
  • Stern☆ Stern☆:
    Morgen :)
  • Hadde-chan Hadde-chan:
    morgen uwu
  • Kroseida Kroseida:
    Abend
  • Majoox Majoox:
    Ich würde den Thread auch gerne sehe
  • Majoox Majoox:
    "1920 x 30.000 Pixel" für ein Stellengesuch ist der aktuelle Rekord an Bildergrößen
  • Majoox Majoox:
    In Echt könnte ich damit fast einen Meter bei akzeptabler Pixeldichte ausdrucken
  • LottaXL LottaXL:
    Moin, moin =)
  • Matthias Matthias:
    Guten Morgen
  • Stern☆ Stern☆:
    Morgen :)
  • SirYwell SirYwell:
    mooorgen
    +1
  • Majoox Majoox:
    Griaß God
  • Hadde-chan Hadde-chan:
    Majoox was los?
  • Hadde-chan Hadde-chan:
    Hat jenny dich verlassen oder warum bist du so viel hier?
    Hadde-chan Hadde-chan: Hat jenny dich verlassen oder warum bist du so viel hier?
    Oben