Mojira Archive
MC-120780

Chunk data packets are sometimes created unnecessarily

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;
}

Fixed

Ben Staddon

[Mojang] Grum (Erik Broes)

2017-09-22, 01:14 AM

2018-07-25, 09:17 PM

2018-07-25, 09:17 PM

7

2

Confirmed

Minecraft 1.12.2

Minecraft 18w30b