fix: Incorrect primary codec in lenient profile serialization

This commit is contained in:
Linnea Gräf
2024-11-27 15:57:02 +01:00
parent 139fa705b3
commit 9df1f12970
2 changed files with 29 additions and 5 deletions

View File

@@ -3,6 +3,10 @@ package moe.nea.firmament.mixins;
import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.Lifecycle;
import com.mojang.util.UndashedUuid;
import moe.nea.firmament.util.json.FirmCodecs;
import net.minecraft.component.type.ProfileComponent; import net.minecraft.component.type.ProfileComponent;
import net.minecraft.util.Uuids; import net.minecraft.util.Uuids;
import org.objectweb.asm.Opcodes; import org.objectweb.asm.Opcodes;
@@ -13,9 +17,9 @@ import java.util.UUID;
@Mixin(ProfileComponent.class) @Mixin(ProfileComponent.class)
public class LenientProfileComponentPatch { public class LenientProfileComponentPatch {
// lambda in RecordCodecBuilder.create for BASE_CODEC // lambda in RecordCodecBuilder.create for BASE_CODEC
@ModifyExpressionValue(method = "method_57508", at = @At(value = "FIELD", opcode = Opcodes.GETSTATIC, target = "Lnet/minecraft/util/Uuids;INT_STREAM_CODEC:Lcom/mojang/serialization/Codec;")) @ModifyExpressionValue(method = "method_57508", at = @At(value = "FIELD", opcode = Opcodes.GETSTATIC, target = "Lnet/minecraft/util/Uuids;INT_STREAM_CODEC:Lcom/mojang/serialization/Codec;"))
private static Codec<UUID> onStaticInit(Codec<UUID> original) { private static Codec<UUID> onStaticInit(Codec<UUID> original) {
return Uuids.CODEC; return FirmCodecs.UUID_LENIENT_PREFER_INT_STREAM;
} }
} }

View File

@@ -0,0 +1,20 @@
package moe.nea.firmament.util.json
import com.mojang.serialization.Codec
import com.mojang.serialization.DataResult
import com.mojang.serialization.Lifecycle
import com.mojang.util.UndashedUuid
import net.minecraft.util.Uuids
object FirmCodecs {
@JvmField
val UUID_LENIENT_PREFER_INT_STREAM = Codec.withAlternative(Uuids.INT_STREAM_CODEC, Codec.STRING.comapFlatMap(
{
try {
DataResult.success(UndashedUuid.fromStringLenient(it), Lifecycle.stable())
} catch (ex: IllegalArgumentException) {
DataResult.error { "Invalid UUID $it: ${ex.message}" }
}
},
UndashedUuid::toString))
}