diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/ItemFrameEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/ItemFrameEntity.java index 83865309737..ec5c08e7869 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/ItemFrameEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/ItemFrameEntity.java @@ -34,6 +34,7 @@ import org.cloudburstmc.protocol.bedrock.packet.BlockEntityDataPacket; import org.cloudburstmc.protocol.bedrock.packet.UpdateBlockPacket; import org.geysermc.geyser.entity.spawn.EntitySpawnContext; +import org.geysermc.geyser.registry.type.GeyserBedrockBlock; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.item.ItemTranslator; import org.geysermc.geyser.util.InteractionResult; @@ -226,7 +227,7 @@ private BlockDefinition buildBlockDefinition(Direction direction) { .putByte("item_frame_photo_bit", (byte) 0); blockBuilder.put("states", statesBuilder.build()); - return session.getBlockMappings().getItemFrame(blockBuilder.build()); + return new GeyserBedrockBlock(blockBuilder.build()); } /** diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/BasePiglinEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/BasePiglinEntity.java index b68a7a2fa3f..70ccd62305a 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/BasePiglinEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/BasePiglinEntity.java @@ -36,8 +36,8 @@ public class BasePiglinEntity extends MonsterEntity { public BasePiglinEntity(EntitySpawnContext context) { super(context); - // Both TARGET_EID and BLOCK are needed for melee attack animation - dirtyMetadata.put(EntityDataTypes.BLOCK, session.getBlockMappings().getDefinition(1)); + // Both TARGET_EID and VARIANT are needed for melee attack animation + dirtyMetadata.put(EntityDataTypes.VARIANT, 1); setFlag(EntityFlag.SHAKING, isShaking()); } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/PiglinEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/PiglinEntity.java index 79c9fecf0d2..17528daa7c0 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/PiglinEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/PiglinEntity.java @@ -70,7 +70,7 @@ public void setHand(GeyserItemStack stack) { boolean toCrossbow = stack != null && stack.is(Items.CROSSBOW); if (toCrossbow ^ getMainHandItem().is(Items.CROSSBOW)) { // If switching to/from crossbow - dirtyMetadata.put(EntityDataTypes.BLOCK, session.getBlockMappings().getDefinition(toCrossbow ? 0 : 1)); + dirtyMetadata.put(EntityDataTypes.VARIANT, toCrossbow ? 0 : 1); dirtyMetadata.put(EntityDataTypes.CHARGE_AMOUNT, (byte) 0); setFlag(EntityFlag.CHARGED, false); setFlag(EntityFlag.USING_ITEM, false); diff --git a/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java b/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java index d7f61f08e06..9c8e0b529c8 100644 --- a/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java +++ b/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java @@ -205,7 +205,7 @@ public PacketSignal handle(LoginPacket loginPacket) { } // Set the block translation based off of version - session.setBlockMappings(BlockRegistries.BLOCKS.forVersion(loginPacket.getProtocolVersion())); + session.setBlockMappings(BlockRegistries.BLOCKS.get()); session.setItemMappings(Registries.ITEMS.forVersion(loginPacket.getProtocolVersion())); LoginEncryptionUtils.encryptPlayerConnection(session, loginPacket); diff --git a/core/src/main/java/org/geysermc/geyser/registry/BlockRegistries.java b/core/src/main/java/org/geysermc/geyser/registry/BlockRegistries.java index 3ae39f76d85..19c77a4c140 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/BlockRegistries.java +++ b/core/src/main/java/org/geysermc/geyser/registry/BlockRegistries.java @@ -56,10 +56,9 @@ */ public class BlockRegistries { /** - * A versioned registry which holds {@link BlockMappings} for each version. These block mappings contain - * primarily Bedrock version-specific data. + * A registry which holds {@link BlockMappings}. */ - public static final VersionedRegistry BLOCKS = VersionedRegistry.create(RegistryLoaders.empty(Int2ObjectOpenHashMap::new)); + public static final SimpleRegistry BLOCKS = SimpleRegistry.create(RegistryLoaders.uninitialized()); /** * A registry which stores Java IDs to Java {@link BlockState}s, each with their specific state differences and a link diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java index 91ac7ae1d19..9fa071b029b 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java @@ -25,27 +25,24 @@ package org.geysermc.geyser.registry.populator; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Interner; import com.google.common.collect.Interners; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.objects.Object2ObjectMap; import it.unimi.dsi.fastutil.objects.Object2ObjectMaps; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectIntPair; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import org.cloudburstmc.nbt.NBTInputStream; import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtMapBuilder; import org.cloudburstmc.nbt.NbtType; import org.cloudburstmc.nbt.NbtUtils; -import org.cloudburstmc.protocol.bedrock.codec.v898.Bedrock_v898; -import org.cloudburstmc.protocol.bedrock.codec.v924.Bedrock_v924; -import org.cloudburstmc.protocol.bedrock.codec.v944.Bedrock_v944; import org.cloudburstmc.protocol.bedrock.data.BlockPropertyData; import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition; import org.geysermc.geyser.GeyserImpl; @@ -64,7 +61,6 @@ import java.io.DataInputStream; import java.io.InputStream; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.BitSet; @@ -117,24 +113,14 @@ private static void nullifyBlocksNbt() { } private static void registerBedrockBlocks() { - var blockMappers = ImmutableMap., Remapper>builder() - // This is technically the same 1.21.111 palette; there have been no changes - .put(ObjectIntPair.of("1_21_130", Bedrock_v898.CODEC.getProtocolVersion()), tag -> tag) - // 26.0 also doesn't have any changes, so we re-use the same file - .put(ObjectIntPair.of("1_21_130", Bedrock_v924.CODEC.getProtocolVersion()), tag -> tag) - .put(ObjectIntPair.of("1_26_10", Bedrock_v944.CODEC.getProtocolVersion()), tag -> tag) - .build(); - // We can keep this strong as nothing should be garbage collected // Safe to intern since Cloudburst NBT is immutable //noinspection UnstableApiUsage Interner statesInterner = Interners.newStrongInterner(); - for (ObjectIntPair palette : blockMappers.keySet()) { - int protocolVersion = palette.valueInt(); List vanillaBlockStates; List blockStates; - try (InputStream stream = GeyserImpl.getInstance().getBootstrap().getResourceOrThrow(String.format("bedrock/block_palette.%s.nbt", palette.key())); + try (InputStream stream = GeyserImpl.getInstance().getBootstrap().getResourceOrThrow("bedrock/block_palette.nbt"); NBTInputStream nbtInputStream = new NBTInputStream(new DataInputStream(new GZIPInputStream(stream)), true, true)) { NbtMap blockPalette = (NbtMap) nbtInputStream.readTag(); @@ -166,23 +152,15 @@ private static void registerBedrockBlocks() { CustomBlockRegistryPopulator.generateCustomBlockStates(customBlock, customBlockStates, customExtBlockStates); } blockStates.addAll(customBlockStates); - GeyserImpl.getInstance().getLogger().debug("Added " + customBlockStates.size() + " custom block states to v" + protocolVersion + " palette."); - - // The palette is sorted by the FNV1 64-bit hash of the name - blockStates.sort((a, b) -> Long.compareUnsigned(fnv164(a.getString("name")), fnv164(b.getString("name")))); + GeyserImpl.getInstance().getLogger().debug("Added " + customBlockStates.size() + " custom block states."); } // New since 1.16.100 - find the block runtime ID by the order given to us in the block palette, // as we no longer send a block palette - Object2ObjectMap blockStateOrderedMap = new Object2ObjectOpenHashMap<>(blockStates.size()); - GeyserBedrockBlock[] bedrockRuntimeMap = new GeyserBedrockBlock[blockStates.size()]; - for (int i = 0; i < blockStates.size(); i++) { - NbtMap tag = blockStates.get(i); - GeyserBedrockBlock block = new GeyserBedrockBlock(i, tag); - if (blockStateOrderedMap.put(tag, block) != null) { - throw new AssertionError("Duplicate block states in Bedrock palette: " + tag); - } - bedrockRuntimeMap[i] = block; + Int2ObjectMap bedrockRuntimeMap = new Int2ObjectOpenHashMap<>(blockStates.size()); + for (NbtMap tag : blockStates) { + GeyserBedrockBlock block = new GeyserBedrockBlock(tag); + bedrockRuntimeMap.put(block.getRuntimeId(), block); } Object2ObjectMap customBlockStateDefinitions = Object2ObjectMaps.emptyMap(); @@ -191,14 +169,14 @@ private static void registerBedrockBlocks() { for (int i = 0; i < customExtBlockStates.size(); i++) { NbtMap tag = customBlockStates.get(i); CustomBlockState blockState = customExtBlockStates.get(i); - GeyserBedrockBlock bedrockBlock = blockStateOrderedMap.get(tag); + GeyserBedrockBlock bedrockBlock = new GeyserBedrockBlock(tag); customBlockStateDefinitions.put(blockState, bedrockBlock); } remappedVanillaIds = new int[vanillaBlockStates.size()]; for (int i = 0; i < vanillaBlockStates.size(); i++) { - GeyserBedrockBlock bedrockBlock = blockStateOrderedMap.get(vanillaBlockStates.get(i)); - remappedVanillaIds[i] = bedrockBlock != null ? bedrockBlock.getRuntimeId() : -1; + GeyserBedrockBlock bedrockBlock = new GeyserBedrockBlock(vanillaBlockStates.get(i)); + remappedVanillaIds[i] = bedrockBlock.getRuntimeId(); } } @@ -214,8 +192,6 @@ private static void registerBedrockBlocks() { BlockDefinition movingBlockDefinition = null; Iterator blocksIterator = BLOCKS_NBT.iterator(); - Remapper stateMapper = blockMappers.get(palette); - GeyserBedrockBlock[] javaToBedrockBlocks = new GeyserBedrockBlock[JAVA_BLOCKS_SIZE]; GeyserBedrockBlock[] javaToVanillaBedrockBlocks = new GeyserBedrockBlock[JAVA_BLOCKS_SIZE]; @@ -233,7 +209,7 @@ private static void registerBedrockBlocks() { }) .toList(); Map flowerPotBlocks = new Object2ObjectOpenHashMap<>(); - Map itemFrames = new Object2ObjectOpenHashMap<>(); + IntOpenHashSet itemFrames = new IntOpenHashSet(); IntArrayList collisionIgnoredBlocks = new IntArrayList(); Set jigsawDefinitions = new ObjectOpenHashSet<>(); @@ -246,28 +222,16 @@ private static void registerBedrockBlocks() { BlockState blockState = javaBlockStates.get(javaRuntimeId); String javaId = blockState.toString(); - NbtMap originalBedrockTag = buildBedrockState(blockState, entry); - NbtMap bedrockTag = stateMapper.remap(originalBedrockTag); + NbtMap bedrockTag = buildBedrockState(blockState, entry); - GeyserBedrockBlock vanillaBedrockDefinition = blockStateOrderedMap.get(bedrockTag); + GeyserBedrockBlock vanillaBedrockDefinition = new GeyserBedrockBlock(bedrockTag); GeyserBedrockBlock bedrockDefinition; CustomBlockState blockStateOverride = BlockRegistries.CUSTOM_BLOCK_STATE_OVERRIDES.get(javaRuntimeId); if (blockStateOverride == null) { bedrockDefinition = vanillaBedrockDefinition; - if (bedrockDefinition == null) { - throw new RuntimeException(""" - Unable to find %s Bedrock runtime ID for %s! Original block tag: - %s - Updated block tag: - %s""".formatted(javaId, palette.key(), originalBedrockTag, bedrockTag)); - } } else { bedrockDefinition = customBlockStateDefinitions.get(blockStateOverride); - if (bedrockDefinition == null) { - throw new RuntimeException("Unable to find " + javaId + " Bedrock runtime ID! Custom block override: \n" + - blockStateOverride); - } } switch (javaId) { @@ -385,18 +349,17 @@ private static void registerBedrockBlocks() { javaToBedrockIdentifiers.trim(); // Loop around again to find all item frame runtime IDs - Object2ObjectMaps.fastForEach(blockStateOrderedMap, entry -> { - String name = entry.getKey().getString("name"); + for (NbtMap entry : blockStates) { + String name = entry.getString("name"); if (name.equals("minecraft:frame") || name.equals("minecraft:glow_frame")) { - itemFrames.put(entry.getKey(), entry.getValue()); + itemFrames.add(new GeyserBedrockBlock(entry).getRuntimeId()); } - }); + } - BlockRegistries.BLOCKS.register(palette.valueInt(), builder.bedrockRuntimeMap(bedrockRuntimeMap) + BlockRegistries.BLOCKS.set(builder.bedrockRuntimeMap(bedrockRuntimeMap) .javaToBedrockBlocks(javaToBedrockBlocks) .javaToVanillaBedrockBlocks(javaToVanillaBedrockBlocks) .javaToBedrockIdentifiers(javaToBedrockIdentifiers) - .stateDefinitionMap(blockStateOrderedMap) .itemFrames(itemFrames) .flowerPotBlocks(flowerPotBlocks) .jigsawStates(jigsawDefinitions) @@ -405,7 +368,6 @@ private static void registerBedrockBlocks() { .blockProperties(customBlockProperties) .customBlockStateDefinitions(customBlockStateDefinitions) .build()); - } } private static void registerJavaBlocks() { @@ -454,22 +416,4 @@ private static NbtMap buildBedrockState(BlockState state, NbtMap nbt) { tagBuilder.put("states", nbt.getCompound("state")); return tagBuilder.build(); } - - private static final long FNV1_64_OFFSET_BASIS = 0xcbf29ce484222325L; - private static final long FNV1_64_PRIME = 1099511628211L; - - /** - * Hashes a string using the FNV-1a 64-bit algorithm. - * - * @param str The string to hash - * @return The hashed string - */ - private static long fnv164(String str) { - long hash = FNV1_64_OFFSET_BASIS; - for (byte b : str.getBytes(StandardCharsets.UTF_8)) { - hash *= FNV1_64_PRIME; - hash ^= b; - } - return hash; - } } diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/CreativeItemRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/CreativeItemRegistryPopulator.java index 4fadba373f9..0d04429bd79 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/CreativeItemRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/CreativeItemRegistryPopulator.java @@ -127,7 +127,7 @@ static void populate(ItemRegistryPopulator.PaletteVersion palette, Map lastCreativeGroupIds = new Object2IntOpenHashMap<>(); CreativeItemRegistryPopulator.readCreativeItemGroups(palette, creativeItems, creativeItemGroups, creativeGroupIds, lastCreativeGroupIds); - BlockMappings blockMappings = BlockRegistries.BLOCKS.forVersion(palette.protocolVersion()); + BlockMappings blockMappings = BlockRegistries.BLOCKS.get(); Set javaOnlyItems = new ObjectOpenHashSet<>(); Collections.addAll(javaOnlyItems, Items.SPECTRAL_ARROW, Items.DEBUG_STICK, @@ -391,7 +391,7 @@ public static void populate() { if (bedrockBlock == null) { // We need to loop around again (we can't cache the block tags above) because Bedrock can include states that we don't have a pairing for // in it's "preferred" block state - I.E. the first matching block state in the list - for (GeyserBedrockBlock block : blockMappings.getBedrockRuntimeMap()) { + for (GeyserBedrockBlock block : blockMappings.getBedrockRuntimeMap().values()) { if (block == null) { continue; } diff --git a/core/src/main/java/org/geysermc/geyser/registry/type/BlockMappings.java b/core/src/main/java/org/geysermc/geyser/registry/type/BlockMappings.java index 22679ecfdc5..85f79b32e3c 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/type/BlockMappings.java +++ b/core/src/main/java/org/geysermc/geyser/registry/type/BlockMappings.java @@ -27,6 +27,7 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.objects.Object2ObjectMap; import lombok.Builder; import lombok.Value; @@ -59,8 +60,7 @@ public class BlockMappings implements DefinitionRegistry { */ Int2ObjectMap javaToBedrockIdentifiers; - Map stateDefinitionMap; - GeyserBedrockBlock[] bedrockRuntimeMap; + Int2ObjectMap bedrockRuntimeMap; int[] remappedVanillaIds; BlockDefinition commandBlock; @@ -69,7 +69,7 @@ public class BlockMappings implements DefinitionRegistry { IntArrayList collisionIgnoredBlocks; - Map itemFrames; + IntOpenHashSet itemFrames; Map flowerPotBlocks; Set jigsawStates; @@ -105,16 +105,8 @@ public GeyserBedrockBlock getVanillaBedrockBlock(int javaState) { return this.javaToVanillaBedrockBlocks[javaState]; } - public BlockDefinition getItemFrame(NbtMap tag) { - return this.itemFrames.get(tag); - } - public boolean isItemFrame(BlockDefinition definition) { - if (definition instanceof GeyserBedrockBlock def) { - return this.itemFrames.containsKey(def.getState()); - } - - return false; + return this.itemFrames.contains(definition.getRuntimeId()); } public BlockDefinition getStructureBlockFromMode(String mode) { @@ -123,10 +115,7 @@ public BlockDefinition getStructureBlockFromMode(String mode) { @Override public @Nullable GeyserBedrockBlock getDefinition(int bedrockId) { - if (bedrockId < 0 || bedrockId >= this.bedrockRuntimeMap.length) { - return null; - } - return bedrockRuntimeMap[bedrockId]; + return bedrockRuntimeMap.get(bedrockId); } public @Nullable GeyserBedrockBlock getDefinition(NbtMap tag) { @@ -134,7 +123,7 @@ public BlockDefinition getStructureBlockFromMode(String mode) { return null; } - return this.stateDefinitionMap.get(tag); + return new GeyserBedrockBlock(tag); } @Override diff --git a/core/src/main/java/org/geysermc/geyser/registry/type/GeyserBedrockBlock.java b/core/src/main/java/org/geysermc/geyser/registry/type/GeyserBedrockBlock.java index 190354359df..512b4dc58c4 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/type/GeyserBedrockBlock.java +++ b/core/src/main/java/org/geysermc/geyser/registry/type/GeyserBedrockBlock.java @@ -25,16 +25,46 @@ package org.geysermc.geyser.registry.type; +import org.cloudburstmc.nbt.NBTOutputStream; import org.cloudburstmc.nbt.NbtMap; +import org.cloudburstmc.nbt.NbtUtils; import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.TreeMap; + public class GeyserBedrockBlock implements BlockDefinition { + private static final int FNV1_32_INIT = 0x811c9dc5; + private static final int FNV1_PRIME_32 = 0x01000193; + private final int runtimeId; private final NbtMap state; - public GeyserBedrockBlock(int runtimeId, NbtMap state) { - this.runtimeId = runtimeId; - this.state = state; + public GeyserBedrockBlock(NbtMap state) { + NbtMap tag = NbtMap.builder() + .putString("name", state.getString("name")) + .putCompound("states", NbtMap.fromMap( + new TreeMap<>(state.getCompound("states")))) + .build(); + + byte[] bytes; + try (ByteArrayOutputStream stream = new ByteArrayOutputStream(); + NBTOutputStream output = NbtUtils.createWriterLE(stream)) { + output.writeTag(tag); + bytes = stream.toByteArray(); + } catch (IOException e) { + throw new RuntimeException(e); + } + + int hash = FNV1_32_INIT; + for (byte b : bytes) { + hash ^= (b & 0xff); + hash *= FNV1_PRIME_32; + } + + this.runtimeId = hash; + this.state = tag; } @Override diff --git a/core/src/main/java/org/geysermc/geyser/registry/type/ItemMappings.java b/core/src/main/java/org/geysermc/geyser/registry/type/ItemMappings.java index 170815bf398..954d13a3421 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/type/ItemMappings.java +++ b/core/src/main/java/org/geysermc/geyser/registry/type/ItemMappings.java @@ -168,7 +168,7 @@ public ItemMapping getMapping(ItemData data) { for (ItemMapping mapping : this.items) { if (mapping.getBedrockDefinition().getRuntimeId() == definition.getRuntimeId()) { if (isBlock && !hasDamage) { // Pre-1.16.220 will not use block runtime IDs at all, so we shouldn't check either - if (data.getBlockDefinition() != mapping.getBedrockBlockDefinition()) { + if (data.getBlockDefinition().getRuntimeId() != mapping.getBedrockBlockDefinition().getRuntimeId()) { continue; } } else { diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index e495740aa47..edde54690c1 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -1900,6 +1900,8 @@ private StartGamePacket buildStartGamePacket() { // It does *not* mean we can dictate the break speed server-sided :( startGamePacket.setServerAuthoritativeBlockBreaking(true); + startGamePacket.setBlockNetworkIdsHashed(true); + return startGamePacket; } diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/StructureBlockBlockEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/StructureBlockBlockEntityTranslator.java index dcf4f85ffc7..a358fea8267 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/StructureBlockBlockEntityTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/StructureBlockBlockEntityTranslator.java @@ -138,4 +138,4 @@ public void translateTag(GeyserSession session, NbtMapBuilder bedrockNbt, NbtMap // Java's "showair" is unrepresented } -} \ No newline at end of file +} diff --git a/core/src/main/java/org/geysermc/geyser/translator/sound/block/ButtonSoundInteractionTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/sound/block/ButtonSoundInteractionTranslator.java index 2c874e4fd79..c80ff8a934d 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/sound/block/ButtonSoundInteractionTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/sound/block/ButtonSoundInteractionTranslator.java @@ -28,7 +28,6 @@ import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.SoundEvent; import org.cloudburstmc.protocol.bedrock.packet.LevelSoundEventPacket; -import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.level.block.property.Properties; import org.geysermc.geyser.level.block.type.BlockState; import org.geysermc.geyser.session.GeyserSession; diff --git a/core/src/main/resources/bedrock/block_palette.1_21_130.nbt b/core/src/main/resources/bedrock/block_palette.1_21_130.nbt deleted file mode 100644 index e89f50aec38..00000000000 Binary files a/core/src/main/resources/bedrock/block_palette.1_21_130.nbt and /dev/null differ diff --git a/core/src/main/resources/bedrock/block_palette.1_26_10.nbt b/core/src/main/resources/bedrock/block_palette.nbt similarity index 100% rename from core/src/main/resources/bedrock/block_palette.1_26_10.nbt rename to core/src/main/resources/bedrock/block_palette.nbt