Java Problem

rasmuslos

Spieler
2 Sep 2017
65
Hey,
Ich habe ein kleines Problem mit Minecraft Java Programmen.

Ich versuche gerade ein Flyspeed Plugin zu Programmieren, aber es komm immer eine Fehler Meldung, wenn ich /flyspeed <Zahl> eingebe. Ich versuche das ganze in der 1.12.2. Hier ist mein Code:

Code:
package de.RasFlor.testen.command;

import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

public class FlySpeedCommand implements CommandExecutor {

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if(sender instanceof Player) {
            Player p = (Player) sender;
            if(args.length == 1) {
                float speed = Float.valueOf(Integer.parseInt(args[1]));
                p.setFlySpeed(speed);
                
                } else {
                    p.sendMessage("§cBitte gib §6/flyspeed <flyspeed> §cein");
                }
            } else {
                System.out.println("Du musst ein Spieler sein um dis auszuführen.");
            }
    return false;
    }
}

Das alles ist selbstverständlich in der plugin.yml und in der Mainclass registriert.

Danke im Voraus

RasFlor
 
Ich habe schon länger nichts mehr mit Plugins gemacht, aber so viel weiß ich noch:
  1. Du musst in onCommand spezifizieren, welchen Befehl du überschreiben möchtest. Sonst überschreibst du das Verhalten aller Befehle soweit ich weiß. Hier ein Beispiel:
    Code:
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
    {
        if (cmd.getName().equalsIgnoreCase("flyspeed") && sender.isOp())
        {
            // Hier der ganze Code, was passieren soll, wenn der Befehl /flyspeed ausgeführt wird
        }
        return false;
    }
  2. Du gibst immer false zurück, d.h. der Befehl schlägt immer fehl. Wenn der Befehl erfolgreich ausgeführt werden konnte, musst du true zurückgeben.
    Code:
    p.setFlySpeed(speed);
    p.sendMessage("Deine Fluggeschwindigkeit wurde erfolgreich auf " + args[0] + " gesetzt.");
    return true;
  3. Arrays fangen in Java immer mit 0 an, d.h. args[0] ist das erste Argument, args[1] das zweite etc.
  4. Kleiner Tipp: Man kann auch ChatColor.RED + "Roter Text" statt "§cRoter Text" schreiben. Macht das ganze ein wenig übersichtlicher.

Wenn du alles davon korrigiert hast, und immer noch ein Fehler auftritt, wäre es sinnvoll, genau zu sagen, welche Fehlermeldung denn überhaupt kommt.

Disclaimer: Es ist schon ein wenig länger her, dass ich das letzte Mal ein Plugin programmiert habe, es könnten sich also Fehler in diesen Post eingeschlichen haben.
 
Danke @violine1101 , Es hat aber imm noch nicht geklappt.

Ich habe die Fehlermeldung angeheftet.

Ps: Es ist schon richtig das die Array bei 1 anfängt ;D
 

Anhänge

  • 2017-11-17_18.34.36.png
    2017-11-17_18.34.36.png
    523,7 KB · Aufrufe: 445
Naja, die Fehlermeldung ist jetzt nicht sonderlich hilfreich :|

Sicher, dass das Array bei 1 anfangen soll? Bin mir ziemlich sicher, dass das nicht so ist. Es sei denn, dein Befehl sieht so aus: /flyspeed <irgendein Parameter> <Fluggeschwindigkeit>

Nichtdestotrotz schließe ich durch die Ausgabe, dass du entweder keinen oder mindestens zwei Parameter angegeben hast, d.h. er springt in den zweiten Fall. Warum hier die Fehlermeldung kommt, ist ein wenig seltsam. Vielleicht hilft es, wenn du den Code so abänderst:
Code:
if(sender instanceof Player) {
    Player p = (Player) sender;
    if(args.length == 1) {
        float speed = Float.valueOf(Integer.parseInt(args[0]));
        p.setFlySpeed(speed);
    } else {
        p.sendMessage("§cBitte gib §6/flyspeed <flyspeed> §cein");
    }
} else {
   sender.sendMessage("Du musst ein Spieler sein um diesen Befehl auszuführen.");
}
return true;
Damit gaukelst du Bukkit vor, der Befehl wäre erfolgreich gewesen (egal welche Eingabe), gibst aber eine eigene Fehlermeldung aus. Vielleicht verhindert das ja den internen Fehler.

Übrigens habe ich das System.out.println() durch ein sender.sendMessage() ersetzt. Das erste sendet immer an die Konsole, das zweite tatsächlich an den, der's ausführt, also beispielsweise auch ein Befehlsblock.

Wenn das nichts hilft, gibt's wahrscheinlich außerhalb der Klasse FlySpeedCommand einen Fehler.

PS: Ich hab nicht gesehen, dass du eine eigene Klasse für den Befehl hast. Ich hab bei mir immer alle zusammen in eine Datei geworfen, war vielleicht im Nachhinein gesehen nicht die beste Idee. Dann braucht man die Fallunterscheidung für den Befehl natürlich nicht.
 
Danke @violine1101 .Jetzt gehts.Ich kann aber nur werte von -1 bis 1 angeben (ohne Dezimalzahlen).

Kannst du mir da bitte nochmal helfen(hab schon mit double probiert)?
 
Code:
float speed = Float.valueOf(Integer.parseInt(args[0]));

Das erste Argument soll ja eine Gleitkommazahl sein, allerdings parsest du sie zunächst in einen Integer (was nur ganze Zahlen akzeptiert und sonst Nachkommastellen abschneiden würde) und castest es dann in einen Float um. Es würde also mehr Sinn machen, wenn du das Argument direkt in einen Float casten würdest, die Float-Klasse bietet eine solche Methode:

Code:
float speed = Float.parseFloat(args[0]);

Jetzt kannst du auch Zahlen im Format "x.yz..." einlesen. Wenn du nun prüfen willst, ob sich die Zahl im Definitionsbereich von -1 bis 1 befindet, kannst du das mit einer normalen if-Schleife abfragen:

Code:
if (speed < -1 || speed > 1) {
    sender.sendMessage("Bitte gebe eine gültige Zahl zwischen -1 und 1 ein!");
    return false;
}

Außerdem kannst du noch mit einer try-Schleife abprüfen, ob eine NumberFormatException geworfen wird, nämlich genau dann, wenn ein ungültiges Format eingegeben wird.
 
Zuletzt bearbeitet:
Das Problem was ich habe ist, das ich nur -1 0 oder 1 angeben kann. das heißt Ich kann nur schnell, aus oder Rückwerts angeben.
Kann mir jemand helfen, das ich /flyspeed 0.1 angeben kann.

Ps: Danke @Kyrtap
 
Ich hätte noch ein paar Anmerkungen. Entgegen violine1101's Aussage, musst du in einem CommandExecutor den Befehl nicht spezifizieren. Beim Setzen eines CommandExecutors wird der Befehl bereits übergeben, weshalb es nicht zwangsläufig nötig ist, den Namen des Commands erneut abzufragen.
Desweiteren sollte man, wie violine1101 bereits gesagt hat, wenn man Farben in einer Chatnachricht verwendet, immer die ChatColor Methode und nicht das Paragraphenzeichen verwenden, da dies bei falscher Formatierung zu Fehlern führen könnte.
 

Benutzer, die dieses Thema gerade lesen

ONLINE 2 Spieler