Jump to content

[GELÖST] Could not pass event SignChangeEvent to ....


mik3_1802
 Share

Recommended Posts

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 by mik3_1802
Gelöst
Link to comment
Share on other sites

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

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

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 :D

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...
B
B