From 92a8b01f5c18320b08cf611abbf145614dcd065c Mon Sep 17 00:00:00 2001 From: chris Date: Thu, 21 Aug 2025 01:27:26 +0300 Subject: [PATCH] Catch block caching exceptions (#5771) * Catch block caching exceptions, add ShowPlayerListLogs / ShowChunkHeightWarningLogs system properties to disable warnings * Update ChunkCache.java --- .../geyser/session/cache/ChunkCache.java | 34 ++++++++++++------- .../java/entity/JavaAddEntityTranslator.java | 6 +++- .../org/geysermc/geyser/util/ChunkUtils.java | 4 ++- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/ChunkCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/ChunkCache.java index ad5237c23..272c3f309 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/ChunkCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/ChunkCache.java @@ -28,6 +28,7 @@ package org.geysermc.geyser.session.cache; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import lombok.Setter; +import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.level.block.type.Block; import org.geysermc.geyser.level.chunk.GeyserChunk; import org.geysermc.geyser.session.GeyserSession; @@ -81,21 +82,28 @@ public class ChunkCache { return; } - DataPalette palette = chunk.sections()[(y - minY) >> 4]; - if (palette == null) { - if (block != Block.JAVA_AIR_ID) { - // A previously empty chunk, which is no longer empty as a block has been added to it - palette = DataPalette.createForChunk(); - // Fixes the chunk assuming that all blocks is the `block` variable we are updating. /shrug - palette.getPalette().stateToId(Block.JAVA_AIR_ID); - chunk.sections()[(y - minY) >> 4] = palette; - } else { - // Nothing to update - return; + boolean previouslyEmpty = false; + try { + DataPalette palette = chunk.sections()[(y - minY) >> 4]; + if (palette == null) { + previouslyEmpty = true; + if (block != Block.JAVA_AIR_ID) { + // A previously empty chunk, which is no longer empty as a block has been added to it + palette = DataPalette.createForChunk(); + // Fixes the chunk assuming that all blocks is the `block` variable we are updating. /shrug + palette.getPalette().stateToId(Block.JAVA_AIR_ID); + chunk.sections()[(y - minY) >> 4] = palette; + } else { + // Nothing to update + return; + } } - } - palette.set(x & 0xF, y & 0xF, z & 0xF, block); + palette.set(x & 0xF, y & 0xF, z & 0xF, block); + } catch (Throwable e) { + GeyserImpl.getInstance().getLogger().error("Failed to update block in chunk cache! ", e); + GeyserImpl.getInstance().getLogger().error("Info: newChunk=%s, block=%s, pos=%s,%s,%s", previouslyEmpty, block, x, y, z); + } } public int getBlockAt(int x, int y, int z) { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaAddEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaAddEntityTranslator.java index 793104c5d..3d00ad87a 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaAddEntityTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaAddEntityTranslator.java @@ -51,6 +51,8 @@ import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.entity.Clie @Translator(packet = ClientboundAddEntityPacket.class) public class JavaAddEntityTranslator extends PacketTranslator { + private static final boolean SHOW_PLAYER_LIST_LOGS = Boolean.parseBoolean(System.getProperty("Geyser.ShowPlayerListLogs", "true")); + @Override public void translate(GeyserSession session, ClientboundAddEntityPacket packet) { EntityDefinition definition = Registries.ENTITY_DEFINITIONS.get(packet.getType()); @@ -76,7 +78,9 @@ public class JavaAddEntityTranslator extends PacketTranslator bedrockDimension.maxY())) { + if (SHOW_CHUNK_HEIGHT_WARNING_LOGS && (minY < bedrockDimension.minY() || (bedrockDimension.doUpperHeightWarn() && maxY > bedrockDimension.maxY()))) { session.getGeyser().getLogger().warning(GeyserLocale.getLocaleStringLog("geyser.network.translator.chunk.out_of_bounds", String.valueOf(bedrockDimension.minY()), String.valueOf(bedrockDimension.maxY()),