From c38c8ecaba37b0d9b4703d3322c0a3b510c3e5dc Mon Sep 17 00:00:00 2001 From: JFronny Date: Thu, 25 Apr 2024 23:17:20 +0200 Subject: [PATCH] chore: update to 1.20.5 --- build.gradle.kts | 28 ++++++++------- .../client/BetterWhitelistClient.java | 33 ++++++++++------- .../betterwhitelist/BetterWhitelist.java | 24 ++++++++----- .../jfronny/betterwhitelist/DSerializer.java | 25 +++++++++++++ .../packet/ChallengePacket.java | 23 ++++++++++++ .../packet/ChallengeResponsePacket.java | 17 +++++++++ .../packet/HandshakePacket.java | 17 +++++++++ .../server/BetterWhitelistServer.java | 36 +++++++++++-------- .../betterwhitelist/server/Challenge.java | 5 +-- .../betterwhitelist/server/ServerScope.java | 23 ++++++------ 10 files changed, 171 insertions(+), 60 deletions(-) create mode 100644 src/main/java/io/gitlab/jfronny/betterwhitelist/DSerializer.java create mode 100644 src/main/java/io/gitlab/jfronny/betterwhitelist/packet/ChallengePacket.java create mode 100644 src/main/java/io/gitlab/jfronny/betterwhitelist/packet/ChallengeResponsePacket.java create mode 100644 src/main/java/io/gitlab/jfronny/betterwhitelist/packet/HandshakePacket.java diff --git a/build.gradle.kts b/build.gradle.kts index 7050f0a..a100513 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,17 +1,17 @@ plugins { - id("jfmod") version "1.5-SNAPSHOT" + id("jfmod") version "1.6-SNAPSHOT" } allprojects { group = "io.gitlab.jfronny" } base.archivesName = "better-whitelist" -val fabricVersion = "0.91.1+1.20.4" -val muscriptVersion = "1.5-SNAPSHOT" +val muscriptVersion = "1.7-SNAPSHOT" jfMod { - minecraftVersion = "1.20.4" + minecraftVersion = "1.20.5" yarn("build.1") - loaderVersion = "0.15.0" - libJfVersion = "3.14.1" + loaderVersion = "0.15.10" + libJfVersion = "3.15.5" + fabricApiVersion = "0.97.6+1.20.5" modrinth { projectId = "better-whitelist" @@ -20,12 +20,16 @@ jfMod { } dependencies { - modImplementation(fabricApi.module("fabric-networking-api-v1", fabricVersion)) - modImplementation(fabricApi.module("fabric-command-api-v2", fabricVersion)) - include(modImplementation("io.gitlab.jfronny:muscript:$muscriptVersion")!!) - modImplementation("io.gitlab.jfronny.libjf:libjf-base:${jfMod.libJfVersion.get()}") + modImplementation("net.fabricmc.fabric-api:fabric-networking-api-v1") + modImplementation("net.fabricmc.fabric-api:fabric-command-api-v2") + include(modImplementation("io.gitlab.jfronny:muscript-all:$muscriptVersion")!!) + modImplementation("io.gitlab.jfronny.libjf:libjf-base") // Dev env - modLocalRuntime("io.gitlab.jfronny.libjf:libjf-devutil:${jfMod.libJfVersion.get()}") - modLocalRuntime("com.terraformersmc:modmenu:9.0.0-pre.1") + modLocalRuntime("io.gitlab.jfronny.libjf:libjf-devutil") + modLocalRuntime("com.terraformersmc:modmenu:10.0.0-beta.1") + // for modmenu + modLocalRuntime("net.fabricmc.fabric-api:fabric-resource-loader-v0") + modLocalRuntime("net.fabricmc.fabric-api:fabric-screen-api-v1") + modLocalRuntime("net.fabricmc.fabric-api:fabric-key-binding-api-v1") } diff --git a/src/client/java/io/gitlab/jfronny/betterwhitelist/client/BetterWhitelistClient.java b/src/client/java/io/gitlab/jfronny/betterwhitelist/client/BetterWhitelistClient.java index 7c418cd..bf28c8c 100644 --- a/src/client/java/io/gitlab/jfronny/betterwhitelist/client/BetterWhitelistClient.java +++ b/src/client/java/io/gitlab/jfronny/betterwhitelist/client/BetterWhitelistClient.java @@ -1,12 +1,16 @@ package io.gitlab.jfronny.betterwhitelist.client; import io.gitlab.jfronny.betterwhitelist.BetterWhitelist; -import io.gitlab.jfronny.muscript.compiler.MuScriptVersion; -import io.gitlab.jfronny.muscript.compiler.Parser; -import io.gitlab.jfronny.muscript.data.Scope; +import io.gitlab.jfronny.betterwhitelist.DSerializer; +import io.gitlab.jfronny.betterwhitelist.packet.ChallengePacket; +import io.gitlab.jfronny.betterwhitelist.packet.HandshakePacket; +import io.gitlab.jfronny.muscript.core.MuScriptVersion; +import io.gitlab.jfronny.muscript.data.additional.DFinal; +import io.gitlab.jfronny.muscript.data.additional.context.Scope; import io.gitlab.jfronny.muscript.data.dynamic.DCallable; import io.gitlab.jfronny.muscript.data.dynamic.Dynamic; -import io.gitlab.jfronny.muscript.data.dynamic.additional.DFinal; +import io.gitlab.jfronny.muscript.parser.Parser; +import io.gitlab.jfronny.muscript.runtime.Runtime; import net.fabricmc.api.*; import net.fabricmc.fabric.api.client.networking.v1.ClientLoginNetworking; import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; @@ -17,38 +21,41 @@ import net.minecraft.text.TextContent; import java.util.*; import java.util.concurrent.CompletableFuture; +import static io.gitlab.jfronny.muscript.ast.context.ExprUtils.asDynamic; + @Environment(EnvType.CLIENT) public class BetterWhitelistClient implements ClientModInitializer { @Override public void onInitializeClient() { + BetterWhitelist.initialize(); + ClientLoginNetworking.registerGlobalReceiver(BetterWhitelist.HANDSHAKE_CHANNEL, (client, handler, buf, listenerAdder) -> { // buf also contains the server version PacketByteBuf resultBuf = PacketByteBufs.create(); - resultBuf.writeInt(BetterWhitelist.PROTOCOL_VERSION); + HandshakePacket.CODEC.encode(resultBuf, new HandshakePacket(BetterWhitelist.PROTOCOL_VERSION)); return CompletableFuture.completedFuture(resultBuf); }); ClientLoginNetworking.registerGlobalReceiver(BetterWhitelist.CHALLENGE_CHANNEL, (client, handler, buf, listenerAdder) -> { + ChallengePacket packet = ChallengePacket.CODEC.decode(buf); Scope fork = BetterWhitelist.SCOPE.fork(); fork.set("resourcePacks", MinecraftClient.getInstance() .getResourcePackManager() .getEnabledProfiles() .stream() .map(s -> DFinal.of(Map.of( - "name", DFinal.of(s.getName()), + "name", DFinal.of(s.getId()), "displayName", DFinal.of(toString(s.getDisplayName().getContent())), "description", DFinal.of(toString(s.getDescription().getContent())) ))) .toList()); - String scriptSource = buf.readString(); - BetterWhitelist.LOG.info("Received challenge: " + scriptSource); - DCallable script = Parser.parse(MuScriptVersion.DEFAULT, scriptSource).asDynamicExpr().get(fork).asCallable(); - int paramSize = buf.readInt(); + BetterWhitelist.LOG.info("Received challenge: " + packet.challenge()); + DCallable script = Runtime.evaluate(asDynamic(Parser.parse(MuScriptVersion.DEFAULT, packet.challenge())), fork).asCallable(); List params = new LinkedList<>(); - for (int i = 0; i < paramSize; i++) { - params.add(Parser.parse(MuScriptVersion.DEFAULT, buf.readString()).asDynamicExpr().get(fork)); + for (String param : packet.params()) { + params.add(Runtime.evaluate(asDynamic(Parser.parse(MuScriptVersion.DEFAULT, param)), fork)); } - String resultString = Dynamic.serialize(script.call(DFinal.of(params))); + String resultString = DSerializer.serialize(script.call(DFinal.of(params))); BetterWhitelist.LOG.info("Sending result: " + resultString); PacketByteBuf resultBuf = PacketByteBufs.create(); resultBuf.writeString(resultString); diff --git a/src/main/java/io/gitlab/jfronny/betterwhitelist/BetterWhitelist.java b/src/main/java/io/gitlab/jfronny/betterwhitelist/BetterWhitelist.java index f810d72..9c7ce3b 100644 --- a/src/main/java/io/gitlab/jfronny/betterwhitelist/BetterWhitelist.java +++ b/src/main/java/io/gitlab/jfronny/betterwhitelist/BetterWhitelist.java @@ -1,11 +1,15 @@ package io.gitlab.jfronny.betterwhitelist; -import io.gitlab.jfronny.commons.logging.Logger; -import io.gitlab.jfronny.muscript.compiler.MuScriptVersion; -import io.gitlab.jfronny.muscript.libs.StandardLib; -import io.gitlab.jfronny.muscript.data.Scope; +import io.gitlab.jfronny.betterwhitelist.packet.ChallengePacket; +import io.gitlab.jfronny.betterwhitelist.packet.ChallengeResponsePacket; +import io.gitlab.jfronny.betterwhitelist.packet.HandshakePacket; +import io.gitlab.jfronny.commons.logger.SystemLoggerPlus; +import io.gitlab.jfronny.muscript.core.MuScriptVersion; +import io.gitlab.jfronny.muscript.data.additional.DFinal; +import io.gitlab.jfronny.muscript.data.additional.context.Scope; +import io.gitlab.jfronny.muscript.data.additional.libs.StandardLib; import io.gitlab.jfronny.muscript.data.dynamic.*; -import io.gitlab.jfronny.muscript.data.dynamic.additional.DFinal; +import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.metadata.ModDependency; @@ -15,11 +19,11 @@ import net.minecraft.util.Identifier; import java.util.Map; import java.util.stream.Collectors; -import static io.gitlab.jfronny.muscript.data.dynamic.additional.DFinal.of; +import static io.gitlab.jfronny.muscript.data.additional.DFinal.of; public class BetterWhitelist { public static final String MOD_ID = "better-whitelist"; - public static final Logger LOG = Logger.forName(MOD_ID); + public static final SystemLoggerPlus LOG = SystemLoggerPlus.forName(MOD_ID); public static final Identifier HANDSHAKE_CHANNEL = new Identifier(MOD_ID, "handshake"); public static final Identifier CHALLENGE_CHANNEL = new Identifier(MOD_ID, "challenge"); public static final int PROTOCOL_VERSION = 1; @@ -41,12 +45,16 @@ public class BetterWhitelist { .map(BetterWhitelist::wrap) .orElse(new DNull()); }).set("println", args -> { - String s = args.size() == 0 ? "" : args.size() == 1 ? args.get(0).asString().getValue() : args.toString(); + String s = args.isEmpty() ? "" : args.size() == 1 ? args.get(0).asString().getValue() : args.toString(); System.out.println(s); return of(s); }); } + public static void initialize() { + // Initialization for things like registering packet types would go here + } + private static DObject wrap(ModContainer mod) { return of(Map.of( "id", of(mod.getMetadata().getId()), diff --git a/src/main/java/io/gitlab/jfronny/betterwhitelist/DSerializer.java b/src/main/java/io/gitlab/jfronny/betterwhitelist/DSerializer.java new file mode 100644 index 0000000..06ff561 --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/betterwhitelist/DSerializer.java @@ -0,0 +1,25 @@ +package io.gitlab.jfronny.betterwhitelist; + +import io.gitlab.jfronny.muscript.ast.DynamicExpr; +import io.gitlab.jfronny.muscript.ast.context.ExprUtils; +import io.gitlab.jfronny.muscript.core.MuScriptVersion; +import io.gitlab.jfronny.muscript.data.additional.DataExprMapper; +import io.gitlab.jfronny.muscript.data.additional.libs.StandardLib; +import io.gitlab.jfronny.muscript.data.dynamic.Dynamic; +import io.gitlab.jfronny.muscript.parser.Parser; +import io.gitlab.jfronny.muscript.runtime.Runtime; +import io.gitlab.jfronny.muscript.serialize.Decompiler; + +import static io.gitlab.jfronny.muscript.ast.context.ExprUtils.asDynamic; + +public class DSerializer { + public static String serialize(Dynamic d) { + return Decompiler.decompile(DataExprMapper.map(d)); + } + + public static Dynamic deserialize(String s) { + DynamicExpr dynamicExpr = asDynamic(Parser.parse(MuScriptVersion.DEFAULT, s)); + if (!ExprUtils.isDirect(dynamicExpr)) throw new RuntimeException("Invalid dynamic"); + return Runtime.evaluate(dynamicExpr, StandardLib.createScope(MuScriptVersion.DEFAULT)); + } +} diff --git a/src/main/java/io/gitlab/jfronny/betterwhitelist/packet/ChallengePacket.java b/src/main/java/io/gitlab/jfronny/betterwhitelist/packet/ChallengePacket.java new file mode 100644 index 0000000..84c6770 --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/betterwhitelist/packet/ChallengePacket.java @@ -0,0 +1,23 @@ +package io.gitlab.jfronny.betterwhitelist.packet; + +import io.gitlab.jfronny.betterwhitelist.BetterWhitelist; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.network.packet.CustomPayload; + +import java.util.List; + +public record ChallengePacket(String challenge, List params) implements CustomPayload { + public static final Id ID = new CustomPayload.Id<>(BetterWhitelist.CHALLENGE_CHANNEL); + public static final PacketCodec CODEC = PacketCodec.tuple( + PacketCodecs.STRING, ChallengePacket::challenge, + PacketCodecs.toList().apply(PacketCodecs.STRING), ChallengePacket::params, + ChallengePacket::new); + + @Override + public Id getId() { + return ID; + } +} diff --git a/src/main/java/io/gitlab/jfronny/betterwhitelist/packet/ChallengeResponsePacket.java b/src/main/java/io/gitlab/jfronny/betterwhitelist/packet/ChallengeResponsePacket.java new file mode 100644 index 0000000..d3dcab0 --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/betterwhitelist/packet/ChallengeResponsePacket.java @@ -0,0 +1,17 @@ +package io.gitlab.jfronny.betterwhitelist.packet; + +import io.gitlab.jfronny.betterwhitelist.BetterWhitelist; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.network.packet.CustomPayload; + +public record ChallengeResponsePacket(String message) implements CustomPayload { + public static final CustomPayload.Id ID = new CustomPayload.Id<>(BetterWhitelist.CHALLENGE_CHANNEL); + public static final PacketCodec CODEC = PacketCodecs.STRING.xmap(ChallengeResponsePacket::new, ChallengeResponsePacket::message); + + @Override + public Id getId() { + return ID; + } +} diff --git a/src/main/java/io/gitlab/jfronny/betterwhitelist/packet/HandshakePacket.java b/src/main/java/io/gitlab/jfronny/betterwhitelist/packet/HandshakePacket.java new file mode 100644 index 0000000..5976596 --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/betterwhitelist/packet/HandshakePacket.java @@ -0,0 +1,17 @@ +package io.gitlab.jfronny.betterwhitelist.packet; + +import io.gitlab.jfronny.betterwhitelist.BetterWhitelist; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.network.packet.CustomPayload; + +public record HandshakePacket(int version) implements CustomPayload { + public static final CustomPayload.Id ID = new CustomPayload.Id<>(BetterWhitelist.HANDSHAKE_CHANNEL); + public static final PacketCodec CODEC = PacketCodecs.INTEGER.xmap(HandshakePacket::new, HandshakePacket::version); + + @Override + public Id getId() { + return ID; + } +} diff --git a/src/main/java/io/gitlab/jfronny/betterwhitelist/server/BetterWhitelistServer.java b/src/main/java/io/gitlab/jfronny/betterwhitelist/server/BetterWhitelistServer.java index ad5d3bd..aefe542 100644 --- a/src/main/java/io/gitlab/jfronny/betterwhitelist/server/BetterWhitelistServer.java +++ b/src/main/java/io/gitlab/jfronny/betterwhitelist/server/BetterWhitelistServer.java @@ -3,18 +3,21 @@ package io.gitlab.jfronny.betterwhitelist.server; import com.mojang.authlib.GameProfile; import com.mojang.brigadier.context.CommandContext; import io.gitlab.jfronny.betterwhitelist.BetterWhitelist; +import io.gitlab.jfronny.betterwhitelist.DSerializer; +import io.gitlab.jfronny.betterwhitelist.packet.ChallengeResponsePacket; +import io.gitlab.jfronny.betterwhitelist.packet.HandshakePacket; import io.gitlab.jfronny.betterwhitelist.server.mixin.ServerLoginNetworkHandlerAccessor; import io.gitlab.jfronny.commons.StringFormatter; -import io.gitlab.jfronny.muscript.compiler.MuScriptVersion; -import io.gitlab.jfronny.muscript.compiler.Parser; -import io.gitlab.jfronny.muscript.data.Script; -import io.gitlab.jfronny.muscript.data.dynamic.Dynamic; -import io.gitlab.jfronny.muscript.error.LocationalException; +import io.gitlab.jfronny.muscript.ast.context.Script; +import io.gitlab.jfronny.muscript.core.LocationalException; +import io.gitlab.jfronny.muscript.core.MuScriptVersion; +import io.gitlab.jfronny.muscript.parser.Parser; import net.fabricmc.api.DedicatedServerModInitializer; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.networking.v1.*; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.packet.c2s.handshake.HandshakeC2SPacket; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerLoginNetworkHandler; import net.minecraft.text.Text; @@ -35,6 +38,8 @@ public class BetterWhitelistServer implements DedicatedServerModInitializer { @Override public void onInitializeServer() { + BetterWhitelist.initialize(); + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { dispatcher.register( literal(BetterWhitelist.MOD_ID) @@ -48,9 +53,9 @@ public class BetterWhitelistServer implements DedicatedServerModInitializer { GameProfile gp = profile(handler); Challenge challenge = new Challenge(gp, sender); challenges.put(gp, challenge); - PacketByteBuf handshake = PacketByteBufs.create(); - handshake.writeInt(BetterWhitelist.PROTOCOL_VERSION); - challenge.sender.sendPacket(BetterWhitelist.HANDSHAKE_CHANNEL, handshake); + PacketByteBuf buf = PacketByteBufs.create(); + HandshakePacket.CODEC.encode(buf, new HandshakePacket(BetterWhitelist.PROTOCOL_VERSION)); + challenge.sender.sendPacket(BetterWhitelist.HANDSHAKE_CHANNEL, buf); synchronizer.waitFor(challenge.challengeCompleted); }); @@ -59,13 +64,15 @@ public class BetterWhitelistServer implements DedicatedServerModInitializer { handler.disconnect(Text.literal("This server requires better-whitelist to be installed")); return; } + LoginPacketSender rns = (LoginPacketSender) responseSender; + HandshakePacket packet = HandshakePacket.CODEC.decode(buf); try { - if (buf.readInt() != BetterWhitelist.PROTOCOL_VERSION) { + if (packet.version() != BetterWhitelist.PROTOCOL_VERSION) { handler.disconnect(Text.literal("This server requires a version of better-whitelist supporting the protocol version " + BetterWhitelist.PROTOCOL_VERSION)); return; } Challenge challenge = challenges.get(profile(handler)); - challenge.sender = responseSender; + challenge.sender = rns; Util.getMainWorkerExecutor().execute(new FutureTask<>(() -> { try { ServerScope.run(script, challenge); @@ -98,12 +105,13 @@ public class BetterWhitelistServer implements DedicatedServerModInitializer { handler.disconnect(Text.literal("This server requires better-whitelist to be installed")); return; } + LoginPacketSender rns = (LoginPacketSender) responseSender; + ChallengeResponsePacket packet = ChallengeResponsePacket.CODEC.decode(buf); try { Challenge ch = challenges.get(profile(handler)); - ch.sender = responseSender; - String response = buf.readString(); - BetterWhitelist.LOG.info("Got response from " + ch.profile.getName() + ": " + response); - ch.response.complete(Dynamic.deserialize(response)); + ch.sender = rns; + BetterWhitelist.LOG.info("Got response from " + ch.profile.getName() + ": " + packet.message()); + ch.response.complete(DSerializer.deserialize(packet.message())); } catch (Throwable t) { BetterWhitelist.LOG.error("Failed login", t); handler.disconnect(Text.literal("Invalid dynamic")); diff --git a/src/main/java/io/gitlab/jfronny/betterwhitelist/server/Challenge.java b/src/main/java/io/gitlab/jfronny/betterwhitelist/server/Challenge.java index 919b2f5..336f662 100644 --- a/src/main/java/io/gitlab/jfronny/betterwhitelist/server/Challenge.java +++ b/src/main/java/io/gitlab/jfronny/betterwhitelist/server/Challenge.java @@ -2,15 +2,16 @@ package io.gitlab.jfronny.betterwhitelist.server; import com.mojang.authlib.GameProfile; import io.gitlab.jfronny.muscript.data.dynamic.Dynamic; +import net.fabricmc.fabric.api.networking.v1.LoginPacketSender; import net.fabricmc.fabric.api.networking.v1.PacketSender; class Challenge { public final ManualFuture challengeCompleted = new ManualFuture<>(); public final ManualFuture response = new ManualFuture<>(); public final GameProfile profile; - public PacketSender sender; + public LoginPacketSender sender; - public Challenge(GameProfile profile, PacketSender sender) { + public Challenge(GameProfile profile, LoginPacketSender sender) { this.profile = profile; this.sender = sender; } diff --git a/src/main/java/io/gitlab/jfronny/betterwhitelist/server/ServerScope.java b/src/main/java/io/gitlab/jfronny/betterwhitelist/server/ServerScope.java index 521ce94..d2672c5 100644 --- a/src/main/java/io/gitlab/jfronny/betterwhitelist/server/ServerScope.java +++ b/src/main/java/io/gitlab/jfronny/betterwhitelist/server/ServerScope.java @@ -1,12 +1,15 @@ package io.gitlab.jfronny.betterwhitelist.server; import io.gitlab.jfronny.betterwhitelist.BetterWhitelist; -import io.gitlab.jfronny.muscript.data.Scope; -import io.gitlab.jfronny.muscript.data.Script; +import io.gitlab.jfronny.betterwhitelist.DSerializer; +import io.gitlab.jfronny.betterwhitelist.packet.ChallengePacket; +import io.gitlab.jfronny.muscript.ast.context.Script; +import io.gitlab.jfronny.muscript.core.LocationalException; +import io.gitlab.jfronny.muscript.data.additional.DFinal; +import io.gitlab.jfronny.muscript.data.additional.context.Scope; import io.gitlab.jfronny.muscript.data.dynamic.DNull; import io.gitlab.jfronny.muscript.data.dynamic.Dynamic; -import io.gitlab.jfronny.muscript.data.dynamic.additional.DFinal; -import io.gitlab.jfronny.muscript.error.LocationalException; +import io.gitlab.jfronny.muscript.runtime.Runtime; import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; import net.minecraft.network.PacketByteBuf; @@ -18,7 +21,7 @@ import java.util.concurrent.TimeoutException; public class ServerScope { public static Dynamic run(Script script, Challenge challenge) { try { - return script.run(fork(challenge)); + return Runtime.run(script, fork(challenge)); } catch (LocationalException le) { for (Throwable t = le; t != null; t = t.getCause()) { if (t instanceof ServerScope.AssertFail af) throw af; @@ -34,14 +37,12 @@ public class ServerScope { return new DNull(); }).set("challenge", args -> { if (args.isEmpty()) throw new IllegalArgumentException("Invalid number of arguments for challenge: expected 1 or more but got 0"); - PacketByteBuf buf = PacketByteBufs.create(); - String challengeString = Dynamic.serialize(args.get(0).asCallable()); + String challengeString = DSerializer.serialize(args.get(0).asCallable()); BetterWhitelist.LOG.info("Sending challenge to " + challenge.profile.getName() + ": " + challengeString); - buf.writeString(challengeString); - List params = args.getValue().subList(1, args.size()); - buf.writeInt(params.size()); - params.forEach(p -> buf.writeString(Dynamic.serialize(p))); + List params = args.getValue().subList(1, args.size()).stream().map(DSerializer::serialize).toList(); challenge.response.reset(); + PacketByteBuf buf = PacketByteBufs.create(); + ChallengePacket.CODEC.encode(buf, new ChallengePacket(challengeString, params)); challenge.sender.sendPacket(BetterWhitelist.CHALLENGE_CHANNEL, buf); try { return challenge.response.get(1, TimeUnit.SECONDS);