Rednael Posted March 26, 2016 Share Posted March 26, 2016 (edited) Guten Abend. Ich bin gerade dabei ein Plugin am programmieren, welches beim Start des Server Schilder aus einer Config lädt, diese platziert und updated. Das funktioniert soweit. Allerdings möchte ich, ohne den Namen des Schildes zu kennen, mithilfe der Koordinaten (X, Y, Z) auf die gespeicherte IP und den PORT zugreifen. Um konkreter zu sein: Das Plugin soll JOIN-Schilder erschaffen und wenn ein Spieler auf das Schild klickt, soll er auf den Server mit den zusammen mit den Koordinaten des Schildes gespeicherten Daten (IP, PORT) geschickt werden. Am Ende sollen in der Datei etwa 20 Einträge dieses Formates stehen und ich möchte mithilfe die durch den Klick des Spielers auf das Schild ermittelten Koordinaten auf die IP und den PORT zugreifen. Name des jeweiligen Servers/Schildes: Schild: NAME: Name des Schildes <- unbekannt, aber hierfür nicht wichtig IP: 123.456.789.0 <- gesucht PORT: 25565 <- gesucht X: 123 <- bekannt Y: 456 <- bekannt Z: 789 <- bekannt Kann mir hier jemand weiterhelfen? Das wäre super. Falls ihr dafür mehr Informationen benötigt, schreibt es mir bitte Edited March 26, 2016 by Rednael Link to comment Share on other sites More sharing options...
boomer41 Posted March 26, 2016 Share Posted March 26, 2016 Map<String, Object> schilder = getConfig().getSection("schilder").getValues(true); for (Map.Entry<String, Object> schildEintrag : schilder.entrySet()) { ConfigurationSection schild = (ConfigurationSection) schildEintrag.getValue(); schild.getString(...) } Keine Gewähr, ist ausm Kopf. Die Variable "schild" beinhaltet alles was unter schild1, schild2 usw steht, wobei schild1 und schild2 auch frei wählbare Namen sind. Vorraussetzung: Deine Datei ist so aufgebaut: schilder: schild1: <USW> schild2: <USW> Link to comment Share on other sites More sharing options...
Rednael Posted March 27, 2016 Author Share Posted March 27, 2016 (edited) vor 14 Stunden schrieb boomer41: Map<String, Object> schilder = getConfig().getSection("schilder").getValues(true); for (Map.Entry<String, Object> schildEintrag : schilder.entrySet()) { ConfigurationSection schild = (ConfigurationSection) schildEintrag.getValue(); schild.getString(...) } Keine Gewähr, ist ausm Kopf. Die Variable "schild" beinhaltet alles was unter schild1, schild2 usw steht, wobei schild1 und schild2 auch frei wählbare Namen sind. Vorraussetzung: Deine Datei ist so aufgebaut: schilder: schild1: <USW> schild2: <USW> Soweit verstehe ich es eigentlich, aber ich habe ja nur die Unterwerte X, Y und Z und in der gleichen Unterspalte stehen auch die anderen Werte, die ich auslesen möchte, also so ähnlich wie bei einer Datenbank. Dort, wo X, Y und Z einen bestimmten Wert haben, möchte ich den Wert von PORT und IP auslesen, unabhängig von den anderen Werten und Überpunkten: //Jetzt mal ein bisschen umstrukturiert: Schild: Server1: NAME: BedWars 3 IP: 12345.67890 PORT: 25516 X: 647 Y: 356 Z: 357 WELT: welt Server2: NAME: SurvivalGames 2 IP: 5648794.35637 PORT: 25598 X: 426 Y: 246 Z: 845 WELT: welt Server3: NAME: PvP 5 IP: 89736.783566 PORT: 25523 X: 357 Y: 265 Z: 195 WELT: welt //IPs und Ports sind frei ausgedacht, die Servernamen und Koordinaten auch ;) Ich bestimme die Koordinaten des Schildes, wenn ein Spieler auf es klickt und möchte dann vergleichen, ob in der Config, dort, wo die Koordinaten des Schildes, auf das der Spieler geklickt hat, übereinstimmen und dann den IP und PORT für einen Servierwechsel auslesen. Gibt es vielleicht eine bessere Methode, das zu regeln? Vielleicht hast Du es ja auch schon super erklärt, nur ich verstehe nicht ganz, wie ich dann an die Werte gelangen kann. Frohe Ostern und eine Hoffnung, dass mir jemand das erklären kann Edited March 27, 2016 by Rednael Link to comment Share on other sites More sharing options...
boomer41 Posted March 27, 2016 Share Posted March 27, 2016 In der Schleife bekommst du praktisch alle Unterpunkte zurück. Überprüfe mit schild.getInt("X") usw. ob das gleich ist. Wenn Ja kannst du dann mit getString("IP") die IPs abgreifen Link to comment Share on other sites More sharing options...
Rednael Posted March 27, 2016 Author Share Posted March 27, 2016 Ok, dann ist ja super, danke Link to comment Share on other sites More sharing options...
Rednael Posted March 27, 2016 Author Share Posted March 27, 2016 (edited) Im Scheduler wirft er mir aber im 10Tick-Takt Fehler aus: public void updateSign() { Bukkit.getScheduler().runTaskTimerAsynchronously(this, new Runnable() { @Override public void run() { Map<String, Object> schild = sc.getConfigurationSection("Schild").getValues(true); for (Map.Entry<String, Object> eintrag : schild.entrySet()) { ConfigurationSection section = (ConfigurationSection) eintrag.getValue(); String name = section.getString("NAME"); String ip = section.getString("IP"); int port = section.getInt("PORT"); double x = section.getDouble("X"); double y = section.getDouble("Y"); double z = section.getDouble("Z"); World w = Bukkit.getServer().getWorld(section.getString("WELT")); Location loc = new Location(w, x, y, z); Sign s = (Sign) loc.getBlock().getState(); Ping server = new Ping(ip, port); s.setLine(3, server.parseData(Connection.ONLINE_PLAYERS) + "/" + server.parseData(Connection.MAX_PLAYERS)); s.setLine(2, server.parseData(Connection.MOTD)); if(s.getLine(2).equalsIgnoreCase(null)) { s.setLine(0, "§f§l█████████"); s.setLine(1, "§cServer wird"); s.setLine(2, "§cgesucht"); s.setLine(3, "§f§l█████████"); } else if (!s.getLine(2).equalsIgnoreCase(null)){ String voll = ""; if (Integer.valueOf(server.parseData(Connection.ONLINE_PLAYERS)) == Integer.valueOf(server.parseData(Connection.MAX_PLAYERS))) { voll = "§7[§6PREMIUM§7]"; } else { voll = "§7[§aWarten§7]"; } s.setLine(0, "§0" + name); s.setLine(1, voll); s.setLine(2, "§7" + server.parseData(Connection.MOTD)); s.setLine(3, "§f" + server.parseData(Connection.ONLINE_PLAYERS) + "§7/§f" + server.parseData(Connection.MAX_PLAYERS)); } s.update(); } } }, 200L, 10L); } Fehler: [15:42:05 WARN]: org.apache.commons.lang.UnhandledException: Plugin LobbySystem v1.0 generated an exception while executing task 2 at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:56) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to org.bukkit.configuration.ConfigurationSection at net.rednaelde.lobby.plugin.start$1.run(start.java:130) at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftTask.run(CraftTask.java:71) at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:53) ... 3 more [15:42:05 WARN]: Exception in thread "Craft Scheduler Thread - 1" [15:42:05 WARN]: org.apache.commons.lang.UnhandledException: Plugin LobbySystem v1.0 generated an exception while executing task 2 at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:56) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to org.bukkit.configuration.ConfigurationSection at net.rednaelde.lobby.plugin.start$1.run(start.java:130) at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftTask.run(CraftTask.java:71) at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:53) ... 3 more Den Fehler bringt er alle 0.5 Sekunden... Ich weiß nicht weiter Edited March 27, 2016 by Rednael Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now