From bed7638bcd82fec1388b99e431a5563eba101e17 Mon Sep 17 00:00:00 2001 From: Roman Alexander Date: Mon, 16 Sep 2024 04:37:56 +0700 Subject: [PATCH 01/10] Update to 1.21.30 --- .../entity/attribute/GeyserAttributeType.java | 4 +- .../geyser/impl/camera/CameraDefinitions.java | 14 +- .../geyser/network/CodecProcessor.java | 55 +- .../geysermc/geyser/network/GameProtocol.java | 10 +- .../populator/BlockRegistryPopulator.java | 36 +- .../registry/populator/Conversion729_712.java | 141 + .../populator/ItemRegistryPopulator.java | 4 +- .../bedrock/block_palette.1_21_30.nbt | Bin 0 -> 180490 bytes .../bedrock/creative_items.1_21_30.json | 6214 +++++++++++++++ .../bedrock/runtime_item_states.1_21_30.json | 6898 +++++++++++++++++ gradle/libs.versions.toml | 6 +- 11 files changed, 13362 insertions(+), 20 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/registry/populator/Conversion729_712.java create mode 100644 core/src/main/resources/bedrock/block_palette.1_21_30.nbt create mode 100644 core/src/main/resources/bedrock/creative_items.1_21_30.json create mode 100644 core/src/main/resources/bedrock/runtime_item_states.1_21_30.json diff --git a/core/src/main/java/org/geysermc/geyser/entity/attribute/GeyserAttributeType.java b/core/src/main/java/org/geysermc/geyser/entity/attribute/GeyserAttributeType.java index 3b543a943fc..5fe27d483b3 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/attribute/GeyserAttributeType.java +++ b/core/src/main/java/org/geysermc/geyser/entity/attribute/GeyserAttributeType.java @@ -37,7 +37,7 @@ public enum GeyserAttributeType { // Universal Attributes FOLLOW_RANGE("minecraft:generic.follow_range", "minecraft:follow_range", 0f, 2048f, 32f), KNOCKBACK_RESISTANCE("minecraft:generic.knockback_resistance", "minecraft:knockback_resistance", 0f, 1f, 0f), - MOVEMENT_SPEED("minecraft:generic.movement_speed", "minecraft:movement", 0f, 1024f, 0.1f), + MOVEMENT_SPEED("minecraft:generic.movement_speed", "minecraft:movement", 0f, Float.MAX_VALUE, 0.1f), FLYING_SPEED("minecraft:generic.flying_speed", "minecraft:movement", 0.0f, 1024.0f, 0.4000000059604645f), ATTACK_DAMAGE("minecraft:generic.attack_damage", "minecraft:attack_damage", 0f, 2048f, 1f), HORSE_JUMP_STRENGTH("minecraft:horse.jump_strength", "minecraft:horse.jump_strength", 0.0f, 2.0f, 0.7f), @@ -54,7 +54,7 @@ public enum GeyserAttributeType { // Bedrock Attributes ABSORPTION(null, "minecraft:absorption", 0f, 1024f, 0f), - EXHAUSTION(null, "minecraft:player.exhaustion", 0f, 5f, 0f), + EXHAUSTION(null, "minecraft:player.exhaustion", 0f, 20f, 0f), EXPERIENCE(null, "minecraft:player.experience", 0f, 1f, 0f), EXPERIENCE_LEVEL(null, "minecraft:player.level", 0f, 24791.00f, 0f), HEALTH(null, "minecraft:health", 0f, 1024f, 20f), diff --git a/core/src/main/java/org/geysermc/geyser/impl/camera/CameraDefinitions.java b/core/src/main/java/org/geysermc/geyser/impl/camera/CameraDefinitions.java index 7bb25c9ef0c..1cf6a794ede 100644 --- a/core/src/main/java/org/geysermc/geyser/impl/camera/CameraDefinitions.java +++ b/core/src/main/java/org/geysermc/geyser/impl/camera/CameraDefinitions.java @@ -43,13 +43,13 @@ public class CameraDefinitions { static { CAMERA_PRESETS = List.of( - new CameraPreset(CameraPerspective.FIRST_PERSON.id(), "", null, null, null, null, null, null, OptionalBoolean.empty()), - new CameraPreset(CameraPerspective.FREE.id(), "", null, null, null, null, null, null, OptionalBoolean.empty()), - new CameraPreset(CameraPerspective.THIRD_PERSON.id(), "", null, null, null, null, null, null, OptionalBoolean.empty()), - new CameraPreset(CameraPerspective.THIRD_PERSON_FRONT.id(), "", null, null, null, null, null, null, OptionalBoolean.empty()), - new CameraPreset("geyser:free_audio", "minecraft:free", null, null, null, null, null, CameraAudioListener.PLAYER, OptionalBoolean.of(false)), - new CameraPreset("geyser:free_effects", "minecraft:free", null, null, null, null, null, CameraAudioListener.CAMERA, OptionalBoolean.of(true)), - new CameraPreset("geyser:free_audio_effects", "minecraft:free", null, null, null, null, null, CameraAudioListener.PLAYER, OptionalBoolean.of(true))); + new CameraPreset(CameraPerspective.FIRST_PERSON.id(), "", null, null, null, null, null, null, OptionalBoolean.empty(), null, OptionalBoolean.empty(), null), + new CameraPreset(CameraPerspective.FREE.id(), "", null, null, null, null, null, null, OptionalBoolean.empty(), null, OptionalBoolean.empty(), null), + new CameraPreset(CameraPerspective.THIRD_PERSON.id(), "", null, null, null, null, null, null, OptionalBoolean.empty(), null, OptionalBoolean.empty(), null), + new CameraPreset(CameraPerspective.THIRD_PERSON_FRONT.id(), "", null, null, null, null, null, null, OptionalBoolean.empty(), null, OptionalBoolean.empty(), null), + new CameraPreset("geyser:free_audio", "minecraft:free", null, null, null, null, null, CameraAudioListener.PLAYER, OptionalBoolean.empty(), null, OptionalBoolean.of(false), null), + new CameraPreset("geyser:free_effects", "minecraft:free", null, null, null, null, null, CameraAudioListener.CAMERA, OptionalBoolean.empty(), null, OptionalBoolean.of(true), null), + new CameraPreset("geyser:free_audio_effects", "minecraft:free", null, null, null, null, null, CameraAudioListener.PLAYER, OptionalBoolean.empty(), null, OptionalBoolean.of(true), null)); SimpleDefinitionRegistry.Builder builder = SimpleDefinitionRegistry.builder(); for (int i = 0; i < CAMERA_PRESETS.size(); i++) { diff --git a/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java b/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java index fd18c01cebe..5179817bce1 100644 --- a/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java +++ b/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java @@ -43,6 +43,10 @@ import org.cloudburstmc.protocol.bedrock.codec.v712.serializer.InventoryContentSerializer_v712; import org.cloudburstmc.protocol.bedrock.codec.v712.serializer.InventorySlotSerializer_v712; import org.cloudburstmc.protocol.bedrock.codec.v712.serializer.MobArmorEquipmentSerializer_v712; +import org.cloudburstmc.protocol.bedrock.codec.v729.serializer.InventoryContentSerializer_v729; +import org.cloudburstmc.protocol.bedrock.codec.v729.serializer.InventorySlotSerializer_v729; +import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.data.inventory.FullContainerName; import org.cloudburstmc.protocol.bedrock.packet.AnvilDamagePacket; import org.cloudburstmc.protocol.bedrock.packet.BedrockPacket; import org.cloudburstmc.protocol.bedrock.packet.BossEventPacket; @@ -139,6 +143,19 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, InventoryCont } }; + private static final BedrockPacketSerializer INVENTORY_CONTENT_SERIALIZER_V729 = new InventoryContentSerializer_v729() { + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, InventoryContentPacket packet) { + packet.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); + super.serialize(buffer, helper, packet); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, InventoryContentPacket packet) { + throw new IllegalArgumentException("Client cannot send InventoryContentPacket in server-auth inventory environment!"); + } + }; + /** * Serializer that throws an exception when trying to deserialize InventorySlotPacket since server-auth inventory is used. */ @@ -159,6 +176,21 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, InventorySlot } }; + private static final BedrockPacketSerializer INVENTORY_SLOT_SERIALIZER_V729 = new InventorySlotSerializer_v729() { + @Override + public void serialize(ByteBuf buffer, BedrockCodecHelper helper, InventorySlotPacket packet) { + packet.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); + super.serialize(buffer, helper, packet); + } + + @Override + public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, InventorySlotPacket packet) { + throw new IllegalArgumentException("Client cannot send InventorySlotPacket in server-auth inventory environment!"); + } + }; + + + /** * Serializer that does nothing when trying to deserialize BossEventPacket since it is not used from the client. */ @@ -256,8 +288,25 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, MobEquipmentP @SuppressWarnings("unchecked") static BedrockCodec processCodec(BedrockCodec codec) { + boolean is729 = codec.getProtocolVersion() == 729; boolean isPre712 = codec.getProtocolVersion() < 712; - + + BedrockPacketSerializer inventoryContentPacketBedrockPacketSerializer; + if (is729) { + inventoryContentPacketBedrockPacketSerializer = INVENTORY_CONTENT_SERIALIZER_V729; + } else if (isPre712) { + inventoryContentPacketBedrockPacketSerializer = INVENTORY_CONTENT_SERIALIZER_V407; + } else { + inventoryContentPacketBedrockPacketSerializer = INVENTORY_CONTENT_SERIALIZER_V712; + } + BedrockPacketSerializer inventorySlotPacketBedrockPacketSerializer; + if (is729) { + inventorySlotPacketBedrockPacketSerializer = INVENTORY_SLOT_SERIALIZER_V729; + } else if (isPre712) { + inventorySlotPacketBedrockPacketSerializer = INVENTORY_SLOT_SERIALIZER_V407; + } else { + inventorySlotPacketBedrockPacketSerializer = INVENTORY_SLOT_SERIALIZER_V712; + } BedrockCodec.Builder codecBuilder = codec.toBuilder() // Illegal unused serverbound EDU packets .updateSerializer(PhotoTransferPacket.class, ILLEGAL_SERIALIZER) @@ -286,8 +335,8 @@ static BedrockCodec processCodec(BedrockCodec codec) { .updateSerializer(AnvilDamagePacket.class, IGNORED_SERIALIZER) .updateSerializer(RefreshEntitlementsPacket.class, IGNORED_SERIALIZER) // Illegal when serverbound due to Geyser specific setup - .updateSerializer(InventoryContentPacket.class, isPre712 ? INVENTORY_CONTENT_SERIALIZER_V407 : INVENTORY_CONTENT_SERIALIZER_V712) - .updateSerializer(InventorySlotPacket.class, isPre712 ? INVENTORY_SLOT_SERIALIZER_V407 : INVENTORY_SLOT_SERIALIZER_V712) + .updateSerializer(InventoryContentPacket.class, inventoryContentPacketBedrockPacketSerializer) + .updateSerializer(InventorySlotPacket.class, inventorySlotPacketBedrockPacketSerializer) // Ignored only when serverbound .updateSerializer(BossEventPacket.class, BOSS_EVENT_SERIALIZER) .updateSerializer(MobArmorEquipmentPacket.class, isPre712 ? MOB_ARMOR_EQUIPMENT_SERIALIZER_V291 : MOB_ARMOR_EQUIPMENT_SERIALIZER_V712) diff --git a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java index baa1d24d09a..f78c10d59a5 100644 --- a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java +++ b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java @@ -31,6 +31,7 @@ import org.cloudburstmc.protocol.bedrock.codec.v685.Bedrock_v685; import org.cloudburstmc.protocol.bedrock.codec.v686.Bedrock_v686; import org.cloudburstmc.protocol.bedrock.codec.v712.Bedrock_v712; +import org.cloudburstmc.protocol.bedrock.codec.v729.Bedrock_v729; import org.cloudburstmc.protocol.bedrock.netty.codec.packet.BedrockPacketCodec; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.mcprotocollib.protocol.codec.MinecraftCodec; @@ -49,9 +50,9 @@ public final class GameProtocol { * Default Bedrock codec that should act as a fallback. Should represent the latest available * release of the game that Geyser supports. */ - public static final BedrockCodec DEFAULT_BEDROCK_CODEC = CodecProcessor.processCodec(Bedrock_v712.CODEC.toBuilder() - .minecraftVersion("1.21.20/1.21.21") - .build()); + public static final BedrockCodec DEFAULT_BEDROCK_CODEC = CodecProcessor.processCodec(CodecProcessor.processCodec(Bedrock_v729.CODEC.toBuilder() + .minecraftVersion("1.21.30/1.21.31") + .build())); /** * A list of all supported Bedrock versions that can join Geyser @@ -65,6 +66,9 @@ public final class GameProtocol { private static final PacketCodec DEFAULT_JAVA_CODEC = MinecraftCodec.CODEC; static { + SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v712.CODEC.toBuilder() + .minecraftVersion("1.21.20/1.21.21") + .build())); SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v671.CODEC.toBuilder() .minecraftVersion("1.20.80/1.20.81") .build())); 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 22321246b49..eb8880ae153 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 @@ -39,6 +39,7 @@ import org.cloudburstmc.protocol.bedrock.codec.v671.Bedrock_v671; import org.cloudburstmc.protocol.bedrock.codec.v685.Bedrock_v685; import org.cloudburstmc.protocol.bedrock.codec.v712.Bedrock_v712; +import org.cloudburstmc.protocol.bedrock.codec.v729.Bedrock_v729; import org.cloudburstmc.protocol.bedrock.data.BlockPropertyData; import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition; import org.geysermc.geyser.GeyserImpl; @@ -110,7 +111,40 @@ private static void registerBedrockBlocks() { var blockMappers = ImmutableMap., Remapper>builder() .put(ObjectIntPair.of("1_20_80", Bedrock_v671.CODEC.getProtocolVersion()), Conversion685_671::remapBlock) .put(ObjectIntPair.of("1_21_0", Bedrock_v685.CODEC.getProtocolVersion()), Conversion712_685::remapBlock) - .put(ObjectIntPair.of("1_21_20", Bedrock_v712.CODEC.getProtocolVersion()), tag -> tag) + .put(ObjectIntPair.of("1_21_20", Bedrock_v712.CODEC.getProtocolVersion()), Conversion729_712::remapBlock) + .put(ObjectIntPair.of("1_21_30", Bedrock_v729.CODEC.getProtocolVersion()), tag -> { // TODO: Remove me when mappings is updated + if(Objects.equals(tag.getString("name"), "minecraft:sponge")) { + NbtMapBuilder builder = tag.getCompound("states").toBuilder(); + builder.remove("sponge_type"); + NbtMap states = builder.build(); + return tag.toBuilder().putString("name", "minecraft:sponge").putCompound("states", states).build(); + } + if(Objects.equals(tag.getString("name"), "minecraft:tnt")) { + NbtMapBuilder builder = tag.getCompound("states").toBuilder(); + builder.remove("allow_underwater_bit"); + NbtMap states = builder.build(); + return tag.toBuilder().putString("name", "minecraft:tnt").putCompound("states", states).build(); + } + if(Objects.equals(tag.getString("name"), "minecraft:cobblestone_wall")) { + NbtMapBuilder builder = tag.getCompound("states").toBuilder(); + builder.remove("wall_block_type"); + NbtMap states = builder.build(); + return tag.toBuilder().putString("name", "minecraft:cobblestone_wall").putCompound("states", states).build(); + } + if(Objects.equals(tag.getString("name"), "minecraft:purpur_block")) { + NbtMapBuilder builder = tag.getCompound("states").toBuilder(); + builder.remove("chisel_type"); + NbtMap states = builder.build(); + return tag.toBuilder().putString("name", "minecraft:purpur_block").putCompound("states", states).build(); + } + if(Objects.equals(tag.getString("name"), "minecraft:structure_void")) { + NbtMapBuilder builder = tag.getCompound("states").toBuilder(); + builder.remove("structure_void_type"); + NbtMap states = builder.build(); + return tag.toBuilder().putString("name", "minecraft:structure_void").putCompound("states", states).build(); + } + return tag; + }) .build(); // We can keep this strong as nothing should be garbage collected diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/Conversion729_712.java b/core/src/main/java/org/geysermc/geyser/registry/populator/Conversion729_712.java new file mode 100644 index 00000000000..3b8d6d4a20f --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/Conversion729_712.java @@ -0,0 +1,141 @@ +package org.geysermc.geyser.registry.populator; + +import org.cloudburstmc.nbt.NbtMap; +import org.geysermc.geyser.item.type.Item; +import org.geysermc.geyser.registry.type.GeyserMappingItem; + +import java.util.List; +import java.util.stream.Stream; + +public class Conversion729_712 { + private static final List NEW_PURPUR_BLOCKS = List.of("minecraft:purpur_block", "minecraft:purpur_pillar"); + private static final List NEW_WALL_BLOCKS = List.of("minecraft:cobblestone_wall", "minecraft:mossy_cobblestone_wall", "minecraft:granite_wall", "minecraft:diorite_wall", "minecraft:andesite_wall", "minecraft:sandstone_wall", "minecraft:brick_wall", "minecraft:stone_brick_wall", "minecraft:mossy_stone_brick_wall", "minecraft:nether_brick_wall", "minecraft:end_stone_brick_wall", "minecraft:prismarine_wall", "minecraft:red_sandstone_wall", "minecraft:red_nether_brick_wall"); + private static final List NEW_SPONGE_BLOCKS = List.of("minecraft:sponge", "minecraft:wet_sponge"); + private static final List NEW_TNT_BLOCKS = List.of("minecraft:tnt", "minecraft:underwater_tnt"); + private static final List NEW_BLOCKS = Stream.of(NEW_PURPUR_BLOCKS, NEW_WALL_BLOCKS, NEW_SPONGE_BLOCKS, NEW_TNT_BLOCKS).flatMap(List::stream).toList(); + + static GeyserMappingItem remapItem(Item item, GeyserMappingItem mapping) { + String identifier = mapping.getBedrockIdentifier(); + + if (!NEW_BLOCKS.contains(identifier)) { + return mapping; + } + + if (identifier.equals("minecraft:underwater_tnt")) { + return mapping.withBedrockIdentifier("minecraft:tnt").withBedrockData(1); + } + + if (NEW_PURPUR_BLOCKS.contains(identifier)) { + switch (identifier) { + case "minecraft:purpur_block" -> { return mapping.withBedrockIdentifier("minecraft:purpur_block").withBedrockData(0); } + case "minecraft:purpur_pillar" -> { return mapping.withBedrockIdentifier("minecraft:purpur_block").withBedrockData(1); } + } + } + + if (NEW_WALL_BLOCKS.contains(identifier)) { + switch (identifier) { + case "minecraft:cobblestone_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(0); } + case "minecraft:mossy_cobblestone_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(1); } + case "minecraft:granite_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(2); } + case "minecraft:diorite_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(3); } + case "minecraft:andesite_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(4); } + case "minecraft:sandstone_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(5); } + case "minecraft:brick_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(6); } + case "minecraft:stone_brick_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(7); } + case "minecraft:mossy_stone_brick_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(8); } + case "minecraft:nether_brick_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(9); } + case "minecraft:end_stone_brick_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(10); } + case "minecraft:prismarine_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(11); } + case "minecraft:red_sandstone_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(12); } + case "minecraft:red_nether_brick_wall" -> { return mapping.withBedrockIdentifier("minecraft:cobblestone_wall").withBedrockData(13); } + } + } + + if (NEW_SPONGE_BLOCKS.contains(identifier)) { + switch (identifier) { + case "minecraft:sponge" -> { return mapping.withBedrockIdentifier("minecraft:sponge").withBedrockData(0); } + case "minecraft:wet_sponge" -> { return mapping.withBedrockIdentifier("minecraft:sponge").withBedrockData(1); } + } + } + + return mapping; + } + + static NbtMap remapBlock(NbtMap tag) { + final String name = tag.getString("name"); + + if (!NEW_BLOCKS.contains(name)) { + return tag; + } + + String replacement; + + if (NEW_PURPUR_BLOCKS.contains(name)) { + replacement = "minecraft:purpur_block"; + String purpurType = name.equals("minecraft:purpur_pillar") ? "lines" : "default"; + + NbtMap states = tag.getCompound("states") + .toBuilder() + .putString("chisel_type", purpurType) + .build(); + + return tag.toBuilder().putString("name", replacement).putCompound("states", states).build(); + } + + if (NEW_WALL_BLOCKS.contains(name)) { + replacement = "minecraft:cobblestone_wall"; + String wallType; + + switch (name) { + case "minecraft:cobblestone_wall" -> wallType = "cobblestone"; + case "minecraft:mossy_cobblestone_wall" -> wallType = "mossy"; + case "minecraft:granite_wall" -> wallType = "granite"; + case "minecraft:diorite_wall" -> wallType = "diorite"; + case "minecraft:andesite_wall" -> wallType = "andesite"; + case "minecraft:sandstone_wall" -> wallType = "sandstone"; + case "minecraft:brick_wall" -> wallType = "brick"; + case "minecraft:stone_brick_wall" -> wallType = "stone_brick"; + case "minecraft:mossy_stone_brick_wall" -> wallType = "mossy_stone_brick"; + case "minecraft:nether_brick_wall" -> wallType = "nether_brick"; + case "minecraft:end_stone_brick_wall" -> wallType = "end_stone_brick"; + case "minecraft:prismarine_wall" -> wallType = "prismarine"; + case "minecraft:red_sandstone_wall" -> wallType = "red_sandstone"; + case "minecraft:red_nether_brick_wall" -> wallType = "red_nether_brick"; + default -> throw new IllegalStateException("Unexpected value: " + name); + } + + NbtMap states = tag.getCompound("states") + .toBuilder() + .putString("wall_block_type", wallType) + .build(); + + return tag.toBuilder().putString("name", replacement).putCompound("states", states).build(); + } + + if (NEW_SPONGE_BLOCKS.contains(name)) { + replacement = "minecraft:sponge"; + String spongeType = name.equals("minecraft:wet_sponge") ? "wet" : "dry"; + + NbtMap states = tag.getCompound("states") + .toBuilder() + .putString("sponge_type", spongeType) + .build(); + + return tag.toBuilder().putString("name", replacement).putCompound("states", states).build(); + } + + if (NEW_TNT_BLOCKS.contains(name)) { + replacement = "minecraft:tnt"; + byte tntType = (byte) (name.equals("minecraft:underwater_tnt") ? 1 : 0); + + NbtMap states = tag.getCompound("states") + .toBuilder() + .putByte("allow_underwater_bit", tntType) + .build(); + + return tag.toBuilder().putString("name", replacement).putCompound("states", states).build(); + } + + return tag; + } +} diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java index 55d44c3d9ec..bea213aa4fc 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java @@ -42,6 +42,7 @@ import org.cloudburstmc.protocol.bedrock.codec.v671.Bedrock_v671; import org.cloudburstmc.protocol.bedrock.codec.v685.Bedrock_v685; import org.cloudburstmc.protocol.bedrock.codec.v712.Bedrock_v712; +import org.cloudburstmc.protocol.bedrock.codec.v729.Bedrock_v729; import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition; import org.cloudburstmc.protocol.bedrock.data.definitions.ItemDefinition; import org.cloudburstmc.protocol.bedrock.data.definitions.SimpleItemDefinition; @@ -92,7 +93,8 @@ public static void populate() { List paletteVersions = new ArrayList<>(3); paletteVersions.add(new PaletteVersion("1_20_80", Bedrock_v671.CODEC.getProtocolVersion(), Collections.emptyMap(), Conversion685_671::remapItem)); paletteVersions.add(new PaletteVersion("1_21_0", Bedrock_v685.CODEC.getProtocolVersion(), Collections.emptyMap(), Conversion712_685::remapItem)); - paletteVersions.add(new PaletteVersion("1_21_20", Bedrock_v712.CODEC.getProtocolVersion())); + paletteVersions.add(new PaletteVersion("1_21_20", Bedrock_v712.CODEC.getProtocolVersion(), Collections.emptyMap(), Conversion729_712::remapItem)); + paletteVersions.add(new PaletteVersion("1_21_30", Bedrock_v729.CODEC.getProtocolVersion())); GeyserBootstrap bootstrap = GeyserImpl.getInstance().getBootstrap(); diff --git a/core/src/main/resources/bedrock/block_palette.1_21_30.nbt b/core/src/main/resources/bedrock/block_palette.1_21_30.nbt new file mode 100644 index 0000000000000000000000000000000000000000..bb19c11ca73fbdda905acbb35516ab0588dbac95 GIT binary patch literal 180490 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

YrJkdVHz~Mle@U@uoaxq4WA>+KOf4 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⪻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 x%~%O@&ufKXxje1)?;(_z&Mt^kT5|lewQh_^h Date: Mon, 16 Sep 2024 12:32:57 +0700 Subject: [PATCH 02/10] Update to 1.21.30 --- .../geyser/network/CodecProcessor.java | 20 ++++++++++--------- .../geysermc/geyser/network/GameProtocol.java | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java b/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java index 5179817bce1..55184e8a375 100644 --- a/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java +++ b/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java @@ -288,25 +288,27 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, MobEquipmentP @SuppressWarnings("unchecked") static BedrockCodec processCodec(BedrockCodec codec) { - boolean is729 = codec.getProtocolVersion() == 729; - boolean isPre712 = codec.getProtocolVersion() < 712; + boolean is729 = codec.getProtocolVersion() >= 729; + boolean is712 = codec.getProtocolVersion() >= 712; BedrockPacketSerializer inventoryContentPacketBedrockPacketSerializer; if (is729) { inventoryContentPacketBedrockPacketSerializer = INVENTORY_CONTENT_SERIALIZER_V729; - } else if (isPre712) { - inventoryContentPacketBedrockPacketSerializer = INVENTORY_CONTENT_SERIALIZER_V407; - } else { + } else if (is712) { inventoryContentPacketBedrockPacketSerializer = INVENTORY_CONTENT_SERIALIZER_V712; + } else { + inventoryContentPacketBedrockPacketSerializer = INVENTORY_CONTENT_SERIALIZER_V407; } + BedrockPacketSerializer inventorySlotPacketBedrockPacketSerializer; if (is729) { inventorySlotPacketBedrockPacketSerializer = INVENTORY_SLOT_SERIALIZER_V729; - } else if (isPre712) { - inventorySlotPacketBedrockPacketSerializer = INVENTORY_SLOT_SERIALIZER_V407; - } else { + } else if (is712) { inventorySlotPacketBedrockPacketSerializer = INVENTORY_SLOT_SERIALIZER_V712; + } else { + inventorySlotPacketBedrockPacketSerializer = INVENTORY_SLOT_SERIALIZER_V407; } + BedrockCodec.Builder codecBuilder = codec.toBuilder() // Illegal unused serverbound EDU packets .updateSerializer(PhotoTransferPacket.class, ILLEGAL_SERIALIZER) @@ -339,7 +341,7 @@ static BedrockCodec processCodec(BedrockCodec codec) { .updateSerializer(InventorySlotPacket.class, inventorySlotPacketBedrockPacketSerializer) // Ignored only when serverbound .updateSerializer(BossEventPacket.class, BOSS_EVENT_SERIALIZER) - .updateSerializer(MobArmorEquipmentPacket.class, isPre712 ? MOB_ARMOR_EQUIPMENT_SERIALIZER_V291 : MOB_ARMOR_EQUIPMENT_SERIALIZER_V712) + .updateSerializer(MobArmorEquipmentPacket.class, is712 ? MOB_ARMOR_EQUIPMENT_SERIALIZER_V291 : MOB_ARMOR_EQUIPMENT_SERIALIZER_V712) .updateSerializer(PlayerHotbarPacket.class, PLAYER_HOTBAR_SERIALIZER) .updateSerializer(PlayerSkinPacket.class, PLAYER_SKIN_SERIALIZER) .updateSerializer(SetEntityDataPacket.class, SET_ENTITY_DATA_SERIALIZER) diff --git a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java index f78c10d59a5..2e0708e58db 100644 --- a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java +++ b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java @@ -51,7 +51,7 @@ public final class GameProtocol { * release of the game that Geyser supports. */ public static final BedrockCodec DEFAULT_BEDROCK_CODEC = CodecProcessor.processCodec(CodecProcessor.processCodec(Bedrock_v729.CODEC.toBuilder() - .minecraftVersion("1.21.30/1.21.31") + .minecraftVersion("1.21.30") .build())); /** From 655829dc2e910aef0cd489f9954ece2567c036d5 Mon Sep 17 00:00:00 2001 From: Roman Alexander Date: Mon, 16 Sep 2024 12:39:20 +0700 Subject: [PATCH 03/10] Update to 1.21.30 --- .../main/java/org/geysermc/geyser/network/CodecProcessor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java b/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java index 55184e8a375..8726c0ca8d3 100644 --- a/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java +++ b/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java @@ -146,7 +146,7 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, InventoryCont private static final BedrockPacketSerializer INVENTORY_CONTENT_SERIALIZER_V729 = new InventoryContentSerializer_v729() { @Override public void serialize(ByteBuf buffer, BedrockCodecHelper helper, InventoryContentPacket packet) { - packet.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); + packet.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); // TODO: Remove me for correct FullContainerName super.serialize(buffer, helper, packet); } @@ -179,7 +179,7 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, InventorySlot private static final BedrockPacketSerializer INVENTORY_SLOT_SERIALIZER_V729 = new InventorySlotSerializer_v729() { @Override public void serialize(ByteBuf buffer, BedrockCodecHelper helper, InventorySlotPacket packet) { - packet.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); + packet.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); // TODO: Remove me for correct FullContainerName super.serialize(buffer, helper, packet); } From 8c7c75e41c7d9cde12f9c85776aa21de4f6363d9 Mon Sep 17 00:00:00 2001 From: Roman Alexander Date: Mon, 16 Sep 2024 13:33:51 +0700 Subject: [PATCH 04/10] Add FullContainerName to all packets --- .../geyser/inventory/updater/AnvilInventoryUpdater.java | 6 ++++++ .../geyser/inventory/updater/ChestInventoryUpdater.java | 4 ++++ .../inventory/updater/ContainerInventoryUpdater.java | 4 ++++ .../geyser/inventory/updater/HorseInventoryUpdater.java | 4 ++++ .../geyser/inventory/updater/InventoryUpdater.java | 4 ++++ .../geyser/inventory/updater/UIInventoryUpdater.java | 4 ++++ .../java/org/geysermc/geyser/network/CodecProcessor.java | 4 ---- .../translator/inventory/OldSmithingTableTranslator.java | 2 ++ .../translator/inventory/PlayerInventoryTranslator.java | 7 +++++++ .../inventory/horse/ChestedHorseInventoryTranslator.java | 3 +++ .../protocol/java/entity/JavaEntityEventTranslator.java | 3 +++ .../java/inventory/JavaContainerSetSlotTranslator.java | 4 ++++ .../main/java/org/geysermc/geyser/util/InventoryUtils.java | 3 +++ 13 files changed, 48 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java b/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java index 7afd31cc9f2..2e0c75708db 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java @@ -32,6 +32,8 @@ import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtMapBuilder; import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerId; +import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.data.inventory.FullContainerName; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; import org.cloudburstmc.protocol.bedrock.packet.InventorySlotPacket; import org.geysermc.geyser.GeyserImpl; @@ -78,6 +80,7 @@ public void updateInventory(InventoryTranslator translator, GeyserSession sessio slotPacket.setContainerId(ContainerId.UI); slotPacket.setSlot(bedrockSlot); slotPacket.setItem(inventory.getItem(i).getItemData(session)); + slotPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(slotPacket); } } @@ -98,6 +101,7 @@ public boolean updateSlot(InventoryTranslator translator, GeyserSession session, slotPacket.setContainerId(ContainerId.UI); slotPacket.setSlot(translator.javaSlotToBedrock(javaSlot)); slotPacket.setItem(inventory.getItem(javaSlot).getItemData(session)); + slotPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(slotPacket); } else if (lastTargetSlot != javaSlot) { // Update the previous target slot to remove repair cost changes @@ -105,6 +109,7 @@ public boolean updateSlot(InventoryTranslator translator, GeyserSession session, slotPacket.setContainerId(ContainerId.UI); slotPacket.setSlot(translator.javaSlotToBedrock(lastTargetSlot)); slotPacket.setItem(inventory.getItem(lastTargetSlot).getItemData(session)); + slotPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(slotPacket); } @@ -168,6 +173,7 @@ private void updateTargetSlot(InventoryTranslator translator, GeyserSession sess slotPacket.setContainerId(ContainerId.UI); slotPacket.setSlot(translator.javaSlotToBedrock(slot)); slotPacket.setItem(itemData); + slotPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(slotPacket); } diff --git a/core/src/main/java/org/geysermc/geyser/inventory/updater/ChestInventoryUpdater.java b/core/src/main/java/org/geysermc/geyser/inventory/updater/ChestInventoryUpdater.java index 5d6214871c2..9f3d00c5750 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/updater/ChestInventoryUpdater.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/updater/ChestInventoryUpdater.java @@ -25,6 +25,8 @@ package org.geysermc.geyser.inventory.updater; +import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.data.inventory.FullContainerName; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; import org.cloudburstmc.protocol.bedrock.packet.InventoryContentPacket; import org.cloudburstmc.protocol.bedrock.packet.InventorySlotPacket; @@ -61,6 +63,7 @@ public void updateInventory(InventoryTranslator translator, GeyserSession sessio InventoryContentPacket contentPacket = new InventoryContentPacket(); contentPacket.setContainerId(inventory.getBedrockId()); contentPacket.setContents(bedrockItems); + contentPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(contentPacket); } @@ -73,6 +76,7 @@ public boolean updateSlot(InventoryTranslator translator, GeyserSession session, slotPacket.setContainerId(inventory.getBedrockId()); slotPacket.setSlot(translator.javaSlotToBedrock(javaSlot)); slotPacket.setItem(inventory.getItem(javaSlot).getItemData(session)); + slotPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(slotPacket); return true; } diff --git a/core/src/main/java/org/geysermc/geyser/inventory/updater/ContainerInventoryUpdater.java b/core/src/main/java/org/geysermc/geyser/inventory/updater/ContainerInventoryUpdater.java index c9f313f2a63..3d372c08316 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/updater/ContainerInventoryUpdater.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/updater/ContainerInventoryUpdater.java @@ -25,6 +25,8 @@ package org.geysermc.geyser.inventory.updater; +import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.data.inventory.FullContainerName; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; import org.cloudburstmc.protocol.bedrock.packet.InventoryContentPacket; import org.cloudburstmc.protocol.bedrock.packet.InventorySlotPacket; @@ -49,6 +51,7 @@ public void updateInventory(InventoryTranslator translator, GeyserSession sessio InventoryContentPacket contentPacket = new InventoryContentPacket(); contentPacket.setContainerId(inventory.getBedrockId()); contentPacket.setContents(Arrays.asList(bedrockItems)); + contentPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(contentPacket); } @@ -61,6 +64,7 @@ public boolean updateSlot(InventoryTranslator translator, GeyserSession session, slotPacket.setContainerId(inventory.getBedrockId()); slotPacket.setSlot(translator.javaSlotToBedrock(javaSlot)); slotPacket.setItem(inventory.getItem(javaSlot).getItemData(session)); + slotPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(slotPacket); return true; } diff --git a/core/src/main/java/org/geysermc/geyser/inventory/updater/HorseInventoryUpdater.java b/core/src/main/java/org/geysermc/geyser/inventory/updater/HorseInventoryUpdater.java index 7441e66d0d5..1a46fc02a20 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/updater/HorseInventoryUpdater.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/updater/HorseInventoryUpdater.java @@ -25,6 +25,8 @@ package org.geysermc.geyser.inventory.updater; +import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.data.inventory.FullContainerName; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; import org.cloudburstmc.protocol.bedrock.packet.InventoryContentPacket; import org.cloudburstmc.protocol.bedrock.packet.InventorySlotPacket; @@ -49,6 +51,7 @@ public void updateInventory(InventoryTranslator translator, GeyserSession sessio InventoryContentPacket contentPacket = new InventoryContentPacket(); contentPacket.setContainerId(inventory.getBedrockId()); contentPacket.setContents(Arrays.asList(bedrockItems)); + contentPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(contentPacket); } @@ -61,6 +64,7 @@ public boolean updateSlot(InventoryTranslator translator, GeyserSession session, slotPacket.setContainerId(4); // Horse GUI? slotPacket.setSlot(translator.javaSlotToBedrock(javaSlot)); slotPacket.setItem(inventory.getItem(javaSlot).getItemData(session)); + slotPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(slotPacket); return true; } diff --git a/core/src/main/java/org/geysermc/geyser/inventory/updater/InventoryUpdater.java b/core/src/main/java/org/geysermc/geyser/inventory/updater/InventoryUpdater.java index 68ee334ba45..b7ef4720fa1 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/updater/InventoryUpdater.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/updater/InventoryUpdater.java @@ -26,6 +26,8 @@ package org.geysermc.geyser.inventory.updater; import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerId; +import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.data.inventory.FullContainerName; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; import org.cloudburstmc.protocol.bedrock.packet.InventoryContentPacket; import org.cloudburstmc.protocol.bedrock.packet.InventorySlotPacket; @@ -45,6 +47,7 @@ public void updateInventory(InventoryTranslator translator, GeyserSession sessio InventoryContentPacket contentPacket = new InventoryContentPacket(); contentPacket.setContainerId(ContainerId.INVENTORY); contentPacket.setContents(Arrays.asList(bedrockItems)); + contentPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(contentPacket); } @@ -54,6 +57,7 @@ public boolean updateSlot(InventoryTranslator translator, GeyserSession session, slotPacket.setContainerId(ContainerId.INVENTORY); slotPacket.setSlot(translator.javaSlotToBedrock(javaSlot)); slotPacket.setItem(inventory.getItem(javaSlot).getItemData(session)); + slotPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(slotPacket); return true; } diff --git a/core/src/main/java/org/geysermc/geyser/inventory/updater/UIInventoryUpdater.java b/core/src/main/java/org/geysermc/geyser/inventory/updater/UIInventoryUpdater.java index a23385b53c2..f4f40d6cebb 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/updater/UIInventoryUpdater.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/updater/UIInventoryUpdater.java @@ -26,6 +26,8 @@ package org.geysermc.geyser.inventory.updater; import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerId; +import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.data.inventory.FullContainerName; import org.cloudburstmc.protocol.bedrock.packet.InventorySlotPacket; import org.geysermc.geyser.inventory.Inventory; import org.geysermc.geyser.session.GeyserSession; @@ -46,6 +48,7 @@ public void updateInventory(InventoryTranslator translator, GeyserSession sessio slotPacket.setContainerId(ContainerId.UI); slotPacket.setSlot(bedrockSlot); slotPacket.setItem(inventory.getItem(i).getItemData(session)); + slotPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(slotPacket); } } @@ -59,6 +62,7 @@ public boolean updateSlot(InventoryTranslator translator, GeyserSession session, slotPacket.setContainerId(ContainerId.UI); slotPacket.setSlot(translator.javaSlotToBedrock(javaSlot)); slotPacket.setItem(inventory.getItem(javaSlot).getItemData(session)); + slotPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(slotPacket); return true; } diff --git a/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java b/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java index 8726c0ca8d3..fa4164c4116 100644 --- a/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java +++ b/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java @@ -146,7 +146,6 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, InventoryCont private static final BedrockPacketSerializer INVENTORY_CONTENT_SERIALIZER_V729 = new InventoryContentSerializer_v729() { @Override public void serialize(ByteBuf buffer, BedrockCodecHelper helper, InventoryContentPacket packet) { - packet.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); // TODO: Remove me for correct FullContainerName super.serialize(buffer, helper, packet); } @@ -179,7 +178,6 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, InventorySlot private static final BedrockPacketSerializer INVENTORY_SLOT_SERIALIZER_V729 = new InventorySlotSerializer_v729() { @Override public void serialize(ByteBuf buffer, BedrockCodecHelper helper, InventorySlotPacket packet) { - packet.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); // TODO: Remove me for correct FullContainerName super.serialize(buffer, helper, packet); } @@ -189,8 +187,6 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, InventorySlot } }; - - /** * Serializer that does nothing when trying to deserialize BossEventPacket since it is not used from the client. */ diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/OldSmithingTableTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/OldSmithingTableTranslator.java index 21fe9ca2150..685d51fc039 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/OldSmithingTableTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/OldSmithingTableTranslator.java @@ -28,6 +28,7 @@ import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerId; import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerType; +import org.cloudburstmc.protocol.bedrock.data.inventory.FullContainerName; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; import org.cloudburstmc.protocol.bedrock.data.inventory.itemstack.request.ItemStackRequest; import org.cloudburstmc.protocol.bedrock.data.inventory.itemstack.request.ItemStackRequestSlotData; @@ -139,6 +140,7 @@ public void openInventory(GeyserSession session, Inventory inventory) { slotPacket.setContainerId(ContainerId.UI); slotPacket.setSlot(53); slotPacket.setItem(UPGRADE_TEMPLATE.apply(session.getUpstream().getProtocolVersion())); + slotPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(slotPacket); } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/PlayerInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/PlayerInventoryTranslator.java index 21f45a5ca91..a276e475014 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/PlayerInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/PlayerInventoryTranslator.java @@ -30,6 +30,7 @@ import it.unimi.dsi.fastutil.ints.IntSet; import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerId; import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.data.inventory.FullContainerName; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; import org.cloudburstmc.protocol.bedrock.data.inventory.itemstack.request.ItemStackRequest; import org.cloudburstmc.protocol.bedrock.data.inventory.itemstack.request.ItemStackRequestSlotData; @@ -83,6 +84,7 @@ public void updateInventory(GeyserSession session, Inventory inventory) { contents[i - 36] = inventory.getItem(i).getItemData(session); } inventoryContentPacket.setContents(Arrays.asList(contents)); + inventoryContentPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(inventoryContentPacket); // Armor @@ -99,12 +101,14 @@ public void updateInventory(GeyserSession session, Inventory inventory) { } } armorContentPacket.setContents(Arrays.asList(contents)); + armorContentPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(armorContentPacket); // Offhand InventoryContentPacket offhandPacket = new InventoryContentPacket(); offhandPacket.setContainerId(ContainerId.OFFHAND); offhandPacket.setContents(Collections.singletonList(inventory.getItem(45).getItemData(session))); + offhandPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(offhandPacket); } @@ -126,6 +130,7 @@ public static void updateCraftingGrid(GeyserSession session, Inventory inventory slotPacket.setItem(inventory.getItem(i).getItemData(session)); } + slotPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(slotPacket); } } @@ -162,11 +167,13 @@ public void updateSlot(GeyserSession session, Inventory inventory, int slot) { slotPacket.setSlot(slot + 27); } slotPacket.setItem(bedrockItem); + slotPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(slotPacket); } else if (slot == 45) { InventoryContentPacket offhandPacket = new InventoryContentPacket(); offhandPacket.setContainerId(ContainerId.OFFHAND); offhandPacket.setContents(Collections.singletonList(bedrockItem)); + offhandPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(offhandPacket); } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/horse/ChestedHorseInventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/horse/ChestedHorseInventoryTranslator.java index f1a5723c8f6..ba3b7285ec5 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/horse/ChestedHorseInventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/horse/ChestedHorseInventoryTranslator.java @@ -27,6 +27,7 @@ import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerId; import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.data.inventory.FullContainerName; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; import org.cloudburstmc.protocol.bedrock.data.inventory.itemstack.request.ItemStackRequestSlotData; import org.cloudburstmc.protocol.bedrock.packet.InventoryContentPacket; @@ -94,6 +95,7 @@ public void updateInventory(GeyserSession session, Inventory inventory) { InventoryContentPacket contentPacket = new InventoryContentPacket(); contentPacket.setContainerId(ContainerId.INVENTORY); contentPacket.setContents(Arrays.asList(bedrockItems)); + contentPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(contentPacket); ItemData[] horseItems = new ItemData[chestSize + 1]; @@ -107,6 +109,7 @@ public void updateInventory(GeyserSession session, Inventory inventory) { InventoryContentPacket horseContentsPacket = new InventoryContentPacket(); horseContentsPacket.setContainerId(inventory.getBedrockId()); horseContentsPacket.setContents(Arrays.asList(horseItems)); + horseContentsPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(horseContentsPacket); } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaEntityEventTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaEntityEventTranslator.java index 6c2e02cd3fc..3195a65363c 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaEntityEventTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaEntityEventTranslator.java @@ -30,6 +30,8 @@ import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.data.entity.EntityEventType; import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerId; +import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.data.inventory.FullContainerName; import org.cloudburstmc.protocol.bedrock.packet.EntityEventPacket; import org.cloudburstmc.protocol.bedrock.packet.InventoryContentPacket; import org.cloudburstmc.protocol.bedrock.packet.LevelEventPacket; @@ -167,6 +169,7 @@ public void translate(GeyserSession session, ClientboundEntityEventPacket packet InventoryContentPacket offhandPacket = new InventoryContentPacket(); offhandPacket.setContainerId(ContainerId.OFFHAND); offhandPacket.setContents(Collections.singletonList(InventoryUtils.getTotemOfUndying().apply(session.getUpstream().getProtocolVersion()))); + offhandPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(offhandPacket); } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaContainerSetSlotTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaContainerSetSlotTranslator.java index 9c125981858..9b5d95afe57 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaContainerSetSlotTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/inventory/JavaContainerSetSlotTranslator.java @@ -25,6 +25,8 @@ package org.geysermc.geyser.translator.protocol.java.inventory; +import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.data.inventory.FullContainerName; import org.geysermc.mcprotocollib.protocol.data.game.item.ItemStack; import org.geysermc.mcprotocollib.protocol.data.game.recipe.Ingredient; import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.inventory.ClientboundContainerSetSlotPacket; @@ -180,6 +182,7 @@ private static void updateCraftingGrid(GeyserSession session, int slot, ItemStac slotPacket.setContainerId(ContainerId.UI); slotPacket.setSlot(col + (row * gridDimensions) + offset); slotPacket.setItem(ItemData.AIR); + slotPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(slotPacket); index++; } @@ -212,6 +215,7 @@ private static void updateCraftingGrid(GeyserSession session, int slot, ItemStac slotPacket.setContainerId(ContainerId.UI); slotPacket.setSlot(col + (row * gridDimensions) + offset); slotPacket.setItem(ingredients[index]); + slotPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(slotPacket); index++; } diff --git a/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java b/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java index d8c41d626d0..a0bd5a4c7a5 100644 --- a/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java @@ -32,6 +32,8 @@ import org.cloudburstmc.nbt.NbtType; import org.cloudburstmc.protocol.bedrock.data.definitions.ItemDefinition; import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerId; +import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.data.inventory.FullContainerName; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; import org.cloudburstmc.protocol.bedrock.packet.InventorySlotPacket; import org.cloudburstmc.protocol.bedrock.packet.PlayerHotbarPacket; @@ -180,6 +182,7 @@ public static void updateCursor(GeyserSession session) { cursorPacket.setContainerId(ContainerId.UI); cursorPacket.setSlot(0); cursorPacket.setItem(session.getPlayerInventory().getCursor().getItemData(session)); + cursorPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(cursorPacket); } From 2f977a58b3c76486c698b64ae5391bd5769d0d4c Mon Sep 17 00:00:00 2001 From: Roman Alexander Date: Mon, 16 Sep 2024 13:35:36 +0700 Subject: [PATCH 05/10] Split these into separate objects. Packets without sendPacketImmediately are unsafe for reuse. --- .../updater/CrafterInventoryUpdater.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java b/core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java index 4474d420ca5..d7d4a400bf2 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java @@ -26,6 +26,8 @@ package org.geysermc.geyser.inventory.updater; import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerId; +import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; +import org.cloudburstmc.protocol.bedrock.data.inventory.FullContainerName; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; import org.cloudburstmc.protocol.bedrock.packet.InventoryContentPacket; import org.cloudburstmc.protocol.bedrock.packet.InventorySlotPacket; @@ -47,7 +49,6 @@ public class CrafterInventoryUpdater extends InventoryUpdater { public void updateInventory(InventoryTranslator translator, GeyserSession session, Inventory inventory) { ItemData[] bedrockItems; InventoryContentPacket contentPacket; - // crafter grid - but excluding the result slot bedrockItems = new ItemData[CrafterInventoryTranslator.GRID_SIZE]; for (int i = 0; i < bedrockItems.length; i++) { @@ -56,18 +57,22 @@ public void updateInventory(InventoryTranslator translator, GeyserSession sessio contentPacket = new InventoryContentPacket(); contentPacket.setContainerId(inventory.getBedrockId()); contentPacket.setContents(Arrays.asList(bedrockItems)); + contentPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(contentPacket); // inventory and hotbar - bedrockItems = new ItemData[36]; + ItemData[] bedrockItems2; + InventoryContentPacket contentPacket2; + bedrockItems2 = new ItemData[36]; for (int i = 0; i < 36; i++) { final int offset = i < 9 ? 27 : -9; - bedrockItems[i] = inventory.getItem(CrafterInventoryTranslator.GRID_SIZE + i + offset).getItemData(session); + bedrockItems2[i] = inventory.getItem(CrafterInventoryTranslator.GRID_SIZE + i + offset).getItemData(session); } - contentPacket = new InventoryContentPacket(); - contentPacket.setContainerId(ContainerId.INVENTORY); - contentPacket.setContents(Arrays.asList(bedrockItems)); - session.sendUpstreamPacket(contentPacket); + contentPacket2 = new InventoryContentPacket(); + contentPacket2.setContainerId(ContainerId.INVENTORY); + contentPacket2.setContents(Arrays.asList(bedrockItems2)); + contentPacket2.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); + session.sendUpstreamPacket(contentPacket2); // Crafter result - it doesn't come after the grid, as explained elsewhere. updateSlot(translator, session, inventory, CrafterInventoryTranslator.JAVA_RESULT_SLOT); @@ -88,6 +93,7 @@ public boolean updateSlot(InventoryTranslator translator, GeyserSession session, packet.setContainerId(containerId); packet.setSlot(translator.javaSlotToBedrock(javaSlot)); packet.setItem(inventory.getItem(javaSlot).getItemData(session)); + packet.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); session.sendUpstreamPacket(packet); return true; } From 98e2005ea9338bf3b40153146f8e9b309b8f2f63 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Mon, 16 Sep 2024 14:25:04 -0400 Subject: [PATCH 06/10] Updates and fixes --- .../geysermc/geyser/network/CodecProcessor.java | 16 ++-------------- .../geysermc/geyser/network/GameProtocol.java | 6 +++--- .../inventory/InventoryTranslator.java | 4 ++-- gradle/libs.versions.toml | 6 +++--- 4 files changed, 10 insertions(+), 22 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java b/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java index fa4164c4116..5d10d12bd0f 100644 --- a/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java +++ b/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java @@ -33,7 +33,6 @@ import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.MobEquipmentSerializer_v291; import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.PlayerHotbarSerializer_v291; import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.SetEntityLinkSerializer_v291; -import org.cloudburstmc.protocol.bedrock.codec.v291.serializer.SetEntityMotionSerializer_v291; import org.cloudburstmc.protocol.bedrock.codec.v390.serializer.PlayerSkinSerializer_v390; import org.cloudburstmc.protocol.bedrock.codec.v407.serializer.InventoryContentSerializer_v407; import org.cloudburstmc.protocol.bedrock.codec.v407.serializer.InventorySlotSerializer_v407; @@ -45,8 +44,6 @@ import org.cloudburstmc.protocol.bedrock.codec.v712.serializer.MobArmorEquipmentSerializer_v712; import org.cloudburstmc.protocol.bedrock.codec.v729.serializer.InventoryContentSerializer_v729; import org.cloudburstmc.protocol.bedrock.codec.v729.serializer.InventorySlotSerializer_v729; -import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerSlotType; -import org.cloudburstmc.protocol.bedrock.data.inventory.FullContainerName; import org.cloudburstmc.protocol.bedrock.packet.AnvilDamagePacket; import org.cloudburstmc.protocol.bedrock.packet.BedrockPacket; import org.cloudburstmc.protocol.bedrock.packet.BossEventPacket; @@ -242,16 +239,7 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, SetEntityData }; /** - * Serializer that does nothing when trying to deserialize SetEntityMotionPacket since it is not used from the client for codec v291. - */ - private static final BedrockPacketSerializer SET_ENTITY_MOTION_SERIALIZER_V291 = new SetEntityMotionSerializer_v291() { - @Override - public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, SetEntityMotionPacket packet) { - } - }; - - /** - * Serializer that does nothing when trying to deserialize SetEntityMotionPacket since it is not used from the client for codec v662. + * Serializer that does nothing when trying to deserialize SetEntityMotionPacket since it is not used from the client. */ private static final BedrockPacketSerializer SET_ENTITY_MOTION_SERIALIZER = new SetEntityMotionSerializer_v662() { @Override @@ -337,7 +325,7 @@ static BedrockCodec processCodec(BedrockCodec codec) { .updateSerializer(InventorySlotPacket.class, inventorySlotPacketBedrockPacketSerializer) // Ignored only when serverbound .updateSerializer(BossEventPacket.class, BOSS_EVENT_SERIALIZER) - .updateSerializer(MobArmorEquipmentPacket.class, is712 ? MOB_ARMOR_EQUIPMENT_SERIALIZER_V291 : MOB_ARMOR_EQUIPMENT_SERIALIZER_V712) + .updateSerializer(MobArmorEquipmentPacket.class, is712 ? MOB_ARMOR_EQUIPMENT_SERIALIZER_V712 : MOB_ARMOR_EQUIPMENT_SERIALIZER_V291) .updateSerializer(PlayerHotbarPacket.class, PLAYER_HOTBAR_SERIALIZER) .updateSerializer(PlayerSkinPacket.class, PLAYER_SKIN_SERIALIZER) .updateSerializer(SetEntityDataPacket.class, SET_ENTITY_DATA_SERIALIZER) diff --git a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java index 2e0708e58db..06386f0c35c 100644 --- a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java +++ b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java @@ -66,9 +66,6 @@ public final class GameProtocol { private static final PacketCodec DEFAULT_JAVA_CODEC = MinecraftCodec.CODEC; static { - SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v712.CODEC.toBuilder() - .minecraftVersion("1.21.20/1.21.21") - .build())); SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v671.CODEC.toBuilder() .minecraftVersion("1.20.80/1.20.81") .build())); @@ -78,6 +75,9 @@ public final class GameProtocol { SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v686.CODEC.toBuilder() .minecraftVersion("1.21.2/1.21.3") .build())); + SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v712.CODEC.toBuilder() + .minecraftVersion("1.21.20 - 1.20.23") + .build())); SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC); } diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java index afa11c9827d..3338d2e52d6 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/InventoryTranslator.java @@ -981,11 +981,11 @@ protected final List makeContainerEntries(GeyserSess List containerEntries = new ArrayList<>(); for (Map.Entry> entry : containerMap.entrySet()) { - containerEntries.add(new ItemStackResponseContainer(entry.getKey(), entry.getValue(), new FullContainerName(entry.getKey(), 0))); + containerEntries.add(new ItemStackResponseContainer(entry.getKey(), entry.getValue(), new FullContainerName(entry.getKey(), null))); } ItemStackResponseSlot cursorEntry = makeItemEntry(0, session.getPlayerInventory().getCursor()); - containerEntries.add(new ItemStackResponseContainer(ContainerSlotType.CURSOR, Collections.singletonList(cursorEntry), new FullContainerName(ContainerSlotType.CURSOR, 0))); + containerEntries.add(new ItemStackResponseContainer(ContainerSlotType.CURSOR, Collections.singletonList(cursorEntry), new FullContainerName(ContainerSlotType.CURSOR, null))); return containerEntries; } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5c10852f239..2ff669803f9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,9 +10,9 @@ netty-io-uring = "0.0.25.Final-SNAPSHOT" guava = "29.0-jre" gson = "2.3.1" # Provided by Spigot 1.8.8 websocket = "1.5.1" -protocol-connection = "3.0.0.Beta5-20240915.165743-3" -protocol-common = "3.0.0.Beta5-20240915.165743-3" -protocol-codec = "3.0.0.Beta5-20240915.165743-3" +protocol-connection = "3.0.0.Beta5-20240916.181041-6" +protocol-common = "3.0.0.Beta5-20240916.181041-6" +protocol-codec = "3.0.0.Beta5-20240916.181041-6" raknet = "1.0.0.CR3-20240416.144209-1" minecraftauth = "4.1.1-20240806.235051-7" mcprotocollib = "1.21-20240725.013034-16" From b28644f7f2460ca5eddb3cf26885f921e6abc408 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Tue, 17 Sep 2024 00:22:40 -0400 Subject: [PATCH 07/10] Address reviews --- .../updater/CrafterInventoryUpdater.java | 16 +++---- .../geyser/network/CodecProcessor.java | 44 +++++++------------ .../geysermc/geyser/network/GameProtocol.java | 6 +-- .../populator/BlockRegistryPopulator.java | 21 ++++----- 4 files changed, 38 insertions(+), 49 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java b/core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java index d7d4a400bf2..377eb450dda 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java @@ -61,18 +61,16 @@ public void updateInventory(InventoryTranslator translator, GeyserSession sessio session.sendUpstreamPacket(contentPacket); // inventory and hotbar - ItemData[] bedrockItems2; - InventoryContentPacket contentPacket2; - bedrockItems2 = new ItemData[36]; + bedrockItems = new ItemData[36]; for (int i = 0; i < 36; i++) { final int offset = i < 9 ? 27 : -9; - bedrockItems2[i] = inventory.getItem(CrafterInventoryTranslator.GRID_SIZE + i + offset).getItemData(session); + bedrockItems[i] = inventory.getItem(CrafterInventoryTranslator.GRID_SIZE + i + offset).getItemData(session); } - contentPacket2 = new InventoryContentPacket(); - contentPacket2.setContainerId(ContainerId.INVENTORY); - contentPacket2.setContents(Arrays.asList(bedrockItems2)); - contentPacket2.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); - session.sendUpstreamPacket(contentPacket2); + contentPacket = new InventoryContentPacket(); + contentPacket.setContainerId(ContainerId.INVENTORY); + contentPacket.setContents(Arrays.asList(bedrockItems)); + contentPacket.setContainerNameData(new FullContainerName(ContainerSlotType.ANVIL_INPUT, null)); + session.sendUpstreamPacket(contentPacket); // Crafter result - it doesn't come after the grid, as explained elsewhere. updateSlot(translator, session, inventory, CrafterInventoryTranslator.JAVA_RESULT_SLOT); diff --git a/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java b/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java index 5d10d12bd0f..741369c4674 100644 --- a/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java +++ b/core/src/main/java/org/geysermc/geyser/network/CodecProcessor.java @@ -141,11 +141,6 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, InventoryCont }; private static final BedrockPacketSerializer INVENTORY_CONTENT_SERIALIZER_V729 = new InventoryContentSerializer_v729() { - @Override - public void serialize(ByteBuf buffer, BedrockCodecHelper helper, InventoryContentPacket packet) { - super.serialize(buffer, helper, packet); - } - @Override public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, InventoryContentPacket packet) { throw new IllegalArgumentException("Client cannot send InventoryContentPacket in server-auth inventory environment!"); @@ -173,11 +168,6 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, InventorySlot }; private static final BedrockPacketSerializer INVENTORY_SLOT_SERIALIZER_V729 = new InventorySlotSerializer_v729() { - @Override - public void serialize(ByteBuf buffer, BedrockCodecHelper helper, InventorySlotPacket packet) { - super.serialize(buffer, helper, packet); - } - @Override public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, InventorySlotPacket packet) { throw new IllegalArgumentException("Client cannot send InventorySlotPacket in server-auth inventory environment!"); @@ -272,25 +262,25 @@ public void deserialize(ByteBuf buffer, BedrockCodecHelper helper, MobEquipmentP @SuppressWarnings("unchecked") static BedrockCodec processCodec(BedrockCodec codec) { - boolean is729 = codec.getProtocolVersion() >= 729; - boolean is712 = codec.getProtocolVersion() >= 712; + boolean is729OrAbove = codec.getProtocolVersion() >= 729; + boolean is712OrAbove = codec.getProtocolVersion() >= 712; - BedrockPacketSerializer inventoryContentPacketBedrockPacketSerializer; - if (is729) { - inventoryContentPacketBedrockPacketSerializer = INVENTORY_CONTENT_SERIALIZER_V729; - } else if (is712) { - inventoryContentPacketBedrockPacketSerializer = INVENTORY_CONTENT_SERIALIZER_V712; + BedrockPacketSerializer inventoryContentSerializer; + if (is729OrAbove) { + inventoryContentSerializer = INVENTORY_CONTENT_SERIALIZER_V729; + } else if (is712OrAbove) { + inventoryContentSerializer = INVENTORY_CONTENT_SERIALIZER_V712; } else { - inventoryContentPacketBedrockPacketSerializer = INVENTORY_CONTENT_SERIALIZER_V407; + inventoryContentSerializer = INVENTORY_CONTENT_SERIALIZER_V407; } - BedrockPacketSerializer inventorySlotPacketBedrockPacketSerializer; - if (is729) { - inventorySlotPacketBedrockPacketSerializer = INVENTORY_SLOT_SERIALIZER_V729; - } else if (is712) { - inventorySlotPacketBedrockPacketSerializer = INVENTORY_SLOT_SERIALIZER_V712; + BedrockPacketSerializer inventorySlotSerializer; + if (is729OrAbove) { + inventorySlotSerializer = INVENTORY_SLOT_SERIALIZER_V729; + } else if (is712OrAbove) { + inventorySlotSerializer = INVENTORY_SLOT_SERIALIZER_V712; } else { - inventorySlotPacketBedrockPacketSerializer = INVENTORY_SLOT_SERIALIZER_V407; + inventorySlotSerializer = INVENTORY_SLOT_SERIALIZER_V407; } BedrockCodec.Builder codecBuilder = codec.toBuilder() @@ -321,11 +311,11 @@ static BedrockCodec processCodec(BedrockCodec codec) { .updateSerializer(AnvilDamagePacket.class, IGNORED_SERIALIZER) .updateSerializer(RefreshEntitlementsPacket.class, IGNORED_SERIALIZER) // Illegal when serverbound due to Geyser specific setup - .updateSerializer(InventoryContentPacket.class, inventoryContentPacketBedrockPacketSerializer) - .updateSerializer(InventorySlotPacket.class, inventorySlotPacketBedrockPacketSerializer) + .updateSerializer(InventoryContentPacket.class, inventoryContentSerializer) + .updateSerializer(InventorySlotPacket.class, inventorySlotSerializer) // Ignored only when serverbound .updateSerializer(BossEventPacket.class, BOSS_EVENT_SERIALIZER) - .updateSerializer(MobArmorEquipmentPacket.class, is712 ? MOB_ARMOR_EQUIPMENT_SERIALIZER_V712 : MOB_ARMOR_EQUIPMENT_SERIALIZER_V291) + .updateSerializer(MobArmorEquipmentPacket.class, is712OrAbove ? MOB_ARMOR_EQUIPMENT_SERIALIZER_V712 : MOB_ARMOR_EQUIPMENT_SERIALIZER_V291) .updateSerializer(PlayerHotbarPacket.class, PLAYER_HOTBAR_SERIALIZER) .updateSerializer(PlayerSkinPacket.class, PLAYER_SKIN_SERIALIZER) .updateSerializer(SetEntityDataPacket.class, SET_ENTITY_DATA_SERIALIZER) diff --git a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java index 06386f0c35c..cfbb1be48be 100644 --- a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java +++ b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java @@ -50,9 +50,9 @@ public final class GameProtocol { * Default Bedrock codec that should act as a fallback. Should represent the latest available * release of the game that Geyser supports. */ - public static final BedrockCodec DEFAULT_BEDROCK_CODEC = CodecProcessor.processCodec(CodecProcessor.processCodec(Bedrock_v729.CODEC.toBuilder() - .minecraftVersion("1.21.30") - .build())); + public static final BedrockCodec DEFAULT_BEDROCK_CODEC = CodecProcessor.processCodec(Bedrock_v729.CODEC.toBuilder() + .minecraftVersion("1.21.30") + .build()); /** * A list of all supported Bedrock versions that can join Geyser 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 eb8880ae153..9603cba6377 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 @@ -113,35 +113,36 @@ private static void registerBedrockBlocks() { .put(ObjectIntPair.of("1_21_0", Bedrock_v685.CODEC.getProtocolVersion()), Conversion712_685::remapBlock) .put(ObjectIntPair.of("1_21_20", Bedrock_v712.CODEC.getProtocolVersion()), Conversion729_712::remapBlock) .put(ObjectIntPair.of("1_21_30", Bedrock_v729.CODEC.getProtocolVersion()), tag -> { // TODO: Remove me when mappings is updated - if(Objects.equals(tag.getString("name"), "minecraft:sponge")) { + String name = tag.getString("name"); + if ("minecraft:sponge".equals(name)) { NbtMapBuilder builder = tag.getCompound("states").toBuilder(); builder.remove("sponge_type"); NbtMap states = builder.build(); - return tag.toBuilder().putString("name", "minecraft:sponge").putCompound("states", states).build(); + return tag.toBuilder().putCompound("states", states).build(); } - if(Objects.equals(tag.getString("name"), "minecraft:tnt")) { + if ("minecraft:tnt".equals(name)) { NbtMapBuilder builder = tag.getCompound("states").toBuilder(); builder.remove("allow_underwater_bit"); NbtMap states = builder.build(); - return tag.toBuilder().putString("name", "minecraft:tnt").putCompound("states", states).build(); + return tag.toBuilder().putCompound("states", states).build(); } - if(Objects.equals(tag.getString("name"), "minecraft:cobblestone_wall")) { + if ("minecraft:cobblestone_wall".equals(name)) { NbtMapBuilder builder = tag.getCompound("states").toBuilder(); builder.remove("wall_block_type"); NbtMap states = builder.build(); - return tag.toBuilder().putString("name", "minecraft:cobblestone_wall").putCompound("states", states).build(); + return tag.toBuilder().putCompound("states", states).build(); } - if(Objects.equals(tag.getString("name"), "minecraft:purpur_block")) { + if ("minecraft:purpur_block".equals(name)) { NbtMapBuilder builder = tag.getCompound("states").toBuilder(); builder.remove("chisel_type"); NbtMap states = builder.build(); - return tag.toBuilder().putString("name", "minecraft:purpur_block").putCompound("states", states).build(); + return tag.toBuilder().putCompound("states", states).build(); } - if(Objects.equals(tag.getString("name"), "minecraft:structure_void")) { + if ("minecraft:structure_void".equals(name)) { NbtMapBuilder builder = tag.getCompound("states").toBuilder(); builder.remove("structure_void_type"); NbtMap states = builder.build(); - return tag.toBuilder().putString("name", "minecraft:structure_void").putCompound("states", states).build(); + return tag.toBuilder().putCompound("states", states).build(); } return tag; }) From 9d88f49dc1170b4e6c67d5245778a0fe26744e00 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Tue, 17 Sep 2024 01:45:25 -0400 Subject: [PATCH 08/10] Revert attribute change to Java default --- .../geysermc/geyser/entity/attribute/GeyserAttributeType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/geysermc/geyser/entity/attribute/GeyserAttributeType.java b/core/src/main/java/org/geysermc/geyser/entity/attribute/GeyserAttributeType.java index 5fe27d483b3..1e050c84044 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/attribute/GeyserAttributeType.java +++ b/core/src/main/java/org/geysermc/geyser/entity/attribute/GeyserAttributeType.java @@ -37,7 +37,7 @@ public enum GeyserAttributeType { // Universal Attributes FOLLOW_RANGE("minecraft:generic.follow_range", "minecraft:follow_range", 0f, 2048f, 32f), KNOCKBACK_RESISTANCE("minecraft:generic.knockback_resistance", "minecraft:knockback_resistance", 0f, 1f, 0f), - MOVEMENT_SPEED("minecraft:generic.movement_speed", "minecraft:movement", 0f, Float.MAX_VALUE, 0.1f), + MOVEMENT_SPEED("minecraft:generic.movement_speed", "minecraft:movement", 0f, 1024f, 0.1f), FLYING_SPEED("minecraft:generic.flying_speed", "minecraft:movement", 0.0f, 1024.0f, 0.4000000059604645f), ATTACK_DAMAGE("minecraft:generic.attack_damage", "minecraft:attack_damage", 0f, 2048f, 1f), HORSE_JUMP_STRENGTH("minecraft:horse.jump_strength", "minecraft:horse.jump_strength", 0.0f, 2.0f, 0.7f), From 0f7e75e15de71afb76e347ac022744f1a36fed73 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Tue, 17 Sep 2024 11:28:22 -0400 Subject: [PATCH 09/10] Fix typo; add spacing --- .../geyser/inventory/updater/CrafterInventoryUpdater.java | 1 + .../src/main/java/org/geysermc/geyser/network/GameProtocol.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java b/core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java index 377eb450dda..0e08e0a09df 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java @@ -49,6 +49,7 @@ public class CrafterInventoryUpdater extends InventoryUpdater { public void updateInventory(InventoryTranslator translator, GeyserSession session, Inventory inventory) { ItemData[] bedrockItems; InventoryContentPacket contentPacket; + // crafter grid - but excluding the result slot bedrockItems = new ItemData[CrafterInventoryTranslator.GRID_SIZE]; for (int i = 0; i < bedrockItems.length; i++) { diff --git a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java index cfbb1be48be..d3abf934fbe 100644 --- a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java +++ b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java @@ -76,7 +76,7 @@ public final class GameProtocol { .minecraftVersion("1.21.2/1.21.3") .build())); SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v712.CODEC.toBuilder() - .minecraftVersion("1.21.20 - 1.20.23") + .minecraftVersion("1.21.20 - 1.21.23") .build())); SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC); } From a504da9df4f96ceb5df6d913ed3f591387e4994b Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Tue, 17 Sep 2024 11:33:00 -0400 Subject: [PATCH 10/10] Bump to 2.4.3 --- .../geyser/inventory/updater/CrafterInventoryUpdater.java | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java b/core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java index 0e08e0a09df..315b84c6d8e 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/updater/CrafterInventoryUpdater.java @@ -49,7 +49,7 @@ public class CrafterInventoryUpdater extends InventoryUpdater { public void updateInventory(InventoryTranslator translator, GeyserSession session, Inventory inventory) { ItemData[] bedrockItems; InventoryContentPacket contentPacket; - + // crafter grid - but excluding the result slot bedrockItems = new ItemData[CrafterInventoryTranslator.GRID_SIZE]; for (int i = 0; i < bedrockItems.length; i++) { diff --git a/gradle.properties b/gradle.properties index dd1bc915a78..1ee0e12ccef 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,5 +8,5 @@ org.gradle.vfs.watch=false group=org.geysermc id=geyser -version=2.4.2-SNAPSHOT +version=2.4.3-SNAPSHOT description=Allows for players from Minecraft: Bedrock Edition to join Minecraft: Java Edition servers.