Gamemode "Bug oder Fehler" bei AsyncPlayerChatEvent, Weiß jmd. eine Lösung?
Hallo, Ich habe mit dem AsyncPlayerChatEvent versucht, dass bei der nachricht "gm" der Creative Mode Aktiviert wird und wieder deaktivert wird. Dazu haben ich folgenden Code verwendet:
@EventHandler
public void gamemode(AsyncPlayerChatEvent e) {
if (e.getMessage().startsWith("gm")) {
if (e.getPlayer().getGameMode() == GameMode.SURVIVAL) {
e.getPlayer().setGameMode(GameMode.CREATIVE);
} else {
e.getPlayer().setGameMode(GameMode.SURVIVAL);
}
}
}
Das Problem: Der Gamemode wird nur "halb" geändert. Ich hab noch das Survival Inventar aber kann fliegen, mit Mausrad Blöcke nehmen, Blöcke sofort zerstören. Wenn ich aber Blöcke setze, werden sie aus dem Inventar abgezogen Weiß jemand wie man diesen Bug beheben kann? Schonmal Danke im voraus!
3 Antworten
Weißt du, was "Async" bedeutet ? Das bedeutet, dass es nicht auf dem Hauptthread (Ist sowas wie ein Prozess gaub' ich [Google hilft]), sondern auf einen eigenen, extra dafür erstellten Thread ausgeführt wird. Deshalb bekommst du auch die Fehlermeldung
Asynchronous player tracker update!
. Versuch das mal:
[...]
public void gamemode(AsyncPlayerChatEvent e)
{
gm(e.getPlayer());
}
void gm(Player p)
{
if(p.getGameMode() == GameMode.SURVIVAL)
{
p.setGameMode(GameMode.CREATIVE);
}else{
p.setGameMode(GameMode.SURVIVAL);
}
}
[...]
(Außerdem gibt es extra Foren für solche Fragen.)
Du hast soweit alles richtig programmiert, das müsste an einem anderen Plugin liegen.
Ansonsten Versuch das Event über 'PlayerChangeGamemode' abzugreifen...
LG Atomsi
Ja war irgendwie klar... Würdest du normal FÜR einen Server entwickeln, hätte es keinen Sinn das über ein Chat Event zu machen :D
Aber mal im Ernst, hast du Skype oder so? Weil damit hatte ich mich schonmal länger beschäftigt. Aber eher um meine APIs usw sicher gegen sowas zu machen...
Hm, des wird schwierig xD, des sieht man ja in der Konsole, du weißt, was ich damit machen will ? xD
Danke für deine Antwort,
ich habe einen Testserver gemacht und dort dieses Plugin alleine laden lassen und alle Methoden außer dieser deaktiviert. Leider ist besteht immer noch das gleiche Problem :c
Das ist der log:
[XX:XX:XX] [Async Chat Thread - #15/ERROR]: Could not pass event AsyncPlayerChatEvent to XXX vXX
org.bukkit.event.EventException
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:310) ~[spigot.jar:git-Spigot-db6de12-07c3001]
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot.jar:git-Spigot-db6de12-07c3001]
at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [spigot.jar:git-Spigot-db6de12-07c3001]
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:484) [spigot.jar:git-Spigot-db6de12-07c3001]
at net.minecraft.server.v1_8_R3.PlayerConnection.chat(PlayerConnection.java:1084) [spigot.jar:git-Spigot-db6de12-07c3001]
at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:1022) [spigot.jar:git-Spigot-db6de12-07c3001]
at net.minecraft.server.v1_8_R3.PacketPlayInChat$1.run(PacketPlayInChat.java:39) [spigot.jar:git-Spigot-db6de12-07c3001]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_74]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_74]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_74]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_74]
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_74]
Caused by: java.lang.IllegalStateException: Asynchronous player tracker update!
at org.spigotmc.AsyncCatcher.catchOp(AsyncCatcher.java:14) ~[spigot.jar:git-Spigot-db6de12-07c3001]
at net.minecraft.server.v1_8_R3.EntityTrackerEntry.updatePlayer(EntityTrackerEntry.java:313) ~[spigot.jar:git-Spigot-db6de12-07c3001]
at net.minecraft.server.v1_8_R3.EntityTracker.a(EntityTracker.java:207) ~[spigot.jar:git-Spigot-db6de12-07c3001]
at net.minecraft.server.v1_8_R3.EntityPlayer.B(EntityPlayer.java:1041) ~[spigot.jar:git-Spigot-db6de12-07c3001]
at net.minecraft.server.v1_8_R3.EntityPlayer.updateAbilities(EntityPlayer.java:934) ~[spigot.jar:git-Spigot-db6de12-07c3001]
at net.minecraft.server.v1_8_R3.PlayerInteractManager.setGameMode(PlayerInteractManager.java:36) ~[spigot.jar:git-Spigot-db6de12-07c3001]
at org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer.setGameMode(CraftPlayer.java:759) ~[spigot.jar:git-Spigot-db6de12-07c3001]
at xxx.xxx.xxx.xxx.xxx(main.java:217) ~[?:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_74]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_74]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_74]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_74]
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot.jar:git-Spigot-db6de12-07c3001]
... 11 more
Letzteres werde ich mal versuchen.
Mach mal Try/Catch um getMessage() und lass den Error broadcasten. Ich glaube das ist ein 'AsynchronPlayerTracker' oder so.
Gruß.
Wenn ich es in eine Try/ Catch "Methode bzw. Block" einbaue, bekomme ich:
Asynchronous player tracker update!
Also, das stimmt, aber wie kann ich das fixen?
Okay... Ich kann dir noch empfehlen das ganze einfach als Befehl zu machen (/gm) da das dann sicher funktioniert... Welches Plugin soll das denn werden (weil bei einem griefplugin usw. Geht das mit /gm nicht gut...)
LG Atomsi