From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Wed, 9 Aug 2023 14:00:40 -0700 Subject: [PATCH] Remove UpgradeData neighbour ticks outside of range The lists are only supposed to contain ticks for the 1 radius neighbours of the chunk. diff --git a/src/main/java/net/minecraft/world/level/chunk/UpgradeData.java b/src/main/java/net/minecraft/world/level/chunk/UpgradeData.java index 8943081f270d5328b4f333b7bc1ae1a449d1788c..0f94af3502ef517c33d04841a80ea2ace077f0af 100644 --- a/src/main/java/net/minecraft/world/level/chunk/UpgradeData.java +++ b/src/main/java/net/minecraft/world/level/chunk/UpgradeData.java @@ -99,6 +99,24 @@ public class UpgradeData { } + // Paper start - filter out relocated neighbour ticks + private static void filterTickList(int chunkX, int chunkZ, List> ticks) { + for (java.util.Iterator> iterator = ticks.iterator(); iterator.hasNext();) { + SavedTick tick = iterator.next(); + BlockPos tickPos = tick.pos(); + int tickCX = tickPos.getX() >> 4; + int tickCZ = tickPos.getZ() >> 4; + + int dist = Math.max(Math.abs(chunkX - tickCX), Math.abs(chunkZ - tickCZ)); + + if (dist != 1) { + LOGGER.warn("Neighbour tick '" + tick + "' serialized in chunk (" + chunkX + "," + chunkZ + ") is too far (" + tickCX + "," + tickCZ + ")"); + iterator.remove(); + } + } + } + // Paper end - filter out relocated neighbour ticks + public void upgrade(LevelChunk chunk) { this.upgradeInside(chunk); @@ -106,6 +124,11 @@ public class UpgradeData { upgradeSides(chunk, direction8); } + // Paper start - filter out relocated neighbour ticks + filterTickList(chunk.locX, chunk.locZ, this.neighborBlockTicks); + filterTickList(chunk.locX, chunk.locZ, this.neighborFluidTicks); + // Paper end - filter out relocated neighbour ticks + Level level = chunk.getLevel(); this.neighborBlockTicks.forEach((tick) -> { Block block = tick.type() == Blocks.AIR ? level.getBlockState(tick.pos()).getBlock() : tick.type();