-
Bug
-
Resolution: Fixed
-
Minecraft 1.12.2
-
None
-
Confirmed
Basically, the method PlayerChunkMapEntry.sendToPlayers() is sometimes called on an entry while it contains no players.
The end of that method looks like this:
else { this.changes = 0; this.changedSectionFilter = 0; this.sentToPlayers = true; Packet<?> packet = new SPacketChunkData(this.chunk, 65535); for (EntityPlayerMP entityplayermp : this.players) { entityplayermp.connection.sendPacket(packet); this.playerChunkMap.getWorldServer().getEntityTracker().sendLeashedEntitiesInChunk(entityplayermp, this.chunk); } return true; }
When that code is run, the SPacketChunkData packet is created even if the list players is empty at this point and the packet is not actually needed.
As creating the packet here involves reading all the data for a chunk, including block entity data, it's better to avoid doing so unnecessarily.
The issue can be easily resolved by adding a check to the method like so:
else { this.changes = 0; this.changedSectionFilter = 0; this.sentToPlayers = true; if (!this.players.isEmpty()) { Packet<?> packet = new SPacketChunkData(this.chunk, 65535); for (EntityPlayerMP entityplayermp : this.players) { entityplayermp.connection.sendPacket(packet); this.playerChunkMap.getWorldServer().getEntityTracker().sendLeashedEntitiesInChunk(entityplayermp, this.chunk); } } return true; }