diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PacketHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PacketHelper.java index bf9e35b571..d2a3a319ad 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PacketHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/PacketHelper.java @@ -76,6 +76,10 @@ default void showMobHealth(Player player, LivingEntity mob, double health, doubl void setNetworkManagerFor(Player player); + default void enableNetworkManager() { + // Pre-1.18 do nothing + } + default void sendRename(Player player, Entity entity, String name, boolean listMode) { throw new UnsupportedOperationException(); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/packets/NetworkInterceptHelper.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/packets/NetworkInterceptHelper.java index fb1d4b9039..5fd7a4842a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/packets/NetworkInterceptHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/packets/NetworkInterceptHelper.java @@ -24,6 +24,7 @@ public static void enable() { for (Player player : Bukkit.getOnlinePlayers()) { NMSHandler.getPacketHelper().setNetworkManagerFor(player); } + NMSHandler.getPacketHelper().enableNetworkManager(); } @EventHandler(priority = EventPriority.LOWEST) diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/PacketHelperImpl.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/PacketHelperImpl.java index b54eca710e..04ae9dc63d 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/PacketHelperImpl.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/PacketHelperImpl.java @@ -478,6 +478,11 @@ public void setNetworkManagerFor(Player player) { DenizenNetworkManagerImpl.setNetworkManager(player); } + @Override + public void enableNetworkManager() { + DenizenNetworkManagerImpl.enableNetworkManager(); + } + @Override public void showDebugTestMarker(Player player, Location location, ColorTag color, int alpha, String name, int time) { ResourceLocation packetKey = new ResourceLocation("minecraft", "debug/game_test_add_marker"); diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/network/handlers/DenizenNetworkManagerImpl.java index dbdf0152d3..b8321b0967 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -45,8 +45,10 @@ import net.minecraft.network.protocol.game.*; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ChunkMap; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.server.network.ServerPlayerConnection; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.item.ItemStack; @@ -54,7 +56,9 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Particle; +import org.bukkit.World; import org.bukkit.craftbukkit.v1_18_R1.CraftParticle; +import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; import org.bukkit.craftbukkit.v1_18_R1.entity.CraftEntity; import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack; @@ -101,6 +105,28 @@ public static void setNetworkManager(Player player) { setNetworkManager(playerConnection, new DenizenNetworkManagerImpl(entityPlayer, playerConnection.connection)); } + public static void enableNetworkManager() { + for (World w : Bukkit.getWorlds()) { + for (ChunkMap.TrackedEntity tracker : ((CraftWorld) w).getHandle().getChunkSource().chunkMap.entityMap.values()) { + ArrayList connections = new ArrayList<>(tracker.seenBy); + tracker.seenBy.clear(); + for (ServerPlayerConnection connection : connections) { + tracker.seenBy.add(connection.getPlayer().connection); + } + } + } + } + + @Override + public int hashCode() { + return oldManager.hashCode(); + } + + @Override + public boolean equals(Object c2) { + return oldManager.equals(c2); + } + @Override public void channelRegistered(ChannelHandlerContext ctx) throws Exception { oldManager.channelRegistered(ctx); @@ -185,6 +211,45 @@ public void send(Packet packet) { send(packet, null); } + public void debugOutputPacket(Packet packet) { + if (packet instanceof ClientboundSetEntityDataPacket) { + StringBuilder output = new StringBuilder(128); + output.append("Packet: ClientboundSetEntityDataPacket sent to ").append(player.getScoreboardName()).append(" for entity ID: ").append(((ClientboundSetEntityDataPacket) packet).getId()).append(": "); + List> list = ((ClientboundSetEntityDataPacket) packet).getUnpackedData(); + if (list == null) { + output.append("None"); + } + else { + for (SynchedEntityData.DataItem data : list) { + output.append('[').append(data.getAccessor().getId()).append(": ").append(data.getValue()).append("], "); + } + } + Debug.log(output.toString()); + } + else if (packet instanceof ClientboundSetEntityMotionPacket) { + try { + throw new RuntimeException("Trace"); + } + catch (Exception ex) { + Debug.echoError(ex); + } + ClientboundSetEntityMotionPacket velPacket = (ClientboundSetEntityMotionPacket) packet; + Debug.log("Packet: ClientboundSetEntityMotionPacket sent to " + player.getScoreboardName() + " for entity ID: " + velPacket.getId() + ": " + velPacket.getXa() + "," + velPacket.getYa() + "," + velPacket.getZa()); + } + else if (packet instanceof ClientboundAddEntityPacket) { + ClientboundAddEntityPacket addEntityPacket = (ClientboundAddEntityPacket) packet; + Debug.log("Packet: ClientboundAddEntityPacket sent to " + player.getScoreboardName() + " for entity ID: " + addEntityPacket.getId() + ": " + "uuid: " + addEntityPacket.getUUID() + + ", type: " + addEntityPacket.getType() + ", at: " + addEntityPacket.getX() + "," + addEntityPacket.getY() + "," + addEntityPacket.getZ() + ", data: " + addEntityPacket.getData()); + } + else if (packet instanceof ClientboundMapItemDataPacket) { + ClientboundMapItemDataPacket mapPacket = (ClientboundMapItemDataPacket) packet; + Debug.log("Packet: ClientboundMapItemDataPacket sent to " + player.getScoreboardName() + " for map ID: " + mapPacket.getMapId() + ", scale: " + mapPacket.getScale() + ", locked: " + mapPacket.isLocked()); + } + else { + Debug.log("Packet: " + packet.getClass().getCanonicalName() + " sent to " + player.getScoreboardName()); + } + } + @Override public void send(Packet packet, GenericFutureListener> genericfuturelistener) { if (!Bukkit.isPrimaryThread()) { @@ -204,36 +269,7 @@ public void send(Packet packet, GenericFutureListener> list = ((ClientboundSetEntityDataPacket) packet).getUnpackedData(); - if (list == null) { - output.append("None"); - } - else { - for (SynchedEntityData.DataItem data : list) { - output.append('[').append(data.getAccessor().getId()).append(": ").append(data.getValue()).append("], "); - } - } - Debug.log(output.toString()); - } - else if (packet instanceof ClientboundSetEntityMotionPacket) { - ClientboundSetEntityMotionPacket velPacket = (ClientboundSetEntityMotionPacket) packet; - Debug.log("Packet: ClientboundSetEntityMotionPacket sent to " + player.getScoreboardName() + " for entity ID: " + velPacket.getId() + ": " + velPacket.getXa() + "," + velPacket.getYa() + "," + velPacket.getZa()); - } - else if (packet instanceof ClientboundAddEntityPacket) { - ClientboundAddEntityPacket addEntityPacket = (ClientboundAddEntityPacket) packet; - Debug.log("Packet: ClientboundAddEntityPacket sent to " + player.getScoreboardName() + " for entity ID: " + addEntityPacket.getId() + ": " + "uuid: " + addEntityPacket.getUUID() - + ", type: " + addEntityPacket.getType() + ", at: " + addEntityPacket.getX() + "," + addEntityPacket.getY() + "," + addEntityPacket.getZ() + ", data: " + addEntityPacket.getData()); - } - else if (packet instanceof ClientboundMapItemDataPacket) { - ClientboundMapItemDataPacket mapPacket = (ClientboundMapItemDataPacket) packet; - Debug.log("Packet: ClientboundMapItemDataPacket sent to " + player.getScoreboardName() + " for map ID: " + mapPacket.getMapId() + ", scale: " + mapPacket.getScale() + ", locked: " + mapPacket.isLocked()); - } - else { - Debug.log("Packet: " + packet.getClass().getCanonicalName() + " sent to " + player.getScoreboardName()); - } + debugOutputPacket(packet); } packetsSent++; if (processAttachToForPacket(packet) @@ -256,7 +292,6 @@ public boolean processSoundPacket(Packet packet) { if (!PlayerHearsSoundScriptEvent.enabled) { return false; } - // (Player player, String name, String category, boolean isCustom, Entity entity, Location location, float volume, float pitch) if (packet instanceof ClientboundSoundPacket) { ClientboundSoundPacket spacket = (ClientboundSoundPacket) packet; return PlayerHearsSoundScriptEvent.instance.run(player.getBukkitEntity(), spacket.getSound().getLocation().getPath(), spacket.getSource().name(),