diff --git a/src/main/java/net/minestom/server/instance/batch/ChunkBatch.java b/src/main/java/net/minestom/server/instance/batch/ChunkBatch.java index aed940473..f2afafe8a 100644 --- a/src/main/java/net/minestom/server/instance/batch/ChunkBatch.java +++ b/src/main/java/net/minestom/server/instance/batch/ChunkBatch.java @@ -127,17 +127,18 @@ public class ChunkBatch implements InstanceBatch { chunkPopulator.populateChunk(this, chunk); } } + + // Refresh chunk for viewers + this.chunk.sendChunkUpdate(); + + this.instance.refreshLastBlockChangeTime(); + + // Safe callback + instance.scheduleNextTick(inst -> { + OptionalCallback.execute(callback, chunk); + }); + } - - // Refresh chunk for viewers - this.chunk.sendChunkUpdate(); - - this.instance.refreshLastBlockChangeTime(); - - // Safe callback - instance.scheduleNextTick(inst -> { - OptionalCallback.execute(callback, chunk); - }); }); } @@ -199,9 +200,9 @@ public class ChunkBatch implements InstanceBatch { // Refresh chunk for viewers chunk.sendChunkUpdate(); - if (callback != null) { - this.instance.refreshLastBlockChangeTime(); + this.instance.refreshLastBlockChangeTime(); + if (callback != null) { if (safeCallback) { this.instance.scheduleNextTick(inst -> callback.accept(chunk)); } else { diff --git a/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java b/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java index 3276afc34..b4f8efa2f 100644 --- a/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java +++ b/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java @@ -124,7 +124,7 @@ public class NettyPlayerConnection extends PlayerConnection { } else { // Try to retrieve the cached buffer TemporaryCache temporaryCache = cacheablePacket.getCache(); - ByteBuf buffer = temporaryCache.retrieve(identifier); + ByteBuf buffer = temporaryCache.retrieve(identifier, cacheablePacket.getLastUpdateTime()); if (buffer == null) { // Buffer not found, create and cache it final long time = System.currentTimeMillis(); diff --git a/src/main/java/net/minestom/server/utils/cache/TemporaryCache.java b/src/main/java/net/minestom/server/utils/cache/TemporaryCache.java index 960626a20..ddb93d360 100644 --- a/src/main/java/net/minestom/server/utils/cache/TemporaryCache.java +++ b/src/main/java/net/minestom/server/utils/cache/TemporaryCache.java @@ -60,8 +60,13 @@ public class TemporaryCache { * @return the retrieved object or null if not found */ @Nullable - public T retrieve(@NotNull UUID identifier) { - return cache.get(identifier); + public synchronized T retrieve(@NotNull UUID identifier, long lastUpdate) { + if (!cacheTime.containsKey(identifier)) { + return null; + } + + final long cachedTime = cacheTime.get(identifier); + return lastUpdate <= cachedTime ? cache.get(identifier) : null; } /**