mik3_1802 Posted July 13, 2017 Share Posted July 13, 2017 (edited) Hey Leute Ich bin gerade dabei ein kleines Plugin zum teleportieren zu schreiben. Die erste Funktion, den Spieler an irgendeinen zufällige Stelle der Map zu teleportieren klappt wunderbar. Jetzt will ich Schilder erstellen können, ein Schild als Start, und ein Schild als Ziel. Zum teleportieren also. Nur wenn ich ein Schild erstelle, bekomme ich direkt den Fehler in der Konsole: [17:39:32 ERROR]: Could not pass event SignChangeEvent to Teleport v1.0.3 org.bukkit.event.EventException: null at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.12.jar:git-Spigot-7228328-af1c013] at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.12.jar:git-Spigot-7228328-af1c013] at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:499) [spigot-1.12.jar:git-Spigot-7228328-af1c013] at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:484) [spigot-1.12.jar:git-Spigot-7228328-af1c013] at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:2187) [spigot-1.12.jar:git-Spigot-7228328-af1c013] at net.minecraft.server.v1_12_R1.PacketPlayInUpdateSign.a(SourceFile:44) [spigot-1.12.jar:git-Spigot-7228328-af1c013] at net.minecraft.server.v1_12_R1.PacketPlayInUpdateSign.a(SourceFile:10) [spigot-1.12.jar:git-Spigot-7228328-af1c013] at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot-1.12.jar:git-Spigot-7228328-af1c013] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_112] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_112] at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46) [spigot-1.12.jar:git-Spigot-7228328-af1c013] at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:747) [spigot-1.12.jar:git-Spigot-7228328-af1c013] at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:405) [spigot-1.12.jar:git-Spigot-7228328-af1c013] at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:678) [spigot-1.12.jar:git-Spigot-7228328-af1c013] at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:576) [spigot-1.12.jar:git-Spigot-7228328-af1c013] at java.lang.Thread.run(Thread.java:745) [?:1.8.0_112] Caused by: java.lang.ClassCastException: org.bukkit.craftbukkit.v1_12_R1.block.CraftBlock cannot be cast to org.bukkit.block.Sign at tlprt.teleport.Main.onSignCreate(Main.java:82) ~[?:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_112] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_112] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_112] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_112] at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.12.jar:git-Spigot-7228328-af1c013] ... 15 more Ich weiß nicht woran das liegt... Also ja natürlich an dem SignChangeEvent, aber wodurch genau er da ausgelöst wird weiß ich leider nichts. Hier ist noch die Stelle die den Fehler verursacht: // Wenn ein Schild erstellt wird @EventHandler public void onSignCreate (SignChangeEvent e) { // Daten vom Schild holen Sign s = (Sign)e.getBlock(); Location sloc = e.getBlock().getLocation(); String[] lines = s.getLines(); Player player = (Player) e; String playername = player.getName(); // Überprüfen ob in der ersten Zeile [Teleport] steht if (lines.length == 2 && lines[0].equalsIgnoreCase("[Teleport]")) { // Wenn in der zweiten Zeile ziel steht if (lines[1].equalsIgnoreCase("ziel")) { // Die Koordinaten des Schildes speichern int posx = sloc.getBlockX(); int posy = sloc.getBlockY(); int posz = sloc.getBlockZ(); String signname = lines[2]; // Wenn in der dritten Zeile kein Schildname steht if (signname == null) { // Spieler benachrichtigen und Schild auf Rot stellen player.sendMessage("§cDu musst einen Schildnamen in der dritten Reihe angeben!"); e.setLine(0, "§c[Teleport]"); } else { // Wenn ein Schildname angegeben wurde, Schildname und Koordinaten in der config speichern e.setLine(0, "§1[Teleport]"); Main.cfg.set("Signs." + playername + "." + signname + ".X", posx); Main.cfg.set("Signs." + playername + "." + signname + ".Y", posy); Main.cfg.set("Signs." + playername + "." + signname + ".Z", posz); this.getConfig().options().copyDefaults(true); this.saveConfig(); } // Wenn start in der zweiten Zeile steht } else if (lines[1].equalsIgnoreCase("start")) { String ziel = lines[2]; // Versuchen Wert X aus der Config zu laden String exist = Main.cfg.getString("Signs." + playername + "." + ziel + ".X"); // Wenn der Wert X nicht null ist if (exist == null) { // Spieler benachrichtigen und Schild auf Rot stellen player.sendMessage("Das Ziel existiert nichts!"); e.setLine(0, "§c[Teleport]"); } else { } // Wenn kein Start oder Ziel angegeben wurde } else { player.sendMessage("§cDu musst in der zweiten Zeile start/ziel angeben"); } } } Ich hoffe das mir jemand weiterhelfen kann. Danke im Voraus für Antworten! Edited July 16, 2017 by mik3_1802 Gelöst Link to comment Share on other sites More sharing options...
boomer41 Posted July 13, 2017 Share Posted July 13, 2017 Sign s = (Sign)e.getBlock(); wird zu Sign s = (Sign) e.getBlock().getState() Nach dem setzen einer Line muss noch sign.update() aufgerufen werden. sign.getLines().length wird IMMER(!!) 4 sein, weil jedes Schild 4 Zeilen hat. Du willst wahrscheinlich wissen, ob die Zeilen leer sind? Dann musst du prüfen ob der Inhalt eben leer ist. Link to comment Share on other sites More sharing options...
mik3_1802 Posted July 14, 2017 Author Share Posted July 14, 2017 Am 13.7.2017 um 18:56 schrieb boomer41: sign.getLines().length wird IMMER(!!) 4 sein, weil jedes Schild 4 Zeilen hat Danke für die Antwort Ja das habe ich mir abgeschaut, dachte es wäre richtig so. Aber gibt schon Sinn was du schreibst. Ich probier das jetzt mal aus und melde mich dann mit dem Ergebnis Also der Fehler kommt immer noch jedes mal wenn ich ein Schild erstelle.. Generell wenn ich ein Schild erstelle. Also es ist egal ob ich [Teleport] oder nichts drin stehen hab. Weißt du boomer41, oder sonst jemand was das sein könnte? Also ich hab rausgefunden was das Problem ist. Ich schreibe es mal für diejenigen die auf den Post stoßen und das gleiche Problem haben: Man kann das Schild nicht in dem SignChangeEvent bearbeiten. Man muss dafür eine eigene Methode erstellen die man aufruft. Wenn ich Zuhause bin poste ich mal wie ich das gelöst habe. Link to comment Share on other sites More sharing options...
mik3_1802 Posted July 16, 2017 Author Share Posted July 16, 2017 Soo hier wie ich das gelöst habe: Das hier kommt an den Anfang der Klasse, das die Werte immer abgerufen werden können public double positx; public double posity; public double positz; public String schildname; public String schildart; public Sign sign; Hier das Event wenn ein Schild erstellt wird @EventHandler public void onSignChange(SignChangeEvent e) { sign = (Sign)e.getBlock().getState(); } Dann habe ich es hier etwas abgeändert, und zwar muss ich einen Befehl eingeben um das Schild zu erstellen Das passiert natürlich in einer onCommand Methode // Wenn der Befehl /signcreate <start|ziel> <schildname> ausgeführt wird if (label.equalsIgnoreCase("signcreate")) { Player player = (Player) sender; String username = player.getName(); String welt = player.getWorld().getName(); if (args.length == 2) { schildart = args[0]; schildname = args[1]; if (schildart.equalsIgnoreCase("ziel")) { // Position des zuvor erstellten Schildes ermitteln Location loc = sign.getLocation(); // Und dann an die Methode signUpdater() weitergeben signUpdater(loc); return true; } else if (schildart.equalsIgnoreCase("start")) { if (schildname == "") { player.sendMessage("§cDu musst einen Schildnamen in der dritten Reihe angeben!"); } else { player.sendMessage("§aDein Schild §9" + schildname + " §awurde erstellt!"); Location loc = sign.getLocation(); signUpdater(loc); return true; } } } } Und das hier ist die Methode signUpdater() public void signUpdater (Location loc) { World w = loc.getWorld(); Block a = w.getBlockAt(loc); if (a.getType() == Material.SIGN_POST || a.getType() == Material.WALL_SIGN) { Sign sign = (Sign) a.getState(); sign.setLine(0, "§a[Teleport]"); sign.setLine(1, schildart); sign.setLine(2, schildname); sign.update(true); } } Ich hoffe ich konnte jemandem helfen der auf das selbe Problem stößt, bzw wie ich nicht wusste das man ein Schild nicht in dem SignChangeEvent bearbeiten kann 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