Jump to content
  • 0

Minecraft Plugin Programierung Werte tragen sich nicht in die config.yml eine


Sille

Frage

Hallo,

ich habe ein kleines Plugin für meinen Server erstellt, einfach weil ich interesse an Programierung hab obwohl es da bestimmt fertige Plugins gibt. Es beinhaltet einen /home command, dessen Werte sich automatisch in die config.yml eintragen sollen, diese sind Spielerspezifisch und es soll 2 pro Welt erstellbar sein, ein /spawn command, welcher einen Spawn der für alle über /spawn verfügbar sein soll festlegt, und einen /warp command, der Admins erlauben soll warps zu setzen, welche für Spieler mit demselben oder einer höheren permission verfügbar sein sollen (in der Programierung Warplevel), und einen JoinListener der für jeden Spieler der beitritt ein Verzeichniss, welches über die UUID unterschieden wird erstellt.

Mein Problem ist jetzt das sich die Struktur, aber die Werte nicht abspeichern lassen, ich wüste gerne was ich falsch mache :D. Ich werde aber den kompletten Quellcode einfügen, für den falls das sich jemand die mühe machen möchte und nach allgemeinen fehlern überprüfen möchte, genau wie die .jar Datei, und eins der von dem Server erstellte config Datei.

EDIT:Den Quellcode direkt einzufügen wäre unübersichtlich, ich füge screenshots in den anhang dazu.

LG Sille

 

 

OrangeJuice.jar

Main.png

Listener.png

HomeCommand.png

SpawnCommand.png

WarpCommand.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

14 Antworten auf diese Frage

Empfohlene Beiträge

  • 1

Du rufst getStringList auf eine Gruppe auf ("Homes").

Das geht leider so nicht. Du brauchst die Funktion getKeys:

Set<String> homeList = cfg.getSection("Players". + p.getPlayer().getUniqueId().toString() + ".Worlds." + loc.getWorld().getName() + ".Homes").getKeys(false);

Das "false" bei getKeys heißt, dass du nur eine Ebene willst.

 

Listen in einer Konfiguration haben immer folgenden Aufbau:

key1:
- wert1
- wert2
- wert3

 

  • Like 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1

Es muss aber dann dort einen Fehler in der Konsole geben...

 

Schreibe anstatt if (args[0].equals..... && args.length == 1 && ....) das:

if (args.length == 1 && args[0].equals.... && ....)

Der Unterschied ist, dass wenn das erste bereits false ist, der rest nicht geprüft wird. Wenn du die Länge des Arrays erst *nach* einem ungültigen Zugriff prüfen willst, wird der ungültige Zugriff vorher ausgeführt => Fehler.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1

Der Fehler aus der Konsole wäre hald noch hilfreich, eine Glaskugel habe ich leider noch nicht bestellt :)

 

 

Edit: Bei /home benutzt du

args[1]

Du prüfst aber vorher, ob args.length == 1 ist. Bedenke, dass der Computer bei 0 anfängt zu zählen, d. h. du brauchst hier args[0]. Wie in der Zeile darüber auch :)

  • Like 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 5 Minuten schrieb boomer41:

"createSection" erstellt eine Gruppierung. Eine Gruppierung kann keine Werte haben.

Mach einfach einmal createSection("Spawn") anstatt für jeden Wert createSection("spawn.World") aufzurufen.

Was müsste ich dann bei dem /home command ändern

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 24 Minuten schrieb boomer41:

Das ist die Transferaufgabe. Du sollst das auch verstehen und nicht kopieren.

(Hab ich was ich mich jetzt Frage ist, kann ich dann einem Pfad der noch weitergeht dann überhaupt noch einen Wert zuweisen, dass würde ja heißen das .Homes gar keinen Wert mehr annehmen kann, außerdem verstehe ich dann nicht warum das in der PlayerRegistration noch funktioniert, da erstelle ich ja auch eine Section und weise ihr einen Wert zu.)

Habs Verstanden und funktioniert jetzt, danke, anderes Problem, kannst du einen Fehler entdecken warum ich mich nicht Teleportiere wenn ich den Befehl benutze zum Porten

bearbeitet von Sille
EDIT
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 18 Stunden schrieb boomer41:

Du rufst getStringList auf eine Gruppe auf ("Homes").

Das geht leider so nicht. Du brauchst die Funktion getKeys:


Set<String> homeList = cfg.getSection("Players". + p.getPlayer().getUniqueId().toString() + ".Worlds." + loc.getWorld().getName() + ".Homes").getKeys(false);

Das "false" bei getKeys heißt, dass du nur eine Ebene willst.

 

Listen in einer Konfiguration haben immer folgenden Aufbau:


key1:
- wert1
- wert2
- wert3

 

Danke schonmal für die enorme Hilfe :)

Die Commands funktionieren mit den anpassungen einwandfrei, das einzige, dass nicht funktioniert ist sich zu einem der festgelegten Punkte zu Teleportieren. Egal in welchem der Commands, es kommt keine Fehlermeldung, gar nichts, die Verzeichnisse und Werte werden alle korrekt eingetragen und erstellt... fals du keinen generell vorliegenden Fehler finden kannst, kann das an irgendwelchen Server Configs liegen oder ähnlichem?

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
//home benutzen
			
			if(args.length == 1 && homeList.contains(args[0])) {
				World world = Bukkit.getWorld(cfg.getString("Players."+p.getPlayer().getUniqueId().toString()+".Worlds."+loc.getWorld().getName()+".Homes."+ args[0] +".World"));
				double x = cfg.getDouble("Players."+p.getPlayer().getUniqueId().toString()+".Worlds."+loc.getWorld().getName()+".Homes."+ args[1] +".X");
				double y = cfg.getDouble("Players."+p.getPlayer().getUniqueId().toString()+".Worlds."+loc.getWorld().getName()+".Homes."+ args[1] +".Y");
				double z = cfg.getDouble("Players."+p.getPlayer().getUniqueId().toString()+".Worlds."+loc.getWorld().getName()+".Homes."+ args[1] +".Z");
				float yaw = (float) cfg.getDouble("Players."+p.getPlayer().getUniqueId().toString()+".Worlds."+loc.getWorld().getName()+".Homes."+ args[1] +".Yaw");
				float pitch = (float) cfg.getDouble("Players."+p.getPlayer().getUniqueId().toString()+".Worlds."+loc.getWorld().getName()+".Homes."+ args[1] +".Pitch");
				
				Location home = new Location(world, x, y, z, yaw, pitch);
				p.teleport(home);
				
			}

---------------------------------------------------------------------------------------------------------------------------------------------------------------
//spawn benutzen

if(args.length == 0) {
				FileConfiguration cfg = Main.getInstance().getConfig();
				
				World world = Bukkit.getWorld(cfg.getString("Spawn.World"));
				double x = cfg.getDouble("Spawn.X");
				double y = cfg.getDouble("Spawn.Y");
				double z = cfg.getDouble("Spawn.Z");
				float yaw = (float) cfg.getDouble("Spawn.Yaw");
				float pitch = (float) cfg.getDouble("Spawn.Pitch");
				
				Location loc = new Location(world, x, y, z, yaw, pitch);
				p.teleport(loc);
				
---------------------------------------------------------------------------------------------------------------------------------------------------------------

//warp benutzen
			
			else if(args.length == 1 && cfg.contains("Warps."+ args[0]) && cfg.getInt("Players."+p.getPlayer().getUniqueId().toString()+".Warplevel") >= cfg.getInt("Warps."+ args[0] +".Warplevel")) {
				
				World world = Bukkit.getWorld(cfg.getString("Warps."+ args[0] +".World"));
				double x = cfg.getDouble("Warps."+ args[0] +".X");
				double y = cfg.getDouble("Warps."+ args[0] +".Y");
				double z = cfg.getDouble("Warps."+ args[0] +".Z");
				float yaw = (float) cfg.getDouble("Warps."+ args[0] +".Yaw");
				float pitch = (float) cfg.getDouble("Warps."+ args[0] +".World");
				
				Location warp = new Location(world, x, y, z, yaw, pitch);
				p.teleport(warp);
				

Jetzt im nachhinein ist mir aufgefallen das der /spawn Command tatsächlich einen Fehler auswirft, die erklärung war mir allerdings zu hoch tut mir Leid :D

EDIT ich hab das ganze jetzt angepasst es wird aber immernoch ein Fehlercode ausgeworfen, jetzt bei /home auch, /warp habe ich nicht getesxtet. Das ganze sieht jetzt so aus:

bearbeitet von Sille
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 2 Stunden schrieb boomer41:

Der Fehler aus der Konsole wäre hald noch hilfreich, eine Glaskugel habe ich leider noch nicht bestellt :)

 

 

Edit: Bei /home benutzt du


args[1]

Du prüfst aber vorher, ob args.length == 1 ist. Bedenke, dass der Computer bei 0 anfängt zu zählen, d. h. du brauchst hier args[0]. Wie in der Zeile darüber auch :)

Das war tatsächlich der ganze fehler... jetzt läuft alles.

Das letzte wäre (fals du noch lust hast) ob du mir nochmal ausführlicher erklären könntest wie das mit dem args.length == x und dem anderen tauschen gemeint war da hab ich den hintergrund nicht verstanden.

Ansonsten bedanke ich mich nochmal für die großartige Hilfe ich hab einiges gelernt Danke. :)

bearbeitet von Sille
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
if (args.length == 1 && args[0].equalsIgnoreCase("test")) {
	// ...
}

Das && funktioniert so:
Zuerst wird der linke Teil (hier:  "args.length == 1") ausgewertet. Wenn dieser bereits false zurückgibst, dann kann das ganze if nie true ergeben.
Daher wird das (hier) "args[0].equalsIgnoreCase("test")" gar nicht ausgeführt.
Das ist wichtig, weil args[0] zu einem Fehler führt, wenn args.length < 1 wäre.
Würdest du das ganze vertauschen, würdest du zuerst auf args[0] zugreifen. Aber vielleicht existiert es gar nicht? => Unter Umständen gibt das einen Fehler. Die Überprüfung, ob args.length == 1 ist, würde ja erst *danach* ausgeführt werden.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 43 Minuten schrieb boomer41:

if (args.length == 1 && args[0].equalsIgnoreCase("test")) {
	// ...
}

Das && funktioniert so:
Zuerst wird der linke Teil (hier:  "args.length == 1") ausgewertet. Wenn dieser bereits false zurückgibst, dann kann das ganze if nie true ergeben.
Daher wird das (hier) "args[0].equalsIgnoreCase("test")" gar nicht ausgeführt.
Das ist wichtig, weil args[0] zu einem Fehler führt, wenn args.length < 1 wäre.
Würdest du das ganze vertauschen, würdest du zuerst auf args[0] zugreifen. Aber vielleicht existiert es gar nicht? => Unter Umständen gibt das einen Fehler. Die Überprüfung, ob args.length == 1 ist, würde ja erst *danach* ausgeführt werden.

 

Verstanden dankeschön ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...
B
B