• 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 [Gelöst] Hilfestellung, forschleifen.

Shoqrii

Redstoneengineer
Registriert
16 Juni 2018
Beiträge
46
Diamanten
301
Minecraft
Shoqrii
Grüß Gott, Freunde der Sonne.

Ich hatte schon immer meine Probleme mit den forschleifen in Java..
Ich würde gerne einen CMD haben, indem der angegebene Name in eine
CFG übertragen wird.
Wie allerdings frage ich die Argumente nach dem Befehl ab?

Java:
     String msg = "";
     ArrayList<Player> cmd = new ArrayList<>();
    
    @Override
    public boolean onCommand(CommandSender cs, Command arg1, String arg2, String[] args) {
        
        Player p = (Player) cs;
        
        if(args.length == 2) {
            p.sendMessage("1");
            if(args[0].equalsIgnoreCase("create")) {
                p.sendMessage("2");
                cmd.add(p);
                if(args[1].equalsIgnoreCase(msg)) {
                    p.sendMessage("3");
                     for (int i = 0; i < args.length; i++) {
                         msg += args[i] + " ";
                    }
                     p.sendMessage("4");
                     Config.cfg.set(p.getUniqueId() + ".gang", msg);
                     p.sendMessage(Main.prefix + "Deine Gruppierung " + msg + " wurde erstellt.");
                    
                }
            }
        } else {
            p.sendMessage(Main.us + "/Gang <create> <kürzel>");
        }
        
        return false;
    }
    
    @EventHandler
    public void onCMD(AsyncPlayerChatEvent e) {
        Player p = e.getPlayer();
        
        if(cmd.contains(p)) {
            msg = e.getMessage();
            p.sendMessage(msg);
        }
        
    }

P.S: Die p.sendMessage("1,2,3.."); waren als Debugmessages gedacht.


MfG, Luca D.
 
Registriert
10 Dezember 2017
Beiträge
161
Alter
26
Diamanten
322
Minecraft
DerFrZocker
Tag,

Was ist den das genaue Problem mit der For-Schleife?

Wenn es daran liegt das "create" noch am anfang dran ist, dann fange einfach ein Argument vorher an.
Code:
for (int i = 1; i < args.length; i++) // aus der "0" wird einfach eine "1" und schon überspringt es das Argument "create"
       msg += args[i] + " ";

Wenn es aber daran liegt das die Gang kürzel nicht in der Config auftaucht, könnte es auch daran liegen, das du die config noch saven musst.

Code:
 Config.cfg.save(File);

Wenn es aber wiederum daran liegt, dass das Gang kürzel nicht in der Chat Nachricht erscheint, könnte es daran liegen, dass du der message das Kürzel garnicht anhängst.
Code:
        if(cmd.contains(p)) {
            msg = Config.cfg.getString(p.getUniqueId() + ".gang") + e.getMessage();
            p.sendMessage(msg);
        }

oder weil du den Server zwischen zeitlich neugestardet hast und der Spieler somit nicht meht in der cmd liste ist.
 

Feli490

Redstoneengineer
Registriert
30 November 2011
Beiträge
44
Alter
26
Diamanten
342
Minecraft
Feli490
Oh da war der @DerFrZocker ne Sekunde schneller, allerdings sehe ich (mal abgesehen von dem create) auch keinen Fehler in der for-Schleife.

Aber ich glaube die For-schleife wird nie ausgeführt, da meines erachtens die Zeile 14 keinen Sinn ergibt.
Also die hier:
Java:
if(args[1].equalsIgnoreCase(msg)) {
Du fragst dort ab ob das erste Argument nach "create" das gleiche ist wie msg.
Du hast vorher msg nicht bearbeitet, das ist nach wie vor ein leerer String, d.h. sobald ein Argument nach "create" eingegeben wurde (was es ja muss da der code sonst erst garnicht bis dahin ausgeführt wird) fragst du ab ob ein (beliebieger) String gleich einem Leeren String ist. Da das nie der fall sein kann kommst du garnicht erst zur For-Schleife.
Nimm diese abfrage einfach raus und dann sollte es funktionieren.

Kann sein das ich jetzt i-was übersehen habe, habs nur kurz überflogen.
MFG Feli
 

SirYwell

PlotSquared Entwickler
Registriert
30 Juni 2017
Beiträge
540
Diamanten
488
Minecraft
SirYwell
Jetzt war @Feli490 schneller als ich... :D egal

Deine Zeile 14: if(args[1].equalsIgnoreCase(msg)) {
Deine Variable msg ist zu dem Zeitpunkt "", also leer/empty. Da kein Element aus args jemals "" sein wird, wird der Code innerhalb dieser if-Abfrage auch niemals ausgeführt.

In deiner Schleife selber fügst du dann msg ALLE Elemente aus args deinem String hinzu (Bitte schau mal nach StringBuilder oder String.joining() ). Damit hast du auch "create" und das zweite Element (args[1]) hinzugefügt.
Insgesamt solltest du versuchen, deinen Quellcode weniger zu verschachteln, sonst weißt du eine Woche später nicht mehr, was du da getan hast.
 

Shoqrii

Redstoneengineer
Registriert
16 Juni 2018
Beiträge
46
Diamanten
301
Minecraft
Shoqrii
Erstmal danke für die schnellen Antworten! @DerFrZocker @Feli490 @SirYwell
Es funktioniert nun, aber ich habe nun ein neues Problem, bei einer gerade hinzugefügten Funktion.

Ich habe nun eine begrenzung von 5 Buchstaben gesetzt. (Kürzel)
Wenn ich nun einmal eine falsche Eingabe betätige, bsp. 6 Zeichen wird mir ganz normal die Fehlermessage ausgegeben.
Wenn ich dann allerdings die richtige Länge von bsp. 3 Zeichen verwende, bekomme ich weiterhin eine Fehlermessage.
Erst nachdem ein Serverreload gemacht wurde, und ich dann die richtige Länge verwende, dann funktioniert es.

Java:
@Override
    public boolean onCommand(CommandSender cs, Command arg1, String arg2, String[] args) {
        
        Player p = (Player) cs;
        
        if(args.length == 2) {
            if(args[0].equalsIgnoreCase("create")) {
                if(Config.cfg.getString(p.getUniqueId() + ".gang") == null) {
                     for (int i = 1; i < args.length; i++) {
                         msg += args[i] + " ";
                    }
                     if(msg.length() < 5) {
                     Config.cfg.set(p.getUniqueId() + ".gang", msg);
                     Main.getPlugin().saveConfig();
                     p.sendMessage(Main.prefix + "Deine Gruppierung " + Config.cfg.getString(p.getUniqueId() + ".gang") + " wurde erstellt.");
                    
                     } else {
                         p.sendMessage(Main.prefix + "Der Kürzel darf maximal 5 Zeichen beinhalten.");
                     }
                } else {
                    p.sendMessage(Main.prefix + "§cDu besitzt bereits eine Gang.");
                }
            }
        } else {
            p.sendMessage(Main.us + "/Gang <Create> <Kürzel>");
        }
        
        return false;
    }


MfG, Luca D.
 

Feli490

Redstoneengineer
Registriert
30 November 2011
Beiträge
44
Alter
26
Diamanten
342
Minecraft
Feli490
Du setzt den msg String nie "zurück".
Du addierst immer deine Eingaben aufeinander, also wenn deine erste eingabe aus 6 Chars bestand und deine nächste aus 3 beinhaltet der msg String 9 Chars.
Das kannst du ganz einfach beheben indem du die Variable lokal erstellst, also nicht auserhalb der onCommand Methode.
Schreib dafür einfach vor deine For-Schleife das hier:
Java:
//code
String msg = "";
//forschleife

Dann sollte es funktionieren wenn du nichts anderes geändert hast.

PS: Aktuell kann man nur 4 Buchstaben als Kürzel haben wenn du wirklich 5 haben willst musst du das if(msg.length() < 5) zu if(msg.length <= 5) ändern
 

Shoqrii

Redstoneengineer
Registriert
16 Juni 2018
Beiträge
46
Diamanten
301
Minecraft
Shoqrii
Du setzt den msg String nie "zurück".
Du addierst immer deine Eingaben aufeinander, also wenn deine erste eingabe aus 6 Chars bestand und deine nächste aus 3 beinhaltet der msg String 9 Chars.
Das kannst du ganz einfach beheben indem du die Variable lokal erstellst, also nicht auserhalb der onCommand Methode.
Schreib dafür einfach vor deine For-Schleife das hier:
Java:
//code
String msg = "";
//forschleife

Dann sollte es funktionieren wenn du nichts anderes geändert hast.

PS: Aktuell kann man nur 4 Buchstaben als Kürzel haben wenn du wirklich 5 haben willst musst du das if(msg.length() < 5) zu if(msg.length <= 5) ändern
Fehler können so simple, und dumm sein..
Danke!
 
Registriert
10 Dezember 2017
Beiträge
161
Alter
26
Diamanten
322
Minecraft
DerFrZocker
Da ich schätze das entweder @SirYwell oder @Feli490 schon dabei sind, dich auf die kleinen Fehler aufmerksam zumachen. Und da kam sie schon...
Schreibe ich dir einfach kurz wie du deinen Code weniger verschachtelst und damit uns das lesen deines codes vereinfachst.

1: In java gibt es das schöne satz zeichen "!" (keine Ahnung wie genau man den in Java nent, bin gerade auch ztu faul danach zu googlen.) dieses erlaubt einen, ein boolen zu verneinen das heist aus "true" wird "false" und aus "false" wird "true".

2: Gibt es denn schönen austrug "return" der erlaubt es uns eine Methode vorzeitig zu "beenden".

Was bringt uns nun die zwei Methoden?

Ganz einfach wir können die if abfragen verneinen und frühzeitig die Methode verlassen.

Das nun als Beispiel:
Code:
    public boolean onCommand(CommandSender cs, Command arg1, String arg2, String[] args) {

        Player p = (Player) cs;

        if (args.length != 2) {
            p.sendMessage(Main.us + "/Gang <Create> <Kürzel>");
            return true;
        }

        if (args[0].equalsIgnoreCase("create")) { // hier kann man es solassen wenn du noch andere subcommands
                                                    // hinzufügen willst, auch wenn ich dir rate subcommands auch
                                                    // jeweils ihre eigene classe zu geben

            if (Config.cfg.getString(p.getUniqueId() + ".gang") != null) {
                p.sendMessage(Main.prefix + "§cDu besitzt bereits eine Gang.");
                return true;
            }

            for (int i = 1; i < args.length; i++)
                msg += args[i] + " ";

            if (msg.length() >= 5) {
                p.sendMessage(Main.prefix + "Der Kürzel darf maximal 5 Zeichen beinhalten.");
                return true;
            }

            Config.cfg.set(p.getUniqueId() + ".gang", msg);

            Main.getPlugin().saveConfig();

            p.sendMessage(Main.prefix + "Deine Gruppierung " + Config.cfg.getString(p.getUniqueId() + ".gang")
                    + " wurde erstellt.");
            return true;
        }

        return false;
    }
}
 
Oben