Skip to content

Commit d27db96

Browse files
committed
Port to 1.21.1
1 parent 610a753 commit d27db96

9 files changed

Lines changed: 53 additions & 54 deletions

File tree

build.gradle.kts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ repositories {
1111
}
1212

1313
dependencies {
14-
minecraft("com.mojang:minecraft:1.20.1")
14+
minecraft("com.mojang:minecraft:1.21.1")
1515
mappings(loom.layered {
1616
officialMojangMappings()
17-
parchment("org.parchmentmc.data:parchment-1.20.1:2023.09.03@zip")
17+
parchment("org.parchmentmc.data:parchment-1.21.1:2024.11.17@zip")
1818
})
1919
modImplementation("net.fabricmc:fabric-loader:0.16.14")
2020

2121
setOf("fabric-api-base", "fabric-command-api-v2").forEach {
22-
modImplementation(fabricApi.module(it, "0.92.5+1.20.1"))
22+
modImplementation(fabricApi.module(it, "0.115.4+1.21.1"))
2323
}
2424

2525
modImplementation("net.fabricmc:fabric-language-kotlin:1.13.2+kotlin.2.1.20")
@@ -28,12 +28,12 @@ dependencies {
2828
java {
2929
withSourcesJar()
3030

31-
sourceCompatibility = JavaVersion.VERSION_17
32-
targetCompatibility = JavaVersion.VERSION_17
31+
sourceCompatibility = JavaVersion.VERSION_21
32+
targetCompatibility = JavaVersion.VERSION_21
3333
}
3434

3535
kotlin {
36-
jvmToolchain(17)
36+
jvmToolchain(21)
3737
}
3838

3939
tasks {
@@ -42,7 +42,7 @@ tasks {
4242
}
4343

4444
withType<JavaCompile>().configureEach {
45-
options.release = 17
45+
options.release = 21
4646
options.encoding = "UTF-8"
4747
}
4848

src/main/java/dev/optimistic/serverauth/mixin/ConnectionMixin.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
package dev.optimistic.serverauth.mixin;
22

33
import com.google.common.base.Objects;
4+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
5+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
46
import dev.optimistic.serverauth.ClientConstants;
57
import dev.optimistic.serverauth.Constants;
68
import dev.optimistic.serverauth.ducks.TaintHolder;
79
import net.minecraft.network.Connection;
8-
import net.minecraft.network.ConnectionProtocol;
910
import net.minecraft.network.PacketSendListener;
1011
import net.minecraft.network.protocol.Packet;
12+
import net.minecraft.network.protocol.handshake.ClientIntent;
1113
import net.minecraft.network.protocol.handshake.ClientIntentionPacket;
12-
import org.jetbrains.annotations.Nullable;
1314
import org.spongepowered.asm.mixin.Mixin;
1415
import org.spongepowered.asm.mixin.Unique;
1516
import org.spongepowered.asm.mixin.injection.At;
@@ -30,7 +31,7 @@ public abstract class ConnectionMixin implements TaintHolder {
3031
}
3132

3233
@Inject(method = "doSendPacket", at = @At("HEAD"))
33-
private void doSendPacket(Packet<?> packet, @Nullable PacketSendListener sendListener, ConnectionProtocol newProtocol, ConnectionProtocol currentProtocol, CallbackInfo ci) {
34+
private void doSendPacket(Packet<?> packet, PacketSendListener sendListener, boolean flush, CallbackInfo ci) {
3435
if (!(packet instanceof ClientIntentionPacket intentionPacket)) return;
3536

3637
PrivateKey privateKey = ClientConstants.INSTANCE.getPrivateKey().read();
@@ -42,4 +43,16 @@ private void doSendPacket(Packet<?> packet, @Nullable PacketSendListener sendLis
4243

4344
tainted = true;
4445
}
46+
47+
// initiateServerboundConnection lambda
48+
@WrapOperation(method = "method_52900", at = @At(value = "NEW", target = "(ILjava/lang/String;ILnet/minecraft/network/protocol/handshake/ClientIntent;)Lnet/minecraft/network/protocol/handshake/ClientIntentionPacket;"))
49+
private ClientIntentionPacket run$newIntentionPacket(int protocolVersion, String hostName, int port, ClientIntent intention, Operation<ClientIntentionPacket> original) {
50+
ClientIntentionPacket orig = original.call(protocolVersion, hostName, port, intention);
51+
UUID id = ClientConstants.INSTANCE.getUuid();
52+
53+
if (id == null)
54+
return orig;
55+
56+
return ClientConstants.INSTANCE.modifyIntentionPacket(id, orig);
57+
}
4558
}
Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package dev.optimistic.serverauth.mixin.client;
22

3-
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
4-
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
5-
import com.mojang.authlib.GameProfile;
3+
import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
64
import com.mojang.authlib.minecraft.MinecraftSessionService;
75
import dev.optimistic.serverauth.ducks.TaintHolder;
86
import net.minecraft.client.multiplayer.ClientHandshakePacketListenerImpl;
@@ -12,15 +10,16 @@
1210
import org.spongepowered.asm.mixin.Shadow;
1311
import org.spongepowered.asm.mixin.injection.At;
1412

13+
import java.util.UUID;
14+
1515
@Mixin(ClientHandshakePacketListenerImpl.class)
1616
public abstract class ClientHandshakePacketListenerImplMixin {
1717
@Shadow
1818
@Final
1919
private Connection connection;
2020

21-
@WrapOperation(method = "authenticateServer", at = @At(value = "INVOKE", target = "Lcom/mojang/authlib/minecraft/MinecraftSessionService;joinServer(Lcom/mojang/authlib/GameProfile;Ljava/lang/String;Ljava/lang/String;)V", remap = false))
22-
private void joinServerSession(MinecraftSessionService instance, GameProfile gameProfile, String accessToken, String serverId, Operation<Void> original) {
23-
if (!((TaintHolder) connection).serverauth$isTainted())
24-
original.call(instance, gameProfile, accessToken, serverId);
21+
@WrapWithCondition(method = "authenticateServer", at = @At(value = "INVOKE", target = "Lcom/mojang/authlib/minecraft/MinecraftSessionService;joinServer(Ljava/util/UUID;Ljava/lang/String;Ljava/lang/String;)V", remap = false))
22+
private boolean joinServerSession(MinecraftSessionService instance, UUID uuid, String accessToken, String serverHash) {
23+
return !((TaintHolder) connection).serverauth$isTainted();
2524
}
2625
}

src/main/java/dev/optimistic/serverauth/mixin/client/ConnectScreenThreadMixin.java

Lines changed: 0 additions & 25 deletions
This file was deleted.

src/main/java/dev/optimistic/serverauth/mixin/server/ServerHandshakePacketListenerImplMixin.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ public abstract class ServerHandshakePacketListenerImplMixin {
2525
@Unique
2626
private static final IllegalStateException EXCEPTION = new IllegalStateException("Unregistered public key");
2727

28-
@WrapOperation(method = "handleIntention", at = @At(value = "NEW", target = "(Lnet/minecraft/server/MinecraftServer;Lnet/minecraft/network/Connection;)Lnet/minecraft/server/network/ServerLoginPacketListenerImpl;"))
29-
private ServerLoginPacketListenerImpl handleIntention$newServerLoginListener(MinecraftServer server, Connection connection,
28+
@WrapOperation(method = "beginLogin", at = @At(value = "NEW", target = "(Lnet/minecraft/server/MinecraftServer;Lnet/minecraft/network/Connection;Z)Lnet/minecraft/server/network/ServerLoginPacketListenerImpl;"))
29+
private ServerLoginPacketListenerImpl handleIntention$newServerLoginListener(MinecraftServer server, Connection connection, boolean transferred,
3030
Operation<ServerLoginPacketListenerImpl> original,
3131
@Local(argsOnly = true) ClientIntentionPacket packet) {
32-
ServerLoginPacketListenerImpl handler = original.call(server, connection);
32+
ServerLoginPacketListenerImpl handler = original.call(server, connection, transferred);
3333
UUID override = Constants.INSTANCE.deserializeServerAuthId(packet);
3434
if (override != null) {
3535
((IdOverrideHolder) handler).serverauth$setIdOverride(override);

src/main/java/dev/optimistic/serverauth/mixin/server/ServerLoginPacketListenerImplMixin.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
55
import com.mojang.authlib.GameProfile;
66
import com.mojang.authlib.minecraft.MinecraftSessionService;
7+
import com.mojang.authlib.yggdrasil.ProfileResult;
78
import dev.optimistic.serverauth.ducks.IdOverrideHolder;
89
import dev.optimistic.serverauth.keys.PublicKeyHolder;
910
import dev.optimistic.serverauth.mixin.accessor.ServerboundKeyPacketAccessor;
@@ -24,6 +25,7 @@
2425
import java.nio.ByteBuffer;
2526
import java.security.PrivateKey;
2627
import java.security.PublicKey;
28+
import java.util.Set;
2729
import java.util.UUID;
2830

2931
@Mixin(ServerLoginPacketListenerImpl.class)
@@ -78,11 +80,21 @@ public abstract static class AuthenticationThreadMixin {
7880
@Final
7981
ServerLoginPacketListenerImpl field_14176;
8082

81-
@WrapOperation(method = "run", at = @At(value = "INVOKE", target = "Lcom/mojang/authlib/minecraft/MinecraftSessionService;hasJoinedServer(Lcom/mojang/authlib/GameProfile;Ljava/lang/String;Ljava/net/InetAddress;)Lcom/mojang/authlib/GameProfile;", remap = false))
82-
private GameProfile run$hasJoinedServer(MinecraftSessionService instance, GameProfile gameProfile, String data, InetAddress inetAddress, Operation<GameProfile> original) {
83+
@WrapOperation(method = "run", at = @At(value = "INVOKE", target = "Lcom/mojang/authlib/minecraft/MinecraftSessionService;hasJoinedServer(Ljava/lang/String;Ljava/lang/String;Ljava/net/InetAddress;)Lcom/mojang/authlib/yggdrasil/ProfileResult;", remap = false))
84+
private ProfileResult run$hasJoinedServer(MinecraftSessionService instance, String profileName, String serverId, InetAddress inetAddress, Operation<ProfileResult> original) {
8385
UUID id = ((IdOverrideHolder) field_14176).serverauth$getIdOverride();
84-
if (id == null) return original.call(instance, gameProfile, data, inetAddress);
85-
return new GameProfile(id, gameProfile.getName());
86+
if (id == null) return original.call(instance, profileName, serverId, inetAddress);
87+
88+
final GameProfile newProfile = new GameProfile(id, profileName);
89+
90+
// hasJoined request returns signed data, we should too
91+
final ProfileResult fetchedProfile = instance.fetchProfile(id, true);
92+
if (fetchedProfile != null) {
93+
// mojang after not exposing properties in constructor
94+
newProfile.getProperties().putAll(fetchedProfile.profile().getProperties());
95+
}
96+
97+
return new ProfileResult(newProfile, Set.of());
8698
}
8799
}
88100
}

src/main/kotlin/dev/optimistic/serverauth/ClientConstants.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ object ClientConstants {
1616

1717
fun modifyIntentionPacket(serverAuthId: UUID, intentionPacket: ClientIntentionPacket): ClientIntentionPacket =
1818
ClientIntentionPacket(
19+
intentionPacket.protocolVersion,
1920
"\u0000server-auth\u0000${serverAuthId.toString().replace("-", "")}",
2021
intentionPacket.port,
2122
intentionPacket.intention

src/main/resources/fabric.mod.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
],
2828
"depends": {
2929
"fabricloader": ">=0.16.14",
30-
"minecraft": "~1.20.1",
31-
"java": ">=17",
30+
"minecraft": "~1.21.1",
31+
"java": ">=21",
3232
"fabric-command-api-v2": "*",
3333
"fabric-language-kotlin": ">=1.13.2+kotlin.2.1.20"
3434
},

src/main/resources/server-auth.mixins.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"required": true,
33
"package": "dev.optimistic.serverauth.mixin",
4-
"compatibilityLevel": "JAVA_17",
4+
"compatibilityLevel": "JAVA_21",
55
"injectors": {
66
"defaultRequire": 1
77
},
@@ -16,7 +16,6 @@
1616
"server.ServerLoginPacketListenerImplMixin$IdOverrideHolderImpl"
1717
],
1818
"client": [
19-
"client.ClientHandshakePacketListenerImplMixin",
20-
"client.ConnectScreenThreadMixin"
19+
"client.ClientHandshakePacketListenerImplMixin"
2120
]
2221
}

0 commit comments

Comments
 (0)