diff --git a/nms-patches/net/minecraft/server/network/PlayerConnection.patch b/nms-patches/net/minecraft/server/network/PlayerConnection.patch index c5e2e66de..0f0e5bd95 100644 --- a/nms-patches/net/minecraft/server/network/PlayerConnection.patch +++ b/nms-patches/net/minecraft/server/network/PlayerConnection.patch @@ -616,8 +616,9 @@ + + public void teleport(double d0, double d1, double d2, float f, float f1, Set set, PlayerTeleportEvent.TeleportCause cause) { + this.teleport(d0, d1, d2, f, f1, set, false, cause); -+ } -+ + } + +- public void teleport(double d0, double d1, double d2, float f, float f1, Set set, boolean flag) { + public boolean teleport(double d0, double d1, double d2, float f, float f1, Set set, boolean flag, PlayerTeleportEvent.TeleportCause cause) { // CraftBukkit - Return event status + Player player = this.getCraftPlayer(); + Location from = player.getLocation(); @@ -654,9 +655,8 @@ + + public void teleport(Location dest) { + internalTeleport(dest.getX(), dest.getY(), dest.getZ(), dest.getYaw(), dest.getPitch(), Collections.emptySet(), true); - } - -- public void teleport(double d0, double d1, double d2, float f, float f1, Set set, boolean flag) { ++ } ++ + private void internalTeleport(double d0, double d1, double d2, float f, float f1, Set set, boolean flag) { + // CraftBukkit start + if (Float.isNaN(f)) { @@ -1205,7 +1205,20 @@ this.player.resetLastActionTime(); IJumpable ijumpable; -@@ -1594,6 +2319,7 @@ +@@ -1583,6 +2308,12 @@ + } + + public void sendPlayerChatMessage(PlayerChatMessage playerchatmessage, ChatMessageType.a chatmessagetype_a) { ++ // CraftBukkit start - SPIGOT-7262: if hidden we have to send as disguised message. Query whether we should send at all (but changing this may not be expected). ++ if (!getCraftPlayer().canSee(playerchatmessage.link().sender())) { ++ sendDisguisedChatMessage(playerchatmessage.decoratedContent(), chatmessagetype_a); ++ return; ++ } ++ // CraftBukkit end + this.send(new ClientboundPlayerChatPacket(playerchatmessage.link().sender(), playerchatmessage.link().index(), playerchatmessage.signature(), playerchatmessage.signedBody().pack(this.messageSignatureCache), playerchatmessage.unsignedContent(), playerchatmessage.filterMask(), chatmessagetype_a.toNetwork(this.player.level.registryAccess()))); + this.addPendingMessage(playerchatmessage); + } +@@ -1594,6 +2325,7 @@ @Override public void handleInteract(PacketPlayInUseEntity packetplayinuseentity) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinuseentity, this, this.player.getLevel()); @@ -1213,7 +1226,7 @@ final WorldServer worldserver = this.player.getLevel(); final Entity entity = packetplayinuseentity.getTarget(worldserver); -@@ -1606,13 +2332,51 @@ +@@ -1606,13 +2338,51 @@ if (entity.distanceToSqr(this.player.getEyePosition()) < PlayerConnection.MAX_INTERACTION_DISTANCE) { packetplayinuseentity.dispatch(new PacketPlayInUseEntity.c() { @@ -1266,7 +1279,7 @@ if (enuminteractionresult.consumesAction()) { CriterionTriggers.PLAYER_INTERACTED_WITH_ENTITY.trigger(PlayerConnection.this.player, itemstack1, entity); if (enuminteractionresult.shouldSwing()) { -@@ -1625,23 +2389,29 @@ +@@ -1625,23 +2395,29 @@ @Override public void onInteraction(EnumHand enumhand) { @@ -1299,7 +1312,7 @@ } } else { PlayerConnection.this.disconnect(IChatBaseComponent.translatable("multiplayer.disconnect.invalid_entity_attacked")); -@@ -1687,15 +2457,21 @@ +@@ -1687,15 +2463,21 @@ @Override public void handleContainerClose(PacketPlayInCloseWindow packetplayinclosewindow) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinclosewindow, this, this.player.getLevel()); @@ -1323,7 +1336,7 @@ this.player.containerMenu.sendAllDataToRemote(); } else if (!this.player.containerMenu.stillValid(this.player)) { PlayerConnection.LOGGER.debug("Player {} interacted with invalid menu {}", this.player, this.player.containerMenu); -@@ -1708,7 +2484,284 @@ +@@ -1708,7 +2490,284 @@ boolean flag = packetplayinwindowclick.getStateId() != this.player.containerMenu.getStateId(); this.player.containerMenu.suppressRemoteUpdates(); @@ -1609,7 +1622,7 @@ ObjectIterator objectiterator = Int2ObjectMaps.fastIterable(packetplayinwindowclick.getChangedSlots()).iterator(); while (objectiterator.hasNext()) { -@@ -1748,6 +2801,7 @@ +@@ -1748,6 +2807,7 @@ @Override public void handleContainerButtonClick(PacketPlayInEnchantItem packetplayinenchantitem) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinenchantitem, this, this.player.getLevel()); @@ -1617,7 +1630,7 @@ this.player.resetLastActionTime(); if (this.player.containerMenu.containerId == packetplayinenchantitem.getContainerId() && !this.player.isSpectator()) { if (!this.player.containerMenu.stillValid(this.player)) { -@@ -1790,6 +2844,43 @@ +@@ -1790,6 +2850,43 @@ boolean flag1 = packetplayinsetcreativeslot.getSlotNum() >= 1 && packetplayinsetcreativeslot.getSlotNum() <= 45; boolean flag2 = itemstack.isEmpty() || itemstack.getDamageValue() >= 0 && itemstack.getCount() <= 64 && !itemstack.isEmpty(); @@ -1661,7 +1674,7 @@ if (flag1 && flag2) { this.player.inventoryMenu.getSlot(packetplayinsetcreativeslot.getSlotNum()).set(itemstack); -@@ -1812,6 +2903,7 @@ +@@ -1812,6 +2909,7 @@ } private void updateSignText(PacketPlayInUpdateSign packetplayinupdatesign, List list) { @@ -1669,7 +1682,7 @@ this.player.resetLastActionTime(); WorldServer worldserver = this.player.getLevel(); BlockPosition blockposition = packetplayinupdatesign.getPos(); -@@ -1828,18 +2920,37 @@ +@@ -1828,18 +2926,37 @@ if (!tileentitysign.isEditable() || !this.player.getUUID().equals(tileentitysign.getPlayerWhoMayEdit())) { PlayerConnection.LOGGER.warn("Player {} just tried to change non-editable sign", this.player.getName().getString()); @@ -1709,7 +1722,7 @@ tileentitysign.setChanged(); worldserver.sendBlockUpdated(blockposition, iblockdata, iblockdata, 3); -@@ -1849,6 +2960,7 @@ +@@ -1849,6 +2966,7 @@ @Override public void handleKeepAlive(PacketPlayInKeepAlive packetplayinkeepalive) { @@ -1717,7 +1730,7 @@ if (this.keepAlivePending && packetplayinkeepalive.getId() == this.keepAliveChallenge) { int i = (int) (SystemUtils.getMillis() - this.keepAliveTime); -@@ -1863,7 +2975,17 @@ +@@ -1863,7 +2981,17 @@ @Override public void handlePlayerAbilities(PacketPlayInAbilities packetplayinabilities) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinabilities, this, this.player.getLevel()); @@ -1736,7 +1749,7 @@ } @Override -@@ -1872,8 +2994,50 @@ +@@ -1872,8 +3000,50 @@ this.player.updateOptions(packetplayinsettings); } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index c87daf7a3..e7c001d49 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -1350,7 +1350,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public boolean canSee(org.bukkit.entity.Entity entity) { - return !hiddenEntities.containsKey(entity.getUniqueId()); + return canSee(entity.getUniqueId()); + } + + public boolean canSee(UUID uuid) { + return !hiddenEntities.containsKey(uuid); } @Override