From dc5edc0a2c9e33868aedd4fbf387c167fb22ac76 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Fri, 12 Nov 2021 09:42:35 -0500 Subject: [PATCH] Remove 1.17.10 support; extended world height is always enabled --- .../configuration/GeyserConfiguration.java | 2 - .../GeyserJacksonConfiguration.java | 3 - .../connector/network/BedrockProtocol.java | 8 +- .../network/UpstreamPacketHandler.java | 5 +- .../network/session/GeyserSession.java | 3 +- .../player/BedrockMovePlayerTranslator.java | 12 +- .../java/world/JavaChunkDataTranslator.java | 45 +- .../populator/BlockRegistryPopulator.java | 2 - .../populator/ItemRegistryPopulator.java | 18 +- .../geysermc/connector/utils/ChunkUtils.java | 68 +- .../bedrock/block_palette.1_17_10.nbt | Bin 41318 -> 0 bytes ...eative_items.1_17_10.caves_and_cliffs.json | 5207 ----------------- .../bedrock/creative_items.1_17_10.json | 5203 ---------------- ..._item_states.1_17_10.caves_and_cliffs.json | 4290 -------------- .../bedrock/runtime_item_states.1_17_10.json | 4290 -------------- connector/src/main/resources/config.yml | 4 - 16 files changed, 57 insertions(+), 19103 deletions(-) delete mode 100644 connector/src/main/resources/bedrock/block_palette.1_17_10.nbt delete mode 100644 connector/src/main/resources/bedrock/creative_items.1_17_10.caves_and_cliffs.json delete mode 100644 connector/src/main/resources/bedrock/creative_items.1_17_10.json delete mode 100644 connector/src/main/resources/bedrock/runtime_item_states.1_17_10.caves_and_cliffs.json delete mode 100644 connector/src/main/resources/bedrock/runtime_item_states.1_17_10.json diff --git a/connector/src/main/java/org/geysermc/connector/configuration/GeyserConfiguration.java b/connector/src/main/java/org/geysermc/connector/configuration/GeyserConfiguration.java index bf5b137b3..a3fe89c1b 100644 --- a/connector/src/main/java/org/geysermc/connector/configuration/GeyserConfiguration.java +++ b/connector/src/main/java/org/geysermc/connector/configuration/GeyserConfiguration.java @@ -46,8 +46,6 @@ public interface GeyserConfiguration { Map getUserAuths(); - boolean isExtendedWorldHeight(); - boolean isCommandSuggestions(); @JsonIgnore diff --git a/connector/src/main/java/org/geysermc/connector/configuration/GeyserJacksonConfiguration.java b/connector/src/main/java/org/geysermc/connector/configuration/GeyserJacksonConfiguration.java index 759652293..da2840f76 100644 --- a/connector/src/main/java/org/geysermc/connector/configuration/GeyserJacksonConfiguration.java +++ b/connector/src/main/java/org/geysermc/connector/configuration/GeyserJacksonConfiguration.java @@ -62,9 +62,6 @@ public abstract class GeyserJacksonConfiguration implements GeyserConfiguration private BedrockConfiguration bedrock = new BedrockConfiguration(); private RemoteConfiguration remote = new RemoteConfiguration(); - @JsonProperty("extended-world-height") - private boolean extendedWorldHeight = false; - @JsonProperty("floodgate-key-file") private String floodgateKeyFile = "key.pem"; diff --git a/connector/src/main/java/org/geysermc/connector/network/BedrockProtocol.java b/connector/src/main/java/org/geysermc/connector/network/BedrockProtocol.java index d19fe18ca..fa95c8f37 100644 --- a/connector/src/main/java/org/geysermc/connector/network/BedrockProtocol.java +++ b/connector/src/main/java/org/geysermc/connector/network/BedrockProtocol.java @@ -26,7 +26,6 @@ package org.geysermc.connector.network; import com.nukkitx.protocol.bedrock.BedrockPacketCodec; -import com.nukkitx.protocol.bedrock.v448.Bedrock_v448; import com.nukkitx.protocol.bedrock.v465.Bedrock_v465; import com.nukkitx.protocol.bedrock.v471.Bedrock_v471; @@ -42,18 +41,15 @@ public class BedrockProtocol { * Default Bedrock codec that should act as a fallback. Should represent the latest available * release of the game that Geyser supports. */ - public static final BedrockPacketCodec DEFAULT_BEDROCK_CODEC = Bedrock_v448.V448_CODEC; + public static final BedrockPacketCodec DEFAULT_BEDROCK_CODEC = Bedrock_v471.V471_CODEC; /** * A list of all supported Bedrock versions that can join Geyser */ public static final List SUPPORTED_BEDROCK_CODECS = new ArrayList<>(); static { - SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC.toBuilder() - .minecraftVersion("1.17.10/1.17.11") - .build()); SUPPORTED_BEDROCK_CODECS.add(Bedrock_v465.V465_CODEC); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v471.V471_CODEC); + SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC); } /** diff --git a/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java b/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java index d8c2adef9..42e24458f 100644 --- a/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java +++ b/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java @@ -30,6 +30,7 @@ import com.nukkitx.protocol.bedrock.BedrockPacketCodec; import com.nukkitx.protocol.bedrock.data.ExperimentData; import com.nukkitx.protocol.bedrock.data.ResourcePackType; import com.nukkitx.protocol.bedrock.packet.*; +import com.nukkitx.protocol.bedrock.v471.Bedrock_v471; import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.common.AuthType; import org.geysermc.connector.configuration.GeyserConfiguration; @@ -151,8 +152,8 @@ public class UpstreamPacketHandler extends LoggingPacketHandler { stackPacket.getExperiments().add(new ExperimentData("data_driven_items", true)); } - if (session.getConnector().getConfig().isExtendedWorldHeight()) { - // Allow extended world height in the overworld to work + if (session.getUpstream().getProtocolVersion() <= Bedrock_v471.V471_CODEC.getProtocolVersion()) { + // Allow extended world height in the overworld to work for pre-1.18 clients stackPacket.getExperiments().add(new ExperimentData("caves_and_cliffs", true)); } diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java index d9e95e9a9..2efb74a32 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java @@ -59,6 +59,7 @@ import com.nukkitx.protocol.bedrock.data.command.CommandPermission; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import com.nukkitx.protocol.bedrock.packet.*; +import com.nukkitx.protocol.bedrock.v471.Bedrock_v471; import io.netty.channel.Channel; import io.netty.channel.EventLoop; import it.unimi.dsi.fastutil.ints.*; @@ -1200,7 +1201,7 @@ public class GeyserSession implements CommandSender { settings.setServerAuthoritativeBlockBreaking(false); startGamePacket.setPlayerMovementSettings(settings); - if (connector.getConfig().isExtendedWorldHeight()) { + if (upstream.getProtocolVersion() <= Bedrock_v471.V471_CODEC.getProtocolVersion()) { startGamePacket.getExperiments().add(new ExperimentData("caves_and_cliffs", true)); } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/entity/player/BedrockMovePlayerTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/entity/player/BedrockMovePlayerTranslator.java index f70233c04..fb7979afd 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/entity/player/BedrockMovePlayerTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/entity/player/BedrockMovePlayerTranslator.java @@ -33,7 +33,6 @@ import com.nukkitx.math.vector.Vector3d; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.packet.MoveEntityAbsolutePacket; import com.nukkitx.protocol.bedrock.packet.MovePlayerPacket; -import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.common.ChatColor; import org.geysermc.connector.entity.player.SessionPlayerEntity; import org.geysermc.connector.entity.type.EntityType; @@ -43,14 +42,9 @@ import org.geysermc.connector.network.translators.Translator; @Translator(packet = MovePlayerPacket.class) public class BedrockMovePlayerTranslator extends PacketTranslator { - /* The upper and lower bounds to check for the void floor that only exists in Bedrock */ - private static final int BEDROCK_OVERWORLD_VOID_FLOOR_UPPER_Y; - private static final int BEDROCK_OVERWORLD_VOID_FLOOR_LOWER_Y; - - static { - BEDROCK_OVERWORLD_VOID_FLOOR_UPPER_Y = GeyserConnector.getInstance().getConfig().isExtendedWorldHeight() ? -104 : -40; - BEDROCK_OVERWORLD_VOID_FLOOR_LOWER_Y = BEDROCK_OVERWORLD_VOID_FLOOR_UPPER_Y + 2; - } + /* The upper and lower bounds to check for the void floor that only exists in Bedrock. These are the constants for the overworld. */ + private static final int BEDROCK_OVERWORLD_VOID_FLOOR_UPPER_Y = -104; + private static final int BEDROCK_OVERWORLD_VOID_FLOOR_LOWER_Y = BEDROCK_OVERWORLD_VOID_FLOOR_UPPER_Y + 2; @Override public void translate(GeyserSession session, MovePlayerPacket packet) { diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaChunkDataTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaChunkDataTranslator.java index 6e579b5f4..baa2d6781 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaChunkDataTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaChunkDataTranslator.java @@ -39,8 +39,8 @@ import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslator; import org.geysermc.connector.network.translators.Translator; -import org.geysermc.connector.network.translators.world.chunk.ChunkSection; import org.geysermc.connector.network.translators.world.BiomeTranslator; +import org.geysermc.connector.network.translators.world.chunk.ChunkSection; import org.geysermc.connector.utils.ChunkUtils; import static org.geysermc.connector.utils.ChunkUtils.MINIMUM_ACCEPTED_HEIGHT; @@ -48,8 +48,6 @@ import static org.geysermc.connector.utils.ChunkUtils.MINIMUM_ACCEPTED_HEIGHT_OV @Translator(packet = ServerChunkDataPacket.class) public class JavaChunkDataTranslator extends PacketTranslator { - // Caves and cliffs supports 3D biomes by implementing a very similar palette system to blocks - private static final boolean NEW_BIOME_WRITE = GeyserConnector.getInstance().getConfig().isExtendedWorldHeight(); @Override public void translate(GeyserSession session, ServerChunkDataPacket packet) { @@ -84,11 +82,7 @@ public class JavaChunkDataTranslator extends PacketTranslator> 4; - for (int i = 0; i < sectionCount; i++) { - int biomeYOffset = dimensionOffset + i; - if (biomeYOffset < yOffset) { - // Ignore this biome section since it goes below the height of the Java world - byteBuf.writeBytes(ChunkUtils.EMPTY_BIOME_DATA); - continue; - } - BiomeTranslator.toNewBedrockBiome(session, column.getBiomeData(), i + (dimensionOffset - yOffset)).writeToNetwork(byteBuf); - } - - // As of 1.17.10, Bedrock hardcodes to always read 32 biome sections - int remainingEmptyBiomes = 32 - sectionCount; - for (int i = 0; i < remainingEmptyBiomes; i++) { + // At this point we're dealing with Bedrock chunk sections + boolean overworld = session.getChunkCache().isExtendedHeight(); + int dimensionOffset = (overworld ? MINIMUM_ACCEPTED_HEIGHT_OVERWORLD : MINIMUM_ACCEPTED_HEIGHT) >> 4; + for (int i = 0; i < sectionCount; i++) { + int biomeYOffset = dimensionOffset + i; + if (biomeYOffset < yOffset) { + // Ignore this biome section since it goes below the height of the Java world byteBuf.writeBytes(ChunkUtils.EMPTY_BIOME_DATA); + continue; } - } else { - byteBuf.writeBytes(BiomeTranslator.toBedrockBiome(session, column.getBiomeData())); // Biomes - 256 bytes + BiomeTranslator.toNewBedrockBiome(session, column.getBiomeData(), i + (dimensionOffset - yOffset)).writeToNetwork(byteBuf); } + + // As of 1.17.10, Bedrock hardcodes to always read 32 biome sections + int remainingEmptyBiomes = 32 - sectionCount; + for (int i = 0; i < remainingEmptyBiomes; i++) { + byteBuf.writeBytes(ChunkUtils.EMPTY_BIOME_DATA); + } + byteBuf.writeByte(0); // Border blocks - Edu edition only VarInts.writeUnsignedInt(byteBuf, 0); // extra data length, 0 for now diff --git a/connector/src/main/java/org/geysermc/connector/registry/populator/BlockRegistryPopulator.java b/connector/src/main/java/org/geysermc/connector/registry/populator/BlockRegistryPopulator.java index 253b30ba9..30cd7c1cc 100644 --- a/connector/src/main/java/org/geysermc/connector/registry/populator/BlockRegistryPopulator.java +++ b/connector/src/main/java/org/geysermc/connector/registry/populator/BlockRegistryPopulator.java @@ -28,7 +28,6 @@ package org.geysermc.connector.registry.populator; import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.ImmutableMap; import com.nukkitx.nbt.*; -import com.nukkitx.protocol.bedrock.v448.Bedrock_v448; import com.nukkitx.protocol.bedrock.v465.Bedrock_v465; import com.nukkitx.protocol.bedrock.v471.Bedrock_v471; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; @@ -66,7 +65,6 @@ public class BlockRegistryPopulator { static { ImmutableMap.Builder, BiFunction> stateMapperBuilder = ImmutableMap., BiFunction>builder() - .put(ObjectIntPair.of("1_17_10", Bedrock_v448.V448_CODEC.getProtocolVersion()), EMPTY_MAPPER) .put(ObjectIntPair.of("1_17_30", Bedrock_v465.V465_CODEC.getProtocolVersion()), EMPTY_MAPPER) .put(ObjectIntPair.of("1_17_40", Bedrock_v471.V471_CODEC.getProtocolVersion()), EMPTY_MAPPER); diff --git a/connector/src/main/java/org/geysermc/connector/registry/populator/ItemRegistryPopulator.java b/connector/src/main/java/org/geysermc/connector/registry/populator/ItemRegistryPopulator.java index 0251103d0..b413b3a80 100644 --- a/connector/src/main/java/org/geysermc/connector/registry/populator/ItemRegistryPopulator.java +++ b/connector/src/main/java/org/geysermc/connector/registry/populator/ItemRegistryPopulator.java @@ -35,7 +35,6 @@ import com.nukkitx.protocol.bedrock.data.SoundEvent; import com.nukkitx.protocol.bedrock.data.inventory.ComponentItemData; import com.nukkitx.protocol.bedrock.data.inventory.ItemData; import com.nukkitx.protocol.bedrock.packet.StartGamePacket; -import com.nukkitx.protocol.bedrock.v448.Bedrock_v448; import com.nukkitx.protocol.bedrock.v465.Bedrock_v465; import com.nukkitx.protocol.bedrock.v471.Bedrock_v471; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; @@ -63,12 +62,6 @@ public class ItemRegistryPopulator { static { PALETTE_VERSIONS = new Object2ObjectOpenHashMap<>(); - if (GeyserConnector.getInstance().getConfig().isExtendedWorldHeight()) { - PALETTE_VERSIONS.put("1_17_10.caves_and_cliffs", new PaletteVersion(Bedrock_v448.V448_CODEC.getProtocolVersion(), Collections.emptyMap())); - } else { - PALETTE_VERSIONS.put("1_17_10", new PaletteVersion(Bedrock_v448.V448_CODEC.getProtocolVersion(), Collections.emptyMap())); - } - PALETTE_VERSIONS.put("1_17_30", new PaletteVersion(Bedrock_v465.V465_CODEC.getProtocolVersion(), Collections.emptyMap())); PALETTE_VERSIONS.put("1_17_40", new PaletteVersion(Bedrock_v471.V471_CODEC.getProtocolVersion(), Collections.emptyMap())); } @@ -169,10 +162,7 @@ public class ItemRegistryPopulator { } String identifier = itemNode.get("id").textValue(); - if (identifier.equals("minecraft:sculk_sensor") && !GeyserConnector.getInstance().getConfig().isExtendedWorldHeight()) { - // https://github.com/GeyserMC/Geyser/issues/2564 - continue; - } else if (identifier.equals("minecraft:debug_stick")) { + if (identifier.equals("minecraft:debug_stick")) { // Just shows an empty texture; either way it doesn't exist in the creative menu on Java continue; } @@ -223,9 +213,6 @@ public class ItemRegistryPopulator { if (!usingFurnaceMinecart) { javaOnlyItems.add("minecraft:furnace_minecart"); } - if (!GeyserConnector.getInstance().getConfig().isExtendedWorldHeight()) { - javaOnlyItems.add("minecraft:sculk_sensor"); - } // Java-only items for this version javaOnlyItems.addAll(palette.getValue().additionalTranslatedItems().keySet()); @@ -239,7 +226,8 @@ public class ItemRegistryPopulator { // This items has a mapping specifically for this version of the game mappingItem = entry.getValue(); } - if (javaIdentifier.equals("minecraft:sculk_sensor") && GeyserConnector.getInstance().getConfig().isExtendedWorldHeight()) { + if (javaIdentifier.equals("minecraft:sculk_sensor")) { + // TODO fix in mappings mappingItem.setBedrockIdentifier("minecraft:sculk_sensor"); } diff --git a/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java b/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java index bed0e9c80..a8fc5f7f8 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/ChunkUtils.java @@ -69,49 +69,40 @@ public class ChunkUtils { * The minimum height Bedrock Edition will accept. */ public static final int MINIMUM_ACCEPTED_HEIGHT = 0; - private static final int CAVES_AND_CLIFFS_MINIMUM_HEIGHT = -64; - public static final int MINIMUM_ACCEPTED_HEIGHT_OVERWORLD = GeyserConnector.getInstance().getConfig().isExtendedWorldHeight() ? - CAVES_AND_CLIFFS_MINIMUM_HEIGHT : MINIMUM_ACCEPTED_HEIGHT; + public static final int MINIMUM_ACCEPTED_HEIGHT_OVERWORLD = -64; /** * The maximum chunk height Bedrock Edition will accept, from the lowest point to the highest. */ private static final int MAXIMUM_ACCEPTED_HEIGHT = 256; - private static final int CAVES_AND_CLIFFS_MAXIMUM_HEIGHT = 384; - private static final int MAXIMUM_ACCEPTED_HEIGHT_OVERWORLD = GeyserConnector.getInstance().getConfig().isExtendedWorldHeight() ? - CAVES_AND_CLIFFS_MAXIMUM_HEIGHT : MAXIMUM_ACCEPTED_HEIGHT; + private static final int MAXIMUM_ACCEPTED_HEIGHT_OVERWORLD = 384; public static final byte[] EMPTY_CHUNK_DATA; public static final byte[] EMPTY_BIOME_DATA; static { - if (GeyserConnector.getInstance().getConfig().isExtendedWorldHeight()) { - ByteBuf byteBuf = Unpooled.buffer(); - try { - BlockStorage blockStorage = new BlockStorage(0); - blockStorage.writeToNetwork(byteBuf); + ByteBuf byteBuf = Unpooled.buffer(); + try { + BlockStorage blockStorage = new BlockStorage(0); + blockStorage.writeToNetwork(byteBuf); - EMPTY_BIOME_DATA = new byte[byteBuf.readableBytes()]; - byteBuf.readBytes(EMPTY_BIOME_DATA); - } finally { - byteBuf.release(); + EMPTY_BIOME_DATA = new byte[byteBuf.readableBytes()]; + byteBuf.readBytes(EMPTY_BIOME_DATA); + } finally { + byteBuf.release(); + } + + byteBuf = Unpooled.buffer(); + try { + for (int i = 0; i < 32; i++) { + byteBuf.writeBytes(EMPTY_BIOME_DATA); } - byteBuf = Unpooled.buffer(); - try { - for (int i = 0; i < 32; i++) { - byteBuf.writeBytes(EMPTY_BIOME_DATA); - } + byteBuf.writeByte(0); // Border - byteBuf.writeByte(0); // Border - - EMPTY_CHUNK_DATA = new byte[byteBuf.readableBytes()]; - byteBuf.readBytes(EMPTY_CHUNK_DATA); - } finally { - byteBuf.release(); - } - } else { - EMPTY_BIOME_DATA = null; // Unused - EMPTY_CHUNK_DATA = new byte[257]; // 256 bytes for biomes, one for borders + EMPTY_CHUNK_DATA = new byte[byteBuf.readableBytes()]; + byteBuf.readBytes(EMPTY_CHUNK_DATA); + } finally { + byteBuf.release(); } } @@ -441,24 +432,17 @@ public class ChunkUtils { } int dimension = DimensionUtils.javaToBedrock(session.getDimension()); - boolean extendedHeight = dimension == 0 && session.getConnector().getConfig().isExtendedWorldHeight(); + boolean extendedHeight = dimension == 0; session.getChunkCache().setExtendedHeight(extendedHeight); // Yell in the console if the world height is too height in the current scenario // The constraints change depending on if the player is in the overworld or not, and if experimental height is enabled if (minY < (extendedHeight ? MINIMUM_ACCEPTED_HEIGHT_OVERWORLD : MINIMUM_ACCEPTED_HEIGHT) || maxY > (extendedHeight ? MAXIMUM_ACCEPTED_HEIGHT_OVERWORLD : MAXIMUM_ACCEPTED_HEIGHT)) { - if (minY >= CAVES_AND_CLIFFS_MINIMUM_HEIGHT && maxY <= CAVES_AND_CLIFFS_MAXIMUM_HEIGHT && dimension == 0 && !session.getConnector().getConfig().isExtendedWorldHeight()) { - // This dimension uses heights that would be fixed by enabling the experimental toggle - session.getConnector().getLogger().warning( - LanguageUtils.getLocaleStringLog("geyser.network.translator.chunk.out_of_bounds.caves_and_cliffs", - "extended-world-height")); - } else { - session.getConnector().getLogger().warning(LanguageUtils.getLocaleStringLog("geyser.network.translator.chunk.out_of_bounds", - extendedHeight ? MINIMUM_ACCEPTED_HEIGHT_OVERWORLD : MINIMUM_ACCEPTED_HEIGHT, - extendedHeight ? MAXIMUM_ACCEPTED_HEIGHT_OVERWORLD : MAXIMUM_ACCEPTED_HEIGHT, - session.getDimension())); - } + session.getConnector().getLogger().warning(LanguageUtils.getLocaleStringLog("geyser.network.translator.chunk.out_of_bounds", + extendedHeight ? MINIMUM_ACCEPTED_HEIGHT_OVERWORLD : MINIMUM_ACCEPTED_HEIGHT, + extendedHeight ? MAXIMUM_ACCEPTED_HEIGHT_OVERWORLD : MAXIMUM_ACCEPTED_HEIGHT, + session.getDimension())); } session.getChunkCache().setMinY(minY); diff --git a/connector/src/main/resources/bedrock/block_palette.1_17_10.nbt b/connector/src/main/resources/bedrock/block_palette.1_17_10.nbt deleted file mode 100644 index a32c0736ea54406f5d8eb9a12729aa58feb5d9ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41318 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