diff --git a/common/src/main/java/org/adde0109/pcf/PCF.java b/common/src/main/java/org/adde0109/pcf/PCF.java index c76236c7..ea8a8a66 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; @@ -14,6 +15,11 @@ import dev.neuralnexus.taterapi.registries.AdapterRegistry; import org.adde0109.pcf.forwarding.Mode; +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; import org.jetbrains.annotations.ApiStatus; @@ -48,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 @@ -74,9 +80,112 @@ 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.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( + (slpl, profile, c) -> { + slpl.bridge$setGameProfile(profile); + ArclightPreLogin.V14.preLogin(slpl); + }); + } else if (Constraint.builder().version(MinecraftVersions.V20_2).result()) { + ModernForwarding.postProcessors.removeFirst(); + ModernForwarding.postProcessors.add( + (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, c) -> + ((ArclightPreLogin.V20_4) slpl).bridge$preLogin(profile)); + } + } else if (Constraint.builder() + .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, c) -> { + slpl.bridge$setGameProfile(profile); + MohistPreLogin.V20_1.fireEvents(slpl); + }); + } else if (Constraint.builder() + .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, c) -> { + MohistPreLogin.Youer.fireEvents(slpl, profile); + slpl.bridge$startClientVerification(profile); + }); + } else if (Constraints.builder() + .or( + Constraint.range(MinecraftVersions.V12_2, MinecraftVersions.V19_4) + .platform( + Platforms.CATSERVER, Platforms.MAGMA, Platforms.MOHIST), + Constraint.builder() + .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, c) -> { + slpl.bridge$setGameProfile(profile); + SpigotPreLogin.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()) { + logger.debug( + "[Neo]Forge+Bukkit hybrid detected, applying pre-login post processor"); + ModernForwarding.postProcessors.removeFirst(); + ModernForwarding.postProcessors.add( + (slpl, profile, c) -> SpigotPreLogin.V20_2.fireEvents(slpl, profile)); + } 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()) { + logger.debug( + "[Neo]Forge+Bukkit hybrid detected, applying pre-login post processor"); + ModernForwarding.postProcessors.addFirst( + (slpl, profile, c) -> + ((SpigotPreLogin.V20_5) slpl).callPlayerPreLoginEvents(profile)); + } + + 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, c) -> { + slpl.bridge$setGameProfile(profile); + c.setCancelled(SpongePreLogin.API8.fireAuthEvent(slpl)); + }); + } } Constraint.Evaluator.DEBUG = debug; 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/ArclightBridge.java b/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java deleted file mode 100644 index 860badb0..00000000 --- a/common/src/main/java/org/adde0109/pcf/forwarding/compat/ArclightBridge.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.adde0109.pcf.forwarding.compat; - -public interface ArclightBridge { - void arclight$preLogin() throws Exception; -} diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/ArclightPreLogin.java b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/ArclightPreLogin.java new file mode 100644 index 00000000..da6918f8 --- /dev/null +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/ArclightPreLogin.java @@ -0,0 +1,77 @@ +package org.adde0109.pcf.forwarding.compatibility.prelogin; + +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 SpigotPreLogin.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/compatibility/prelogin/MohistPreLogin.java b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/MohistPreLogin.java new file mode 100644 index 00000000..230a7eaa --- /dev/null +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/MohistPreLogin.java @@ -0,0 +1,75 @@ +package org.adde0109.pcf.forwarding.compatibility.prelogin; + +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 MohistPreLogin { + /** + * 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 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 { + 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, + 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 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", methodType); + } + + try { + fireEvents.invoke(loginHandler.invoke(), slpl, profile); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } + } +} diff --git a/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/SpigotPreLogin.java b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/SpigotPreLogin.java new file mode 100644 index 00000000..68fdbf65 --- /dev/null +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/SpigotPreLogin.java @@ -0,0 +1,103 @@ +package org.adde0109.pcf.forwarding.compatibility.prelogin; + +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 SpigotPreLogin { + /** + * 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 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(slpl)); + } 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 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(slpl), 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/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/SpongePreLogin.java b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/SpongePreLogin.java new file mode 100644 index 00000000..6f2bec3a --- /dev/null +++ b/common/src/main/java/org/adde0109/pcf/forwarding/compatibility/prelogin/SpongePreLogin.java @@ -0,0 +1,35 @@ +package org.adde0109.pcf.forwarding.compatibility.prelogin; + +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 methodType = MethodType.methodType(boolean.class); + fireAuthEvent = + lookup.findVirtual(slpl.getClass(), "bridge$fireAuthEvent", methodType); + } + + try { + return (boolean) fireAuthEvent.invoke(slpl); + } catch (final 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 facf5bbe..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 @@ -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,18 +24,17 @@ 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; import java.net.InetSocketAddress; import java.security.InvalidKeyException; +import java.util.ArrayList; import java.util.List; 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 +100,43 @@ public static void handleHello( } @ApiStatus.Internal - public static BiConsumer<@NonNull ServerLoginPacketListenerBridge, @NonNull ByteBuf> - preProcessor = (slpl, buf) -> {}; + @FunctionalInterface + public interface PreProcessor { + void process( + final @NonNull ServerLoginPacketListenerBridge slpl, final @NonNull ByteBuf buf); + } + + @ApiStatus.Internal + @FunctionalInterface + public interface PostProcessor { + /** + * Process the forwarded profile + * + * @param slpl the ServerLoginPacketListener + * @param profile the forwarded GameProfile + * @param c the cancellable wrapper + * @throws Exception if an error occurs + */ + void process( + final @NonNull ServerLoginPacketListenerBridge slpl, + 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, c) -> { + final NameAndId nameAndId = new NameAndId(profile); + slpl.bridge$logger_info( + "UUID of player {} is {}", nameAndId.name(), nameAndId.id()); + slpl.bridge$startClientVerification(profile); + }; + + @ApiStatus.Internal + 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."); @@ -154,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(); } /** @@ -179,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); @@ -193,7 +227,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()); @@ -220,7 +254,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 " @@ -275,16 +309,15 @@ 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; + for (final PostProcessor processor : postProcessors) { + processor.process(slpl, payload.profile(), c); + if (c.cancelled()) { + break; + } } - slpl.bridge$logger_info("UUID of player {} is {}", nameAndId.name(), nameAndId.id()); - slpl.bridge$startClientVerification(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/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/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 diff --git a/docs/development/PreLoginCompatibility.md b/docs/development/PreLoginCompatibility.md new file mode 100644 index 00000000..96d42541 --- /dev/null +++ b/docs/development/PreLoginCompatibility.md @@ -0,0 +1,126 @@ +# PreLogin Compatibility + +## Arclight + +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: + +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 + +## 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
+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: + +## Sponge + +Versions: 1.16.5, 1.18.2
+Class: `net.minecraft.server.network.ServerLoginPacketListenerImpl`
+Method: `boolean bridge$fireAuthEvent()`
+Sources: +- API 8: +- API 9: 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 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..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 @@ -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,8 @@ public abstract class ServerLoginPacketListenerImplMixin // spotless:on // spotless:off + @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 @@ -50,6 +54,19 @@ private void onHandleHello(final @NonNull CallbackInfo ci) { handleHello(this, ci); } + /** + * Arclight - Overwrites the method
+ * CatServer, Magma, Mohist - Patches alter the method in an incompatible manner + */ + @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( + 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) { @@ -80,6 +97,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/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/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/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/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..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,6 +31,9 @@ public abstract class ServerLoginPacketListenerImplMixin @AConstraint(version = @Versions(min = MinecraftVersion.V20_2)) @Shadow abstract void shadow$startClientVerification(GameProfile profile); + @AConstraint(version = @Versions(min = MinecraftVersion.V20_2)) + @Shadow private @Nullable GameProfile authenticatedProfile; + @Unique private int pcf$velocityLoginMessageId = -1; // spotless:on @@ -53,6 +57,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/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/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/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/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); 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()) { 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( 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" ]