Skip to content

Commit

Permalink
NetworkManager: enhanced stability for late-init (1.18 only)
Browse files Browse the repository at this point in the history
also move the debug output to its own method for cleanliness
  • Loading branch information
mcmonkey4eva committed Jan 2, 2022
1 parent f5a2606 commit 56d3707
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 31 deletions.
Expand Up @@ -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();
}
Expand Down
Expand Up @@ -24,6 +24,7 @@ public static void enable() {
for (Player player : Bukkit.getOnlinePlayers()) {
NMSHandler.getPacketHelper().setNetworkManagerFor(player);
}
NMSHandler.getPacketHelper().enableNetworkManager();
}

@EventHandler(priority = EventPriority.LOWEST)
Expand Down
Expand Up @@ -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");
Expand Down
Expand Up @@ -45,16 +45,20 @@
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;
import net.minecraft.world.level.block.state.BlockState;
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;
Expand Down Expand Up @@ -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<ServerPlayerConnection> 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);
Expand Down Expand Up @@ -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<SynchedEntityData.DataItem<?>> 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<? extends Future<? super Void>> genericfuturelistener) {
if (!Bukkit.isPrimaryThread()) {
Expand All @@ -204,36 +269,7 @@ public void send(Packet<?> packet, GenericFutureListener<? extends Future<? supe
return;
}
if (NMSHandler.debugPackets) {
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<SynchedEntityData.DataItem<?>> 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)
Expand All @@ -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(),
Expand Down

0 comments on commit 56d3707

Please sign in to comment.