diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/world/AntiCursorReCentering.java b/BauSystem_Main/src/de/steamwar/bausystem/features/world/AntiCursorReCentering.java index edf23bba..7cf5c4c7 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/world/AntiCursorReCentering.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/world/AntiCursorReCentering.java @@ -21,16 +21,44 @@ package de.steamwar.bausystem.features.world; import com.comphenix.tinyprotocol.Reflection; import com.comphenix.tinyprotocol.TinyProtocol; +import de.steamwar.bausystem.BauSystem; import de.steamwar.linkage.Linked; import de.steamwar.linkage.api.Enable; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; @Linked public class AntiCursorReCentering implements Enable { + private final Set CLOSE_PACKETS = new HashSet<>(); + private final Set CLOSE_NOW = new HashSet<>(); + @Override public void enable() { - // Fix GUI Closing causing a recentering of the Cursor - Class clazz = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutCloseWindow"); - TinyProtocol.instance.addFilter(clazz, (player, object) -> null); + Class closeWindow = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutCloseWindow"); + TinyProtocol.instance.addFilter(closeWindow, (player, object) -> { + if (CLOSE_NOW.remove(player)) { + return object; + } + CLOSE_PACKETS.add(player); + Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> { + if (CLOSE_PACKETS.remove(player)) { + CLOSE_NOW.add(player); + TinyProtocol.instance.sendPacket(player, object); + } + }, 0); + return null; + }); + + Class openWindow = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutOpenWindow"); + TinyProtocol.instance.addFilter(openWindow, (player, object) -> { + CLOSE_PACKETS.remove(player); + return object; + }); } }