diff --git a/README.md b/README.md index 5a734f18b..aea70840e 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The ultimate goal of this project is to allow Minecraft: Bedrock Edition users t Special thanks to the DragonProxy project for being a trailblazer in protocol translation and for all the team members who have joined us here! ## Supported Versions -Geyser is currently supporting Minecraft Bedrock 1.21.90 - 1.21.124 and Minecraft Java 1.21.9 - 1.21.10. For more information, please see [here](https://geysermc.org/wiki/geyser/supported-versions/). +Geyser is currently supporting Minecraft Bedrock 1.21.90 - 1.21.130 and Minecraft Java 1.21.9 - 1.21.10. For more information, please see [here](https://geysermc.org/wiki/geyser/supported-versions/). ## Setting Up Take a look [here](https://geysermc.org/wiki/geyser/setup/) for how to set up Geyser. diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/BoatEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/BoatEntity.java index 3b77b1eec..9652f481a 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/BoatEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/BoatEntity.java @@ -29,7 +29,6 @@ import lombok.Getter; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; -import org.cloudburstmc.protocol.bedrock.packet.AnimatePacket; import org.cloudburstmc.protocol.bedrock.packet.MoveEntityAbsolutePacket; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinitions; @@ -220,14 +219,6 @@ public class BoatEntity extends Entity implements Leashable, Tickable { return leashHolderBedrockId; } - private void sendAnimationPacket(GeyserSession session, Entity rower, AnimatePacket.Action action, float rowTime) { - AnimatePacket packet = new AnimatePacket(); - packet.setRuntimeEntityId(rower.getGeyserId()); - packet.setAction(action); - packet.setRowingTime(rowTime); - session.sendUpstreamPacket(packet); - } - /** * Ordered by Bedrock ordinal */ diff --git a/core/src/main/java/org/geysermc/geyser/level/block/GeyserCustomBlockComponents.java b/core/src/main/java/org/geysermc/geyser/level/block/GeyserCustomBlockComponents.java index 979d3bc7d..f1f62da40 100644 --- a/core/src/main/java/org/geysermc/geyser/level/block/GeyserCustomBlockComponents.java +++ b/core/src/main/java/org/geysermc/geyser/level/block/GeyserCustomBlockComponents.java @@ -168,7 +168,7 @@ public class GeyserCustomBlockComponents implements CustomBlockComponents { protected boolean placeAir = false; protected Set tags = new HashSet<>(); - private void validateBox(BoxComponent box) { + private void validateBox(BoxComponent box, boolean collision) { if (box == null) { return; } @@ -181,21 +181,28 @@ public class GeyserCustomBlockComponents implements CustomBlockComponents { float maxX = minX + box.sizeX(); float maxY = minY + box.sizeY(); float maxZ = minZ + box.sizeZ(); - if (minX < 0 || minY < 0 || minZ < 0 || maxX > 16 || maxY > 16 || maxZ > 16) { - throw new IllegalArgumentException("Box bounds must be within (0, 0, 0) and (16, 16, 16). Recieved: (" + minX + ", " + minY + ", " + minZ + ") to (" + maxX + ", " + maxY + ", " + maxZ + ")"); + if (collision) { + // Since 1.21.130, max y of collisions is 24 + if (minX < 0 || minY < 0 || minZ < 0 || maxX > 16 || maxY > 24 || maxZ > 16) { + throw new IllegalArgumentException("Collision box bounds must be within (0, 0, 0) and (16, 24, 16). Received: (" + minX + ", " + minY + ", " + minZ + ") to (" + maxX + ", " + maxY + ", " + maxZ + ")"); + } + } else { + if (minX < 0 || minY < 0 || minZ < 0 || maxX > 16 || maxY > 16 || maxZ > 16) { + throw new IllegalArgumentException("Box bounds must be within (0, 0, 0) and (16, 16, 16). Received: (" + minX + ", " + minY + ", " + minZ + ") to (" + maxX + ", " + maxY + ", " + maxZ + ")"); + } } } @Override public Builder selectionBox(BoxComponent selectionBox) { - validateBox(selectionBox); + validateBox(selectionBox, false); this.selectionBox = selectionBox; return this; } @Override public Builder collisionBox(BoxComponent collisionBox) { - validateBox(collisionBox); + validateBox(collisionBox, true); this.collisionBox = collisionBox; return this; } 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 d4f427124..35902368d 100644 --- a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java +++ b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java @@ -34,6 +34,8 @@ import org.cloudburstmc.protocol.bedrock.codec.v819.Bedrock_v819; import org.cloudburstmc.protocol.bedrock.codec.v827.Bedrock_v827; import org.cloudburstmc.protocol.bedrock.codec.v844.Bedrock_v844; import org.cloudburstmc.protocol.bedrock.codec.v859.Bedrock_v859; +import org.cloudburstmc.protocol.bedrock.codec.v860.Bedrock_v860; +import org.cloudburstmc.protocol.bedrock.codec.v897.Bedrock_v897; import org.cloudburstmc.protocol.bedrock.netty.codec.packet.BedrockPacketCodec; import org.geysermc.geyser.api.util.MinecraftVersion; import org.geysermc.geyser.impl.MinecraftVersionImpl; @@ -89,7 +91,8 @@ public final class GameProtocol { register(Bedrock_v827.CODEC, "1.21.100", "1.21.101"); register(Bedrock_v844.CODEC, "1.21.111", "1.21.112", "1.21.113", "1.21.114"); register(Bedrock_v859.CODEC, "1.21.120", "1.21.121", "1.21.122", "1.21.123"); - register(Bedrock_v859.CODEC.toBuilder().protocolVersion(860).minecraftVersion("1.21.124").build()); + register(Bedrock_v860.CODEC); + register(Bedrock_v897.CODEC); MinecraftVersion latestBedrock = SUPPORTED_BEDROCK_VERSIONS.get(SUPPORTED_BEDROCK_VERSIONS.size() - 1); DEFAULT_BEDROCK_VERSION = latestBedrock.versionString(); @@ -153,6 +156,10 @@ public final class GameProtocol { return protocolVersion >= Bedrock_v844.CODEC.getProtocolVersion(); } + public static boolean is1_21_130orHigher(int protocolVersion) { + return protocolVersion >= Bedrock_v897.CODEC.getProtocolVersion(); + } + /** * Gets the supported Minecraft: Java Edition version names. * 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 e4296d7fa..14c825908 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 @@ -49,6 +49,8 @@ import org.cloudburstmc.protocol.bedrock.codec.v819.Bedrock_v819; import org.cloudburstmc.protocol.bedrock.codec.v827.Bedrock_v827; import org.cloudburstmc.protocol.bedrock.codec.v844.Bedrock_v844; import org.cloudburstmc.protocol.bedrock.codec.v859.Bedrock_v859; +import org.cloudburstmc.protocol.bedrock.codec.v860.Bedrock_v860; +import org.cloudburstmc.protocol.bedrock.codec.v897.Bedrock_v897; import org.cloudburstmc.protocol.bedrock.data.BlockPropertyData; import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition; import org.geysermc.geyser.GeyserImpl; @@ -129,7 +131,9 @@ public final class BlockRegistryPopulator { .put(ObjectIntPair.of("1_21_110", Bedrock_v844.CODEC.getProtocolVersion()), tag -> tag) // 1.21.110 -> 1.21.12x doesn't change the block palette .put(ObjectIntPair.of("1_21_110", Bedrock_v859.CODEC.getProtocolVersion()), tag -> tag) - .put(ObjectIntPair.of("1_21_110", 860), tag -> tag) + .put(ObjectIntPair.of("1_21_110", Bedrock_v860.CODEC.getProtocolVersion()), tag -> tag) + // No changes in .130 block palette either! + .put(ObjectIntPair.of("1_21_110", Bedrock_v897.CODEC.getProtocolVersion()), tag -> 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/CustomBlockRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/CustomBlockRegistryPopulator.java index 665ab9cd0..4a0ecd219 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/CustomBlockRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/CustomBlockRegistryPopulator.java @@ -419,12 +419,14 @@ public class CustomBlockRegistryPopulator { .build()); } - if (components.selectionBox() != null) { - builder.putCompound("minecraft:selection_box", convertBox(components.selectionBox())); + BoxComponent selectionBox = components.selectionBox(); + if (selectionBox != null) { + builder.putCompound("minecraft:selection_box", convertBox(selectionBox)); } - if (components.collisionBox() != null) { - builder.putCompound("minecraft:collision_box", convertBox(components.collisionBox())); + BoxComponent collisionBox = components.collisionBox(); + if (collisionBox != null) { + builder.putCompound("minecraft:collision_box", convertCollisionBox(collisionBox, protocolVersion)); } if (components.geometry() != null) { @@ -541,6 +543,32 @@ public class CustomBlockRegistryPopulator { return builder.build(); } + /** + * Converts the provided COLLISION box component to an {@link NbtMap} + * + * @param boxComponent the box component to convert + * @return the NBT representation of the provided box component + */ + private static NbtMap convertCollisionBox(BoxComponent boxComponent, int protocolVersion) { + if (GameProtocol.is1_21_130orHigher(protocolVersion)) { + float minX = 8f + boxComponent.originX(); + float minY = boxComponent.originY(); + float minZ = 8f + boxComponent.originZ(); + return NbtMap.builder() + .putBoolean("enabled", !boxComponent.isEmpty()) + .putList("boxes", NbtType.COMPOUND, NbtMap.builder() + .putFloat("minX", minX) + .putFloat("minY", minY) + .putFloat("minZ", minZ) + .putFloat("maxX", minX + boxComponent.sizeX()) + .putFloat("maxY", minY + boxComponent.sizeY()) + .putFloat("maxZ", minZ + boxComponent.sizeZ()) + .build()).build(); + } else { + return convertBox(boxComponent); + } + } + /** * Converts the provided box component to an {@link NbtMap} * @@ -551,7 +579,8 @@ public class CustomBlockRegistryPopulator { return NbtMap.builder() .putBoolean("enabled", !boxComponent.isEmpty()) .putList("origin", NbtType.FLOAT, boxComponent.originX(), boxComponent.originY(), boxComponent.originZ()) - .putList("size", NbtType.FLOAT, boxComponent.sizeX(), boxComponent.sizeY(), boxComponent.sizeZ()) + // TODO remove after 1.21.130 - collision boxes sent to below 1.21.130 must be capped + .putList("size", NbtType.FLOAT, boxComponent.sizeX(), Math.min(boxComponent.sizeY(), 16), boxComponent.sizeZ()) .build(); } 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 e68783e49..253748c1d 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 @@ -50,6 +50,8 @@ import org.cloudburstmc.protocol.bedrock.codec.v819.Bedrock_v819; import org.cloudburstmc.protocol.bedrock.codec.v827.Bedrock_v827; import org.cloudburstmc.protocol.bedrock.codec.v844.Bedrock_v844; import org.cloudburstmc.protocol.bedrock.codec.v859.Bedrock_v859; +import org.cloudburstmc.protocol.bedrock.codec.v860.Bedrock_v860; +import org.cloudburstmc.protocol.bedrock.codec.v897.Bedrock_v897; import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition; import org.cloudburstmc.protocol.bedrock.data.definitions.ItemDefinition; import org.cloudburstmc.protocol.bedrock.data.definitions.SimpleItemDefinition; @@ -200,7 +202,8 @@ public class ItemRegistryPopulator { paletteVersions.add(new PaletteVersion("1_21_100", Bedrock_v827.CODEC.getProtocolVersion(), eightTwoSevenFallbacks, Conversion844_827::remapItem)); paletteVersions.add(new PaletteVersion("1_21_110", Bedrock_v844.CODEC.getProtocolVersion())); paletteVersions.add(new PaletteVersion("1_21_120", Bedrock_v859.CODEC.getProtocolVersion())); - paletteVersions.add(new PaletteVersion("1_21_120", 860)); + paletteVersions.add(new PaletteVersion("1_21_120", Bedrock_v860.CODEC.getProtocolVersion())); + paletteVersions.add(new PaletteVersion("1_21_130", Bedrock_v897.CODEC.getProtocolVersion())); GeyserBootstrap bootstrap = GeyserImpl.getInstance().getBootstrap(); diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/TagRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/TagRegistryPopulator.java index a27a83176..cc2c76876 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/TagRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/TagRegistryPopulator.java @@ -37,6 +37,7 @@ import org.cloudburstmc.protocol.bedrock.codec.v818.Bedrock_v818; import org.cloudburstmc.protocol.bedrock.codec.v819.Bedrock_v819; import org.cloudburstmc.protocol.bedrock.codec.v827.Bedrock_v827; import org.cloudburstmc.protocol.bedrock.codec.v844.Bedrock_v844; +import org.cloudburstmc.protocol.bedrock.codec.v859.Bedrock_v859; import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.item.type.Item; @@ -73,7 +74,9 @@ public final class TagRegistryPopulator { // Not a typo, it's the same file ObjectIntPair.of("1_21_90", Bedrock_v819.CODEC.getProtocolVersion()), ObjectIntPair.of("1_21_100", Bedrock_v827.CODEC.getProtocolVersion()), - ObjectIntPair.of("1_21_110", Bedrock_v844.CODEC.getProtocolVersion()) + ObjectIntPair.of("1_21_110", Bedrock_v844.CODEC.getProtocolVersion()), + ObjectIntPair.of("1_21_120", Bedrock_v859.CODEC.getProtocolVersion()) + // TODO .130! ); Type type = new TypeToken>>() {}.getType(); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java index 8602d37dc..8416e9ff0 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java @@ -43,6 +43,7 @@ import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.event.java.ServerDefineCommandsEvent; import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.command.CommandRegistry; +import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.session.GeyserSession; @@ -123,7 +124,7 @@ public class JavaCommandsTranslator extends PacketTranslator