diff --git a/src/main/java/de/myzelyam/supervanish/features/SilentOpenChest.java b/src/main/java/de/myzelyam/supervanish/features/SilentOpenChest.java index 83ac06b..484a1c7 100644 --- a/src/main/java/de/myzelyam/supervanish/features/SilentOpenChest.java +++ b/src/main/java/de/myzelyam/supervanish/features/SilentOpenChest.java @@ -20,13 +20,11 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.block.Action; import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.player.*; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; import java.util.*; @@ -124,10 +122,8 @@ public void onMove(PlayerMoveEvent e) { Player p = e.getPlayer(); if (playerStateInfoMap.containsKey(p)) { Location loc = e.getTo() != null ? e.getTo() : e.getFrom(); - if (playerStateInfoMap.get(p).openLoc.distance(loc) > .5) { - p.closeInventory(); - restoreState(playerStateInfoMap.get(p), p); - playerStateInfoMap.remove(p); + if (playerStateInfoMap.get(p).openLoc.distance(loc) > 3) { + p.teleport(playerStateInfoMap.get(p).openLoc); } } } @@ -163,17 +159,9 @@ public void onChestInteract(PlayerInteractEvent e) { || plugin.getVersionUtil().isOneDotXOrHigher(11) && additionalChestMaterials.contains(block.getType()))) return; StateInfo stateInfo = StateInfo.extract(p); - p.setVelocity(new Vector(0, 0, 0)); playerStateInfoMap.put(p, stateInfo); p.setGameMode(GameMode.SPECTATOR); - } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onChestClose(InventoryCloseEvent e) { - if (!(e.getPlayer() instanceof Player)) - return; - final Player p = (Player) e.getPlayer(); - if (!playerStateInfoMap.containsKey(p)) return; new BukkitRunnable() { @Override public void run() { @@ -182,12 +170,11 @@ public void run() { restoreState(stateInfo, p); playerStateInfoMap.remove(p); } - }.runTaskLater(plugin, 1); + }.runTaskLater(plugin, 2); } private void restoreState(StateInfo stateInfo, Player p) { p.setGameMode(stateInfo.gameMode); - p.teleport(p.getLocation().add(0, 0.2, 0)); new BukkitRunnable() { @Override public void run() { @@ -224,10 +211,9 @@ public boolean hasSilentlyOpenedChest(Player p) { @Override public void onEnable() { - if (!plugin.getVersionUtil().isOneDotXOrHigher(19)) { - SilentOpenChestPacketAdapter packetAdapter = new SilentOpenChestPacketAdapter(this); - ProtocolLibrary.getProtocolManager().addPacketListener(packetAdapter); - } + plugin.getVersionUtil().isOneDotXOrHigher(19); + SilentOpenChestPacketAdapter packetAdapter = new SilentOpenChestPacketAdapter(this); + ProtocolLibrary.getProtocolManager().addPacketListener(packetAdapter); } private static class StateInfo { diff --git a/src/main/java/de/myzelyam/supervanish/features/SilentOpenChestPacketAdapter.java b/src/main/java/de/myzelyam/supervanish/features/SilentOpenChestPacketAdapter.java index 9edc0a4..731ba2a 100644 --- a/src/main/java/de/myzelyam/supervanish/features/SilentOpenChestPacketAdapter.java +++ b/src/main/java/de/myzelyam/supervanish/features/SilentOpenChestPacketAdapter.java @@ -12,20 +12,12 @@ import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.reflect.FieldAccessException; -import com.comphenix.protocol.wrappers.EnumWrappers; -import com.comphenix.protocol.wrappers.PlayerInfoData; -import com.google.common.collect.ImmutableList; -import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.List; - import static com.comphenix.protocol.PacketType.Play.Server.*; -/** - * This is currently unused on Minecraft 1.19 or higher - */ public class SilentOpenChestPacketAdapter extends PacketAdapter { private final SilentOpenChest silentOpenChest; @@ -34,7 +26,7 @@ public class SilentOpenChestPacketAdapter extends PacketAdapter { public SilentOpenChestPacketAdapter(SilentOpenChest silentOpenChest) { super(silentOpenChest.plugin, ListenerPriority.LOW, PLAYER_INFO, ABILITIES, - ENTITY_METADATA); + ENTITY_METADATA, GAME_STATE_CHANGE, NAMED_ENTITY_SPAWN); this.silentOpenChest = silentOpenChest; } @@ -44,38 +36,10 @@ public void onPacketSending(PacketEvent event) { Player receiver = event.getPlayer(); if (receiver == null) return; if (event.getPacketType() == PLAYER_INFO) { - // multiple events share same packet object - event.setPacket(event.getPacket().shallowClone()); + if (silentOpenChest.hasSilentlyOpenedChest(receiver)) + event.setCancelled(true); - List infoDataList = new ArrayList<>( - event.getPacket().getPlayerInfoDataLists().read(0)); - for (PlayerInfoData infoData : ImmutableList.copyOf(infoDataList)) { - if (!silentOpenChest.plugin.getVisibilityChanger().getHider() - .isHidden(infoData.getProfile().getUUID(), receiver) - && silentOpenChest.plugin.getVanishStateMgr() - .isVanished(infoData.getProfile().getUUID())) { - Player vanishedTabPlayer = Bukkit.getPlayer(infoData.getProfile().getUUID()); - if (infoData.getGameMode() == EnumWrappers.NativeGameMode.SPECTATOR - && silentOpenChest.hasSilentlyOpenedChest(vanishedTabPlayer) - && event.getPacket().getPlayerInfoAction().read(0) - == EnumWrappers.PlayerInfoAction.UPDATE_GAME_MODE) { - int latency; - try { - latency = infoData.getLatency(); - } catch (NoSuchMethodError e) { - latency = 21; - } - PlayerInfoData newData = new PlayerInfoData(infoData.getProfile(), - latency, EnumWrappers.NativeGameMode.SURVIVAL, - infoData.getDisplayName()); - infoDataList.remove(infoData); - infoDataList.add(newData); - } - } - } - event.getPacket().getPlayerInfoDataLists().write(0, infoDataList); } else if (event.getPacketType() == GAME_STATE_CHANGE) { - // Currently unused due to ProtocolLib class loading bug if (silentOpenChest.plugin.getVanishStateMgr().isVanished( receiver.getUniqueId())) { try { @@ -101,6 +65,18 @@ public void onPacketSending(PacketEvent event) { event.setCancelled(true); } } + } else if (event.getPacketType() == NAMED_ENTITY_SPAWN) { + if (silentOpenChest.plugin.getVanishStateMgr().isVanished( + receiver.getUniqueId())) { + if (!silentOpenChest.hasSilentlyOpenedChest(receiver)) return; + Entity entity = event.getPacket().getEntityModifier(receiver.getWorld()).read(0); + if (entity instanceof Player) { + Player p = (Player) entity; + if (p.getGameMode() == GameMode.SPECTATOR) { + event.setCancelled(true); + } + } + } } } catch (Exception | NoClassDefFoundError e) { if (!suppressErrors) {