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

MrPyro13

Workaholic
Registriert
29 April 2013
Beiträge
826
Diamanten
300
Minecraft
MrPyro13
Hallo,

kannst mir jemand sagen, was an diesem Code falsch ist?

Code:
package de.mrpyro13.ImpComs;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.Plugin;
public class iCountdown_Command implements CommandExecutor {
@Override
public boolean onCommand(final CommandSender sender, Command cmd, String label, String[] args) {
//SCRIPT ANFANG
int countdown;
sender.sendMessage("§aDer Countdown wurde gestartet");
countdown = Bukkit.getScheduler().scheduleSyncRepeatingTask((Plugin) this,new Runnable() {
int x;
int high = 11;
@Override
public void run() {
if(high != 0) {
high--;
sender.sendMessage("§6Countdown läuft noch §b " + high + " §5Sekunden");
} else {
sender.sendMessage("§aCountdown vorbei");
Bukkit.getScheduler().cancelTask(countdown);
}
}
}, 0, 20);
//SCRIPT ENDE
return true;
}
}

Bukkit.getScheduler().cancelTask(countdown);
Hier wird das countdown angestrichen, man soll die Variable oben (int countdown) final(en)

Final ich es wird in diesem Abschnitt das countdown angestrichen:
countdown = Bukkit.getScheduler().scheduleSyncRepeatingTask((Plugin) this,new Runnable() {
 

FelixKlauke

Erzengel
Ehem. Teammitglied
Registriert
5 Januar 2014
Beiträge
1.038
Diamanten
299
Minecraft
FelixKlauke
Hallo,

kannst mir jemand sagen, was an diesem Code falsch ist?

Code:
package de.mrpyro13.ImpComs;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.Plugin;
public class iCountdown_Command implements CommandExecutor {
@Override
public boolean onCommand(final CommandSender sender, Command cmd, String label, String[] args) {
//SCRIPT ANFANG
int countdown;
sender.sendMessage("§aDer Countdown wurde gestartet");
countdown = Bukkit.getScheduler().scheduleSyncRepeatingTask((Plugin) this,new Runnable() {
int x;
int high = 11;
@Override
public void run() {
if(high != 0) {
high--;
sender.sendMessage("§6Countdown läuft noch §b " + high + " §5Sekunden");
} else {
sender.sendMessage("§aCountdown vorbei");
Bukkit.getScheduler().cancelTask(countdown);
}
}
}, 0, 20);
//SCRIPT ENDE
return true;
}
}


Hier wird das countdown angestrichen, man soll die Variable oben (int countdown) final(en)

Final ich es wird in diesem Abschnitt das countdown angestrichen:

Ein kleiner Hinweis. Du kannst nicht einfach ein CommandExecutor zu Plugin casten.
Code:
Bukkit.getScheduler().scheduleSyncRepeatingTask((Plugin) this,new Runnable()

Du musst daran denken, deine mainclass da zu uebergeben und keine x-beliebige. Erzeuge eine neue Instanz deiner mainclass im Konstruktor. Diese kannst du dann uebergeben.
 
G

games6471

Guest
Du kannst die Plugininstanz wie folgt über dem Konstruktor übergeben:

http://wiki.bukkit.org/Plugin_Tutorial#Using_a_separate_CommandExecutor_class

Code:
public class MyPluginCommandExecutor implements CommandExecutor {
    private final MyPlugin plugin;

    public MyPluginCommandExecutor(MyPlugin plugin) {
        this.plugin = plugin; // Store the plugin in situations where you need it.
    }

Und bei der Erstellung einer Instanz (new ...) dieser Klasse die Hauptklasse übergeben. Das bedeutet new blabla(instance) Also in der Hauptklasse (JavaPlugin) mit this.

Code:
new MyPluginCommandExecutor(this)
 

FelixKlauke

Erzengel
Ehem. Teammitglied
Registriert
5 Januar 2014
Beiträge
1.038
Diamanten
299
Minecraft
FelixKlauke
In der Klasse mit dem Scheduler:

Code:
private <namedermain> inst;

public <namederklasse>(<Namedermain> plugin){
    this.inst = plugin;
}

Und dann dem Scheduler "inst" uebergeben.

In der Mainklasse machste dann:

Code:
new <namederschedulerklasse>(this);

Versuch aber erst, den simn zu verstehen und es dann zu kopieren!:)
 

MrPyro13

Workaholic
Registriert
29 April 2013
Beiträge
826
Diamanten
300
Minecraft
MrPyro13
Das funktioniert jetzt. Jedoch geht das mit dem countdown nicht

Code:
package de.mrpyro13.ImpComs;

import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.Plugin;

public class iCountdown_Command implements CommandExecutor {

    private Main inst;

    public iCountdown_Command(Main plugin){
        this.inst = plugin;
    }

    @Override
    public boolean onCommand(final CommandSender sender, Command cmd, String label, String[] args) {
        //SCRIPT ANFANG
    
        int countdown;
        sender.sendMessage("§aDer Countdown wurde gestartet");
        countdown = Bukkit.getScheduler().scheduleSyncRepeatingTask(inst, new Runnable() {
            int x;
            int high = 11;
            @Override
            public void run() {
                if(high != 0) {
                    high--;
                    sender.sendMessage("§6Countdown läuft noch §b " + high + " §5Sekunden");
                } else {
                    sender.sendMessage("§aCountdown vorbei");
                    Bukkit.getScheduler().cancelTask(countdown);
                }
            }
        }, 0, 20);
    
        //SCRIPT ENDE
        return true;
    }

}

Das was ich rot markiert habe, buggt: Ich fahre über den Fehler, als Problemlösung kommt das:
final int countdown;

Dann ist es immernoch rot markiert und es kommt als Problemlösung das:
final int countdown = 0;

Jetzt ist das rot markierte richtig, aber das grün markierte wird rot unterstrichen und möchte das final weg haben.
Langsam drehe ich durch :(

@xXSasukeXx und @games6471
Programmierst ihr auch in extra Klassen oder eher in der Main?
 
G

games6471

Guest
Einfache Alternative:

Code:
new BukkitRunnable() {
            int x;
            int high = 11;

            @Override
            public void run() {
                if (high != 0) {
                    high--;
                    sender.sendMessage("§6Countdown läuft noch §b " + high + " §5Sekunden");
                } else {
                    sender.sendMessage("§aCountdown vorbei");
                    this.cancel();
                }
            }
        }.runTaskTimer(inst, 0, 20);

Man sollte seinen Programmcode logisch in verschiedene Klassen unterteilen und nicht alles in eine Klasse stopfen. Das verbessert deutlich die Übersichtlichkeit und viele weitere Dinge.
 
Oben