From 00c8846826b59dec72cc4f1920ebe01e75bd0657 Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Mon, 26 Jan 2026 00:54:40 -0600 Subject: [PATCH 01/28] Made some variables final and fixed a ridiculous networking bug in an upstream lib --- .../org/adde0109/pcf/forwarding/modern/ModernForwarding.java | 2 +- .../forge/forwarding/network/CCustomQueryPacketAdapter.java | 2 +- .../forwarding/network/SCustomQueryAnswerPacketAdapter.java | 2 +- .../v21_11/forwarding/network/CCustomQueryPacketAdapter.java | 2 +- .../forwarding/network/SCustomQueryAnswerPacketAdapter.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java b/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java index facf5bbe..b917ee75 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java @@ -220,7 +220,7 @@ public static void handleCustomQueryPacket( PlayerInfoQueryAnswerPayload.STREAM_CODEC.decode(packet.payload().data()); // Validate version - VelocityProxy.Version version = payload.version(); + final VelocityProxy.Version version = payload.version(); if (version.id() > MODERN_MAX_VERSION) { throw new IllegalStateException( "Unsupported forwarding version " diff --git a/modern/v20_4/src/forge/java/org/adde0109/pcf/v20_4/forge/forwarding/network/CCustomQueryPacketAdapter.java b/modern/v20_4/src/forge/java/org/adde0109/pcf/v20_4/forge/forwarding/network/CCustomQueryPacketAdapter.java index d50d17a4..39d544be 100644 --- a/modern/v20_4/src/forge/java/org/adde0109/pcf/v20_4/forge/forwarding/network/CCustomQueryPacketAdapter.java +++ b/modern/v20_4/src/forge/java/org/adde0109/pcf/v20_4/forge/forwarding/network/CCustomQueryPacketAdapter.java @@ -20,7 +20,7 @@ public final class CCustomQueryPacketAdapter @Override public Result encode( final net.minecraft.network.protocol.login.ClientboundCustomQueryPacket object) { - FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + final FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); object.payload().write(buf); return Result.success( new ClientboundCustomQueryPacket( diff --git a/modern/v20_4/src/forge/java/org/adde0109/pcf/v20_4/forge/forwarding/network/SCustomQueryAnswerPacketAdapter.java b/modern/v20_4/src/forge/java/org/adde0109/pcf/v20_4/forge/forwarding/network/SCustomQueryAnswerPacketAdapter.java index d8cb22cb..e5bb63a1 100644 --- a/modern/v20_4/src/forge/java/org/adde0109/pcf/v20_4/forge/forwarding/network/SCustomQueryAnswerPacketAdapter.java +++ b/modern/v20_4/src/forge/java/org/adde0109/pcf/v20_4/forge/forwarding/network/SCustomQueryAnswerPacketAdapter.java @@ -25,7 +25,7 @@ public Result encode( if (object.payload() == null) { return Result.success(new ServerboundCustomQueryAnswerPacket(transactionId)); } - FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + final FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); object.payload().write(buf); return Result.success( new ServerboundCustomQueryAnswerPacket( diff --git a/modern/v21_11/src/main/java/org/adde0109/pcf/v21_11/forwarding/network/CCustomQueryPacketAdapter.java b/modern/v21_11/src/main/java/org/adde0109/pcf/v21_11/forwarding/network/CCustomQueryPacketAdapter.java index d9d36be9..ee9b2361 100644 --- a/modern/v21_11/src/main/java/org/adde0109/pcf/v21_11/forwarding/network/CCustomQueryPacketAdapter.java +++ b/modern/v21_11/src/main/java/org/adde0109/pcf/v21_11/forwarding/network/CCustomQueryPacketAdapter.java @@ -24,7 +24,7 @@ public final class CCustomQueryPacketAdapter @Override public Result encode( final net.minecraft.network.protocol.login.ClientboundCustomQueryPacket object) { - FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + final FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); object.payload().write(buf); return Result.success( new ClientboundCustomQueryPacket( diff --git a/modern/v21_11/src/main/java/org/adde0109/pcf/v21_11/forwarding/network/SCustomQueryAnswerPacketAdapter.java b/modern/v21_11/src/main/java/org/adde0109/pcf/v21_11/forwarding/network/SCustomQueryAnswerPacketAdapter.java index f7edaa84..1006e3e4 100644 --- a/modern/v21_11/src/main/java/org/adde0109/pcf/v21_11/forwarding/network/SCustomQueryAnswerPacketAdapter.java +++ b/modern/v21_11/src/main/java/org/adde0109/pcf/v21_11/forwarding/network/SCustomQueryAnswerPacketAdapter.java @@ -23,7 +23,7 @@ public Result encode( if (object.payload() == null) { return Result.success(new ServerboundCustomQueryAnswerPacket(transactionId)); } - FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + final FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); object.payload().write(buf); return Result.success( new ServerboundCustomQueryAnswerPacket( From 36b780fed7d951a77d63b61f50c675dd705aaf85 Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Mon, 26 Jan 2026 01:42:38 -0600 Subject: [PATCH 02/28] Added a PostProcessor to ModernForwarding to make supporting hybrids easier --- .../src/main/java/org/adde0109/pcf/PCF.java | 13 ++++++ .../forwarding/modern/ModernForwarding.java | 45 ++++++++++++------- .../ServerLoginPacketListenerBridge.java | 2 + .../ServerLoginPacketListenerImplMixin.java | 5 +++ .../ServerLoginPacketListenerImplMixin.java | 5 +++ ...tenerImplStartClientVerificationMixin.java | 5 +++ .../ServerLoginPacketListenerImplMixin.java | 8 ++++ .../ServerLoginPacketListenerImplMixin.java | 8 ++++ 8 files changed, 75 insertions(+), 16 deletions(-) diff --git a/common/src/main/java/org/adde0109/pcf/PCF.java b/common/src/main/java/org/adde0109/pcf/PCF.java index c76236c7..96e2838d 100644 --- a/common/src/main/java/org/adde0109/pcf/PCF.java +++ b/common/src/main/java/org/adde0109/pcf/PCF.java @@ -14,6 +14,8 @@ import dev.neuralnexus.taterapi.registries.AdapterRegistry; import org.adde0109.pcf.forwarding.Mode; +import org.adde0109.pcf.forwarding.compat.ArclightBridge; +import org.adde0109.pcf.forwarding.modern.ModernForwarding; import org.adde0109.pcf.forwarding.modern.PlayerInfoQueryPayload; import org.adde0109.pcf.forwarding.modern.VelocityProxy; import org.jetbrains.annotations.ApiStatus; @@ -74,9 +76,20 @@ void onInit() { } loader.onInit(); + // Modern forwarding init if (this.forwarding().enabled() && this.forwarding().mode().equals(Mode.MODERN)) { NetworkRegistry.registerQueryPayload( PlayerInfoQueryPayload.IDENTIFIER, PlayerInfoQueryPayload.STREAM_CODEC); + + if (Constraint.range(MinecraftVersions.V14, MinecraftVersions.V20_1) + .platform(Platforms.ARCLIGHT) + .result()) { + ModernForwarding.postProcessor = + (slpl, profile) -> { + slpl.bridge$setGameProfile(profile); + ((ArclightBridge) slpl).arclight$preLogin(); + }; + } } Constraint.Evaluator.DEBUG = debug; diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java b/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java index facf5bbe..3f02c9c2 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java @@ -6,15 +6,13 @@ import static org.adde0109.pcf.forwarding.modern.ReflectionUtils.enforceSecureProfile; import static org.adde0109.pcf.forwarding.modern.VelocityProxy.MODERN_MAX_VERSION; import static org.adde0109.pcf.forwarding.modern.VelocityProxy.PLAYER_INFO_PAYLOAD; -import static org.adde0109.pcf.forwarding.modern.VelocityProxy.Version.MODERN_DEFAULT; -import static org.adde0109.pcf.forwarding.modern.VelocityProxy.Version.MODERN_FORWARDING_WITH_KEY; -import static org.adde0109.pcf.forwarding.modern.VelocityProxy.Version.MODERN_FORWARDING_WITH_KEY_V2; import static org.adde0109.pcf.forwarding.modern.VelocityProxy.checkIntegrity; +import com.mojang.authlib.GameProfile; + import dev.neuralnexus.taterapi.event.Cancellable; import dev.neuralnexus.taterapi.meta.Constraint; import dev.neuralnexus.taterapi.meta.MinecraftVersions; -import dev.neuralnexus.taterapi.meta.Platforms; import dev.neuralnexus.taterapi.mixin.CancellableMixin; import dev.neuralnexus.taterapi.network.chat.ThrowingComponent; import dev.neuralnexus.taterapi.network.protocol.login.ClientboundCustomQueryPacket; @@ -26,7 +24,6 @@ import org.adde0109.pcf.PCF; import org.adde0109.pcf.forwarding.Mode; -import org.adde0109.pcf.forwarding.compat.ArclightBridge; import org.jetbrains.annotations.ApiStatus; import org.jspecify.annotations.NonNull; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -37,7 +34,6 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ThreadLocalRandom; -import java.util.function.BiConsumer; /** * Utility class for modern forwarding handling.
@@ -103,8 +99,31 @@ public static void handleHello( } @ApiStatus.Internal - public static BiConsumer<@NonNull ServerLoginPacketListenerBridge, @NonNull ByteBuf> - preProcessor = (slpl, buf) -> {}; + @FunctionalInterface + public interface PreProcessor { + void accept( + final @NonNull ServerLoginPacketListenerBridge slpl, final @NonNull ByteBuf buf); + } + + @ApiStatus.Internal + @FunctionalInterface + public interface PostProcessor { + void accept( + final @NonNull ServerLoginPacketListenerBridge slpl, + final @NonNull GameProfile profile) + throws Exception; + } + + @ApiStatus.Internal public static PreProcessor preProcessor = (slpl, buf) -> {}; + + @ApiStatus.Internal + public static PostProcessor postProcessor = + (slpl, profile) -> { + final NameAndId nameAndId = new NameAndId(profile); + slpl.bridge$logger_info( + "UUID of player {} is {}", nameAndId.name(), nameAndId.id()); + slpl.bridge$startClientVerification(profile); + }; private static final Object DIRECT_CONNECT_ERR = literal("This server requires you to connect with Velocity."); @@ -275,16 +294,10 @@ public static void handleCustomQueryPacket( } // Proceed with login - final NameAndId nameAndId = new NameAndId(payload.profile()); try { - // TODO: Pull this into a common compat class when other hybrids are supported - if (Constraint.builder().platform(Platforms.ARCLIGHT).result()) { - ((ArclightBridge) slpl).arclight$preLogin(); - return; - } - slpl.bridge$logger_info("UUID of player {} is {}", nameAndId.name(), nameAndId.id()); - slpl.bridge$startClientVerification(payload.profile()); + postProcessor.accept(slpl, payload.profile()); } catch (Exception e) { + final NameAndId nameAndId = new NameAndId(payload.profile()); PCF.logger.warn("Exception while forwarding user " + nameAndId.name()); e.printStackTrace(); throw new ThrowingComponent(FAILED_TO_VERIFY, e); diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/modern/ServerLoginPacketListenerBridge.java b/common/src/main/java/org/adde0109/pcf/forwarding/modern/ServerLoginPacketListenerBridge.java index 560c2e84..eece92c0 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/modern/ServerLoginPacketListenerBridge.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/modern/ServerLoginPacketListenerBridge.java @@ -16,6 +16,8 @@ public interface ServerLoginPacketListenerBridge { void bridge$disconnect(final @NonNull Object reason); + void bridge$setGameProfile(final @NonNull GameProfile profile); + void bridge$startClientVerification(final @NonNull GameProfile profile); void bridge$logger_info(final @NonNull String text, final Object... params); diff --git a/legacy/v12_2/src/forge/java/org/adde0109/pcf/mixin/v12_2/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java b/legacy/v12_2/src/forge/java/org/adde0109/pcf/mixin/v12_2/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java index db724255..164e5580 100644 --- a/legacy/v12_2/src/forge/java/org/adde0109/pcf/mixin/v12_2/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java +++ b/legacy/v12_2/src/forge/java/org/adde0109/pcf/mixin/v12_2/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java @@ -48,6 +48,11 @@ public abstract class ServerLoginPacketListenerImplMixin return (ConnectionBridge) this.networkManager; } + @Override + public void bridge$setGameProfile(final @NonNull GameProfile profile) { + this.loginGameProfile = profile; + } + @Override public void bridge$startClientVerification(final @NonNull GameProfile profile) { this.loginGameProfile = profile; diff --git a/modern/v16_5/src/forge/java/org/adde0109/pcf/mixin/v16_5/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java b/modern/v16_5/src/forge/java/org/adde0109/pcf/mixin/v16_5/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java index 4d1a4925..d521a5e0 100644 --- a/modern/v16_5/src/forge/java/org/adde0109/pcf/mixin/v16_5/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java +++ b/modern/v16_5/src/forge/java/org/adde0109/pcf/mixin/v16_5/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java @@ -80,6 +80,11 @@ private void onHandleCustomQueryPacket( this.shadow$onDisconnect((Component) reason); } + @Override + public void bridge$setGameProfile(final @NonNull GameProfile profile) { + this.gameProfile = profile; + } + @Override public void bridge$startClientVerification(final @NonNull GameProfile profile) { this.gameProfile = profile; diff --git a/modern/v19_2/src/forge/java/org/adde0109/pcf/mixin/v19_2/forge/forwarding/modern/ServerLoginPacketListenerImplStartClientVerificationMixin.java b/modern/v19_2/src/forge/java/org/adde0109/pcf/mixin/v19_2/forge/forwarding/modern/ServerLoginPacketListenerImplStartClientVerificationMixin.java index b273ba36..d156dd68 100644 --- a/modern/v19_2/src/forge/java/org/adde0109/pcf/mixin/v19_2/forge/forwarding/modern/ServerLoginPacketListenerImplStartClientVerificationMixin.java +++ b/modern/v19_2/src/forge/java/org/adde0109/pcf/mixin/v19_2/forge/forwarding/modern/ServerLoginPacketListenerImplStartClientVerificationMixin.java @@ -24,6 +24,11 @@ public abstract class ServerLoginPacketListenerImplStartClientVerificationMixin @Shadow ServerLoginPacketListenerImpl.State state; // spotless:on + @Override + public void bridge$setGameProfile(final @NonNull GameProfile profile) { + this.gameProfile = profile; + } + @Override public void bridge$startClientVerification(final @NonNull GameProfile profile) { this.gameProfile = profile; diff --git a/modern/v20_4/src/forge/java/org/adde0109/pcf/mixin/v20_4/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java b/modern/v20_4/src/forge/java/org/adde0109/pcf/mixin/v20_4/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java index 5284db51..42989b69 100644 --- a/modern/v20_4/src/forge/java/org/adde0109/pcf/mixin/v20_4/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java +++ b/modern/v20_4/src/forge/java/org/adde0109/pcf/mixin/v20_4/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java @@ -30,6 +30,8 @@ public abstract class ServerLoginPacketListenerImplMixin @AConstraint(version = @Versions(min = MinecraftVersion.V20_2)) @Shadow abstract void shadow$startClientVerification(GameProfile profile); + @Shadow + private GameProfile authenticatedProfile; @Unique private int pcf$velocityLoginMessageId = -1; // spotless:on @@ -53,6 +55,12 @@ public abstract class ServerLoginPacketListenerImplMixin this.shadow$onDisconnect((Component) reason); } + @AConstraint(version = @Versions(min = MinecraftVersion.V20_2)) + @Override + public void bridge$setGameProfile(final @NonNull GameProfile profile) { + this.authenticatedProfile = profile; + } + @AConstraint(version = @Versions(min = MinecraftVersion.V20_2)) @Override public void bridge$startClientVerification(final @NonNull GameProfile profile) { diff --git a/modern/v21_11/src/main/java/org/adde0109/pcf/mixin/v21_11/forwarding/modern/ServerLoginPacketListenerImplMixin.java b/modern/v21_11/src/main/java/org/adde0109/pcf/mixin/v21_11/forwarding/modern/ServerLoginPacketListenerImplMixin.java index 488d14fb..e8d50daa 100644 --- a/modern/v21_11/src/main/java/org/adde0109/pcf/mixin/v21_11/forwarding/modern/ServerLoginPacketListenerImplMixin.java +++ b/modern/v21_11/src/main/java/org/adde0109/pcf/mixin/v21_11/forwarding/modern/ServerLoginPacketListenerImplMixin.java @@ -32,6 +32,9 @@ public abstract class ServerLoginPacketListenerImplMixin @Shadow public abstract void shadow$onDisconnect(net.minecraft.network.DisconnectionDetails details); @Shadow abstract void shadow$startClientVerification(GameProfile profile); + + @Shadow + private GameProfile authenticatedProfile; @Unique private int pcf$velocityLoginMessageId = -1; // spotless:on @@ -57,6 +60,11 @@ public abstract class ServerLoginPacketListenerImplMixin new net.minecraft.network.DisconnectionDetails((Component) reason)); } + @Override + public void bridge$setGameProfile(final @NonNull GameProfile profile) { + this.authenticatedProfile = profile; + } + @Override public void bridge$startClientVerification(final @NonNull GameProfile profile) { this.shadow$startClientVerification(profile); From e78eea29b41821739f5185015a0233e15eb92110 Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Mon, 26 Jan 2026 17:37:48 -0600 Subject: [PATCH 03/28] Added more version-specific Arclight post-processors --- .../src/main/java/org/adde0109/pcf/PCF.java | 18 +++++++++- .../pcf/forwarding/compat/ArclightBridge.java | 33 ++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/org/adde0109/pcf/PCF.java b/common/src/main/java/org/adde0109/pcf/PCF.java index 96e2838d..b9753e44 100644 --- a/common/src/main/java/org/adde0109/pcf/PCF.java +++ b/common/src/main/java/org/adde0109/pcf/PCF.java @@ -87,7 +87,23 @@ void onInit() { ModernForwarding.postProcessor = (slpl, profile) -> { slpl.bridge$setGameProfile(profile); - ((ArclightBridge) slpl).arclight$preLogin(); + ((ArclightBridge.V1) slpl).arclight$preLogin(); + }; + } else if (Constraint.range(MinecraftVersions.V20_2, MinecraftVersions.V20_3) + .platform(Platforms.ARCLIGHT) + .result()) { + ModernForwarding.postProcessor = + (slpl, profile) -> { + slpl.bridge$setGameProfile(profile); + ((ArclightBridge.V2) slpl).arclight$preLogin(profile); + }; + } else if (Constraint.noLessThan(MinecraftVersions.V20_4) + .platform(Platforms.ARCLIGHT) + .result()) { + ModernForwarding.postProcessor = + (slpl, profile) -> { + slpl.bridge$setGameProfile(profile); + ((ArclightBridge.V3) slpl).bridge$preLogin(profile); }; } } diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java b/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java index 860badb0..0426c4c5 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java @@ -1,5 +1,36 @@ package org.adde0109.pcf.forwarding.compat; +import com.mojang.authlib.GameProfile; + public interface ArclightBridge { - void arclight$preLogin() throws Exception; + /** + * Used + * in Arclight 1.14 - 1.20.1 + */ + interface V1 { + void arclight$preLogin() throws Exception; + } + + /** + * Used + * in Arclight 1.20.2 - 1.20.3 + */ + interface V2 { + void arclight$preLogin(GameProfile profile) throws Exception; + } + + /** + * Used + * in Arclight 1.20.4+.
+ * {@link SpigotLoginHandler.V2#callPlayerPreLoginEvents(GameProfile)} would be used, but it is + * private in Arclight + * 1.20.5+. + */ + interface V3 { + void bridge$preLogin(GameProfile profile) throws Exception; + } } From 5dd657e4bc01749ca7a5f168090be9b4ccbaccfa Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Mon, 26 Jan 2026 17:39:46 -0600 Subject: [PATCH 04/28] Renamed the interfaces to make more sense at a glance --- common/src/main/java/org/adde0109/pcf/PCF.java | 6 +++--- .../org/adde0109/pcf/forwarding/compat/ArclightBridge.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/org/adde0109/pcf/PCF.java b/common/src/main/java/org/adde0109/pcf/PCF.java index b9753e44..6cee8e85 100644 --- a/common/src/main/java/org/adde0109/pcf/PCF.java +++ b/common/src/main/java/org/adde0109/pcf/PCF.java @@ -87,7 +87,7 @@ void onInit() { ModernForwarding.postProcessor = (slpl, profile) -> { slpl.bridge$setGameProfile(profile); - ((ArclightBridge.V1) slpl).arclight$preLogin(); + ((ArclightBridge.V14) slpl).arclight$preLogin(); }; } else if (Constraint.range(MinecraftVersions.V20_2, MinecraftVersions.V20_3) .platform(Platforms.ARCLIGHT) @@ -95,7 +95,7 @@ void onInit() { ModernForwarding.postProcessor = (slpl, profile) -> { slpl.bridge$setGameProfile(profile); - ((ArclightBridge.V2) slpl).arclight$preLogin(profile); + ((ArclightBridge.V20_2) slpl).arclight$preLogin(profile); }; } else if (Constraint.noLessThan(MinecraftVersions.V20_4) .platform(Platforms.ARCLIGHT) @@ -103,7 +103,7 @@ void onInit() { ModernForwarding.postProcessor = (slpl, profile) -> { slpl.bridge$setGameProfile(profile); - ((ArclightBridge.V3) slpl).bridge$preLogin(profile); + ((ArclightBridge.V20_4) slpl).bridge$preLogin(profile); }; } } diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java b/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java index 0426c4c5..c296eef5 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java @@ -8,7 +8,7 @@ public interface ArclightBridge { * href="https://github.com/IzzelAliz/Arclight/blob/Trials/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerLoginNetHandlerMixin.java">Used * in Arclight 1.14 - 1.20.1 */ - interface V1 { + interface V14 { void arclight$preLogin() throws Exception; } @@ -17,7 +17,7 @@ interface V1 { * href="https://github.com/IzzelAliz/Arclight/blob/Net/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerLoginNetHandlerMixin.java">Used * in Arclight 1.20.2 - 1.20.3 */ - interface V2 { + interface V20_2 { void arclight$preLogin(GameProfile profile) throws Exception; } @@ -30,7 +30,7 @@ interface V2 { * href="https://github.com/IzzelAliz/Arclight/blob/FeudalKings/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerLoginPacketListenerImplMixin.java">Arclight * 1.20.5+. */ - interface V3 { + interface V20_4 { void bridge$preLogin(GameProfile profile) throws Exception; } } From 5576146e6a57cc81594cb6a68e77d966e55afd48 Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Mon, 26 Jan 2026 22:25:49 -0600 Subject: [PATCH 05/28] Fixed some version bounds --- common/src/main/java/org/adde0109/pcf/PCF.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/org/adde0109/pcf/PCF.java b/common/src/main/java/org/adde0109/pcf/PCF.java index 6cee8e85..b6c7a6e5 100644 --- a/common/src/main/java/org/adde0109/pcf/PCF.java +++ b/common/src/main/java/org/adde0109/pcf/PCF.java @@ -89,7 +89,8 @@ void onInit() { slpl.bridge$setGameProfile(profile); ((ArclightBridge.V14) slpl).arclight$preLogin(); }; - } else if (Constraint.range(MinecraftVersions.V20_2, MinecraftVersions.V20_3) + } else if (Constraint.builder() + .version(MinecraftVersions.V20_2) .platform(Platforms.ARCLIGHT) .result()) { ModernForwarding.postProcessor = @@ -97,7 +98,7 @@ void onInit() { slpl.bridge$setGameProfile(profile); ((ArclightBridge.V20_2) slpl).arclight$preLogin(profile); }; - } else if (Constraint.noLessThan(MinecraftVersions.V20_4) + } else if (Constraint.noLessThan(MinecraftVersions.V20_3) .platform(Platforms.ARCLIGHT) .result()) { ModernForwarding.postProcessor = From b83c3b832a0f4fc5343e762a69a89bea3df64058 Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Mon, 26 Jan 2026 23:19:38 -0600 Subject: [PATCH 06/28] Fixed wording --- .../adde0109/pcf/forwarding/compat/ArclightBridge.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java b/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java index c296eef5..45c955e0 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java @@ -6,7 +6,7 @@ public interface ArclightBridge { /** * Used - * in Arclight 1.14 - 1.20.1 + * for Arclight 1.14 - 1.20.1 */ interface V14 { void arclight$preLogin() throws Exception; @@ -15,7 +15,7 @@ interface V14 { /** * Used - * in Arclight 1.20.2 - 1.20.3 + * for Arclight 1.20.2 - 1.20.3 */ interface V20_2 { void arclight$preLogin(GameProfile profile) throws Exception; @@ -24,8 +24,8 @@ interface V20_2 { /** * Used - * in Arclight 1.20.4+.
- * {@link SpigotLoginHandler.V2#callPlayerPreLoginEvents(GameProfile)} would be used, but it is + * for Arclight 1.20.4+.
+ * {@link SpigotLoginHandler.V20_5#callPlayerPreLoginEvents(GameProfile)} could be used, but it is * private in Arclight * 1.20.5+. From d646103f539057c16a95d9a04edd3f27ea062248 Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Mon, 26 Jan 2026 23:33:19 -0600 Subject: [PATCH 07/28] Added Mohist PostProcessors --- .../src/main/java/org/adde0109/pcf/PCF.java | 39 ++++++----- .../pcf/forwarding/compat/ArclightBridge.java | 4 +- .../pcf/forwarding/compat/MohistBridge.java | 66 +++++++++++++++++++ 3 files changed, 91 insertions(+), 18 deletions(-) create mode 100644 common/src/main/java/org/adde0109/pcf/forwarding/compat/MohistBridge.java diff --git a/common/src/main/java/org/adde0109/pcf/PCF.java b/common/src/main/java/org/adde0109/pcf/PCF.java index b6c7a6e5..124c54da 100644 --- a/common/src/main/java/org/adde0109/pcf/PCF.java +++ b/common/src/main/java/org/adde0109/pcf/PCF.java @@ -15,6 +15,7 @@ import org.adde0109.pcf.forwarding.Mode; import org.adde0109.pcf.forwarding.compat.ArclightBridge; +import org.adde0109.pcf.forwarding.compat.MohistBridge; import org.adde0109.pcf.forwarding.modern.ModernForwarding; import org.adde0109.pcf.forwarding.modern.PlayerInfoQueryPayload; import org.adde0109.pcf.forwarding.modern.VelocityProxy; @@ -81,30 +82,36 @@ void onInit() { NetworkRegistry.registerQueryPayload( PlayerInfoQueryPayload.IDENTIFIER, PlayerInfoQueryPayload.STREAM_CODEC); - if (Constraint.range(MinecraftVersions.V14, MinecraftVersions.V20_1) - .platform(Platforms.ARCLIGHT) - .result()) { - ModernForwarding.postProcessor = - (slpl, profile) -> { - slpl.bridge$setGameProfile(profile); - ((ArclightBridge.V14) slpl).arclight$preLogin(); - }; + if (Constraint.builder().platform(Platforms.ARCLIGHT).result()) { + if (Constraint.range(MinecraftVersions.V14, MinecraftVersions.V20_1).result()) { + ModernForwarding.postProcessor = + (slpl, profile) -> { + slpl.bridge$setGameProfile(profile); + ((ArclightBridge.V14) slpl).arclight$preLogin(); + }; + } else if (Constraint.builder().version(MinecraftVersions.V20_2).result()) { + ModernForwarding.postProcessor = + (slpl, profile) -> + ((ArclightBridge.V20_2) slpl).arclight$preLogin(profile); + } else if (Constraint.noLessThan(MinecraftVersions.V20_3).result()) { + ModernForwarding.postProcessor = + (slpl, profile) -> + ((ArclightBridge.V20_4) slpl).bridge$preLogin(profile); + } } else if (Constraint.builder() - .version(MinecraftVersions.V20_2) - .platform(Platforms.ARCLIGHT) + .platform(Platforms.MOHIST) + .version(MinecraftVersions.V20_1) .result()) { ModernForwarding.postProcessor = (slpl, profile) -> { slpl.bridge$setGameProfile(profile); - ((ArclightBridge.V20_2) slpl).arclight$preLogin(profile); + MohistBridge.V20_1.fireEvents(slpl); }; - } else if (Constraint.noLessThan(MinecraftVersions.V20_3) - .platform(Platforms.ARCLIGHT) - .result()) { + } else if (Constraint.builder().platform(Platforms.YOUER).result()) { ModernForwarding.postProcessor = (slpl, profile) -> { - slpl.bridge$setGameProfile(profile); - ((ArclightBridge.V20_4) slpl).bridge$preLogin(profile); + MohistBridge.Youer.fireEvents(slpl); + slpl.bridge$startClientVerification(profile); }; } } diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java b/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java index 45c955e0..d2a00e7f 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java @@ -25,8 +25,8 @@ interface V20_2 { * Used * for Arclight 1.20.4+.
- * {@link SpigotLoginHandler.V20_5#callPlayerPreLoginEvents(GameProfile)} could be used, but it is - * private in Arclight * 1.20.5+. */ diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/MohistBridge.java b/common/src/main/java/org/adde0109/pcf/forwarding/compat/MohistBridge.java new file mode 100644 index 00000000..89297b3b --- /dev/null +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compat/MohistBridge.java @@ -0,0 +1,66 @@ +package org.adde0109.pcf.forwarding.compat; + +import org.adde0109.pcf.forwarding.modern.ServerLoginPacketListenerBridge; +import org.jspecify.annotations.NonNull; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + +public interface MohistBridge { + /** + * Used + * in Mohist 1.20.1 + */ + class V20_1 { + private static MethodHandle loginHandler; + private static MethodHandle fireEvents; + + public static void fireEvents(final @NonNull ServerLoginPacketListenerBridge slpl) + throws Exception { + if (loginHandler == null || fireEvents == null) { + final MethodHandles.Lookup lookup = MethodHandles.lookup(); + final Class clazz = Class.forName("com.mohistmc.bukkit.LoginHandler"); + final MethodType vType = MethodType.methodType(void.class); + loginHandler = lookup.findConstructor(clazz, vType); + final MethodType fireType = MethodType.methodType(void.class, slpl.getClass()); + fireEvents = lookup.findVirtual(clazz, "fireEvents", fireType); + } + + try { + fireEvents.invoke(loginHandler.invoke(), slpl); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } + } + + /** + * Used + * in Youer 1.21.1 + */ + class Youer { + private static MethodHandle loginHandler; + private static MethodHandle fireEvents; + + public static void fireEvents(final @NonNull ServerLoginPacketListenerBridge slpl) + throws Exception { + if (loginHandler == null || fireEvents == null) { + final MethodHandles.Lookup lookup = MethodHandles.lookup(); + final Class clazz = Class.forName("com.mohistmc.youer.bukkit.LoginHandler"); + final MethodType vType = MethodType.methodType(void.class); + loginHandler = lookup.findConstructor(clazz, vType); + final MethodType fireType = MethodType.methodType(void.class, slpl.getClass()); + fireEvents = lookup.findVirtual(clazz, "fireEvents", fireType); + } + + try { + fireEvents.invoke(loginHandler.invoke(), slpl); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } + } +} From 429960b2e963f1d56be6541ff2e04b51b8983a73 Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Tue, 27 Jan 2026 00:45:32 -0600 Subject: [PATCH 08/28] Added PostProcessors for most major hybrids and versions --- .../src/main/java/org/adde0109/pcf/PCF.java | 54 ++++++++- .../forwarding/compat/SpigotLoginHandler.java | 98 ++++++++++++++++ docs/HybridCompatibility.md | 107 ++++++++++++++++++ 3 files changed, 258 insertions(+), 1 deletion(-) create mode 100644 common/src/main/java/org/adde0109/pcf/forwarding/compat/SpigotLoginHandler.java create mode 100644 docs/HybridCompatibility.md diff --git a/common/src/main/java/org/adde0109/pcf/PCF.java b/common/src/main/java/org/adde0109/pcf/PCF.java index 124c54da..3b4d8df3 100644 --- a/common/src/main/java/org/adde0109/pcf/PCF.java +++ b/common/src/main/java/org/adde0109/pcf/PCF.java @@ -3,6 +3,7 @@ import dev.neuralnexus.taterapi.loader.EntrypointLoader; import dev.neuralnexus.taterapi.logger.Logger; import dev.neuralnexus.taterapi.meta.Constraint; +import dev.neuralnexus.taterapi.meta.Constraints; import dev.neuralnexus.taterapi.meta.MetaAPI; import dev.neuralnexus.taterapi.meta.MinecraftVersion; import dev.neuralnexus.taterapi.meta.MinecraftVersions; @@ -12,10 +13,12 @@ import dev.neuralnexus.taterapi.meta.Platforms; import dev.neuralnexus.taterapi.network.NetworkRegistry; import dev.neuralnexus.taterapi.registries.AdapterRegistry; +import dev.neuralnexus.taterapi.server.players.NameAndId; import org.adde0109.pcf.forwarding.Mode; import org.adde0109.pcf.forwarding.compat.ArclightBridge; import org.adde0109.pcf.forwarding.compat.MohistBridge; +import org.adde0109.pcf.forwarding.compat.SpigotLoginHandler; import org.adde0109.pcf.forwarding.modern.ModernForwarding; import org.adde0109.pcf.forwarding.modern.PlayerInfoQueryPayload; import org.adde0109.pcf.forwarding.modern.VelocityProxy; @@ -107,12 +110,61 @@ void onInit() { slpl.bridge$setGameProfile(profile); MohistBridge.V20_1.fireEvents(slpl); }; - } else if (Constraint.builder().platform(Platforms.YOUER).result()) { + } else if (Constraint.builder() + .platform(Platforms.YOUER) + .version(MinecraftVersions.V21_1) + .result()) { ModernForwarding.postProcessor = (slpl, profile) -> { MohistBridge.Youer.fireEvents(slpl); slpl.bridge$startClientVerification(profile); }; + } else if (Constraints.builder() + .or( + Constraint.builder() + .platform(Platforms.KETTING) + .version(MinecraftVersions.V20_1), + Constraint.range(MinecraftVersions.V12_2, MinecraftVersions.V20_1) + .platform(Platforms.MAGMA), + Constraint.range(MinecraftVersions.V12_2, MinecraftVersions.V19_4) + .platform(Platforms.MOHIST)) + .result()) { + ModernForwarding.postProcessor = + (slpl, profile) -> { + slpl.bridge$setGameProfile(profile); + SpigotLoginHandler.Legacy.fireEvents(slpl); + }; + } else if (Constraints.builder() + .or( + Constraint.range(MinecraftVersions.V20_2, MinecraftVersions.V20_4) + .platform(Platforms.KETTING), + Constraint.builder() + .platform(Platforms.MOHIST) + .version(MinecraftVersions.V20_2)) + .result()) { + ModernForwarding.postProcessor = SpigotLoginHandler.V20_2::fireEvents; + } else if (Constraints.builder() + .or( + Constraint.builder() + .platform(Platforms.MAGMA) + .version(MinecraftVersions.V21_1), + Constraint.builder() + .platform(Platforms.MOHIST) + .version(MinecraftVersions.V21_1, MinecraftVersions.V21_4), + Constraint.range(MinecraftVersions.V21_11, MinecraftVersions.V26_1) + .platform(Platforms.YOUER), + Constraint.builder() + .platform(Platforms.NEOTENET) + .version(MinecraftVersions.V21_1, MinecraftVersions.V21_10)) + .result()) { + ModernForwarding.postProcessor = + (slpl, profile) -> { + final NameAndId nameAndId = new NameAndId(profile); + ((SpigotLoginHandler.V20_5) slpl).callPlayerPreLoginEvents(profile); + slpl.bridge$logger_info( + "UUID of player {} is {}", nameAndId.name(), nameAndId.id()); + slpl.bridge$startClientVerification(profile); + }; } } diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpigotLoginHandler.java b/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpigotLoginHandler.java new file mode 100644 index 00000000..b1a75fda --- /dev/null +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpigotLoginHandler.java @@ -0,0 +1,98 @@ +package org.adde0109.pcf.forwarding.compat; + +import com.mojang.authlib.GameProfile; + +import org.adde0109.pcf.forwarding.modern.ServerLoginPacketListenerBridge; +import org.jspecify.annotations.NonNull; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + +public interface SpigotLoginHandler { + /** + * Used for:
+ * Ketting + * 1.20.1
+ * Magma + * 1.12.2, 1.16.5, 1.18.2, 1.19.3, 1.20.1
+ * Mohist + * 1.12.2, 1.16.5, 1.18.2, 1.19.2, 1.19.4 + */ + class Legacy { + private static MethodHandle loginHandler; + private static MethodHandle fireEvents; + + public static void fireEvents(final @NonNull ServerLoginPacketListenerBridge slpl) + throws Exception { + if (loginHandler == null || fireEvents == null) { + final MethodHandles.Lookup lookup = MethodHandles.lookup(); + final Class clazz = Class.forName(slpl.getClass().getName() + "$LoginHandler"); + final MethodType vType = MethodType.methodType(void.class); + loginHandler = lookup.findConstructor(clazz, vType); + fireEvents = lookup.findVirtual(clazz, "fireEvents", vType); + } + + try { + fireEvents.invoke(loginHandler.invoke()); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } + } + + /** + * Used for:
+ * Ketting + * 1.20.2 - 1.20.4
+ * Mohist + * 1.20.2 + */ + class V20_2 { + private static MethodHandle loginHandler; + private static MethodHandle fireEvents; + + public static void fireEvents( + final @NonNull ServerLoginPacketListenerBridge slpl, + final @NonNull GameProfile profile) + throws Exception { + if (loginHandler == null || fireEvents == null) { + final MethodHandles.Lookup lookup = MethodHandles.lookup(); + final Class clazz = Class.forName(slpl.getClass().getName() + "$LoginHandler"); + final MethodType vType = MethodType.methodType(void.class); + loginHandler = lookup.findConstructor(clazz, vType); + final MethodType fireType = MethodType.methodType(void.class, GameProfile.class); + fireEvents = lookup.findVirtual(clazz, "fireEvents", fireType); + } + try { + fireEvents.invoke(loginHandler.invoke(), profile); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } + } + + /** + * Used for:
+ * Magma + * Neo 1.21.1
+ * Mohist + * 1.21.1, 1.21.4
+ * Youer + * 1.21.11 - 26.1
+ * NeoTenet + * 1.21.1, 1.21.10 + */ + interface V20_5 { + void callPlayerPreLoginEvents(GameProfile profile) throws Exception; + } +} diff --git a/docs/HybridCompatibility.md b/docs/HybridCompatibility.md new file mode 100644 index 00000000..e1c9db65 --- /dev/null +++ b/docs/HybridCompatibility.md @@ -0,0 +1,107 @@ +# Hybrid Compatibility + +## Arclight + +Versions: 1.14 - 1.20.1
+Class: `net.minecraft.server.network.ServerLoginPacketListenerImpl`
+Method: `arclight$preLogin()`
+Source: + +Version: 1.20.2
+Class: `net.minecraft.server.network.ServerLoginPacketListenerImpl`
+Method: `arclight$preLogin(GameProfile)`
+Source: + +Versions: 1.20.3 - 1.20.4
+Class: `net.minecraft.server.network.ServerLoginPacketListenerImpl`
+Method: `bridge$preLogin(GameProfile);`
+Source: + +Versions: 1.20.5 and above
+Class: `net.minecraft.server.network.ServerLoginPacketListenerImpl`
+Method: `bridge$preLogin(GameProfile)`
+Source: +Notes: Alternatively call `private void callPlayerPreLoginEvents(GameProfile)` and use PCF logic + +## Ketting + +Version: 1.20.1
+Class: `net.minecraft.server.network.ServerLoginPacketListenerImpl$LoginHandler`
+Method: `fireEvents()`
+Source: + +Versions: 1.20.2 - 1.20.4
+Class: `net.minecraft.server.network.ServerLoginPacketListenerImpl$LoginHandler`
+Method: `fireEvents(GameProfile)`
+Source: + +## Magma + +Versions: 1.12.2, 1.16.5, 1.18.2, 1.19.3, 1.20.1
+Class: `net.minecraft.server.network.ServerLoginPacketListenerImpl$LoginHandler`
+Method: `fireEvents()`
+Sources: +- 1.12.2: +- 1.16.5: No (direct) URL available +- 1.18.2 - 1.20.1: + +### Magma Neo + +Version: 1.21.1
+Class: `net.minecraft.server.network.ServerLoginPacketListenerImpl`
+Method: `callPlayerPreLoginEvents(GameProfile)`
+Source: + +## Mohist + +Version: 1.7.10
+Class: `net.minecraft.network.NetHandlerLoginServer`
+Method: `this.field_147327_f.getConfigurationManager().attemptLogin(this, this.field_147337_i, this.hostname)`
+Source:
+Note: Implement later after researching Cauldron + +Versions: 1.12.2, 1.16.5, 1.18.2, 1.19.2, 1.19.4
+Class: `net.minecraft.server.network.ServerLoginPacketListenerImpl$LoginHandler`
+Method: `fireEvents()`
+Sources: +- 1.12.2: +- 1.16.5: +- 1.18.2 - 1.19.4: + +Version: 1.20.1
+Class: `com.mohistmc.bukkit.LoginHandler`
+Method: `fireEvents(ServerLoginPacketListenerImpl)`
+Source: + +Versions: 1.20.2
+Class: `net.minecraft.server.network.ServerLoginPacketListenerImpl$LoginHandler`
+Method: `fireEvents(GameProfile)`
+Source: + +Versions: 1.21.1, 1.21.4
+Class: `net.minecraft.server.network.ServerLoginPacketListenerImpl`
+Method: `callPlayerPreLoginEvents(GameProfile)`
+Source: + +### Youer + +Note: No longer owned by Mohist, copyright was sold + +Versions: 1.21.1
+Class: `com.mohistmc.youer.bukkit.LoginHandler`
+Method: `fireEvents(ServerLoginPacketListenerImpl, GameProfile)`
+Source: + +Versions: 1.21.11 - 26.1
+Class: `net.minecraft.server.network.ServerLoginPacketListenerImpl`
+Method: `callPlayerPreLoginEvents(GameProfile)`
+Source: + +### NeoTenet + +Note: Mohist's new NeoForge implementation + +Versions: 1.21.1, 1.21.10
+Class: `net.minecraft.server.network.ServerLoginPacketListenerImpl`
+Method: `callPlayerPreLoginEvents(GameProfile)`
+Source: From 60cc437f4e8ff227255c03a6d2afd45a4136d156 Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Tue, 27 Jan 2026 13:58:28 -0600 Subject: [PATCH 09/28] PostProcessors are now held in a SequencedCollection for added flexibility --- .../src/main/java/org/adde0109/pcf/PCF.java | 48 ++++++++++--------- .../pcf/forwarding/compat/MohistBridge.java | 11 +++-- .../forwarding/modern/ModernForwarding.java | 13 +++-- 3 files changed, 43 insertions(+), 29 deletions(-) diff --git a/common/src/main/java/org/adde0109/pcf/PCF.java b/common/src/main/java/org/adde0109/pcf/PCF.java index 3b4d8df3..ff6a5074 100644 --- a/common/src/main/java/org/adde0109/pcf/PCF.java +++ b/common/src/main/java/org/adde0109/pcf/PCF.java @@ -13,7 +13,6 @@ import dev.neuralnexus.taterapi.meta.Platforms; import dev.neuralnexus.taterapi.network.NetworkRegistry; import dev.neuralnexus.taterapi.registries.AdapterRegistry; -import dev.neuralnexus.taterapi.server.players.NameAndId; import org.adde0109.pcf.forwarding.Mode; import org.adde0109.pcf.forwarding.compat.ArclightBridge; @@ -87,38 +86,43 @@ void onInit() { if (Constraint.builder().platform(Platforms.ARCLIGHT).result()) { if (Constraint.range(MinecraftVersions.V14, MinecraftVersions.V20_1).result()) { - ModernForwarding.postProcessor = + ModernForwarding.postProcessors.removeFirst(); + ModernForwarding.postProcessors.add( (slpl, profile) -> { slpl.bridge$setGameProfile(profile); ((ArclightBridge.V14) slpl).arclight$preLogin(); - }; + }); } else if (Constraint.builder().version(MinecraftVersions.V20_2).result()) { - ModernForwarding.postProcessor = + ModernForwarding.postProcessors.removeFirst(); + ModernForwarding.postProcessors.add( (slpl, profile) -> - ((ArclightBridge.V20_2) slpl).arclight$preLogin(profile); + ((ArclightBridge.V20_2) slpl).arclight$preLogin(profile)); } else if (Constraint.noLessThan(MinecraftVersions.V20_3).result()) { - ModernForwarding.postProcessor = + ModernForwarding.postProcessors.removeFirst(); + ModernForwarding.postProcessors.add( (slpl, profile) -> - ((ArclightBridge.V20_4) slpl).bridge$preLogin(profile); + ((ArclightBridge.V20_4) slpl).bridge$preLogin(profile)); } } else if (Constraint.builder() .platform(Platforms.MOHIST) .version(MinecraftVersions.V20_1) .result()) { - ModernForwarding.postProcessor = + ModernForwarding.postProcessors.removeFirst(); + ModernForwarding.postProcessors.add( (slpl, profile) -> { slpl.bridge$setGameProfile(profile); MohistBridge.V20_1.fireEvents(slpl); - }; + }); } else if (Constraint.builder() .platform(Platforms.YOUER) .version(MinecraftVersions.V21_1) .result()) { - ModernForwarding.postProcessor = + ModernForwarding.postProcessors.removeFirst(); + ModernForwarding.postProcessors.add( (slpl, profile) -> { - MohistBridge.Youer.fireEvents(slpl); + MohistBridge.Youer.fireEvents(slpl, profile); slpl.bridge$startClientVerification(profile); - }; + }); } else if (Constraints.builder() .or( Constraint.builder() @@ -129,11 +133,12 @@ void onInit() { Constraint.range(MinecraftVersions.V12_2, MinecraftVersions.V19_4) .platform(Platforms.MOHIST)) .result()) { - ModernForwarding.postProcessor = + ModernForwarding.postProcessors.removeFirst(); + ModernForwarding.postProcessors.add( (slpl, profile) -> { slpl.bridge$setGameProfile(profile); SpigotLoginHandler.Legacy.fireEvents(slpl); - }; + }); } else if (Constraints.builder() .or( Constraint.range(MinecraftVersions.V20_2, MinecraftVersions.V20_4) @@ -142,7 +147,8 @@ void onInit() { .platform(Platforms.MOHIST) .version(MinecraftVersions.V20_2)) .result()) { - ModernForwarding.postProcessor = SpigotLoginHandler.V20_2::fireEvents; + ModernForwarding.postProcessors.removeFirst(); + ModernForwarding.postProcessors.add(SpigotLoginHandler.V20_2::fireEvents); } else if (Constraints.builder() .or( Constraint.builder() @@ -157,14 +163,10 @@ void onInit() { .platform(Platforms.NEOTENET) .version(MinecraftVersions.V21_1, MinecraftVersions.V21_10)) .result()) { - ModernForwarding.postProcessor = - (slpl, profile) -> { - final NameAndId nameAndId = new NameAndId(profile); - ((SpigotLoginHandler.V20_5) slpl).callPlayerPreLoginEvents(profile); - slpl.bridge$logger_info( - "UUID of player {} is {}", nameAndId.name(), nameAndId.id()); - slpl.bridge$startClientVerification(profile); - }; + ModernForwarding.postProcessors.addFirst( + (slpl, profile) -> + ((SpigotLoginHandler.V20_5) slpl) + .callPlayerPreLoginEvents(profile)); } } diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/MohistBridge.java b/common/src/main/java/org/adde0109/pcf/forwarding/compat/MohistBridge.java index 89297b3b..fdeb391f 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compat/MohistBridge.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compat/MohistBridge.java @@ -1,5 +1,7 @@ package org.adde0109.pcf.forwarding.compat; +import com.mojang.authlib.GameProfile; + import org.adde0109.pcf.forwarding.modern.ServerLoginPacketListenerBridge; import org.jspecify.annotations.NonNull; @@ -45,19 +47,22 @@ class Youer { private static MethodHandle loginHandler; private static MethodHandle fireEvents; - public static void fireEvents(final @NonNull ServerLoginPacketListenerBridge slpl) + public static void fireEvents( + final @NonNull ServerLoginPacketListenerBridge slpl, + final @NonNull GameProfile profile) throws Exception { if (loginHandler == null || fireEvents == null) { final MethodHandles.Lookup lookup = MethodHandles.lookup(); final Class clazz = Class.forName("com.mohistmc.youer.bukkit.LoginHandler"); final MethodType vType = MethodType.methodType(void.class); loginHandler = lookup.findConstructor(clazz, vType); - final MethodType fireType = MethodType.methodType(void.class, slpl.getClass()); + final MethodType fireType = + MethodType.methodType(void.class, slpl.getClass(), GameProfile.class); fireEvents = lookup.findVirtual(clazz, "fireEvents", fireType); } try { - fireEvents.invoke(loginHandler.invoke(), slpl); + fireEvents.invoke(loginHandler.invoke(), slpl, profile); } catch (Throwable e) { throw new RuntimeException(e); } diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java b/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java index 4dbeafc5..578650c4 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java @@ -30,7 +30,9 @@ import java.net.InetSocketAddress; import java.security.InvalidKeyException; +import java.util.LinkedHashSet; import java.util.List; +import java.util.SequencedCollection; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ThreadLocalRandom; @@ -116,8 +118,7 @@ void accept( @ApiStatus.Internal public static PreProcessor preProcessor = (slpl, buf) -> {}; - @ApiStatus.Internal - public static PostProcessor postProcessor = + private static final PostProcessor DEFAULT_POST_PROCESSOR = (slpl, profile) -> { final NameAndId nameAndId = new NameAndId(profile); slpl.bridge$logger_info( @@ -125,6 +126,10 @@ void accept( slpl.bridge$startClientVerification(profile); }; + @ApiStatus.Internal + public static SequencedCollection postProcessors = + new LinkedHashSet<>(List.of(DEFAULT_POST_PROCESSOR)); + private static final Object DIRECT_CONNECT_ERR = literal("This server requires you to connect with Velocity."); private static final Object EMPTY_PAYLOAD_ERR = @@ -295,7 +300,9 @@ public static void handleCustomQueryPacket( // Proceed with login try { - postProcessor.accept(slpl, payload.profile()); + for (final PostProcessor processor : postProcessors) { + processor.accept(slpl, payload.profile()); + } } catch (Exception e) { final NameAndId nameAndId = new NameAndId(payload.profile()); PCF.logger.warn("Exception while forwarding user " + nameAndId.name()); From 388866421204a5b7af8bcf36462060362f007164 Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Tue, 27 Jan 2026 14:07:13 -0600 Subject: [PATCH 10/28] Added compat for SpongeAPI 8 and 9, hopefully resolving the long-standing LP issue --- common/src/main/java/org/adde0109/pcf/PCF.java | 8 ++++++++ .../pcf/forwarding/compat/SpongeBridge.java | 10 ++++++++++ docs/HybridCompatibility.md | 14 ++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 common/src/main/java/org/adde0109/pcf/forwarding/compat/SpongeBridge.java diff --git a/common/src/main/java/org/adde0109/pcf/PCF.java b/common/src/main/java/org/adde0109/pcf/PCF.java index ff6a5074..6b1151de 100644 --- a/common/src/main/java/org/adde0109/pcf/PCF.java +++ b/common/src/main/java/org/adde0109/pcf/PCF.java @@ -18,6 +18,7 @@ import org.adde0109.pcf.forwarding.compat.ArclightBridge; import org.adde0109.pcf.forwarding.compat.MohistBridge; import org.adde0109.pcf.forwarding.compat.SpigotLoginHandler; +import org.adde0109.pcf.forwarding.compat.SpongeBridge; import org.adde0109.pcf.forwarding.modern.ModernForwarding; import org.adde0109.pcf.forwarding.modern.PlayerInfoQueryPayload; import org.adde0109.pcf.forwarding.modern.VelocityProxy; @@ -168,6 +169,13 @@ void onInit() { ((SpigotLoginHandler.V20_5) slpl) .callPlayerPreLoginEvents(profile)); } + + if (Constraint.range(MinecraftVersions.V16, MinecraftVersions.V18_2) + .platform(Platforms.SPONGE) + .result()) { + ModernForwarding.postProcessors.addFirst( + (slpl, profile) -> ((SpongeBridge) slpl).bridge$fireAuthEvent()); + } } Constraint.Evaluator.DEBUG = debug; diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpongeBridge.java b/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpongeBridge.java new file mode 100644 index 00000000..c56d01d0 --- /dev/null +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpongeBridge.java @@ -0,0 +1,10 @@ +package org.adde0109.pcf.forwarding.compat; + +/** + * Used + * for SpongeForge 1.16.5 and 1.18.2 + */ +public interface SpongeBridge { + boolean bridge$fireAuthEvent(); +} diff --git a/docs/HybridCompatibility.md b/docs/HybridCompatibility.md index e1c9db65..73421986 100644 --- a/docs/HybridCompatibility.md +++ b/docs/HybridCompatibility.md @@ -105,3 +105,17 @@ Versions: 1.21.1, 1.21.10
Class: `net.minecraft.server.network.ServerLoginPacketListenerImpl`
Method: `callPlayerPreLoginEvents(GameProfile)`
Source: + +## Sponge + +Versions: 1.16.5, 1.18.2
+Class: `net.minecraft.server.network.ServerLoginPacketListenerImpl`
+Method: +```java +if (this.bridge$fireAuthEvent()) { + ci.cancel(); +} +``` +Sources: +- API 8: +- API 9: From 1b4ae84fad4c4fcf6624b491e979dbaf3f3e5c2e Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Tue, 27 Jan 2026 14:17:09 -0600 Subject: [PATCH 11/28] Added boolean return value for PostProcessors to accommodate for Sponge's API exiting early --- .../src/main/java/org/adde0109/pcf/PCF.java | 29 ++++++++++++++----- .../forwarding/modern/ModernForwarding.java | 19 +++++++++--- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/common/src/main/java/org/adde0109/pcf/PCF.java b/common/src/main/java/org/adde0109/pcf/PCF.java index 6b1151de..a855fa29 100644 --- a/common/src/main/java/org/adde0109/pcf/PCF.java +++ b/common/src/main/java/org/adde0109/pcf/PCF.java @@ -92,17 +92,22 @@ void onInit() { (slpl, profile) -> { slpl.bridge$setGameProfile(profile); ((ArclightBridge.V14) slpl).arclight$preLogin(); + return false; }); } else if (Constraint.builder().version(MinecraftVersions.V20_2).result()) { ModernForwarding.postProcessors.removeFirst(); ModernForwarding.postProcessors.add( - (slpl, profile) -> - ((ArclightBridge.V20_2) slpl).arclight$preLogin(profile)); + (slpl, profile) -> { + ((ArclightBridge.V20_2) slpl).arclight$preLogin(profile); + return false; + }); } else if (Constraint.noLessThan(MinecraftVersions.V20_3).result()) { ModernForwarding.postProcessors.removeFirst(); ModernForwarding.postProcessors.add( - (slpl, profile) -> - ((ArclightBridge.V20_4) slpl).bridge$preLogin(profile)); + (slpl, profile) -> { + ((ArclightBridge.V20_4) slpl).bridge$preLogin(profile); + return false; + }); } } else if (Constraint.builder() .platform(Platforms.MOHIST) @@ -113,6 +118,7 @@ void onInit() { (slpl, profile) -> { slpl.bridge$setGameProfile(profile); MohistBridge.V20_1.fireEvents(slpl); + return false; }); } else if (Constraint.builder() .platform(Platforms.YOUER) @@ -123,6 +129,7 @@ void onInit() { (slpl, profile) -> { MohistBridge.Youer.fireEvents(slpl, profile); slpl.bridge$startClientVerification(profile); + return false; }); } else if (Constraints.builder() .or( @@ -139,6 +146,7 @@ void onInit() { (slpl, profile) -> { slpl.bridge$setGameProfile(profile); SpigotLoginHandler.Legacy.fireEvents(slpl); + return false; }); } else if (Constraints.builder() .or( @@ -149,7 +157,11 @@ void onInit() { .version(MinecraftVersions.V20_2)) .result()) { ModernForwarding.postProcessors.removeFirst(); - ModernForwarding.postProcessors.add(SpigotLoginHandler.V20_2::fireEvents); + ModernForwarding.postProcessors.add( + (slpl, profile) -> { + SpigotLoginHandler.V20_2.fireEvents(slpl, profile); + return false; + }); } else if (Constraints.builder() .or( Constraint.builder() @@ -165,9 +177,10 @@ void onInit() { .version(MinecraftVersions.V21_1, MinecraftVersions.V21_10)) .result()) { ModernForwarding.postProcessors.addFirst( - (slpl, profile) -> - ((SpigotLoginHandler.V20_5) slpl) - .callPlayerPreLoginEvents(profile)); + (slpl, profile) -> { + ((SpigotLoginHandler.V20_5) slpl).callPlayerPreLoginEvents(profile); + return false; + }); } if (Constraint.range(MinecraftVersions.V16, MinecraftVersions.V18_2) diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java b/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java index 578650c4..0a72f746 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java @@ -103,14 +103,22 @@ public static void handleHello( @ApiStatus.Internal @FunctionalInterface public interface PreProcessor { - void accept( + void process( final @NonNull ServerLoginPacketListenerBridge slpl, final @NonNull ByteBuf buf); } @ApiStatus.Internal @FunctionalInterface public interface PostProcessor { - void accept( + /** + * Process the forwarded profile + * + * @param slpl the ServerLoginPacketListener + * @param profile the forwarded GameProfile + * @return true to stop processing further, false to continue + * @throws Exception if an error occurs + */ + boolean process( final @NonNull ServerLoginPacketListenerBridge slpl, final @NonNull GameProfile profile) throws Exception; @@ -124,6 +132,7 @@ void accept( slpl.bridge$logger_info( "UUID of player {} is {}", nameAndId.name(), nameAndId.id()); slpl.bridge$startClientVerification(profile); + return false; }; @ApiStatus.Internal @@ -217,7 +226,7 @@ public static void handleCustomQueryPacket( } // Apply fixes - preProcessor.accept(slpl, packet.payload().data()); + preProcessor.process(slpl, packet.payload().data()); // Remove transaction ID from pending set TRANSACTION_IDS.remove(packet.transactionId()); @@ -301,7 +310,9 @@ public static void handleCustomQueryPacket( // Proceed with login try { for (final PostProcessor processor : postProcessors) { - processor.accept(slpl, payload.profile()); + if (processor.process(slpl, payload.profile())) { + break; + } } } catch (Exception e) { final NameAndId nameAndId = new NameAndId(payload.profile()); From 70f22892fb3be8db23cfcd203f93eee7d47b49df Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Thu, 29 Jan 2026 19:59:40 -0600 Subject: [PATCH 12/28] Changed PostProcessors to use an ArrayList --- .../adde0109/pcf/forwarding/modern/ModernForwarding.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java b/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java index 0a72f746..d088559c 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java @@ -30,9 +30,8 @@ import java.net.InetSocketAddress; import java.security.InvalidKeyException; -import java.util.LinkedHashSet; +import java.util.ArrayList; import java.util.List; -import java.util.SequencedCollection; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ThreadLocalRandom; @@ -136,8 +135,8 @@ boolean process( }; @ApiStatus.Internal - public static SequencedCollection postProcessors = - new LinkedHashSet<>(List.of(DEFAULT_POST_PROCESSOR)); + public static final List postProcessors = + new ArrayList<>(List.of(DEFAULT_POST_PROCESSOR)); private static final Object DIRECT_CONNECT_ERR = literal("This server requires you to connect with Velocity."); From 1c845fdea6fdc50a3a0e50cd3fc5f17d2759a5f4 Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Thu, 29 Jan 2026 20:03:15 -0600 Subject: [PATCH 13/28] Finally fixed SpongeForge 1.16.5 PreLogin bug --- .../src/main/java/org/adde0109/pcf/PCF.java | 5 ++- .../pcf/forwarding/compat/SpongeBridge.java | 10 ------ .../pcf/forwarding/compat/SpongePreLogin.java | 34 +++++++++++++++++++ 3 files changed, 38 insertions(+), 11 deletions(-) delete mode 100644 common/src/main/java/org/adde0109/pcf/forwarding/compat/SpongeBridge.java create mode 100644 common/src/main/java/org/adde0109/pcf/forwarding/compat/SpongePreLogin.java diff --git a/common/src/main/java/org/adde0109/pcf/PCF.java b/common/src/main/java/org/adde0109/pcf/PCF.java index a855fa29..7e9de801 100644 --- a/common/src/main/java/org/adde0109/pcf/PCF.java +++ b/common/src/main/java/org/adde0109/pcf/PCF.java @@ -187,7 +187,10 @@ void onInit() { .platform(Platforms.SPONGE) .result()) { ModernForwarding.postProcessors.addFirst( - (slpl, profile) -> ((SpongeBridge) slpl).bridge$fireAuthEvent()); + (slpl, profile) -> { + slpl.bridge$setGameProfile(profile); + return SpongeBridge.API8.fireAuthEvent(slpl); + }); } } diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpongeBridge.java b/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpongeBridge.java deleted file mode 100644 index c56d01d0..00000000 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpongeBridge.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.adde0109.pcf.forwarding.compat; - -/** - * Used - * for SpongeForge 1.16.5 and 1.18.2 - */ -public interface SpongeBridge { - boolean bridge$fireAuthEvent(); -} diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpongePreLogin.java b/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpongePreLogin.java new file mode 100644 index 00000000..ed8f5d64 --- /dev/null +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpongePreLogin.java @@ -0,0 +1,34 @@ +package org.adde0109.pcf.forwarding.compat; + +import org.adde0109.pcf.forwarding.modern.ServerLoginPacketListenerBridge; +import org.jetbrains.annotations.NotNull; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + +/** + * Used + * for SpongeForge 1.16.5 and 1.18.2 + */ +public interface SpongePreLogin { + class API8 { + private static MethodHandle fireAuthEvent; + + public static boolean fireAuthEvent(final @NotNull ServerLoginPacketListenerBridge slpl) + throws Exception { + if (fireAuthEvent == null) { + final MethodHandles.Lookup lookup = MethodHandles.lookup(); + final MethodType rType = MethodType.methodType(boolean.class); + fireAuthEvent = lookup.findVirtual(slpl.getClass(), "bridge$fireAuthEvent", rType); + } + + try { + return (boolean) fireAuthEvent.invoke(slpl); + } catch (final Throwable e) { + throw new RuntimeException(e); + } + } + } +} From c79aa7464a8f7da886f6176bb5efe2188119d59d Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Thu, 29 Jan 2026 22:46:56 -0600 Subject: [PATCH 14/28] Fixed Arclight PreLogin compat --- .../src/main/java/org/adde0109/pcf/PCF.java | 12 +-- .../pcf/forwarding/compat/ArclightBridge.java | 36 --------- .../forwarding/compat/ArclightPreLogin.java | 77 +++++++++++++++++++ 3 files changed, 83 insertions(+), 42 deletions(-) delete mode 100644 common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java create mode 100644 common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightPreLogin.java diff --git a/common/src/main/java/org/adde0109/pcf/PCF.java b/common/src/main/java/org/adde0109/pcf/PCF.java index 7e9de801..5f17a364 100644 --- a/common/src/main/java/org/adde0109/pcf/PCF.java +++ b/common/src/main/java/org/adde0109/pcf/PCF.java @@ -15,10 +15,10 @@ import dev.neuralnexus.taterapi.registries.AdapterRegistry; import org.adde0109.pcf.forwarding.Mode; -import org.adde0109.pcf.forwarding.compat.ArclightBridge; +import org.adde0109.pcf.forwarding.compat.ArclightPreLogin; import org.adde0109.pcf.forwarding.compat.MohistBridge; import org.adde0109.pcf.forwarding.compat.SpigotLoginHandler; -import org.adde0109.pcf.forwarding.compat.SpongeBridge; +import org.adde0109.pcf.forwarding.compat.SpongePreLogin; import org.adde0109.pcf.forwarding.modern.ModernForwarding; import org.adde0109.pcf.forwarding.modern.PlayerInfoQueryPayload; import org.adde0109.pcf.forwarding.modern.VelocityProxy; @@ -91,21 +91,21 @@ void onInit() { ModernForwarding.postProcessors.add( (slpl, profile) -> { slpl.bridge$setGameProfile(profile); - ((ArclightBridge.V14) slpl).arclight$preLogin(); + ArclightPreLogin.V14.preLogin(slpl); return false; }); } else if (Constraint.builder().version(MinecraftVersions.V20_2).result()) { ModernForwarding.postProcessors.removeFirst(); ModernForwarding.postProcessors.add( (slpl, profile) -> { - ((ArclightBridge.V20_2) slpl).arclight$preLogin(profile); + ArclightPreLogin.V20_2.preLogin(slpl, profile); return false; }); } else if (Constraint.noLessThan(MinecraftVersions.V20_3).result()) { ModernForwarding.postProcessors.removeFirst(); ModernForwarding.postProcessors.add( (slpl, profile) -> { - ((ArclightBridge.V20_4) slpl).bridge$preLogin(profile); + ((ArclightPreLogin.V20_4) slpl).bridge$preLogin(profile); return false; }); } @@ -189,7 +189,7 @@ void onInit() { ModernForwarding.postProcessors.addFirst( (slpl, profile) -> { slpl.bridge$setGameProfile(profile); - return SpongeBridge.API8.fireAuthEvent(slpl); + return SpongePreLogin.API8.fireAuthEvent(slpl); }); } } diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java b/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java deleted file mode 100644 index d2a00e7f..00000000 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.adde0109.pcf.forwarding.compat; - -import com.mojang.authlib.GameProfile; - -public interface ArclightBridge { - /** - * Used - * for Arclight 1.14 - 1.20.1 - */ - interface V14 { - void arclight$preLogin() throws Exception; - } - - /** - * Used - * for Arclight 1.20.2 - 1.20.3 - */ - interface V20_2 { - void arclight$preLogin(GameProfile profile) throws Exception; - } - - /** - * Used - * for Arclight 1.20.4+.
- * {@link SpigotLoginHandler.V20_5#callPlayerPreLoginEvents(GameProfile)} could be used, but it - * is private in Arclight - * 1.20.5+. - */ - interface V20_4 { - void bridge$preLogin(GameProfile profile) throws Exception; - } -} diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightPreLogin.java b/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightPreLogin.java new file mode 100644 index 00000000..0caed163 --- /dev/null +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightPreLogin.java @@ -0,0 +1,77 @@ +package org.adde0109.pcf.forwarding.compat; + +import com.mojang.authlib.GameProfile; + +import org.adde0109.pcf.forwarding.modern.ServerLoginPacketListenerBridge; +import org.jspecify.annotations.NonNull; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + +public interface ArclightPreLogin { + /** + * Used + * for Arclight 1.14 - 1.20.1 + */ + class V14 { + private static MethodHandle preLogin; + + public static void preLogin(final @NonNull ServerLoginPacketListenerBridge slpl) + throws Exception { + if (preLogin == null) { + final MethodHandles.Lookup lookup = + MethodHandles.privateLookupIn(slpl.getClass(), MethodHandles.lookup()); + final MethodType methodType = MethodType.methodType(void.class); + preLogin = lookup.findVirtual(slpl.getClass(), "arclight$preLogin", methodType); + } + + try { + preLogin.invoke(slpl); + } catch (final Throwable e) { + throw new RuntimeException(e); + } + } + } + + /** + * Used + * for Arclight 1.20.2 - 1.20.3 + */ + class V20_2 { + private static MethodHandle preLogin; + + public static void preLogin( + final @NonNull ServerLoginPacketListenerBridge slpl, + final @NonNull GameProfile profile) + throws Exception { + if (preLogin == null) { + final MethodHandles.Lookup lookup = + MethodHandles.privateLookupIn(slpl.getClass(), MethodHandles.lookup()); + final MethodType methodType = MethodType.methodType(void.class, GameProfile.class); + preLogin = lookup.findVirtual(slpl.getClass(), "arclight$preLogin", methodType); + } + + try { + preLogin.invoke(slpl, profile); + } catch (final Throwable e) { + throw new RuntimeException(e); + } + } + } + + /** + * Used + * for Arclight 1.20.4+.
+ * {@link SpigotLoginHandler.V20_5#callPlayerPreLoginEvents(GameProfile)} could be used, but it + * is private in Arclight + * 1.20.5+. + */ + interface V20_4 { + void bridge$preLogin(GameProfile profile) throws Exception; + } +} From 2fc6e6411e2ed131d3dd7a0e0b5428b1b32f5b7b Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Thu, 29 Jan 2026 23:10:42 -0600 Subject: [PATCH 15/28] Added Arclight-specific HandleHello mixins due to their overwrites --- .../ServerLoginPacketListenerImplMixin.java | 11 ++++++++ ...rverLoginPacketListenerImplHelloMixin.java | 26 +++++++++++++++++-- .../src/main/resources/pcf.mixins.v21_11.json | 1 + 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/modern/v16_5/src/forge/java/org/adde0109/pcf/mixin/v16_5/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java b/modern/v16_5/src/forge/java/org/adde0109/pcf/mixin/v16_5/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java index d521a5e0..67fac3ad 100644 --- a/modern/v16_5/src/forge/java/org/adde0109/pcf/mixin/v16_5/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java +++ b/modern/v16_5/src/forge/java/org/adde0109/pcf/mixin/v16_5/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java @@ -9,6 +9,7 @@ import dev.neuralnexus.taterapi.meta.anno.AConstraint; import dev.neuralnexus.taterapi.meta.anno.Versions; import dev.neuralnexus.taterapi.meta.enums.MinecraftVersion; +import dev.neuralnexus.taterapi.meta.enums.Platform; import net.minecraft.network.Connection; import net.minecraft.network.chat.Component; @@ -17,6 +18,7 @@ import org.adde0109.pcf.forwarding.modern.ConnectionBridge; import org.adde0109.pcf.forwarding.modern.ServerLoginPacketListenerBridge; +import org.apache.commons.lang3.Validate; import org.apache.logging.log4j.Logger; import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; @@ -43,6 +45,7 @@ public abstract class ServerLoginPacketListenerImplMixin // spotless:on // spotless:off + @AConstraint(platform = Platform.ARCLIGHT, invert = true) @Inject(method = "handleHello", cancellable = true, at = @At(value = "FIELD", opcode = Opcodes.PUTFIELD, ordinal = 1, target = "Lnet/minecraft/server/network/ServerLoginPacketListenerImpl;state:Lnet/minecraft/server/network/ServerLoginPacketListenerImpl$State;")) // spotless:on @@ -50,6 +53,14 @@ private void onHandleHello(final @NonNull CallbackInfo ci) { handleHello(this, ci); } + @AConstraint(platform = Platform.ARCLIGHT) + @Inject(method = "handleHello", cancellable = true, at = @At(value = "HEAD")) + private void onHandleHelloArclight(final @NonNull CallbackInfo ci) { + Validate.validState( + this.state == ServerLoginPacketListenerImpl.State.HELLO, "Unexpected hello packet"); + handleHello(this, ci); + } + @Inject(method = "handleCustomQueryPacket", at = @At("HEAD"), cancellable = true) private void onHandleCustomQueryPacket( final @NonNull ServerboundCustomQueryPacket packet, final @NonNull CallbackInfo ci) { diff --git a/modern/v21_11/src/main/java/org/adde0109/pcf/mixin/v21_11/forwarding/modern/ServerLoginPacketListenerImplHelloMixin.java b/modern/v21_11/src/main/java/org/adde0109/pcf/mixin/v21_11/forwarding/modern/ServerLoginPacketListenerImplHelloMixin.java index d138475f..522ac699 100644 --- a/modern/v21_11/src/main/java/org/adde0109/pcf/mixin/v21_11/forwarding/modern/ServerLoginPacketListenerImplHelloMixin.java +++ b/modern/v21_11/src/main/java/org/adde0109/pcf/mixin/v21_11/forwarding/modern/ServerLoginPacketListenerImplHelloMixin.java @@ -4,24 +4,33 @@ import dev.neuralnexus.taterapi.meta.Mappings; import dev.neuralnexus.taterapi.meta.anno.AConstraint; +import dev.neuralnexus.taterapi.meta.anno.AConstraints; import dev.neuralnexus.taterapi.meta.anno.Versions; import dev.neuralnexus.taterapi.meta.enums.MinecraftVersion; +import dev.neuralnexus.taterapi.meta.enums.Platform; + +import net.minecraft.server.network.ServerLoginPacketListenerImpl; import org.adde0109.pcf.forwarding.modern.ServerLoginPacketListenerBridge; +import org.apache.commons.lang3.Validate; import org.jspecify.annotations.NonNull; import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; // spotless:off -@AConstraint(version = @Versions(min = MinecraftVersion.V17)) +@AConstraints({ + @AConstraint(platform = Platform.ARCLIGHT, invert = true), + @AConstraint(version = @Versions(min = MinecraftVersion.V17)) +}) @SuppressWarnings({"MixinAnnotationTarget", "UnresolvedMixinReference"}) @Mixin(targets = "net.minecraft.server.network.ServerLoginPacketListenerImpl") public abstract class ServerLoginPacketListenerImplHelloMixin implements ServerLoginPacketListenerBridge { - @AConstraint(mappings = Mappings.SEARGE, version = @Versions(min = MinecraftVersion.V17, max = MinecraftVersion.V18_2)) + @AConstraint(mappings = Mappings.SEARGE, version = @Versions(max = MinecraftVersion.V18_2)) @Inject(method = "m_5990_", cancellable = true, at = @At(value = "FIELD", opcode = Opcodes.PUTFIELD, ordinal = 1, target = "Lnet/minecraft/server/network/ServerLoginPacketListenerImpl;f_10019_:Lnet/minecraft/server/network/ServerLoginPacketListenerImpl$State;")) private void onHandleHello_17(final @NonNull CallbackInfo ci) { @@ -48,5 +57,18 @@ private void onHandleHello_20_S(final @NonNull CallbackInfo ci) { private void onHandleHello_20_M(final @NonNull CallbackInfo ci) { handleHello(this, ci); } + + @AConstraint(platform = Platform.ARCLIGHT, version = @Versions(min = MinecraftVersion.V17)) + @Mixin(targets = "net.minecraft.server.network.ServerLoginPacketListenerImpl") + public static class ArclightMixin { + @Shadow private ServerLoginPacketListenerImpl.State state; + + @Inject(method = {"handleHello", "m_5990_"}, require = 0, cancellable = true, at = @At(value = "HEAD")) + private void onHandleHelloArclight(final @NonNull CallbackInfo ci) { + Validate.validState( + this.state == ServerLoginPacketListenerImpl.State.HELLO, "Unexpected hello packet"); + handleHello((ServerLoginPacketListenerBridge) this, ci); + } + } } // spotless:on diff --git a/modern/v21_11/src/main/resources/pcf.mixins.v21_11.json b/modern/v21_11/src/main/resources/pcf.mixins.v21_11.json index 04ddef47..10fc54f2 100644 --- a/modern/v21_11/src/main/resources/pcf.mixins.v21_11.json +++ b/modern/v21_11/src/main/resources/pcf.mixins.v21_11.json @@ -13,6 +13,7 @@ "v21_11.forwarding.modern.ConnectionMixin", "v21_11.forwarding.modern.ServerboundCustomQueryAnswerPacketMixin", "v21_11.forwarding.modern.ServerLoginPacketListenerImplHelloMixin", + "v21_11.forwarding.modern.ServerLoginPacketListenerImplHelloMixin$ArclightMixin", "v21_11.forwarding.modern.ServerLoginPacketListenerImplMixin", "v21_11.forwarding.modern.ServerLoginPacketListenerImplQueryMixin" ] From b7a65ca87328680b94271b47156972bf19ffe1e3 Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Thu, 29 Jan 2026 23:12:41 -0600 Subject: [PATCH 16/28] Made CrossStich info dump debug line print to debug instead of info --- .../forge/java/org/adde0109/pcf/v16_5/forge/Initializer.java | 2 +- .../java/org/adde0109/pcf/v17_1/forge/CrossStitchInit.java | 2 +- .../java/org/adde0109/pcf/v19_2/forge/CrossStitchInit.java | 2 +- .../java/org/adde0109/pcf/v20_2/neoforge/CrossStitchInit.java | 2 +- .../java/org/adde0109/pcf/v20_4/forge/CrossStitchInit.java | 2 +- .../src/main/java/org/adde0109/pcf/v21_11/CrossStitchInit.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modern/v16_5/src/forge/java/org/adde0109/pcf/v16_5/forge/Initializer.java b/modern/v16_5/src/forge/java/org/adde0109/pcf/v16_5/forge/Initializer.java index d16dd402..efbd3395 100644 --- a/modern/v16_5/src/forge/java/org/adde0109/pcf/v16_5/forge/Initializer.java +++ b/modern/v16_5/src/forge/java/org/adde0109/pcf/v16_5/forge/Initializer.java @@ -37,7 +37,7 @@ public Initializer() { CrossStitch.INFO_DUMP = () -> { - PCF.logger.info("Registered Command Argument Types:"); + PCF.logger.debug("Registered Command Argument Types:"); for (final ArgumentTypes.Entry entry : ArgumentTypesAccessor.pcf$getByClass().values()) { PCF.logger.debug(" - " + entry.name + " -> " + entry.serializer.getClass()); diff --git a/modern/v17_1/src/forge/java/org/adde0109/pcf/v17_1/forge/CrossStitchInit.java b/modern/v17_1/src/forge/java/org/adde0109/pcf/v17_1/forge/CrossStitchInit.java index 06fc8d54..694f712a 100644 --- a/modern/v17_1/src/forge/java/org/adde0109/pcf/v17_1/forge/CrossStitchInit.java +++ b/modern/v17_1/src/forge/java/org/adde0109/pcf/v17_1/forge/CrossStitchInit.java @@ -23,7 +23,7 @@ public void onInit() { CrossStitch.INFO_DUMP = () -> { - PCF.logger.info("Registered Command Argument Types:"); + PCF.logger.debug("Registered Command Argument Types:"); for (final ArgumentTypes.Entry entry : ArgumentTypesAccessor.pcf$getByClass().values()) { PCF.logger.debug(" - " + entry.name + " -> " + entry.serializer.getClass()); diff --git a/modern/v19_2/src/forge/java/org/adde0109/pcf/v19_2/forge/CrossStitchInit.java b/modern/v19_2/src/forge/java/org/adde0109/pcf/v19_2/forge/CrossStitchInit.java index 7697f2d6..70371526 100644 --- a/modern/v19_2/src/forge/java/org/adde0109/pcf/v19_2/forge/CrossStitchInit.java +++ b/modern/v19_2/src/forge/java/org/adde0109/pcf/v19_2/forge/CrossStitchInit.java @@ -35,7 +35,7 @@ public void onInit() { CrossStitch.INFO_DUMP = () -> { - PCF.logger.info("Registered Command Argument Types:"); + PCF.logger.debug("Registered Command Argument Types:"); for (final Map.Entry< ResourceKey>, ArgumentTypeInfo> entry : Registry.COMMAND_ARGUMENT_TYPE.entrySet()) { diff --git a/modern/v20_2/src/main/java/org/adde0109/pcf/v20_2/neoforge/CrossStitchInit.java b/modern/v20_2/src/main/java/org/adde0109/pcf/v20_2/neoforge/CrossStitchInit.java index 7d861c11..3bbe5fbe 100644 --- a/modern/v20_2/src/main/java/org/adde0109/pcf/v20_2/neoforge/CrossStitchInit.java +++ b/modern/v20_2/src/main/java/org/adde0109/pcf/v20_2/neoforge/CrossStitchInit.java @@ -33,7 +33,7 @@ public CrossStitchInit() { CrossStitch.INFO_DUMP = () -> { - PCF.logger.info("Registered Command Argument Types:"); + PCF.logger.debug("Registered Command Argument Types:"); for (final Map.Entry< ResourceKey>, ArgumentTypeInfo> entry : BuiltInRegistries.COMMAND_ARGUMENT_TYPE.entrySet()) { diff --git a/modern/v20_4/src/forge/java/org/adde0109/pcf/v20_4/forge/CrossStitchInit.java b/modern/v20_4/src/forge/java/org/adde0109/pcf/v20_4/forge/CrossStitchInit.java index 51922651..3a954a71 100644 --- a/modern/v20_4/src/forge/java/org/adde0109/pcf/v20_4/forge/CrossStitchInit.java +++ b/modern/v20_4/src/forge/java/org/adde0109/pcf/v20_4/forge/CrossStitchInit.java @@ -36,7 +36,7 @@ public CrossStitchInit() { CrossStitch.INFO_DUMP = () -> { - PCF.logger.info("Registered Command Argument Types:"); + PCF.logger.debug("Registered Command Argument Types:"); for (final Map.Entry< ResourceKey>, ArgumentTypeInfo> entry : BuiltInRegistries.COMMAND_ARGUMENT_TYPE.entrySet()) { diff --git a/modern/v21_11/src/main/java/org/adde0109/pcf/v21_11/CrossStitchInit.java b/modern/v21_11/src/main/java/org/adde0109/pcf/v21_11/CrossStitchInit.java index 4a45d183..b009138b 100644 --- a/modern/v21_11/src/main/java/org/adde0109/pcf/v21_11/CrossStitchInit.java +++ b/modern/v21_11/src/main/java/org/adde0109/pcf/v21_11/CrossStitchInit.java @@ -33,7 +33,7 @@ public CrossStitchInit() { CrossStitch.INFO_DUMP = () -> { - PCF.logger.info("Registered Command Argument Types:"); + PCF.logger.debug("Registered Command Argument Types:"); for (final Map.Entry< ResourceKey>, ArgumentTypeInfo> entry : BuiltInRegistries.COMMAND_ARGUMENT_TYPE.entrySet()) { From 2075b5ad79f35dcc96d88840480ca377fbe97361 Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Thu, 29 Jan 2026 23:20:57 -0600 Subject: [PATCH 17/28] Renamed and cleaned up PreLogin compat classes --- .../src/main/java/org/adde0109/pcf/PCF.java | 14 ++++++------ .../forwarding/compat/ArclightPreLogin.java | 4 ++-- ...{MohistBridge.java => MohistPreLogin.java} | 22 +++++++++++-------- ...tLoginHandler.java => SpigotPreLogin.java} | 18 ++++++++------- .../pcf/forwarding/compat/SpongePreLogin.java | 5 +++-- 5 files changed, 35 insertions(+), 28 deletions(-) rename common/src/main/java/org/adde0109/pcf/forwarding/compat/{MohistBridge.java => MohistPreLogin.java} (83%) rename common/src/main/java/org/adde0109/pcf/forwarding/compat/{SpigotLoginHandler.java => SpigotPreLogin.java} (89%) diff --git a/common/src/main/java/org/adde0109/pcf/PCF.java b/common/src/main/java/org/adde0109/pcf/PCF.java index 5f17a364..5bd7f1ab 100644 --- a/common/src/main/java/org/adde0109/pcf/PCF.java +++ b/common/src/main/java/org/adde0109/pcf/PCF.java @@ -16,8 +16,8 @@ import org.adde0109.pcf.forwarding.Mode; import org.adde0109.pcf.forwarding.compat.ArclightPreLogin; -import org.adde0109.pcf.forwarding.compat.MohistBridge; -import org.adde0109.pcf.forwarding.compat.SpigotLoginHandler; +import org.adde0109.pcf.forwarding.compat.MohistPreLogin; +import org.adde0109.pcf.forwarding.compat.SpigotPreLogin; import org.adde0109.pcf.forwarding.compat.SpongePreLogin; import org.adde0109.pcf.forwarding.modern.ModernForwarding; import org.adde0109.pcf.forwarding.modern.PlayerInfoQueryPayload; @@ -117,7 +117,7 @@ void onInit() { ModernForwarding.postProcessors.add( (slpl, profile) -> { slpl.bridge$setGameProfile(profile); - MohistBridge.V20_1.fireEvents(slpl); + MohistPreLogin.V20_1.fireEvents(slpl); return false; }); } else if (Constraint.builder() @@ -127,7 +127,7 @@ void onInit() { ModernForwarding.postProcessors.removeFirst(); ModernForwarding.postProcessors.add( (slpl, profile) -> { - MohistBridge.Youer.fireEvents(slpl, profile); + MohistPreLogin.Youer.fireEvents(slpl, profile); slpl.bridge$startClientVerification(profile); return false; }); @@ -145,7 +145,7 @@ void onInit() { ModernForwarding.postProcessors.add( (slpl, profile) -> { slpl.bridge$setGameProfile(profile); - SpigotLoginHandler.Legacy.fireEvents(slpl); + SpigotPreLogin.Legacy.fireEvents(slpl); return false; }); } else if (Constraints.builder() @@ -159,7 +159,7 @@ void onInit() { ModernForwarding.postProcessors.removeFirst(); ModernForwarding.postProcessors.add( (slpl, profile) -> { - SpigotLoginHandler.V20_2.fireEvents(slpl, profile); + SpigotPreLogin.V20_2.fireEvents(slpl, profile); return false; }); } else if (Constraints.builder() @@ -178,7 +178,7 @@ void onInit() { .result()) { ModernForwarding.postProcessors.addFirst( (slpl, profile) -> { - ((SpigotLoginHandler.V20_5) slpl).callPlayerPreLoginEvents(profile); + ((SpigotPreLogin.V20_5) slpl).callPlayerPreLoginEvents(profile); return false; }); } diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightPreLogin.java b/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightPreLogin.java index 0caed163..96515f66 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightPreLogin.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightPreLogin.java @@ -66,8 +66,8 @@ public static void preLogin( * Used * for Arclight 1.20.4+.
- * {@link SpigotLoginHandler.V20_5#callPlayerPreLoginEvents(GameProfile)} could be used, but it - * is private in Arclight * 1.20.5+. */ diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/MohistBridge.java b/common/src/main/java/org/adde0109/pcf/forwarding/compat/MohistPreLogin.java similarity index 83% rename from common/src/main/java/org/adde0109/pcf/forwarding/compat/MohistBridge.java rename to common/src/main/java/org/adde0109/pcf/forwarding/compat/MohistPreLogin.java index fdeb391f..1f9760e6 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compat/MohistBridge.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compat/MohistPreLogin.java @@ -9,7 +9,7 @@ import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; -public interface MohistBridge { +public interface MohistPreLogin { /** * Used @@ -23,11 +23,13 @@ public static void fireEvents(final @NonNull ServerLoginPacketListenerBridge slp throws Exception { if (loginHandler == null || fireEvents == null) { final MethodHandles.Lookup lookup = MethodHandles.lookup(); + final Class clazz = Class.forName("com.mohistmc.bukkit.LoginHandler"); - final MethodType vType = MethodType.methodType(void.class); - loginHandler = lookup.findConstructor(clazz, vType); - final MethodType fireType = MethodType.methodType(void.class, slpl.getClass()); - fireEvents = lookup.findVirtual(clazz, "fireEvents", fireType); + final MethodType cType = MethodType.methodType(void.class); + loginHandler = lookup.findConstructor(clazz, cType); + + final MethodType methodType = MethodType.methodType(void.class, slpl.getClass()); + fireEvents = lookup.findVirtual(clazz, "fireEvents", methodType); } try { @@ -53,12 +55,14 @@ public static void fireEvents( throws Exception { if (loginHandler == null || fireEvents == null) { final MethodHandles.Lookup lookup = MethodHandles.lookup(); + final Class clazz = Class.forName("com.mohistmc.youer.bukkit.LoginHandler"); - final MethodType vType = MethodType.methodType(void.class); - loginHandler = lookup.findConstructor(clazz, vType); - final MethodType fireType = + final MethodType cType = MethodType.methodType(void.class); + loginHandler = lookup.findConstructor(clazz, cType); + + final MethodType methodType = MethodType.methodType(void.class, slpl.getClass(), GameProfile.class); - fireEvents = lookup.findVirtual(clazz, "fireEvents", fireType); + fireEvents = lookup.findVirtual(clazz, "fireEvents", methodType); } try { diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpigotLoginHandler.java b/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpigotPreLogin.java similarity index 89% rename from common/src/main/java/org/adde0109/pcf/forwarding/compat/SpigotLoginHandler.java rename to common/src/main/java/org/adde0109/pcf/forwarding/compat/SpigotPreLogin.java index b1a75fda..3b46b3fc 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpigotLoginHandler.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpigotPreLogin.java @@ -9,7 +9,7 @@ import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; -public interface SpigotLoginHandler { +public interface SpigotPreLogin { /** * Used for:
*
clazz = Class.forName(slpl.getClass().getName() + "$LoginHandler"); - final MethodType vType = MethodType.methodType(void.class); - loginHandler = lookup.findConstructor(clazz, vType); - fireEvents = lookup.findVirtual(clazz, "fireEvents", vType); + final MethodType voidType = MethodType.methodType(void.class); + loginHandler = lookup.findConstructor(clazz, voidType); + fireEvents = lookup.findVirtual(clazz, "fireEvents", voidType); } try { @@ -63,11 +63,13 @@ public static void fireEvents( throws Exception { if (loginHandler == null || fireEvents == null) { final MethodHandles.Lookup lookup = MethodHandles.lookup(); + final Class clazz = Class.forName(slpl.getClass().getName() + "$LoginHandler"); - final MethodType vType = MethodType.methodType(void.class); - loginHandler = lookup.findConstructor(clazz, vType); - final MethodType fireType = MethodType.methodType(void.class, GameProfile.class); - fireEvents = lookup.findVirtual(clazz, "fireEvents", fireType); + final MethodType cType = MethodType.methodType(void.class); + loginHandler = lookup.findConstructor(clazz, cType); + + final MethodType methodType = MethodType.methodType(void.class, GameProfile.class); + fireEvents = lookup.findVirtual(clazz, "fireEvents", methodType); } try { fireEvents.invoke(loginHandler.invoke(), profile); diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpongePreLogin.java b/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpongePreLogin.java index ed8f5d64..03cac9bc 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpongePreLogin.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpongePreLogin.java @@ -20,8 +20,9 @@ public static boolean fireAuthEvent(final @NotNull ServerLoginPacketListenerBrid throws Exception { if (fireAuthEvent == null) { final MethodHandles.Lookup lookup = MethodHandles.lookup(); - final MethodType rType = MethodType.methodType(boolean.class); - fireAuthEvent = lookup.findVirtual(slpl.getClass(), "bridge$fireAuthEvent", rType); + final MethodType methodType = MethodType.methodType(boolean.class); + fireAuthEvent = + lookup.findVirtual(slpl.getClass(), "bridge$fireAuthEvent", methodType); } try { From 8a3aee664db75c445800d5fd2e05beeaa2f5b73e Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Thu, 29 Jan 2026 23:22:21 -0600 Subject: [PATCH 18/28] Renamed and compat packages to compatibility --- common/src/main/java/org/adde0109/pcf/PCF.java | 8 ++++---- .../java/org/adde0109/pcf/crossstitch/CrossStitch.java | 2 +- .../{compat => compatibility}/ArgumentEdgeCases.java | 2 +- .../{compat => compatibility}/ArclightPreLogin.java | 2 +- .../{compat => compatibility}/MohistPreLogin.java | 2 +- .../{compat => compatibility}/SpigotPreLogin.java | 2 +- .../{compat => compatibility}/SpongePreLogin.java | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) rename common/src/main/java/org/adde0109/pcf/crossstitch/{compat => compatibility}/ArgumentEdgeCases.java (95%) rename common/src/main/java/org/adde0109/pcf/forwarding/{compat => compatibility}/ArclightPreLogin.java (98%) rename common/src/main/java/org/adde0109/pcf/forwarding/{compat => compatibility}/MohistPreLogin.java (98%) rename common/src/main/java/org/adde0109/pcf/forwarding/{compat => compatibility}/SpigotPreLogin.java (98%) rename common/src/main/java/org/adde0109/pcf/forwarding/{compat => compatibility}/SpongePreLogin.java (96%) diff --git a/common/src/main/java/org/adde0109/pcf/PCF.java b/common/src/main/java/org/adde0109/pcf/PCF.java index 5bd7f1ab..f6706321 100644 --- a/common/src/main/java/org/adde0109/pcf/PCF.java +++ b/common/src/main/java/org/adde0109/pcf/PCF.java @@ -15,10 +15,10 @@ import dev.neuralnexus.taterapi.registries.AdapterRegistry; import org.adde0109.pcf.forwarding.Mode; -import org.adde0109.pcf.forwarding.compat.ArclightPreLogin; -import org.adde0109.pcf.forwarding.compat.MohistPreLogin; -import org.adde0109.pcf.forwarding.compat.SpigotPreLogin; -import org.adde0109.pcf.forwarding.compat.SpongePreLogin; +import org.adde0109.pcf.forwarding.compatibility.ArclightPreLogin; +import org.adde0109.pcf.forwarding.compatibility.MohistPreLogin; +import org.adde0109.pcf.forwarding.compatibility.SpigotPreLogin; +import org.adde0109.pcf.forwarding.compatibility.SpongePreLogin; import org.adde0109.pcf.forwarding.modern.ModernForwarding; import org.adde0109.pcf.forwarding.modern.PlayerInfoQueryPayload; import org.adde0109.pcf.forwarding.modern.VelocityProxy; diff --git a/common/src/main/java/org/adde0109/pcf/crossstitch/CrossStitch.java b/common/src/main/java/org/adde0109/pcf/crossstitch/CrossStitch.java index 88d50225..8b47b740 100644 --- a/common/src/main/java/org/adde0109/pcf/crossstitch/CrossStitch.java +++ b/common/src/main/java/org/adde0109/pcf/crossstitch/CrossStitch.java @@ -10,7 +10,7 @@ import io.netty.buffer.Unpooled; import org.adde0109.pcf.PCF; -import org.adde0109.pcf.crossstitch.compat.ArgumentEdgeCases; +import org.adde0109.pcf.crossstitch.compatibility.ArgumentEdgeCases; import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; diff --git a/common/src/main/java/org/adde0109/pcf/crossstitch/compat/ArgumentEdgeCases.java b/common/src/main/java/org/adde0109/pcf/crossstitch/compatibility/ArgumentEdgeCases.java similarity index 95% rename from common/src/main/java/org/adde0109/pcf/crossstitch/compat/ArgumentEdgeCases.java rename to common/src/main/java/org/adde0109/pcf/crossstitch/compatibility/ArgumentEdgeCases.java index 780b3484..e025f5a3 100644 --- a/common/src/main/java/org/adde0109/pcf/crossstitch/compat/ArgumentEdgeCases.java +++ b/common/src/main/java/org/adde0109/pcf/crossstitch/compatibility/ArgumentEdgeCases.java @@ -1,4 +1,4 @@ -package org.adde0109.pcf.crossstitch.compat; +package org.adde0109.pcf.crossstitch.compatibility; import dev.neuralnexus.taterapi.meta.Constraint; import dev.neuralnexus.taterapi.meta.MinecraftVersions; diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightPreLogin.java b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/ArclightPreLogin.java similarity index 98% rename from common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightPreLogin.java rename to common/src/main/java/org/adde0109/pcf/forwarding/compatibility/ArclightPreLogin.java index 96515f66..eb85b4c5 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightPreLogin.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/ArclightPreLogin.java @@ -1,4 +1,4 @@ -package org.adde0109.pcf.forwarding.compat; +package org.adde0109.pcf.forwarding.compatibility; import com.mojang.authlib.GameProfile; diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/MohistPreLogin.java b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/MohistPreLogin.java similarity index 98% rename from common/src/main/java/org/adde0109/pcf/forwarding/compat/MohistPreLogin.java rename to common/src/main/java/org/adde0109/pcf/forwarding/compatibility/MohistPreLogin.java index 1f9760e6..888ea72d 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compat/MohistPreLogin.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/MohistPreLogin.java @@ -1,4 +1,4 @@ -package org.adde0109.pcf.forwarding.compat; +package org.adde0109.pcf.forwarding.compatibility; import com.mojang.authlib.GameProfile; diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpigotPreLogin.java b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/SpigotPreLogin.java similarity index 98% rename from common/src/main/java/org/adde0109/pcf/forwarding/compat/SpigotPreLogin.java rename to common/src/main/java/org/adde0109/pcf/forwarding/compatibility/SpigotPreLogin.java index 3b46b3fc..bd3effb8 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpigotPreLogin.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/SpigotPreLogin.java @@ -1,4 +1,4 @@ -package org.adde0109.pcf.forwarding.compat; +package org.adde0109.pcf.forwarding.compatibility; import com.mojang.authlib.GameProfile; diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpongePreLogin.java b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/SpongePreLogin.java similarity index 96% rename from common/src/main/java/org/adde0109/pcf/forwarding/compat/SpongePreLogin.java rename to common/src/main/java/org/adde0109/pcf/forwarding/compatibility/SpongePreLogin.java index 03cac9bc..daf23f8b 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compat/SpongePreLogin.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/SpongePreLogin.java @@ -1,4 +1,4 @@ -package org.adde0109.pcf.forwarding.compat; +package org.adde0109.pcf.forwarding.compatibility; import org.adde0109.pcf.forwarding.modern.ServerLoginPacketListenerBridge; import org.jetbrains.annotations.NotNull; From 791098828f3c51cdc3b3aae78f912c419d800c03 Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Fri, 30 Jan 2026 19:12:20 -0600 Subject: [PATCH 19/28] Fixed some method handle stuff, since the inner class is non-static --- .../forwarding/compatibility/SpigotPreLogin.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/SpigotPreLogin.java b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/SpigotPreLogin.java index bd3effb8..f8c0763f 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/SpigotPreLogin.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/SpigotPreLogin.java @@ -30,14 +30,17 @@ public static void fireEvents(final @NonNull ServerLoginPacketListenerBridge slp throws Exception { if (loginHandler == null || fireEvents == null) { final MethodHandles.Lookup lookup = MethodHandles.lookup(); + final Class clazz = Class.forName(slpl.getClass().getName() + "$LoginHandler"); - final MethodType voidType = MethodType.methodType(void.class); - loginHandler = lookup.findConstructor(clazz, voidType); - fireEvents = lookup.findVirtual(clazz, "fireEvents", voidType); + final MethodType cType = MethodType.methodType(void.class, slpl.getClass()); + loginHandler = lookup.findConstructor(clazz, cType); + + MethodType methodType = MethodType.methodType(void.class); + fireEvents = lookup.findVirtual(clazz, "fireEvents", methodType); } try { - fireEvents.invoke(loginHandler.invoke()); + fireEvents.invoke(loginHandler.invoke(slpl)); } catch (Throwable e) { throw new RuntimeException(e); } @@ -65,14 +68,14 @@ public static void fireEvents( final MethodHandles.Lookup lookup = MethodHandles.lookup(); final Class clazz = Class.forName(slpl.getClass().getName() + "$LoginHandler"); - final MethodType cType = MethodType.methodType(void.class); + final MethodType cType = MethodType.methodType(void.class, slpl.getClass()); loginHandler = lookup.findConstructor(clazz, cType); final MethodType methodType = MethodType.methodType(void.class, GameProfile.class); fireEvents = lookup.findVirtual(clazz, "fireEvents", methodType); } try { - fireEvents.invoke(loginHandler.invoke(), profile); + fireEvents.invoke(loginHandler.invoke(slpl), profile); } catch (Throwable e) { throw new RuntimeException(e); } From 1909aa9c97ecc5a1022d9c6ebefd026405591b5b Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Fri, 30 Jan 2026 19:12:48 -0600 Subject: [PATCH 20/28] Mohist seem to change handleHello somehow, so they're getting the same workaround as Arclight --- .../modern/ServerLoginPacketListenerImplMixin.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modern/v16_5/src/forge/java/org/adde0109/pcf/mixin/v16_5/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java b/modern/v16_5/src/forge/java/org/adde0109/pcf/mixin/v16_5/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java index 67fac3ad..5d54545b 100644 --- a/modern/v16_5/src/forge/java/org/adde0109/pcf/mixin/v16_5/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java +++ b/modern/v16_5/src/forge/java/org/adde0109/pcf/mixin/v16_5/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java @@ -45,7 +45,7 @@ public abstract class ServerLoginPacketListenerImplMixin // spotless:on // spotless:off - @AConstraint(platform = Platform.ARCLIGHT, invert = true) + @AConstraint(platform = {Platform.ARCLIGHT, Platform.MOHIST}, invert = true) @Inject(method = "handleHello", cancellable = true, at = @At(value = "FIELD", opcode = Opcodes.PUTFIELD, ordinal = 1, target = "Lnet/minecraft/server/network/ServerLoginPacketListenerImpl;state:Lnet/minecraft/server/network/ServerLoginPacketListenerImpl$State;")) // spotless:on @@ -53,7 +53,11 @@ private void onHandleHello(final @NonNull CallbackInfo ci) { handleHello(this, ci); } - @AConstraint(platform = Platform.ARCLIGHT) + /** + * Arclight - Overwrites the method
+ * Mohist - Changed the method in some incompatible manner, not obvious from their patches + */ + @AConstraint(platform = {Platform.ARCLIGHT, Platform.MOHIST}) @Inject(method = "handleHello", cancellable = true, at = @At(value = "HEAD")) private void onHandleHelloArclight(final @NonNull CallbackInfo ci) { Validate.validState( From 6ee03d656367da36fb23df2b13980d2468530c2e Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Fri, 30 Jan 2026 21:07:26 -0600 Subject: [PATCH 21/28] Moved dev notes --- docs/{ => development}/HybridCompatibility.md | 10 ++++++++++ docs/{ => development}/ImplementationNotes.md | 0 docs/{ => development}/ModConfigEvent.md | 0 docs/{ => development}/ModLoadingContext.md | 0 4 files changed, 10 insertions(+) rename docs/{ => development}/HybridCompatibility.md (91%) rename docs/{ => development}/ImplementationNotes.md (100%) rename docs/{ => development}/ModConfigEvent.md (100%) rename docs/{ => development}/ModLoadingContext.md (100%) diff --git a/docs/HybridCompatibility.md b/docs/development/HybridCompatibility.md similarity index 91% rename from docs/HybridCompatibility.md rename to docs/development/HybridCompatibility.md index 73421986..75d67768 100644 --- a/docs/HybridCompatibility.md +++ b/docs/development/HybridCompatibility.md @@ -23,6 +23,16 @@ Method: `bridge$preLogin(GameProfile)`
Source: Notes: Alternatively call `private void callPlayerPreLoginEvents(GameProfile)` and use PCF logic +## CatServer + +Versions: 1.12.2, 1.16.5, 1.18.2
+Class: `net.minecraft.server.network.ServerLoginPacketListenerImpl$LoginHandler`
+Method: `fireEvents()`
+Sources: +- 1.12.2: +- 1.16.5: +- 1.18.2: + ## Ketting Version: 1.20.1
diff --git a/docs/ImplementationNotes.md b/docs/development/ImplementationNotes.md similarity index 100% rename from docs/ImplementationNotes.md rename to docs/development/ImplementationNotes.md diff --git a/docs/ModConfigEvent.md b/docs/development/ModConfigEvent.md similarity index 100% rename from docs/ModConfigEvent.md rename to docs/development/ModConfigEvent.md diff --git a/docs/ModLoadingContext.md b/docs/development/ModLoadingContext.md similarity index 100% rename from docs/ModLoadingContext.md rename to docs/development/ModLoadingContext.md From 0e1f021629b0e50460e794c9d3b342c996d6f3f0 Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Fri, 30 Jan 2026 21:07:49 -0600 Subject: [PATCH 22/28] Added more hybrids to the startup logic --- common/src/main/java/org/adde0109/pcf/PCF.java | 11 +++++------ .../modern/ServerLoginPacketListenerImplMixin.java | 8 +++++--- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/org/adde0109/pcf/PCF.java b/common/src/main/java/org/adde0109/pcf/PCF.java index f6706321..ee6ac614 100644 --- a/common/src/main/java/org/adde0109/pcf/PCF.java +++ b/common/src/main/java/org/adde0109/pcf/PCF.java @@ -133,13 +133,12 @@ void onInit() { }); } else if (Constraints.builder() .or( - Constraint.builder() - .platform(Platforms.KETTING) - .version(MinecraftVersions.V20_1), - Constraint.range(MinecraftVersions.V12_2, MinecraftVersions.V20_1) - .platform(Platforms.MAGMA), Constraint.range(MinecraftVersions.V12_2, MinecraftVersions.V19_4) - .platform(Platforms.MOHIST)) + .platform( + Platforms.CATSERVER, Platforms.MAGMA, Platforms.MOHIST), + Constraint.builder() + .platform(Platforms.MAGMA, Platforms.KETTING) + .version(MinecraftVersions.V20_1)) .result()) { ModernForwarding.postProcessors.removeFirst(); ModernForwarding.postProcessors.add( diff --git a/modern/v16_5/src/forge/java/org/adde0109/pcf/mixin/v16_5/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java b/modern/v16_5/src/forge/java/org/adde0109/pcf/mixin/v16_5/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java index 5d54545b..a676f9b2 100644 --- a/modern/v16_5/src/forge/java/org/adde0109/pcf/mixin/v16_5/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java +++ b/modern/v16_5/src/forge/java/org/adde0109/pcf/mixin/v16_5/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java @@ -45,7 +45,8 @@ public abstract class ServerLoginPacketListenerImplMixin // spotless:on // spotless:off - @AConstraint(platform = {Platform.ARCLIGHT, Platform.MOHIST}, invert = true) + @AConstraint( + platform = {Platform.ARCLIGHT, Platform.CATSERVER, Platform.MAGMA, Platform.MOHIST}, invert = true) @Inject(method = "handleHello", cancellable = true, at = @At(value = "FIELD", opcode = Opcodes.PUTFIELD, ordinal = 1, target = "Lnet/minecraft/server/network/ServerLoginPacketListenerImpl;state:Lnet/minecraft/server/network/ServerLoginPacketListenerImpl$State;")) // spotless:on @@ -55,9 +56,10 @@ private void onHandleHello(final @NonNull CallbackInfo ci) { /** * Arclight - Overwrites the method
- * Mohist - Changed the method in some incompatible manner, not obvious from their patches + * CatServer, Magma, Mohist - Patches alter the method in an incompatible manner */ - @AConstraint(platform = {Platform.ARCLIGHT, Platform.MOHIST}) + @AConstraint( + platform = {Platform.ARCLIGHT, Platform.CATSERVER, Platform.MAGMA, Platform.MOHIST}) @Inject(method = "handleHello", cancellable = true, at = @At(value = "HEAD")) private void onHandleHelloArclight(final @NonNull CallbackInfo ci) { Validate.validState( From ac76aa3e5c72f5f7170725d980690ff33f91da40 Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Fri, 30 Jan 2026 22:57:53 -0600 Subject: [PATCH 23/28] Updated compatibility docs --- docs/Compatibility.md | 48 ++++++++++++++++++++----- docs/development/HybridCompatibility.md | 2 +- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/docs/Compatibility.md b/docs/Compatibility.md index fe105c5a..79adfc8f 100644 --- a/docs/Compatibility.md +++ b/docs/Compatibility.md @@ -1,6 +1,7 @@ -# Platform Compatibility +# Compatibility ## Modern Forwarding and CrossStitch Command Wrapping + | MC Version | Forge | NeoForge | Modern Forwarding | CrossStitch | Notes | |------------|-------|----------|-------------------|-------------|--------------------------------------------------------------------------------------------| | 1.21.x | ✅ | ✅ | ✅ | ✅ | | @@ -12,19 +13,38 @@ | 1.15.x | ✅ | N/A | ✅ | ✅ | Requires [MixinBootstrap](https://modrinth.com/mod/mixinbootstrap) on 1.15 - 1.15.1 | | 1.14.x | ✅ | N/A | ✅ | ✅ | Requires [MixinBootstrap](https://modrinth.com/mod/mixinbootstrap) | | 1.13.x | ❌ | N/A | ❌ | ❌ | | -| 1.12.x | ✅ | N/A | ✅ | ❌ | Requires [MixinBooter](https://modrinth.com/mod/mixinbooter) and a modified Velocity proxy | -| 1.11.x | ✅ | N/A | ✅ | ❌ | Requires [MixinBooter](https://modrinth.com/mod/mixinbooter) and a modified Velocity proxy | -| 1.10.x | ✅ | N/A | ✅ | ❌ | Requires [MixinBooter](https://modrinth.com/mod/mixinbooter) and a modified Velocity proxy | -| 1.9.x | ✅ | N/A | ✅ | ❌ | Requires [MixinBooter](https://modrinth.com/mod/mixinbooter) and a modified Velocity proxy | -| 1.8.x | ✅ | N/A | ✅ | ❌ | Requires [MixinBooter](https://modrinth.com/mod/mixinbooter) and a modified Velocity proxy | -| 1.7.x | ✅ | N/A | ✅ | ❌ | Requires [MixinBooter](https://modrinth.com/mod/mixinbooter) and a modified Velocity proxy | +| 1.12.x | ✅ | N/A | ✅ | N/A | Requires [MixinBooter](https://modrinth.com/mod/mixinbooter) and a modified Velocity proxy | +| 1.11.x | ✅ | N/A | ✅ | N/A | Requires [MixinBooter](https://modrinth.com/mod/mixinbooter) and a modified Velocity proxy | +| 1.10.x | ✅ | N/A | ✅ | N/A | Requires [MixinBooter](https://modrinth.com/mod/mixinbooter) and a modified Velocity proxy | +| 1.9.x | ✅ | N/A | ✅ | N/A | Requires [MixinBooter](https://modrinth.com/mod/mixinbooter) and a modified Velocity proxy | +| 1.8.x | ✅ | N/A | ✅ | N/A | Requires [MixinBooter](https://modrinth.com/mod/mixinbooter) and a modified Velocity proxy | +| 1.7.x | ✅ | N/A | ✅ | N/A | Requires [MixinBooter](https://modrinth.com/mod/mixinbooter) and a modified Velocity proxy | + +## SpongeForge and SpongeNeo Compatibility + +In most cases PCF shouldn't be needed, as Sponge supports legacy+modern forwarding and command argument wrapping. Known exceptions to this rule are listed below. + +| MC Version | SpongeAPI Version | SpongeForge | SpongeNeo | Notes | +|------------|-------------------|-------------|-----------|------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 1.16.5 | 8 | ✅ | N/A | SF's modern forwarding doesn't work | +| 1.18.2 | 9 | TBD | N/A | | +| 1.19.4 | 10 | TBD | N/A | | +| 1.20.6 | 11 | TBD | TBD | | +| 1.21.1 | 12 | TBD | ✅ | SpongeNeo's modern forwarding doesn't work due to an incompatibility caused by Forgified Fabric API is installed (specifically `fabric_networking_api_v1`) | +| 1.21.3 | 13 | TBD | TBD | | +| 1.21.4 | 14 | TBD | TBD | | +| 1.21.5 | 15 | TBD | TBD | | +| 1.21.8 | 16 | TBD | TBD | | +| 1.21.10 | 17 | TBD | TBD | | +| 1.21.11 | 18 | TBD | TBD | | ## Modpack Compatibility + Try adding [BeQuietNegotiator]() to your NeoForge client if you're trying to join a Vanilla server. | Modpack Name | Modpack Version | MC Version | Modloader Version | As Primary/Forced-Host | Server Switching | Can Join Vanilla Servers | Notes | |----------------------------------------------------------------------------------------------------|-----------------|------------|-------------------|------------------------|------------------|--------------------------|--------------------------------| -| [ATM10](https://www.curseforge.com/minecraft/modpacks/all-the-mods-10) | 4.12 | 1.21.1 | NeoForge 21.1.209 | ✅ | ? | ❌ | | +| [ATM10](https://www.curseforge.com/minecraft/modpacks/all-the-mods-10) | 5.4 | 1.21.1 | NeoForge 21.1.215 | ✅ | ✅ | ❌ | | | [ATM10 to Sky](https://www.curseforge.com/minecraft/modpacks/all-the-mods-10-sky) | 1.5.1 | 1.21.1 | NeoForge 21.1.206 | ✅ | ? | ❌ | | | [FTB Presents Direwolf20](https://www.feed-the-beast.com/modpacks/126-ftb-presents-direwolf20-121) | 1.14.2 | 1.21.1 | NeoForge 21.1.172 | ✅ | ? | ❌ | | | [FTB Evolution](https://www.feed-the-beast.com/modpacks/125-ftb-evolution) | ? | 1.21.1 | NeoForge 21.1.203 | ✅ | ? | ❌ | | @@ -33,8 +53,20 @@ Try adding [BeQuietNegotiator]() t | [Age of Fate](https://www.curseforge.com/minecraft/modpacks/age-of-fate) | 4.3.2 | 1.20.1 | Forge 47.4.0 | ? | ? | ? | | | [ATM9](https://www.curseforge.com/minecraft/modpacks/all-the-mods-9) | 1.1.0 | 1.20.1 | Forge 47.4.0 | ✅ | ? | ? | | | [ATM9 to Sky](https://www.curseforge.com/minecraft/modpacks/all-the-mods-9-to-the-sky) | 1.1.8 | 1.20.1 | Forge 47.4.0 | ✅ | ? | ? | | +| [Better MC 4](https://www.curseforge.com/minecraft/modpacks/better-mc-forge-bmc4) | 55 | 1.20.1 | Forge 47.4.13 | ✅ | ? | ? | | | [Ozone Skyblock Reloaded](https://www.curseforge.com/minecraft/modpacks/ozone-skyblock-reborn) | 1.19.1 | 1.20.1 | Forge 47.4.10 | ✅ | ? | ? | | | [Workload](https://www.curseforge.com/minecraft/modpacks/workload) | 1.1.0 | 1.20.1 | Forge 47.3.22 | ✅ | ✅ | ? | FFCRP mod incompatible with VS | | [FTB Presents Stoneblock 3](https://www.feed-the-beast.com/modpacks/100-ftb-stoneblock-3) | 1.11.5 | 1.18.2 | Forge 40.2.34 | ✅ | ? | ? | | | [TechBlock - SkyTech 3](https://modrinth.com/project/techblock-skytech-3) | 1.0 | 1.16.5 | Forge 36.2.35 | ✅ | ? | ? | | | [The Pixelmon Modpack](https://www.curseforge.com/minecraft/modpacks/the-pixelmon-modpack) | 9.1.13 | 1.16.5 | Forge 36.2.35 | ✅ | ? | ? | | + +## Hybrid Server Software Compatibility + +| Server Software | MC Version | Modern Forwarding | CrossStitch | Notes | +|-----------------|------------|-------------------|-------------|-----------------------------------------------------------| +| Arclight | 1.14.4 | ✅ | ✅ | | +| Arclight | 1.15.2 | ✅ | ✅ | | +| Arclight | 1.16.5 | ✅ | ✅ | | +| CatServer | 1.16.5 | ✅ | ✅ | | +| Magma | 1.16.5 | ✅ | ✅ | Magma 1.16.5 is unstable in general and shouldn't be used | +| Mohist | 1.16.5 | ✅ | ✅ | | diff --git a/docs/development/HybridCompatibility.md b/docs/development/HybridCompatibility.md index 75d67768..428fd630 100644 --- a/docs/development/HybridCompatibility.md +++ b/docs/development/HybridCompatibility.md @@ -2,7 +2,7 @@ ## Arclight -Versions: 1.14 - 1.20.1
+Versions: 1.14.4, 1.15.2, 1.16.3, 1.16.5, 1.17.1, 1.18.1, 1.18.2, 1.19.2, 1.19.3, 1.19.4, 1.20.1
Class: `net.minecraft.server.network.ServerLoginPacketListenerImpl`
Method: `arclight$preLogin()`
Source: From b676c58696cb1ecb3144b754dfc667b9b9458ca1 Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Fri, 30 Jan 2026 23:12:06 -0600 Subject: [PATCH 24/28] Added some debug logging during post-processor registration --- common/src/main/java/org/adde0109/pcf/PCF.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/org/adde0109/pcf/PCF.java b/common/src/main/java/org/adde0109/pcf/PCF.java index ee6ac614..fb506228 100644 --- a/common/src/main/java/org/adde0109/pcf/PCF.java +++ b/common/src/main/java/org/adde0109/pcf/PCF.java @@ -54,7 +54,7 @@ void onInit() { Platform platform = api.platform(); // spotless:off - PCF.logger.info("Initializing Proxy Compatible Forge on " + PCF.logger.info("Initializing " + MOD_NAME + " on " + "Minecraft " + mcv + " (" + platform + " " + api.meta().apiVersion() + ")"); // spotless:on @@ -86,6 +86,7 @@ void onInit() { PlayerInfoQueryPayload.IDENTIFIER, PlayerInfoQueryPayload.STREAM_CODEC); if (Constraint.builder().platform(Platforms.ARCLIGHT).result()) { + logger.debug("Arclight detected, applying pre-login post processor"); if (Constraint.range(MinecraftVersions.V14, MinecraftVersions.V20_1).result()) { ModernForwarding.postProcessors.removeFirst(); ModernForwarding.postProcessors.add( @@ -113,6 +114,7 @@ void onInit() { .platform(Platforms.MOHIST) .version(MinecraftVersions.V20_1) .result()) { + logger.debug("Mohist detected, applying pre-login post processor"); ModernForwarding.postProcessors.removeFirst(); ModernForwarding.postProcessors.add( (slpl, profile) -> { @@ -124,6 +126,7 @@ void onInit() { .platform(Platforms.YOUER) .version(MinecraftVersions.V21_1) .result()) { + logger.debug("Youer detected, applying pre-login post processor"); ModernForwarding.postProcessors.removeFirst(); ModernForwarding.postProcessors.add( (slpl, profile) -> { @@ -140,6 +143,7 @@ void onInit() { .platform(Platforms.MAGMA, Platforms.KETTING) .version(MinecraftVersions.V20_1)) .result()) { + logger.debug("Forge+Bukkit hybrid detected, applying pre-login post processor"); ModernForwarding.postProcessors.removeFirst(); ModernForwarding.postProcessors.add( (slpl, profile) -> { @@ -155,6 +159,7 @@ void onInit() { .platform(Platforms.MOHIST) .version(MinecraftVersions.V20_2)) .result()) { + logger.debug("[Neo]Forge+Bukkit hybrid detected, applying pre-login post processor"); ModernForwarding.postProcessors.removeFirst(); ModernForwarding.postProcessors.add( (slpl, profile) -> { @@ -175,6 +180,7 @@ void onInit() { .platform(Platforms.NEOTENET) .version(MinecraftVersions.V21_1, MinecraftVersions.V21_10)) .result()) { + logger.debug("[Neo]Forge+Bukkit hybrid detected, applying pre-login post processor"); ModernForwarding.postProcessors.addFirst( (slpl, profile) -> { ((SpigotPreLogin.V20_5) slpl).callPlayerPreLoginEvents(profile); @@ -185,6 +191,7 @@ void onInit() { if (Constraint.range(MinecraftVersions.V16, MinecraftVersions.V18_2) .platform(Platforms.SPONGE) .result()) { + logger.debug("SpongeAPI 8 or 9 detected, applying pre-login post processor"); ModernForwarding.postProcessors.addFirst( (slpl, profile) -> { slpl.bridge$setGameProfile(profile); From 5eacc5fe5b762e1087d28115163af7f1a6cea703 Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Fri, 30 Jan 2026 23:21:59 -0600 Subject: [PATCH 25/28] Renamed PreLogin compatibility doc, since it includes Sponge --- .../{HybridCompatibility.md => PreLoginCompatibility.md} | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) rename docs/development/{HybridCompatibility.md => PreLoginCompatibility.md} (98%) diff --git a/docs/development/HybridCompatibility.md b/docs/development/PreLoginCompatibility.md similarity index 98% rename from docs/development/HybridCompatibility.md rename to docs/development/PreLoginCompatibility.md index 428fd630..96d42541 100644 --- a/docs/development/HybridCompatibility.md +++ b/docs/development/PreLoginCompatibility.md @@ -1,4 +1,4 @@ -# Hybrid Compatibility +# PreLogin Compatibility ## Arclight @@ -120,12 +120,7 @@ Source: Class: `net.minecraft.server.network.ServerLoginPacketListenerImpl`
-Method: -```java -if (this.bridge$fireAuthEvent()) { - ci.cancel(); -} -``` +Method: `boolean bridge$fireAuthEvent()`
Sources: - API 8: - API 9: From 508ae6e111439ab7336c52f2ce525d4befb8847f Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Tue, 3 Feb 2026 19:07:44 -0600 Subject: [PATCH 26/28] Modified login PostProcessors to take Cancellable as an input as opposed to returning a boolean that only one impl utilizes. --- .../src/main/java/org/adde0109/pcf/PCF.java | 44 +++++++------------ .../forwarding/modern/ModernForwarding.java | 25 ++++++----- 2 files changed, 30 insertions(+), 39 deletions(-) diff --git a/common/src/main/java/org/adde0109/pcf/PCF.java b/common/src/main/java/org/adde0109/pcf/PCF.java index fb506228..a1beff29 100644 --- a/common/src/main/java/org/adde0109/pcf/PCF.java +++ b/common/src/main/java/org/adde0109/pcf/PCF.java @@ -90,25 +90,19 @@ void onInit() { if (Constraint.range(MinecraftVersions.V14, MinecraftVersions.V20_1).result()) { ModernForwarding.postProcessors.removeFirst(); ModernForwarding.postProcessors.add( - (slpl, profile) -> { + (slpl, profile, c) -> { slpl.bridge$setGameProfile(profile); ArclightPreLogin.V14.preLogin(slpl); - return false; }); } else if (Constraint.builder().version(MinecraftVersions.V20_2).result()) { ModernForwarding.postProcessors.removeFirst(); ModernForwarding.postProcessors.add( - (slpl, profile) -> { - ArclightPreLogin.V20_2.preLogin(slpl, profile); - return false; - }); + (slpl, profile, c) -> ArclightPreLogin.V20_2.preLogin(slpl, profile)); } else if (Constraint.noLessThan(MinecraftVersions.V20_3).result()) { ModernForwarding.postProcessors.removeFirst(); ModernForwarding.postProcessors.add( - (slpl, profile) -> { - ((ArclightPreLogin.V20_4) slpl).bridge$preLogin(profile); - return false; - }); + (slpl, profile, c) -> + ((ArclightPreLogin.V20_4) slpl).bridge$preLogin(profile)); } } else if (Constraint.builder() .platform(Platforms.MOHIST) @@ -117,10 +111,9 @@ void onInit() { logger.debug("Mohist detected, applying pre-login post processor"); ModernForwarding.postProcessors.removeFirst(); ModernForwarding.postProcessors.add( - (slpl, profile) -> { + (slpl, profile, c) -> { slpl.bridge$setGameProfile(profile); MohistPreLogin.V20_1.fireEvents(slpl); - return false; }); } else if (Constraint.builder() .platform(Platforms.YOUER) @@ -129,10 +122,9 @@ void onInit() { logger.debug("Youer detected, applying pre-login post processor"); ModernForwarding.postProcessors.removeFirst(); ModernForwarding.postProcessors.add( - (slpl, profile) -> { + (slpl, profile, c) -> { MohistPreLogin.Youer.fireEvents(slpl, profile); slpl.bridge$startClientVerification(profile); - return false; }); } else if (Constraints.builder() .or( @@ -146,10 +138,9 @@ void onInit() { logger.debug("Forge+Bukkit hybrid detected, applying pre-login post processor"); ModernForwarding.postProcessors.removeFirst(); ModernForwarding.postProcessors.add( - (slpl, profile) -> { + (slpl, profile, c) -> { slpl.bridge$setGameProfile(profile); SpigotPreLogin.Legacy.fireEvents(slpl); - return false; }); } else if (Constraints.builder() .or( @@ -159,13 +150,11 @@ void onInit() { .platform(Platforms.MOHIST) .version(MinecraftVersions.V20_2)) .result()) { - logger.debug("[Neo]Forge+Bukkit hybrid detected, applying pre-login post processor"); + logger.debug( + "[Neo]Forge+Bukkit hybrid detected, applying pre-login post processor"); ModernForwarding.postProcessors.removeFirst(); ModernForwarding.postProcessors.add( - (slpl, profile) -> { - SpigotPreLogin.V20_2.fireEvents(slpl, profile); - return false; - }); + (slpl, profile, c) -> SpigotPreLogin.V20_2.fireEvents(slpl, profile)); } else if (Constraints.builder() .or( Constraint.builder() @@ -180,12 +169,11 @@ void onInit() { .platform(Platforms.NEOTENET) .version(MinecraftVersions.V21_1, MinecraftVersions.V21_10)) .result()) { - logger.debug("[Neo]Forge+Bukkit hybrid detected, applying pre-login post processor"); + logger.debug( + "[Neo]Forge+Bukkit hybrid detected, applying pre-login post processor"); ModernForwarding.postProcessors.addFirst( - (slpl, profile) -> { - ((SpigotPreLogin.V20_5) slpl).callPlayerPreLoginEvents(profile); - return false; - }); + (slpl, profile, c) -> + ((SpigotPreLogin.V20_5) slpl).callPlayerPreLoginEvents(profile)); } if (Constraint.range(MinecraftVersions.V16, MinecraftVersions.V18_2) @@ -193,9 +181,9 @@ void onInit() { .result()) { logger.debug("SpongeAPI 8 or 9 detected, applying pre-login post processor"); ModernForwarding.postProcessors.addFirst( - (slpl, profile) -> { + (slpl, profile, c) -> { slpl.bridge$setGameProfile(profile); - return SpongePreLogin.API8.fireAuthEvent(slpl); + c.setCancelled(SpongePreLogin.API8.fireAuthEvent(slpl)); }); } } diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java b/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java index d088559c..01ee37b5 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/modern/ModernForwarding.java @@ -114,24 +114,24 @@ public interface PostProcessor { * * @param slpl the ServerLoginPacketListener * @param profile the forwarded GameProfile - * @return true to stop processing further, false to continue + * @param c the cancellable wrapper * @throws Exception if an error occurs */ - boolean process( + void process( final @NonNull ServerLoginPacketListenerBridge slpl, - final @NonNull GameProfile profile) + final @NonNull GameProfile profile, + final @NonNull Cancellable c) throws Exception; } @ApiStatus.Internal public static PreProcessor preProcessor = (slpl, buf) -> {}; private static final PostProcessor DEFAULT_POST_PROCESSOR = - (slpl, profile) -> { + (slpl, profile, c) -> { final NameAndId nameAndId = new NameAndId(profile); slpl.bridge$logger_info( "UUID of player {} is {}", nameAndId.name(), nameAndId.id()); slpl.bridge$startClientVerification(profile); - return false; }; @ApiStatus.Internal @@ -186,24 +186,24 @@ public static void handleCustomQueryPacket( * @param slpl The ServerLoginPacketListenerImpl * @param transactionId The transaction ID * @param mcPacket The Minecraft packet - * @param ci The callback info wrapper + * @param c The cancellable wrapper */ public static void handleCustomQueryPacket( final @NonNull ServerLoginPacketListenerBridge slpl, final int transactionId, final @NonNull Object mcPacket, - final @NonNull Cancellable ci) { + final @NonNull Cancellable c) { if (transactionId != slpl.bridge$velocityLoginMessageId()) { return; } final ServerboundCustomQueryAnswerPacket packet = ServerboundCustomQueryAnswerPacket.fromMC(mcPacket); try { - handleCustomQueryPacket(slpl, packet); + handleCustomQueryPacket(slpl, packet, c); } catch (ThrowingComponent e) { slpl.bridge$disconnect(e.getComponent()); } - ci.cancel(); + c.cancel(); } /** @@ -211,10 +211,12 @@ public static void handleCustomQueryPacket( * * @param slpl The ServerLoginPacketListenerImpl * @param packet The Minecraft packet + * @param c The cancellable wrapper */ public static void handleCustomQueryPacket( final @NonNull ServerLoginPacketListenerBridge slpl, - final @NonNull ServerboundCustomQueryAnswerPacket packet) { + final @NonNull ServerboundCustomQueryAnswerPacket packet, + final @NonNull Cancellable c) { // Validate payload presence if (packet.payload() == null) { throw new ThrowingComponent(DIRECT_CONNECT_ERR); @@ -309,7 +311,8 @@ public static void handleCustomQueryPacket( // Proceed with login try { for (final PostProcessor processor : postProcessors) { - if (processor.process(slpl, payload.profile())) { + processor.process(slpl, payload.profile(), c); + if (c.cancelled()) { break; } } From aa32c256c6aafa34dff290e05a833c731c85d14c Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Fri, 6 Feb 2026 19:28:49 -0600 Subject: [PATCH 27/28] Added a min version constraint to a 1.20.2+ field, the mixin should behave as expected now for older versions --- .../modern/ServerLoginPacketListenerImplMixin.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modern/v20_4/src/forge/java/org/adde0109/pcf/mixin/v20_4/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java b/modern/v20_4/src/forge/java/org/adde0109/pcf/mixin/v20_4/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java index 42989b69..19a94b49 100644 --- a/modern/v20_4/src/forge/java/org/adde0109/pcf/mixin/v20_4/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java +++ b/modern/v20_4/src/forge/java/org/adde0109/pcf/mixin/v20_4/forge/forwarding/modern/ServerLoginPacketListenerImplMixin.java @@ -14,6 +14,7 @@ import org.adde0109.pcf.forwarding.modern.ConnectionBridge; import org.adde0109.pcf.forwarding.modern.ServerLoginPacketListenerBridge; import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -30,8 +31,9 @@ public abstract class ServerLoginPacketListenerImplMixin @AConstraint(version = @Versions(min = MinecraftVersion.V20_2)) @Shadow abstract void shadow$startClientVerification(GameProfile profile); - @Shadow - private GameProfile authenticatedProfile; + @AConstraint(version = @Versions(min = MinecraftVersion.V20_2)) + @Shadow private @Nullable GameProfile authenticatedProfile; + @Unique private int pcf$velocityLoginMessageId = -1; // spotless:on From b71c1d651e36fd532653d3dbc2cbd029ddb893f9 Mon Sep 17 00:00:00 2001 From: p0t4t0sandwich Date: Sun, 8 Feb 2026 00:52:21 -0600 Subject: [PATCH 28/28] Created new prelogin package --- common/src/main/java/org/adde0109/pcf/PCF.java | 8 ++++---- .../compatibility/{ => prelogin}/ArclightPreLogin.java | 2 +- .../compatibility/{ => prelogin}/MohistPreLogin.java | 2 +- .../compatibility/{ => prelogin}/SpigotPreLogin.java | 2 +- .../compatibility/{ => prelogin}/SpongePreLogin.java | 2 +- gradle.properties | 6 +++--- 6 files changed, 11 insertions(+), 11 deletions(-) rename common/src/main/java/org/adde0109/pcf/forwarding/compatibility/{ => prelogin}/ArclightPreLogin.java (98%) rename common/src/main/java/org/adde0109/pcf/forwarding/compatibility/{ => prelogin}/MohistPreLogin.java (97%) rename common/src/main/java/org/adde0109/pcf/forwarding/compatibility/{ => prelogin}/SpigotPreLogin.java (98%) rename common/src/main/java/org/adde0109/pcf/forwarding/compatibility/{ => prelogin}/SpongePreLogin.java (95%) diff --git a/common/src/main/java/org/adde0109/pcf/PCF.java b/common/src/main/java/org/adde0109/pcf/PCF.java index a1beff29..ea8a8a66 100644 --- a/common/src/main/java/org/adde0109/pcf/PCF.java +++ b/common/src/main/java/org/adde0109/pcf/PCF.java @@ -15,10 +15,10 @@ import dev.neuralnexus.taterapi.registries.AdapterRegistry; import org.adde0109.pcf.forwarding.Mode; -import org.adde0109.pcf.forwarding.compatibility.ArclightPreLogin; -import org.adde0109.pcf.forwarding.compatibility.MohistPreLogin; -import org.adde0109.pcf.forwarding.compatibility.SpigotPreLogin; -import org.adde0109.pcf.forwarding.compatibility.SpongePreLogin; +import org.adde0109.pcf.forwarding.compatibility.prelogin.ArclightPreLogin; +import org.adde0109.pcf.forwarding.compatibility.prelogin.MohistPreLogin; +import org.adde0109.pcf.forwarding.compatibility.prelogin.SpigotPreLogin; +import org.adde0109.pcf.forwarding.compatibility.prelogin.SpongePreLogin; import org.adde0109.pcf.forwarding.modern.ModernForwarding; import org.adde0109.pcf.forwarding.modern.PlayerInfoQueryPayload; import org.adde0109.pcf.forwarding.modern.VelocityProxy; diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/ArclightPreLogin.java b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/ArclightPreLogin.java similarity index 98% rename from common/src/main/java/org/adde0109/pcf/forwarding/compatibility/ArclightPreLogin.java rename to common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/ArclightPreLogin.java index eb85b4c5..da6918f8 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/ArclightPreLogin.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/ArclightPreLogin.java @@ -1,4 +1,4 @@ -package org.adde0109.pcf.forwarding.compatibility; +package org.adde0109.pcf.forwarding.compatibility.prelogin; import com.mojang.authlib.GameProfile; diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/MohistPreLogin.java b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/MohistPreLogin.java similarity index 97% rename from common/src/main/java/org/adde0109/pcf/forwarding/compatibility/MohistPreLogin.java rename to common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/MohistPreLogin.java index 888ea72d..230a7eaa 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/MohistPreLogin.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/MohistPreLogin.java @@ -1,4 +1,4 @@ -package org.adde0109.pcf.forwarding.compatibility; +package org.adde0109.pcf.forwarding.compatibility.prelogin; import com.mojang.authlib.GameProfile; diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/SpigotPreLogin.java b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/SpigotPreLogin.java similarity index 98% rename from common/src/main/java/org/adde0109/pcf/forwarding/compatibility/SpigotPreLogin.java rename to common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/SpigotPreLogin.java index f8c0763f..68fdbf65 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/SpigotPreLogin.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/SpigotPreLogin.java @@ -1,4 +1,4 @@ -package org.adde0109.pcf.forwarding.compatibility; +package org.adde0109.pcf.forwarding.compatibility.prelogin; import com.mojang.authlib.GameProfile; diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/SpongePreLogin.java b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/SpongePreLogin.java similarity index 95% rename from common/src/main/java/org/adde0109/pcf/forwarding/compatibility/SpongePreLogin.java rename to common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/SpongePreLogin.java index daf23f8b..6f2bec3a 100644 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/SpongePreLogin.java +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/SpongePreLogin.java @@ -1,4 +1,4 @@ -package org.adde0109.pcf.forwarding.compatibility; +package org.adde0109.pcf.forwarding.compatibility.prelogin; import org.adde0109.pcf.forwarding.modern.ServerLoginPacketListenerBridge; import org.jetbrains.annotations.NotNull; diff --git a/gradle.properties b/gradle.properties index 08813bf7..58e1c309 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,9 +1,9 @@ # Turn on if you want to compile everything uber fast and maybe OOM a little # (should probably bump Xmx to 6-8GB if you do) -#org.gradle.parallel=true -#org.gradle.jvmargs=-Xmx8G +org.gradle.parallel=true +org.gradle.jvmargs=-Xmx8G -org.gradle.jvmargs=-Xmx4G +#org.gradle.jvmargs=-Xmx4G org.gradle.daemon=false org.gradle.caching=true # PCF project properties