mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-27 07:20:00 +08:00
4104545b11
"It was from a different time before books were as jank as they are now. As time has gone on they've only proven to be worse and worse."
51 lines
2.6 KiB
Diff
51 lines
2.6 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Wed, 6 May 2020 05:00:57 -0400
|
|
Subject: [PATCH] Handle Oversized Tile Entities in chunks
|
|
|
|
Splits out Extra Packets if too many TE's are encountered to prevent
|
|
creating too large of a packet to sed.
|
|
|
|
Co authored by Spottedleaf
|
|
|
|
diff --git a/src/main/java/net/minecraft/network/protocol/game/ClientboundLevelChunkPacket.java b/src/main/java/net/minecraft/network/protocol/game/ClientboundLevelChunkPacket.java
|
|
index 96626835fee3c0fdb452acacdc9f737ad90c08de..c28879f32b004f36ff746ea2274f91ddd9501e71 100644
|
|
--- a/src/main/java/net/minecraft/network/protocol/game/ClientboundLevelChunkPacket.java
|
|
+++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundLevelChunkPacket.java
|
|
@@ -27,6 +27,15 @@ public class ClientboundLevelChunkPacket implements Packet<ClientGamePacketListe
|
|
private final int[] biomes;
|
|
private final byte[] buffer;
|
|
private final List<CompoundTag> blockEntitiesTags;
|
|
+ // Paper start
|
|
+ private final java.util.List<Packet> extraPackets = new java.util.ArrayList<>();
|
|
+ private static final int TE_LIMIT = Integer.getInteger("Paper.excessiveTELimit", 750);
|
|
+
|
|
+ @Override
|
|
+ public java.util.List<Packet> getExtraPackets() {
|
|
+ return extraPackets;
|
|
+ }
|
|
+ // Paper end
|
|
|
|
public ClientboundLevelChunkPacket(LevelChunk chunk) {
|
|
ChunkPos chunkPos = chunk.getPos();
|
|
@@ -44,9 +53,19 @@ public class ClientboundLevelChunkPacket implements Packet<ClientGamePacketListe
|
|
this.buffer = new byte[this.calculateChunkSize(chunk)];
|
|
this.availableSections = this.extractChunkData(new FriendlyByteBuf(this.getWriteBuffer()), chunk);
|
|
this.blockEntitiesTags = Lists.newArrayList();
|
|
+ int totalTileEntities = 0; // Paper
|
|
|
|
for(Entry<BlockPos, BlockEntity> entry2 : chunk.getBlockEntities().entrySet()) {
|
|
BlockEntity blockEntity = entry2.getValue();
|
|
+ // Paper start - improve oversized chunk data packet handling
|
|
+ if (++totalTileEntities > TE_LIMIT) {
|
|
+ ClientboundBlockEntityDataPacket updatePacket = blockEntity.getUpdatePacket();
|
|
+ if (updatePacket != null) {
|
|
+ this.extraPackets.add(updatePacket);
|
|
+ continue;
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
CompoundTag compoundTag = blockEntity.getUpdateTag();
|
|
if (blockEntity instanceof net.minecraft.world.level.block.entity.SkullBlockEntity) { net.minecraft.world.level.block.entity.SkullBlockEntity.sanitizeTileEntityUUID(compoundTag); } // Paper
|
|
this.blockEntitiesTags.add(compoundTag);
|