diff --git a/build-logic/src/main/kotlin/geyser.base-conventions.gradle.kts b/build-logic/src/main/kotlin/geyser.base-conventions.gradle.kts index d6f6f175a..107068819 100644 --- a/build-logic/src/main/kotlin/geyser.base-conventions.gradle.kts +++ b/build-logic/src/main/kotlin/geyser.base-conventions.gradle.kts @@ -26,7 +26,7 @@ dependencies { } repositories { - mavenLocal() + // mavenLocal() mavenCentral() diff --git a/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java b/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java index dbd880adc..e0e8b94d8 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java +++ b/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java @@ -655,7 +655,7 @@ public final class EntityDefinitions { .addTranslator(MetadataTypes.ROTATIONS, ArmorStandEntity::setRightLegRotation) .build(); - EntityDefinition avatarEntityBase = EntityDefinition.inherited(AvatarEntity::new, livingEntityBase) + EntityDefinition avatarEntityBase = EntityDefinition.inherited(null, livingEntityBase) .height(1.8f).width(0.6f) .offset(1.62f) .addTranslator(null) // Player main hand diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/player/AvatarEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/player/AvatarEntity.java index c41f5362a..b2fd4f0c8 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/player/AvatarEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/player/AvatarEntity.java @@ -25,6 +25,8 @@ package org.geysermc.geyser.entity.type.player; +import lombok.Getter; +import lombok.Setter; import net.kyori.adventure.text.Component; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -59,17 +61,21 @@ public class AvatarEntity extends LivingEntity { public static final float SNEAKING_POSE_HEIGHT = 1.5f; protected static final List BASE_ABILITY_LAYER; + @Getter protected String username; /** * The textures property from the GameProfile. */ + @Getter + @Setter @Nullable - protected String texturesProperty; + protected String texturesProperty; // TODO no direct setter, rather one that updates the skin private String cachedScore = ""; private boolean scoreVisible = true; + @Getter @Nullable private Vector3i bedPosition; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/player/PlayerEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/player/PlayerEntity.java index 75614454c..4e1eb2dcb 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/player/PlayerEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/player/PlayerEntity.java @@ -209,6 +209,10 @@ public class PlayerEntity extends AvatarEntity implements GeyserPlayerEntity { super.setNametag(nametag, fromDisplayName); } + public void setUsername(String username) { + this.username = username; + } + /** * @return the UUID that should be used when dealing with Bedrock's tab list. */ 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 b68d3cfd7..e2b65eb0c 100644 --- a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java +++ b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java @@ -166,7 +166,7 @@ public final class GameProtocol { * @return the supported Minecraft: Java Edition version */ public static String getJavaMinecraftVersion() { - return "1.21.9-pre4"; // TODO change to 1.21.9 + return "1.21.9-rc1"; // TODO change to 1.21.9 } /** diff --git a/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java b/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java index 73db9e243..e8c6745c8 100644 --- a/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java +++ b/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java @@ -151,14 +151,14 @@ public class UpstreamPacketHandler extends LoggingPacketHandler { } @Override - public void onDisconnect(String reason) { + public void onDisconnect(CharSequence reason) { // Use our own disconnect messages for these reasons - if (BedrockDisconnectReasons.CLOSED.equals(reason)) { + if (BedrockDisconnectReasons.CLOSED.contentEquals(reason)) { this.session.getUpstream().getSession().setDisconnectReason(GeyserLocale.getLocaleStringLog("geyser.network.disconnect.closed_by_remote_peer")); - } else if (BedrockDisconnectReasons.TIMEOUT.equals(reason)) { + } else if (BedrockDisconnectReasons.TIMEOUT.contentEquals(reason)) { this.session.getUpstream().getSession().setDisconnectReason(GeyserLocale.getLocaleStringLog("geyser.network.disconnect.timed_out")); } - this.session.disconnect(this.session.getUpstream().getSession().getDisconnectReason()); + this.session.disconnect(this.session.getUpstream().getSession().getDisconnectReason().toString()); } @Override diff --git a/core/src/main/java/org/geysermc/geyser/skin/FakeHeadProvider.java b/core/src/main/java/org/geysermc/geyser/skin/FakeHeadProvider.java index 9011fdc60..4ca5f14eb 100644 --- a/core/src/main/java/org/geysermc/geyser/skin/FakeHeadProvider.java +++ b/core/src/main/java/org/geysermc/geyser/skin/FakeHeadProvider.java @@ -39,7 +39,7 @@ import org.geysermc.geyser.api.skin.Skin; import org.geysermc.geyser.api.skin.SkinData; import org.geysermc.geyser.api.skin.SkinGeometry; import org.geysermc.geyser.entity.type.LivingEntity; -import org.geysermc.geyser.entity.type.player.PlayerEntity; +import org.geysermc.geyser.entity.type.player.AvatarEntity; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.mcprotocollib.auth.GameProfile; @@ -100,7 +100,7 @@ public class FakeHeadProvider { } }); - public static void setHead(GeyserSession session, PlayerEntity entity, @Nullable ResolvableProfile profile) { + public static void setHead(GeyserSession session, AvatarEntity entity, @Nullable ResolvableProfile profile) { if (profile == null) { return; } @@ -120,7 +120,7 @@ public class FakeHeadProvider { }); } - private static void loadHeadFromProfile(GeyserSession session, PlayerEntity entity, ResolvableProfile original, GameProfile resolved) { + private static void loadHeadFromProfile(GeyserSession session, AvatarEntity entity, ResolvableProfile original, GameProfile resolved) { Texture skinTexture = SkinManager.getTextureDataFromProfile(resolved, TextureType.SKIN); String originalTextures = entity.getTexturesProperty(); if (skinTexture != null) { @@ -137,7 +137,7 @@ public class FakeHeadProvider { } public static void restoreOriginalSkin(GeyserSession session, LivingEntity livingEntity) { - if (!(livingEntity instanceof PlayerEntity entity)) { + if (!(livingEntity instanceof AvatarEntity entity)) { return; } @@ -161,7 +161,7 @@ public class FakeHeadProvider { private static class FakeHeadEntry { private final String texturesProperty; private final String fakeHeadSkinUrl; - private PlayerEntity entity; + private AvatarEntity entity; private GeyserSession session; @Override diff --git a/core/src/main/java/org/geysermc/geyser/skin/SkinManager.java b/core/src/main/java/org/geysermc/geyser/skin/SkinManager.java index c7aae7f3d..d89faf4bb 100644 --- a/core/src/main/java/org/geysermc/geyser/skin/SkinManager.java +++ b/core/src/main/java/org/geysermc/geyser/skin/SkinManager.java @@ -40,7 +40,7 @@ import org.geysermc.geyser.api.skin.Cape; import org.geysermc.geyser.api.skin.Skin; import org.geysermc.geyser.api.skin.SkinData; import org.geysermc.geyser.api.skin.SkinGeometry; -import org.geysermc.geyser.entity.type.player.PlayerEntity; +import org.geysermc.geyser.entity.type.player.AvatarEntity; import org.geysermc.geyser.entity.type.player.SkullPlayerEntity; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.auth.BedrockClientData; @@ -73,7 +73,7 @@ public class SkinManager { /** * Builds a Bedrock player list entry from our existing, cached Bedrock skin information */ - public static PlayerListPacket.Entry buildCachedEntry(GeyserSession session, PlayerEntity playerEntity) { + public static PlayerListPacket.Entry buildCachedEntry(GeyserSession session, AvatarEntity playerEntity) { // First: see if we have the cached skin texture ID. GameProfileData data = GameProfileData.from(playerEntity); Skin skin = null; @@ -156,7 +156,7 @@ public class SkinManager { return entry; } - public static void sendSkinPacket(GeyserSession session, PlayerEntity entity, SkinData skinData) { + public static void sendSkinPacket(GeyserSession session, AvatarEntity entity, SkinData skinData) { Skin skin = skinData.skin(); Cape cape = skinData.cape(); SkinGeometry geometry = skinData.geometry(); @@ -278,7 +278,7 @@ public class SkinManager { return textures.get(type); } - public static void requestAndHandleSkinAndCape(PlayerEntity entity, GeyserSession session, + public static void requestAndHandleSkinAndCape(AvatarEntity entity, GeyserSession session, Consumer skinAndCapeConsumer) { SkinProvider.requestSkinData(entity, session).whenCompleteAsync((skinData, throwable) -> { if (skinData == null) { @@ -299,7 +299,7 @@ public class SkinManager { }); } - public static void handleBedrockSkin(PlayerEntity playerEntity, BedrockClientData clientData) { + public static void handleBedrockSkin(AvatarEntity playerEntity, BedrockClientData clientData) { GeyserImpl geyser = GeyserImpl.getInstance(); if (geyser.getConfig().isDebugMode()) { geyser.getLogger().info(GeyserLocale.getLocaleStringLog("geyser.skin.bedrock.register", playerEntity.getUsername(), playerEntity.getUuid())); @@ -370,7 +370,7 @@ public class SkinManager { * @param entity entity to build the GameProfileData from * @return The built GameProfileData */ - public static @Nullable GameProfileData from(PlayerEntity entity) { + public static @Nullable GameProfileData from(AvatarEntity entity) { String texturesProperty = entity.getTexturesProperty(); if (texturesProperty == null) { // Likely offline mode diff --git a/core/src/main/java/org/geysermc/geyser/skin/SkinProvider.java b/core/src/main/java/org/geysermc/geyser/skin/SkinProvider.java index 88ade3547..ec88f6e93 100644 --- a/core/src/main/java/org/geysermc/geyser/skin/SkinProvider.java +++ b/core/src/main/java/org/geysermc/geyser/skin/SkinProvider.java @@ -38,7 +38,7 @@ import org.geysermc.geyser.api.skin.Cape; import org.geysermc.geyser.api.skin.Skin; import org.geysermc.geyser.api.skin.SkinData; import org.geysermc.geyser.api.skin.SkinGeometry; -import org.geysermc.geyser.entity.type.player.PlayerEntity; +import org.geysermc.geyser.entity.type.player.AvatarEntity; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.util.FileUtils; @@ -236,7 +236,7 @@ public class SkinProvider { return CACHED_JAVA_CAPES.getIfPresent(capeUrl); } - static CompletableFuture requestSkinData(PlayerEntity entity, GeyserSession session) { + static CompletableFuture requestSkinData(AvatarEntity entity, GeyserSession session) { SkinManager.GameProfileData data = SkinManager.GameProfileData.from(entity); if (data == null) { // This player likely does not have a textures property diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SkullBlockEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SkullBlockEntityTranslator.java index 7c5893e91..9c9e61454 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SkullBlockEntityTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SkullBlockEntityTranslator.java @@ -86,7 +86,7 @@ public class SkullBlockEntityTranslator extends BlockEntityTranslator implements partialOrStatic.setProperties(properties); // Only if all fields are present, then the profile is a static one // TODO shorthand constructor in MCPL - return new ResolvableProfile(partialOrStatic, uuid == null || name == null || properties == null); + return new ResolvableProfile(partialOrStatic); } public static @Nullable BlockDefinition translateSkull(GeyserSession session, NbtMap javaNbt, Vector3i blockPosition, BlockState blockState) { diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaSetDefaultSpawnPositionTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaSetDefaultSpawnPositionTranslator.java index 1fb12d209..f6e6ac53e 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaSetDefaultSpawnPositionTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaSetDefaultSpawnPositionTranslator.java @@ -38,8 +38,8 @@ public class JavaSetDefaultSpawnPositionTranslator extends PacketTranslator BedrockDimension.BEDROCK_NETHER_ID; diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 09dd38615..68aa59f1d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,12 +9,12 @@ netty = "4.2.3.Final" guava = "29.0-jre" gson = "2.3.1" # Provided by Spigot 1.8.8 websocket = "1.5.1" -protocol-connection = "3.0.0.Beta8-NO-ADVENTURE-SNAPSHOT" -protocol-common = "3.0.0.Beta8-NO-ADVENTURE-SNAPSHOT" -protocol-codec = "3.0.0.Beta8-NO-ADVENTURE-SNAPSHOT" +protocol-connection = "3.0.0.Beta8-20250929.100800-7" +protocol-common = "3.0.0.Beta8-20250929.100800-7" +protocol-codec = "3.0.0.Beta8-20250929.100800-7" raknet = "1.0.0.CR3-20250811.214335-20" minecraftauth = "4.1.1" -mcprotocollib = "1.21.9-SNAPSHOT" +mcprotocollib = "1.21.9-20250929.132357-8" adventure = "4.24.0" adventure-platform = "4.3.0" junit = "5.9.2"