diff --git a/src/main/java/gregtech/api/metatileentity/SyncedTileEntityBase.java b/src/main/java/gregtech/api/metatileentity/SyncedTileEntityBase.java index fbcf0a179fe..148bed2b78f 100644 --- a/src/main/java/gregtech/api/metatileentity/SyncedTileEntityBase.java +++ b/src/main/java/gregtech/api/metatileentity/SyncedTileEntityBase.java @@ -13,6 +13,7 @@ import net.minecraft.network.play.server.SPacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; +import net.minecraft.world.WorldServer; import net.minecraftforge.common.util.Constants; import io.netty.buffer.ByteBuf; @@ -57,7 +58,25 @@ public void addPacketsFrom(SyncedTileEntityBase syncedTileEntityBase) { private void notifyWorld() { @SuppressWarnings("deprecation") IBlockState blockState = getBlockType().getStateFromMeta(getBlockMetadata()); - world.notifyBlockUpdate(getPos(), blockState, blockState, 0); + if (canNotifyWorld()) { + world.notifyBlockUpdate(getPos(), blockState, blockState, 0); + } + } + + private boolean canNotifyWorld() { + // short circuit with packet size to avoid too many hash lookups and instanceof casts + if (updates.size() > 10 && getWorld() instanceof WorldServer server) { + int x = getPos().getX() >> 4; + int z = getPos().getZ() >> 4; + if (server.getPlayerChunkMap().contains(x, z)) { + return true; + } else { + // cannot send, so clear + updates.clear(); + return false; + } + } + return false; } @Override diff --git a/src/main/java/gregtech/api/network/PacketDataList.java b/src/main/java/gregtech/api/network/PacketDataList.java index e2f57507eff..baca3321b91 100644 --- a/src/main/java/gregtech/api/network/PacketDataList.java +++ b/src/main/java/gregtech/api/network/PacketDataList.java @@ -5,6 +5,8 @@ import org.jetbrains.annotations.NotNull; +import java.util.Arrays; + /** * An optimised data structure backed by two arrays. * This is essentially equivalent to List>, but more efficient. @@ -84,9 +86,8 @@ public boolean isEmpty() { * remove all data packets */ public void clear() { - for (int i = 0; i < this.size; i++) { - this.data[i] = null; - } + Arrays.fill(this.discriminators, 0); + Arrays.fill(this.data, null); this.size = 0; }