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

Config

WlanGehtNicht

Schafhirte
Registriert
30 Mai 2017
Beiträge
105
Diamanten
312
Hallo,
wenn ich den Command /sethouse name Test eingebe, dann wird Test in die Config geschrieben.
Wenn ich z.B. noch /sethouse name Hallo eingebe, dann überschreibt Hallo Test in der Config. Kann mir da bitte jemand weiterhelfen?

Code:
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        
        if(sender instanceof Player) {
            Player p = (Player) sender;
            
            if(args.length > 0) {
                if(args[0].equalsIgnoreCase("name")) {
                    
                    Server.createHouse.add(p);
                    String name = args[1];
                    if(!(name.equals(Server.housecfg.get("House")))) {
                        Server.housecfg.set("House", name);
                        
                        try {
                            Server.housecfg.save(Server.housefile);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        
                        p.sendMessage(Server.prefix + "Du hast erfolgreich den Namen gesetzt");
                        p.sendMessage(Server.prefix + "Bitte setze die Punkte: /sethouse location " + name);
                    } else {
                        p.sendMessage(Server.prefix + "Das Haus " + name + " gibt es schon");
                    }
                    
                } else if(args[0].equalsIgnoreCase("location")) {
                    String name = args[1];
                    if(name.equals(Server.housecfg.get("House"))) {
                        SetHouseInventar.run(p);
                    } else {
                        p.sendMessage(Server.prefix + "Das Haus gibt es noch nicht.");
                        p.sendMessage(Server.prefix + "Erstelle ein Haus mit /sethouse name [Name]");
                    }
                }
            } else {
                p.sendMessage(Server.prefix + "Verwendung:");
                p.sendMessage(Server.prefix + "/sethouse name [Name] §cErstellt ein Haus");
                p.sendMessage(Server.prefix + "/sethouse location [Name] §cÄndert die Location Punkte");
                p.sendMessage(Server.prefix + "/sethouse price [Name] [Preis] §cSetze den Preis");
                p.sendMessage(Server.prefix + "/sethouse [Name] finish §cSetze das Haus fertig");
            }
        }
        
        return true;
    }

}

Danke
 

petomka

Redstoneengineer
Registriert
8 Oktober 2012
Beiträge
41
Alter
26
Diamanten
322
Hallo,

du speicherst deine Werte unter dem falschen Pfad ab, bzw. speicherst du jedes Mal unter dem gleichen Pfad einen neuen Wert ab:
Server.housecfg.set("House", name) speichert nämlich genau unter dem Schlüssel "House" den Wert in name ab. Das sieht dann folgendermaßen aus, wenn z.B. name = "Test":
YAML:
House: 'Test'
Nach dem zweiten Eingeben des Befehls schaut deine Datei dann aber (logischerweise) so aus:
YAML:
House: 'Hallo'
Da ich nicht genau weiß, ob du einfach nur die Namen der Häuser speichern möchtest, oder noch mehr, weiß ich nicht, ob für dich dort eine einfach Stringliste reicht oder ob du eventuell ein komplexeres Objekt dort abspeichern könntest.

Nichtsdestotrotz kannst du dich ja mal hier umsehen: https://bukkit.gamepedia.com/Configuration_API_Reference
Wenn du ein komplexeres Objekt abspeichern möchtest, kannst du mal einen Blick auf das Interface ConfigurationSerializable werfen.

Gruß,
petomka
 

Taminoful

Schafhirte
Registriert
3 August 2012
Beiträge
137
Diamanten
390
Minecraft
Taminoful

Taminoful

Schafhirte
Registriert
3 August 2012
Beiträge
137
Diamanten
390
Minecraft
Taminoful
Was brauchst du noch für Informationen?

Naja, ne anständige Problembeschreibung halt.
Was hast du seit @petomkas Kommentar an deinem Code verändert? Wo hängst du derzeit fest, weiterhin das gleiche Problem oder ein anderes? Wie hast du bereits versucht das auftretende Problem zu lösen und wie bist du dabei vorgegangen (Konkrete Lösungsansätze und Umsetzungen), hast du dir bereits einmal das erwähnte Interface angesehen oder nicht? Etc.
 

WlanGehtNicht

Schafhirte
Registriert
30 Mai 2017
Beiträge
105
Diamanten
312
Ich habe mir die Seiten schon angesehen, aber es bringt mir nichts, da nachdem ich die Namen abgespeichert habe, noch mehr Sachen abgespeichert werden sollen.
Wenn ich den Command /sethouse name Test eingebe, dann wird Test in die Config gespeichert. Wenn ich z.B. /sethouse name Hallo eingebe, dann überschreibt Hallo Test in der Config. Das bekomme ich nicht hin.
 

Taminoful

Schafhirte
Registriert
3 August 2012
Beiträge
137
Diamanten
390
Minecraft
Taminoful
Wenn ich den Command /sethouse name Test eingebe, dann wird Test in die Config gespeichert. Wenn ich z.B. /sethouse name Hallo eingebe, dann überschreibt Hallo Test in der Config. Das bekomme ich nicht hin.

du speicherst deine Werte unter dem falschen Pfad ab, bzw. speicherst du jedes Mal unter dem gleichen Pfad einen neuen Wert ab
Server.housecfg.set("House", name) speichert nämlich genau unter dem Schlüssel "House" den Wert in name ab. Das sieht dann folgendermaßen aus, wenn z.B. name = "Test":

Das löst dein Problem bereits. Du solltest Beiträge aufmerksam lesen. Was du tun musst, ist den Pfad anpassen in dem dein Wert gespeichert wird. Bleibt dieser der gleiche, wird dieser natürlich überschrieben, wie soll das auch sonst funktionieren?
Vermutlich, basierend auf den Hilfeausgabe, wäre eine Konfiguration in einem Schema wie diesem sinnvoller.
Auch hier bietet sich das oben verlinkte Tutorial von SirYwell an, welches auch beschreibt, wie man Objekte (Java Klassen) in einer YAML Konfiguration abbilden (serialisieren/deserialisieren) kann, dies ist für einen objektorientierten Aufbau äußerst hilfreich.

Configuration Schema Example:
houses:
  key-input-from-user-executing-the-sethouse-command:
    location: # Some values
    price: # Some price
  other-key-input-from-a-user:
    location: # another location
    price: # another price
  # many, many more houses.
 

WlanGehtNicht

Schafhirte
Registriert
30 Mai 2017
Beiträge
105
Diamanten
312
Ich habe das jetzt so

Code:
public class SetHouseCommand implements CommandExecutor {

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        
        if(sender instanceof Player) {
            Player p = (Player) sender;
            
            if(p.hasPermission("createhouse.set")) {
                if(args.length > 0) {
                    if(args[0].equalsIgnoreCase("name")) {
                        
                        Server.createHouse.add(p);
                        String name = args[1];
                        if(!(name.equals(Server.housecfg.get("House")))) {
                            Server.housecfg.set("Hous", p.getUniqueId());
                            Server.housecfg.set("Hous." + p.getUniqueId() + ".Ersteller", p.getName());
                            Server.housecfg.set("Hous." + p.getUniqueId() + ".Ersteller." + p.getName() + ".Haus.Name", name);
                            
                            try {
                                Server.housecfg.save(Server.housefile);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            
                            p.sendMessage(Server.prefix + "Du hast erfolgreich den Namen gesetzt");
                            p.sendMessage(Server.prefix + "Bitte setze die Punkte: /sethouse location " + name);
                        } else {
                            p.sendMessage(Server.prefix + "Das Haus " + name + " gibt es schon");
                        }
                        
                    } else if(args[0].equalsIgnoreCase("location")) {
                        String name = args[1];
                        if(name.equals(Server.housecfg.get("House"))) {
                            SetHouseInventar.run(p);
                        } else {
                            p.sendMessage(Server.prefix + "Das Haus gibt es noch nicht.");
                            p.sendMessage(Server.prefix + "Erstelle ein Haus mit /sethouse name [Name]");
                        }
                    }
                } else {
                    p.sendMessage(Server.prefix + "Verwendung:");
                    p.sendMessage(Server.prefix + "/sethouse name [Name] §cErstellt ein Haus");
                    p.sendMessage(Server.prefix + "/sethouse location [Name] §cÄndert die Location Punkte");
                    p.sendMessage(Server.prefix + "/sethouse price [Name] [Preis] §cSetze den Preis");
                    p.sendMessage(Server.prefix + "/sethouse [Name] finish §cSetze das Haus fertig");
                }
            }
        }
        
        return true;
    }

}

Das geht aber immernoch nicht. Ich habe das gleiche Problem, wie vorher. Die Häuser überschreiben sich.
 

Taminoful

Schafhirte
Registriert
3 August 2012
Beiträge
137
Diamanten
390
Minecraft
Taminoful
Das geht aber immernoch nicht. Ich habe das gleiche Problem, wie vorher. Die Häuser überschreiben sich.
Weil du unsere Antworten nicht anständig liest. Irgendwann wird es auch mir zu doof mich andauernd zu wiederholen. Bei dir wird weiterhin alles unter einem Key gespeichert, in dem Fall jetzt "Hous", wenn du es nicht schaffst, den ersten Parameter, welcher sogar ein String ist, der set-Methode anzupassen kann ich dir auch nicht mehr weiterhelfen.
 

SirYwell

PlotSquared Entwickler
Registriert
30 Juni 2017
Beiträge
540
Diamanten
488
Minecraft
SirYwell
Die Zeilen 15-18 sind irgendwie merkwürdig, ich weiß nicht, ob du dir darüber im Klaren bist, was da passiert. Außerdem kann ich, wie bereits @petomka und @Taminoful erwähnt haben, dir ans Herz legen, die dafür gedachte Serialisierung von Bukkit zu verwenden. Mein Tutorial dazu hat Taminoful bereits verlinkt. Wenn du Fragen dazu hast, kannst du diese jederzeit gerne stellen. Die Werte alle einzeln zu setzen ist umständlich, fehleranfällig und verursacht unnötigen Code an Stellen, an denen Übersichtlichkeit sowieso schon schwer zu gewährleisten ist.

Auch für generelle Fragen bezüglich einer Strukturierung solcher Funktionalitäten stehen wir hier jederzeit offen.
 
Oben