mik3_1802 Geschrieben 13. Juli 2017 Share Geschrieben 13. Juli 2017 (bearbeitet) 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! bearbeitet 16. Juli 2017 von mik3_1802 Gelöst Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
boomer41 Geschrieben 13. Juli 2017 Share Geschrieben 13. Juli 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 zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
mik3_1802 Geschrieben 14. Juli 2017 Autor Share Geschrieben 14. Juli 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 zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
mik3_1802 Geschrieben 16. Juli 2017 Autor Share Geschrieben 16. Juli 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 zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Empfohlene Beiträge
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 erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden