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"
]