diff --git a/api/src/main/java/com/viaversion/viaversion/api/configuration/ViaVersionConfig.java b/api/src/main/java/com/viaversion/viaversion/api/configuration/ViaVersionConfig.java index ba8532fa8..5d8bbacaa 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/configuration/ViaVersionConfig.java +++ b/api/src/main/java/com/viaversion/viaversion/api/configuration/ViaVersionConfig.java @@ -453,4 +453,6 @@ public interface ViaVersionConfig { * @return the global map from vanilla dimensions to world name */ WorldIdentifiers get1_16WorldNamesMap(); + + boolean cache1_17Light(); } diff --git a/common/src/main/java/com/viaversion/viaversion/configuration/AbstractViaConfig.java b/common/src/main/java/com/viaversion/viaversion/configuration/AbstractViaConfig.java index e809b0577..002bfacf7 100644 --- a/common/src/main/java/com/viaversion/viaversion/configuration/AbstractViaConfig.java +++ b/common/src/main/java/com/viaversion/viaversion/configuration/AbstractViaConfig.java @@ -88,6 +88,7 @@ public abstract class AbstractViaConfig extends Config implements ViaVersionConf private boolean forcedUse1_17ResourcePack; private JsonElement resourcePack1_17PromptMessage; private WorldIdentifiers map1_16WorldNames; + private boolean cache1_17Light; protected AbstractViaConfig(File configFile) { super(configFile); @@ -155,6 +156,7 @@ public abstract class AbstractViaConfig extends Config implements ViaVersionConf map1_16WorldNames = new WorldIdentifiers(worlds.getOrDefault("overworld", WorldIdentifiers.OVERWORLD_DEFAULT), worlds.getOrDefault("nether", WorldIdentifiers.NETHER_DEFAULT), worlds.getOrDefault("end", WorldIdentifiers.END_DEFAULT)); + cache1_17Light = getBoolean("cache-1_17-light", true); } private BlockedProtocolVersions loadBlockedProtocolVersions() { @@ -516,4 +518,9 @@ public abstract class AbstractViaConfig extends Config implements ViaVersionConf public WorldIdentifiers get1_16WorldNamesMap() { return map1_16WorldNames; } + + @Override + public boolean cache1_17Light() { + return cache1_17Light; + } } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_18to1_17_1/packets/WorldPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_18to1_17_1/packets/WorldPackets.java index 8d2c01432..870b72817 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_18to1_17_1/packets/WorldPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_18to1_17_1/packets/WorldPackets.java @@ -67,7 +67,7 @@ public final class WorldPackets { handler(wrapper -> { final int chunkX = wrapper.passthrough(Type.VAR_INT); final int chunkZ = wrapper.passthrough(Type.VAR_INT); - if (wrapper.user().get(ChunkLightStorage.class).isLoaded(chunkX, chunkZ)) { + if (!Via.getConfig().cache1_17Light() && wrapper.user().get(ChunkLightStorage.class).isLoaded(chunkX, chunkZ)) { // Light packets updating already sent chunks are the same as before return; } @@ -162,9 +162,9 @@ public final class WorldPackets { final ChunkLightStorage lightStorage = wrapper.user().get(ChunkLightStorage.class); final boolean alreadyLoaded = !lightStorage.addLoadedChunk(chunk.getX(), chunk.getZ()); - // Get and remove light stored, there's only full chunk packets //TODO Only get, not remove if we find out people re-send full chunk packets without re-sending light // Append light data to chunk packet - final ChunkLightStorage.ChunkLight light = lightStorage.removeLight(chunk.getX(), chunk.getZ()); + final ChunkLightStorage.ChunkLight light = Via.getConfig().cache1_17Light() ? + lightStorage.getLight(chunk.getX(), chunk.getZ()) : lightStorage.removeLight(chunk.getX(), chunk.getZ()); if (light == null) { Via.getPlatform().getLogger().warning("No light data found for chunk at " + chunk.getX() + ", " + chunk.getZ() + ". Chunk was already loaded: " + alreadyLoaded); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_18to1_17_1/storage/ChunkLightStorage.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_18to1_17_1/storage/ChunkLightStorage.java index cf3d2df02..6b508a6eb 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_18to1_17_1/storage/ChunkLightStorage.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_18to1_17_1/storage/ChunkLightStorage.java @@ -38,6 +38,10 @@ public final class ChunkLightStorage implements StorableObject { return lightPackets.remove(getChunkSectionIndex(x, z)); } + public @Nullable ChunkLight getLight(final int x, final int z) { + return lightPackets.get(getChunkSectionIndex(x, z)); + } + public boolean addLoadedChunk(final int x, final int z) { return loadedChunks.add(getChunkSectionIndex(x, z)); } diff --git a/common/src/main/resources/assets/viaversion/config.yml b/common/src/main/resources/assets/viaversion/config.yml index 288ddbfd7..c204acfb6 100644 --- a/common/src/main/resources/assets/viaversion/config.yml +++ b/common/src/main/resources/assets/viaversion/config.yml @@ -160,6 +160,10 @@ forced-use-1_17-resource-pack: false # The message to be displayed at the prompt when the 1.17+ client receives the server resource pack. resource-pack-1_17-prompt: '' # +# Caches light until chunks are unloaded to allow subsequent chunk update packets as opposed to instantly uncaching when the first chunk data is sent. +# Only disable this if you know what you are doing. +cache-1_17-light: true +# #----------------------------------------------------------# # 1.9+ CLIENTS ON 1.8 SERVERS OPTIONS # #----------------------------------------------------------#