From e724e41e884e6e42e2633939f5b3ae4081407107 Mon Sep 17 00:00:00 2001 From: UserNugget <47762903+UserNugget@users.noreply.github.com> Date: Wed, 17 Jun 2026 17:35:38 +0300 Subject: [PATCH 1/3] Minecraft 26.2 and Velocity b604+ support --- plugin/build.gradle | 6 ++-- plugin/mapping/fallbackdata.json | 30 +++++++++++++++++++ .../java/net/elytrium/limboapi/LimboAPI.java | 2 +- .../java/net/elytrium/limboapi/Settings.java | 2 +- .../injection/login/LoginListener.java | 3 ++ .../elytrium/limboapi/server/LimboImpl.java | 5 +++- 6 files changed, 43 insertions(+), 5 deletions(-) diff --git a/plugin/build.gradle b/plugin/build.gradle index e6801031..7bc11bd8 100644 --- a/plugin/build.gradle +++ b/plugin/build.gradle @@ -149,7 +149,8 @@ enum MinecraftVersion { MINECRAFT_1_21_7(772), MINECRAFT_1_21_9(773), MINECRAFT_1_21_11(774), - MINECRAFT_26_1(774) + MINECRAFT_26_1(775), + MINECRAFT_26_2(776) public static final List WORLD_VERSIONS = List.of( MINECRAFT_1_13, @@ -172,7 +173,8 @@ enum MinecraftVersion { MINECRAFT_1_21_7, MINECRAFT_1_21_9, MINECRAFT_1_21_11, - MINECRAFT_26_1 + MINECRAFT_26_1, + MINECRAFT_26_2 ) public static final MinecraftVersion MINIMUM_VERSION = MINECRAFT_1_7_2 diff --git a/plugin/mapping/fallbackdata.json b/plugin/mapping/fallbackdata.json index 4c54755e..3c33c215 100755 --- a/plugin/mapping/fallbackdata.json +++ b/plugin/mapping/fallbackdata.json @@ -1,4 +1,34 @@ { + "MINECRAFT_26_1": { + "minecraft:sulfur": "minecraft:sandstone", + "minecraft:potent_sulfur": "minecraft:end_stone", + "minecraft:sulfur_slab": "minecraft:sandstone_slab", + "minecraft:sulfur_stairs": "minecraft:sandstone_stairs", + "minecraft:sulfur_wall": "minecraft:sandstone_wall", + "minecraft:polished_sulfur": "minecraft:smooth_sandstone", + "minecraft:polished_sulfur_slab": "minecraft:sandstone_slab", + "minecraft:polished_sulfur_stairs": "minecraft:sandstone_stairs", + "minecraft:polished_sulfur_wall": "minecraft:sandstone_wall", + "minecraft:sulfur_bricks": "minecraft:end_stone_bricks", + "minecraft:sulfur_brick_slab": "minecraft:end_stone_brick_slab", + "minecraft:sulfur_brick_stairs": "minecraft:end_stone_brick_stairs", + "minecraft:sulfur_brick_wall": "minecraft:end_stone_brick_wall", + "minecraft:chiseled_sulfur": "minecraft:chiseled_sandstone", + "minecraft:cinnabar": "minecraft:granite", + "minecraft:cinnabar_slab": "minecraft:granite_slab", + "minecraft:cinnabar_stairs": "minecraft:granite_stairs", + "minecraft:cinnabar_wall": "minecraft:granite_wall", + "minecraft:polished_cinnabar": "minecraft:polished_granite", + "minecraft:polished_cinnabar_slab": "minecraft:granite_slab", + "minecraft:polished_cinnabar_stairs": "minecraft:granite_stairs", + "minecraft:polished_cinnabar_wall": "minecraft:granite_wall", + "minecraft:cinnabar_bricks": "minecraft:bricks", + "minecraft:cinnabar_brick_slab": "minecraft:brick_slab", + "minecraft:cinnabar_brick_stairs": "minecraft:brick_stairs", + "minecraft:cinnabar_brick_wall": "minecraft:brick_wall", + "minecraft:chiseled_cinnabar": "minecraft:chiseled_copper", + "minecraft:sulfur_spike": "minecraft:pointed_dripstone" + }, "MINECRAFT_1_21_11": { "minecraft:golden_dandelion": "minecraft:dandelion", "minecraft:potted_golden_dandelion": "minecraft:potted_dandelion" diff --git a/plugin/src/main/java/net/elytrium/limboapi/LimboAPI.java b/plugin/src/main/java/net/elytrium/limboapi/LimboAPI.java index 420c0664..1feb146f 100644 --- a/plugin/src/main/java/net/elytrium/limboapi/LimboAPI.java +++ b/plugin/src/main/java/net/elytrium/limboapi/LimboAPI.java @@ -130,7 +130,7 @@ ) public class LimboAPI implements LimboFactory { - private static final int SUPPORTED_MAXIMUM_PROTOCOL_VERSION_NUMBER = 775; + private static final int SUPPORTED_MAXIMUM_PROTOCOL_VERSION_NUMBER = 776; @MonotonicNonNull private static Logger LOGGER; diff --git a/plugin/src/main/java/net/elytrium/limboapi/Settings.java b/plugin/src/main/java/net/elytrium/limboapi/Settings.java index 094d8779..56b0ee9d 100644 --- a/plugin/src/main/java/net/elytrium/limboapi/Settings.java +++ b/plugin/src/main/java/net/elytrium/limboapi/Settings.java @@ -88,7 +88,7 @@ public static class MAIN { "1_13, 1_13_1, 1_13_2, 1_14, 1_14_1, 1_14_2, 1_14_3, 1_14_4, 1_15, 1_15_1, 1_15_2,", "1_16, 1_16_1, 1_16_2, 1_16_3, 1_16_4, 1_17, 1_17_1, 1_18, 1_18_2, 1_19, 1_19_1, 1_19_3,", "1_20, 1_20_2, 1_20_3, 1_20_5, 1_21, 1_21_2, 1_21_4, 1_21_5, 1_21_6, 1_21_7, 1_21_9, 1_21_11,", - "26_1, LATEST" + "26_1, 26_2, LATEST" }) public String PREPARE_MIN_VERSION = "1_7_2"; public String PREPARE_MAX_VERSION = "LATEST"; diff --git a/plugin/src/main/java/net/elytrium/limboapi/injection/login/LoginListener.java b/plugin/src/main/java/net/elytrium/limboapi/injection/login/LoginListener.java index d3a3a588..3d0fef2c 100644 --- a/plugin/src/main/java/net/elytrium/limboapi/injection/login/LoginListener.java +++ b/plugin/src/main/java/net/elytrium/limboapi/injection/login/LoginListener.java @@ -99,6 +99,7 @@ public class LoginListener { private static final MethodHandle CONNECTED_PLAYER_CONSTRUCTOR; private static final MethodHandle SPAWNED_FIELD; private static final BiConsumer TAB_LIST_SETTER; + private static final UUID SESSION_ID = UUID.randomUUID(); private final LimboAPI plugin; private final VelocityServer server; @@ -232,6 +233,7 @@ public void hookLoginSession(GameProfileRequestEvent event) throws Throwable { success.setUsername(player.getUsername()); success.setProperties(player.getGameProfileProperties()); success.setUuid(playerUniqueID); + success.setSessionId(SESSION_ID); if (Settings.IMP.MAIN.COMPATIBILITY_MODE) { connection.write(success); @@ -240,6 +242,7 @@ public void hookLoginSession(GameProfileRequestEvent event) throws Throwable { successHook.setUsername(player.getUsername()); successHook.setProperties(player.getGameProfileProperties()); successHook.setUuid(playerUniqueID); + successHook.setSessionId(SESSION_ID); connection.write(successHook); ChannelHandler compressionHandler = pipeline.get(Connections.COMPRESSION_ENCODER); diff --git a/plugin/src/main/java/net/elytrium/limboapi/server/LimboImpl.java b/plugin/src/main/java/net/elytrium/limboapi/server/LimboImpl.java index 4c9ae4ff..24e1566e 100644 --- a/plugin/src/main/java/net/elytrium/limboapi/server/LimboImpl.java +++ b/plugin/src/main/java/net/elytrium/limboapi/server/LimboImpl.java @@ -969,6 +969,9 @@ private JoinGamePacket createJoinGamePacket(ProtocolVersion version) { joinGame.setPreviousGamemode((short) -1); joinGame.setDimension(dimension.getModernID()); joinGame.setDifficulty((short) 0); + // TODO: different JoinGame packets for different login types, + // at the moment (26.2) it tells client to fetch chat signing keypair. + joinGame.setOnlineMode(true); try { PARTIAL_HASHED_SEED_FIELD.invokeExact(joinGame, ThreadLocalRandom.current().nextLong()); } catch (Throwable e) { @@ -1266,7 +1269,7 @@ private JoinGamePacket createJoinGamePacket(ProtocolVersion version) { Map songs = new HashMap<>(); for (String songName : List.of("11", "13", "5", "blocks", "cat", "chirp", "creator", "creator_music_box", "far", "lava_chicken", "mall", "mellohi", "otherside", - "pigstep", "precipice", "relic", "stal", "strad", "tears", "wait", "ward")) { + "pigstep", "precipice", "relic", "stal", "strad", "tears", "wait", "ward", "bounce")) { songs.put(songName, song); } registryContainer.put("minecraft:jukebox_song", this.createRegistry("minecraft:jukebox_song", songs)); From a5e3e562077891bfa5d6dca539640ada7b3ada5b Mon Sep 17 00:00:00 2001 From: UserNugget <47762903+UserNugget@users.noreply.github.com> Date: Wed, 17 Jun 2026 17:41:50 +0300 Subject: [PATCH 2/3] Invalidate caches --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 5937da46..1f7c4519 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,4 +5,4 @@ manifestUrl=https://launchermeta.mojang.com/mc/game/version_manifest.json cacheValidMillis=604800000 # Change to invalidate mappings cache on CI -gameVersion=26.1 \ No newline at end of file +gameVersion=26.2 \ No newline at end of file From dcfc4e2d7b10f157db9d1fabe9731d015fe71b37 Mon Sep 17 00:00:00 2001 From: UserNugget <47762903+UserNugget@users.noreply.github.com> Date: Fri, 19 Jun 2026 23:09:19 +0300 Subject: [PATCH 3/3] Keep protocol compatibility with Velocity --- .../net/elytrium/limboapi/injection/login/LoginListener.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugin/src/main/java/net/elytrium/limboapi/injection/login/LoginListener.java b/plugin/src/main/java/net/elytrium/limboapi/injection/login/LoginListener.java index 3d0fef2c..a83bc1f2 100644 --- a/plugin/src/main/java/net/elytrium/limboapi/injection/login/LoginListener.java +++ b/plugin/src/main/java/net/elytrium/limboapi/injection/login/LoginListener.java @@ -99,7 +99,6 @@ public class LoginListener { private static final MethodHandle CONNECTED_PLAYER_CONSTRUCTOR; private static final MethodHandle SPAWNED_FIELD; private static final BiConsumer TAB_LIST_SETTER; - private static final UUID SESSION_ID = UUID.randomUUID(); private final LimboAPI plugin; private final VelocityServer server; @@ -233,7 +232,7 @@ public void hookLoginSession(GameProfileRequestEvent event) throws Throwable { success.setUsername(player.getUsername()); success.setProperties(player.getGameProfileProperties()); success.setUuid(playerUniqueID); - success.setSessionId(SESSION_ID); + success.setSessionId(this.server.getSessionId()); if (Settings.IMP.MAIN.COMPATIBILITY_MODE) { connection.write(success); @@ -242,7 +241,7 @@ public void hookLoginSession(GameProfileRequestEvent event) throws Throwable { successHook.setUsername(player.getUsername()); successHook.setProperties(player.getGameProfileProperties()); successHook.setUuid(playerUniqueID); - successHook.setSessionId(SESSION_ID); + successHook.setSessionId(this.server.getSessionId()); connection.write(successHook); ChannelHandler compressionHandler = pipeline.get(Connections.COMPRESSION_ENCODER);