• 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 Erledigt Fehlerhaftes performCommand? Argumente werden nicht übernommen.

dmmk218

Redstoneengineer
Mitglied seit
28 Juni 2018
Beiträge
42
Alter
21
Hey zusammen kann mir jemand kurz auf die Sprünge helfen wo hier mein Fehler liegt?

Ich hab hier mit meinem Command /p das Alias /p von /plot bei PlotSquared überschrieben weil nur "/p" das PlotMenü öffnen soll.
Also meine Überlegung wenn die Argument länge != 0 ist kann man doch einfach ein perform command "plot " + args machen oder nicht?

Java:
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        Player p = (Player)sender;
        if (sender instanceof Player) {
            if (args.length == 0) {
                p.openInventory(inv);
                p.performCommand("plot");
            }
            else if (args.length != 1) {
                p.performCommand("plot " + args);
            }
        }
        return false;
    }

Gruß dmmk218
 

SirYwell

Vorarbeiter
Osterei Experte
Mitglied seit
30 Juni 2017
Beiträge
265
Alter
20
Minecraft
SirYwell
Abgesehen davon, dass ich dein Vorhaben nicht ganz verstehe und dich darum bitte, das nochmal genauer auszuführen, kann ich dir sagen, dass p.performCommand("plot " + args); vermutlich nicht das macht, was du geplant hast.
 

Boy132

Minecrafter
Osterei Experte
Mitglied seit
25 Juli 2012
Beiträge
19
Minecraft
Boy132
Wenn ich dich richtig verstanden hab:
Java:
else if (args.length >= 1)  {
      p.performCommand("plot " + args);
}
 

dmmk218

Redstoneengineer
Mitglied seit
28 Juni 2018
Beiträge
42
Alter
21
Okay revidiere funktioniert auch nicht.

Abgesehen davon, dass ich dein Vorhaben nicht ganz verstehe und dich darum bitte, das nochmal genauer auszuführen, kann ich dir sagen, dass p.performCommand("plot " + args); vermutlich nicht das macht, was du geplant hast.
@SirYwell
Geplant habe ich den Befehl bzw. den Alias von Plotsquared /p zu überschreiben mit /p und dann das Plotmenü (Inventar) zu öffnen aber nur wenn nur wenn if (args.length == 0) zutrifft. Sobald die Argumentenlänge größer als 0 ist (Fehler aus dem Code oben ist bereits behoben inkluse der 1 als Argumentenlänge die ist nun 0) soll der Command "plot " ausgeführt werden und die Argumente die im Originalen Befehl hinter /p standen hinzugefügt werden.

Ich muss es ja mit einem performCommand da ich ja voher /p überschrieben habe. (Alternativ auch mit p.chat("befehl") finde ich persönlich aber nicht so schön)

Aktuell sieht der onCommand Abschnitt so aus:

Java:
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        Player p = (Player)sender;
        if (sender instanceof Player) {
            if (args.length == 0) {
                p.openInventory(inv);
                p.performCommand("plot");
            }
            else if (args.length >= 0) {
                p.performCommand("plot " + args);
            }
        }
        else {
            Bukkit.getConsoleSender().sendMessage("Nutze in der Konsole bitte 'plot' anstatt 'p'");
        }
        return false;
    }
 

SirYwell

Vorarbeiter
Osterei Experte
Mitglied seit
30 Juni 2017
Beiträge
265
Alter
20
Minecraft
SirYwell
Ist das Plotmenü, also inv etwas von dir oder ist das von PlotSquared? Bin bei P² nicht so in der Materie drin, aber wenn ich das richtig verstehe, gibt es die Option auch standardmäßig. Dann könntest du mal schauen, ob nicht sogar einfach das Editieren der commands.yml ausreicht, um dein Vorhaben umzusetzen.
 

dmmk218

Redstoneengineer
Mitglied seit
28 Juni 2018
Beiträge
42
Alter
21
Ist das Plotmenü, also inv etwas von dir oder ist das von PlotSquared? Bin bei P² nicht so in der Materie drin, aber wenn ich das richtig verstehe, gibt es die Option auch standardmäßig. Dann könntest du mal schauen, ob nicht sogar einfach das Editieren der commands.yml ausreicht, um dein Vorhaben umzusetzen.
Das Plotmenü inv ist ein von mir programmiertes Inventar wo man schnellen Zugriff auf Plotflags bekommt. Man muss Quasi nur das Item anklicken und die Flag wird gesetzt. Das Funktioniert auch soweit alles. Nur das mit der mit der Sache wenn die Argumentenlänge größer als 0 ist nicht.

//edit: Wenn ich mir jetzt das mit der commands.yml ansehe heißt doch theoretisch müsste es gehen wenn ich jetzt das Command für das Plotmenü auf bspw. "/pm" abändere und der commands.yml als Alias von /pm einfach "p" eintrage oder?
 
Zuletzt bearbeitet:

SirYwell

Vorarbeiter
Osterei Experte
Mitglied seit
30 Juni 2017
Beiträge
265
Alter
20
Minecraft
SirYwell
Hm, ob das so rum funktioniert weiß ich nicht, aber vielleicht kann man Aliase mit Argumenten auf einen anderen Befehl verweisen lassen als Aliase ohne Argumente. Außerdem empfehle ich dir, <plugin>:<befehl> <argumente...> zu verwenden. Das könntest du auch in deinem Plugin ausprobieren, also statt "plot" rufst du den Befehl "plotsquared: plot" (das Leerzeichen ist nur wegen der Emoji-Funktion...) auf.

Dein String-Array (args) wird übrigens nicht wieder so zu dem Befehl zusammengebaut, wie du es haben möchtest. Versuch mal
String.join(" ", args). Beispiel:
Das Programm
Code:
class Scratch {
    public static void main(String[] a) {
        String[] args = new String[]{"first", "second", "third", "fourth"};
        System.out.println("plot " + args);
        System.out.println("plot " + String.join(" ", args));
    }
}
wird dir folgende Ausgabe liefern:
Code:
plot [Ljava.lang.String;@29453f44
plot first second third fourth
Wie du siehst, kann das Array nicht direkt umwandeln.
 

dmmk218

Redstoneengineer
Mitglied seit
28 Juni 2018
Beiträge
42
Alter
21
Hm, ob das so rum funktioniert weiß ich nicht, aber vielleicht kann man Aliase mit Argumenten auf einen anderen Befehl verweisen lassen als Aliase ohne Argumente. Außerdem empfehle ich dir, <plugin>:<befehl> <argumente...> zu verwenden. Das könntest du auch in deinem Plugin ausprobieren, also statt "plot" rufst du den Befehl "plotsquared: plot" (das Leerzeichen ist nur wegen der Emoji-Funktion...) auf.

Dein String-Array (args) wird übrigens nicht wieder so zu dem Befehl zusammengebaut, wie du es haben möchtest. Versuch mal
String.join(" ", args). Beispiel:
Das Programm
Code:
class Scratch {
    public static void main(String[] a) {
        String[] args = new String[]{"first", "second", "third", "fourth"};
        System.out.println("plot " + args);
        System.out.println("plot " + String.join(" ", args));
    }
}
wird dir folgende Ausgabe liefern:
Code:
plot [Ljava.lang.String;@29453f44
plot first second third fourth
Wie du siehst, kann das Array nicht direkt umwandeln.
Gut das ist einleuchtend ich beschäftige mich noch nicht so lange mit der Materie Java. Erst ca. 2 Wochen.
Was wäre denn wenn ich versuchen würde das ganze folgendermaßen zu programmieren (nicht unbedingt schön aber wenn es klappt...)

Java:
            else if (args.length >= 0) {
                if (args.length == 1) {
                    p.performCommand("plot " + args[0]);
                }
                if (args.length == 2) {
                    p.performCommand("plot " + args[0] + " " + args[1]);
                }
            }
 

SirYwell

Vorarbeiter
Osterei Experte
Mitglied seit
30 Juni 2017
Beiträge
265
Alter
20
Minecraft
SirYwell
Du kannst das String.join() einfach so übernehmen. Letztendlich macht es nichts anderes, als alle Elemente in dem Array miteinander zu verbinden und jeweils ein Leerzeichen dazwischen zu machen. Somit ist es egal, wie viele Elemente tatsächlich in dem Array sind.
 

BlackHole

Workaholic
Mitglied seit
1 Juli 2012
Beiträge
749
Minecraft
BlackHole
Um sicher zu gehen, dass der richtige Befehl ausgeführt wird solltest bei performCommand plotsquared:plot verwenden.
 
Zuletzt bearbeitet:

dmmk218

Redstoneengineer
Mitglied seit
28 Juni 2018
Beiträge
42
Alter
21
Ja danke hab ich eingefügt @BlackHole.

Noch etwas anders...
Meint Ihr es ist möglich das TabComplete event so "ab zu ändern" das die Tabcompletition erhalten bleibt?
 

dmmk218

Redstoneengineer
Mitglied seit
28 Juni 2018
Beiträge
42
Alter
21
Nebenbei würde ich dir empfehlen die beiden Zeilen zu tauschen:

Da es dir sonst einen schönen Fehler wirft wenn du den command in der console ausführt.
Also so ?

Java:
if (!(sender instanceof Player)) {
            Bukkit.getConsoleSender().sendMessage("Nutze in der Konsole bitte 'plot' anstatt 'p'");
            return false;
        }
        Player p = (Player)sender;
 

DerFrZocker

Miner
Osterei Experte
Mitglied seit
10 Dezember 2017
Beiträge
155
Alter
19
Minecraft
DerFrZocker
Ja, wobei ich noch aus dem return false ein return True machen würde. Damit nicht noch unknow command kommt.
 

BlackHole

Workaholic
Mitglied seit
1 Juli 2012
Beiträge
749
Minecraft
BlackHole
Zur Tabvervollständigung musst du dir einen Verweis auf das Plugin holen:
Plugin plugin = Bukkit.getPluginManager().getPlugin("Plotsquared");

Von dem Plugin dann den Befehl:
PluginCommand command = (PluginCommand) plugin.getCommand("plots")

Und schließlich den TabCompleter:
TabCompleter tabCompleter = (TabCompleter) command.getExecutor();

Dann kannst du in der Tabvervollständigung deines Befehls diesen mit den entsprechenden Argumenten aufrufen.

(Diese Vorgehensweise ist nicht universell übertragbar, weil es verschiedene Möglichkeiten gibt, wie Befehle und Tabvervollständigung in Spigot
behandelt wird.)
 
Allgemein
Hilfe Benutzer
  • ❤️可愛いちゃん️❤️ ❤️可愛いちゃん️❤️:
    Das mit der Chatfarbe versteht irgendwie jeder sofort
  • Majoox Majoox:
    @AntiThunder Weshalb ist deine Frage eigentlich verschwommen? Soll sie auch beantwortet werden?
  • ❤️可愛いちゃん️❤️ ❤️可愛いちゃん️❤️:
    Er wills spannend machen.
  • Majoox Majoox:
    Wer gerade so weiß wie Bungeecord funktioniert wird niemals im Leben blicken, dass man das markieren kann um es zu lesen.
  • Majoox Majoox:
    Oder es ist purer Selbstschutz
  • AntiThunder AntiThunder:
    wollte nur den startbeitrag schlicht halten :p
  • Majoox Majoox:
    Ich glaube Sammelthreads sind voll 2012
  • 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
    iTz_Proph3t iTz_Proph3t: :D
    Oben