Skip to content

Commit 954fda5

Browse files
committed
Improve the error messages for registry-related codecs
1 parent e211db2 commit 954fda5

File tree

4 files changed

+240
-0
lines changed

4 files changed

+240
-0
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package net.errorcraft.codecium.mixin.minecraft.registry.entry;
2+
3+
import com.llamalad7.mixinextras.sugar.Local;
4+
import net.minecraft.registry.Registry;
5+
import net.minecraft.registry.RegistryKey;
6+
import net.minecraft.registry.entry.RegistryElementCodec;
7+
import net.minecraft.registry.entry.RegistryEntry;
8+
import org.spongepowered.asm.mixin.Final;
9+
import org.spongepowered.asm.mixin.Mixin;
10+
import org.spongepowered.asm.mixin.Shadow;
11+
import org.spongepowered.asm.mixin.injection.At;
12+
import org.spongepowered.asm.mixin.injection.ModifyArg;
13+
14+
import java.util.function.Supplier;
15+
16+
@Mixin(RegistryElementCodec.class)
17+
public class RegistryElementCodecExtender<E> {
18+
@Shadow
19+
@Final
20+
private RegistryKey<? extends Registry<E>> registryRef;
21+
22+
@ModifyArg(
23+
method = "encode(Lnet/minecraft/registry/entry/RegistryEntry;Lcom/mojang/serialization/DynamicOps;Ljava/lang/Object;)Lcom/mojang/serialization/DataResult;",
24+
at = @At(
25+
value = "INVOKE",
26+
target = "Lcom/mojang/serialization/DataResult;error(Ljava/util/function/Supplier;)Lcom/mojang/serialization/DataResult;"
27+
),
28+
remap = false
29+
)
30+
private Supplier<String> invalidOwnerUseBetterErrorMessage(Supplier<String> message, @Local(argsOnly = true) RegistryEntry<E> registryEntry) {
31+
return () -> "Holder " + registryEntry.getKey().orElseThrow().getValue() + " is not part of the current registry set";
32+
}
33+
34+
@ModifyArg(
35+
method = "decode",
36+
at = @At(
37+
value = "INVOKE",
38+
target = "Lcom/mojang/serialization/DataResult;error(Ljava/util/function/Supplier;)Lcom/mojang/serialization/DataResult;",
39+
ordinal = 0
40+
),
41+
remap = false
42+
)
43+
private Supplier<String> inaccessibleRegistryUseBetterErrorMessage(Supplier<String> message) {
44+
return () -> "Registry " + this.registryRef.getValue() + " is inaccessible";
45+
}
46+
47+
@ModifyArg(
48+
method = "decode",
49+
at = @At(
50+
value = "INVOKE",
51+
target = "Lcom/mojang/serialization/DataResult;error(Ljava/util/function/Supplier;)Lcom/mojang/serialization/DataResult;",
52+
ordinal = 1
53+
),
54+
remap = false
55+
)
56+
private Supplier<String> inlinedHoldersDisallowedUseBetterErrorMessage(Supplier<String> message) {
57+
return () -> "Cannot decode a direct holder";
58+
}
59+
60+
@ModifyArg(
61+
method = "method_46624",
62+
at = @At(
63+
value = "INVOKE",
64+
target = "Lcom/mojang/serialization/DataResult;error(Ljava/util/function/Supplier;)Lcom/mojang/serialization/DataResult;",
65+
remap = false
66+
)
67+
)
68+
private static <E> Supplier<String> unknownRegistryEntryUseBetterErrorMessage(Supplier<String> message, @Local(argsOnly = true) RegistryKey<E> key) {
69+
return () -> "Cannot get a registry entry with id " + key.getValue();
70+
}
71+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package net.errorcraft.codecium.mixin.minecraft.registry.entry;
2+
3+
import com.llamalad7.mixinextras.sugar.Local;
4+
import com.mojang.datafixers.util.Pair;
5+
import com.mojang.serialization.DataResult;
6+
import com.mojang.serialization.DynamicOps;
7+
import net.minecraft.registry.Registry;
8+
import net.minecraft.registry.RegistryKey;
9+
import net.minecraft.registry.entry.RegistryEntry;
10+
import net.minecraft.registry.entry.RegistryEntryList;
11+
import net.minecraft.registry.entry.RegistryEntryListCodec;
12+
import net.minecraft.registry.tag.TagKey;
13+
import org.spongepowered.asm.mixin.Final;
14+
import org.spongepowered.asm.mixin.Mixin;
15+
import org.spongepowered.asm.mixin.Shadow;
16+
import org.spongepowered.asm.mixin.injection.At;
17+
import org.spongepowered.asm.mixin.injection.Inject;
18+
import org.spongepowered.asm.mixin.injection.ModifyArg;
19+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
20+
21+
import java.util.function.Supplier;
22+
23+
@Mixin(RegistryEntryListCodec.class)
24+
public class RegistryEntryListCodecExtender<E> {
25+
@Shadow
26+
@Final
27+
private RegistryKey<? extends Registry<E>> registry;
28+
29+
private static RegistryKey<? extends Registry<?>> tempRegistryKey;
30+
31+
@ModifyArg(
32+
method = "method_58027",
33+
at = @At(
34+
value = "INVOKE",
35+
target = "Lcom/mojang/serialization/DataResult;error(Ljava/util/function/Supplier;)Lcom/mojang/serialization/DataResult;",
36+
remap = false
37+
)
38+
)
39+
private static <E> Supplier<String> unknownRegistryTagUseBetterErrorMessage(Supplier<String> message, @Local(argsOnly = true) TagKey<E> tag) {
40+
return () -> "Cannot get a registry tag with id " + tag.id();
41+
}
42+
43+
@ModifyArg(
44+
method = "encode(Lnet/minecraft/registry/entry/RegistryEntryList;Lcom/mojang/serialization/DynamicOps;Ljava/lang/Object;)Lcom/mojang/serialization/DataResult;",
45+
at = @At(
46+
value = "INVOKE",
47+
target = "Lcom/mojang/serialization/DataResult;error(Ljava/util/function/Supplier;)Lcom/mojang/serialization/DataResult;"
48+
),
49+
remap = false
50+
)
51+
private Supplier<String> invalidOwnerUseBetterErrorMessage(Supplier<String> message, @Local(argsOnly = true) RegistryEntryList<E> registryEntries) {
52+
return () -> "Registry tag " + registryEntries.getTagKey().orElseThrow().id() + " is not part of the current registry set";
53+
}
54+
55+
@Inject(
56+
method = "decodeDirect",
57+
at = @At("HEAD")
58+
)
59+
private <T> void storeTemporaryRegistryKey(DynamicOps<T> ops, T input, CallbackInfoReturnable<DataResult<Pair<RegistryEntryList<E>, T>>> info) {
60+
RegistryEntryListCodecExtender.tempRegistryKey = this.registry;
61+
}
62+
63+
@ModifyArg(
64+
method = "method_40381",
65+
at = @At(
66+
value = "INVOKE",
67+
target = "Lcom/mojang/serialization/DataResult;error(Ljava/util/function/Supplier;)Lcom/mojang/serialization/DataResult;",
68+
remap = false
69+
)
70+
)
71+
private static <R> Supplier<String> inaccessibleRegistryUseBetterErrorMessage(Supplier<String> message, @Local RegistryEntry<R> entry) {
72+
return () -> "Registry " + RegistryEntryListCodecExtender.tempRegistryKey.getValue() + " is inaccessible for " + entry.getKey().orElseThrow();
73+
}
74+
75+
@Inject(
76+
method = "decodeDirect",
77+
at = @At("TAIL")
78+
)
79+
private <T> void removeTemporaryRegistryKey(DynamicOps<T> ops, T input, CallbackInfoReturnable<DataResult<Pair<RegistryEntryList<E>, T>>> info) {
80+
RegistryEntryListCodecExtender.tempRegistryKey = null;
81+
}
82+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package net.errorcraft.codecium.mixin.minecraft.registry.entry;
2+
3+
import com.llamalad7.mixinextras.sugar.Local;
4+
import net.minecraft.registry.Registry;
5+
import net.minecraft.registry.RegistryKey;
6+
import net.minecraft.registry.entry.RegistryEntry;
7+
import net.minecraft.registry.entry.RegistryFixedCodec;
8+
import net.minecraft.util.Identifier;
9+
import org.spongepowered.asm.mixin.Final;
10+
import org.spongepowered.asm.mixin.Mixin;
11+
import org.spongepowered.asm.mixin.Shadow;
12+
import org.spongepowered.asm.mixin.injection.At;
13+
import org.spongepowered.asm.mixin.injection.ModifyArg;
14+
15+
import java.util.function.Supplier;
16+
17+
@Mixin(RegistryFixedCodec.class)
18+
public class RegistryFixedCodecExtender<E> {
19+
@Shadow
20+
@Final
21+
private RegistryKey<? extends Registry<E>> registry;
22+
23+
@ModifyArg(
24+
method = "encode(Lnet/minecraft/registry/entry/RegistryEntry;Lcom/mojang/serialization/DynamicOps;Ljava/lang/Object;)Lcom/mojang/serialization/DataResult;",
25+
at = @At(
26+
value = "INVOKE",
27+
target = "Lcom/mojang/serialization/DataResult;error(Ljava/util/function/Supplier;)Lcom/mojang/serialization/DataResult;",
28+
ordinal = 0
29+
),
30+
remap = false
31+
)
32+
private Supplier<String> invalidOwnerUseBetterErrorMessage(Supplier<String> message, @Local(argsOnly = true) RegistryEntry<E> registryEntry) {
33+
return () -> "Holder " + registryEntry.getKey().orElseThrow().getValue() + " is not part of the current registry set";
34+
}
35+
36+
@ModifyArg(
37+
method = "encode(Lnet/minecraft/registry/entry/RegistryEntry;Lcom/mojang/serialization/DynamicOps;Ljava/lang/Object;)Lcom/mojang/serialization/DataResult;",
38+
at = @At(
39+
value = "INVOKE",
40+
target = "Lcom/mojang/serialization/DataResult;error(Ljava/util/function/Supplier;)Lcom/mojang/serialization/DataResult;",
41+
ordinal = 1
42+
),
43+
remap = false
44+
)
45+
private Supplier<String> encodeInaccessibleRegistryUseBetterErrorMessage(Supplier<String> message) {
46+
return () -> "Registry " + this.registry.getValue() + " is inaccessible";
47+
}
48+
49+
@ModifyArg(
50+
method = "method_40397",
51+
at = @At(
52+
value = "INVOKE",
53+
target = "Lcom/mojang/serialization/DataResult;error(Ljava/util/function/Supplier;)Lcom/mojang/serialization/DataResult;",
54+
remap = false
55+
)
56+
)
57+
private Supplier<String> directRegistryEntryUseBetterErrorMessage(Supplier<String> message) {
58+
return () -> "Cannot encode a direct holder";
59+
}
60+
61+
@ModifyArg(
62+
method = "decode",
63+
at = @At(
64+
value = "INVOKE",
65+
target = "Lcom/mojang/serialization/DataResult;error(Ljava/util/function/Supplier;)Lcom/mojang/serialization/DataResult;"
66+
),
67+
remap = false
68+
)
69+
private Supplier<String> decodeInaccessibleRegistryUseBetterErrorMessage(Supplier<String> message) {
70+
return () -> "Registry " + this.registry.getValue() + " is inaccessible";
71+
}
72+
73+
@ModifyArg(
74+
method = "method_46625",
75+
at = @At(
76+
value = "INVOKE",
77+
target = "Lcom/mojang/serialization/DataResult;error(Ljava/util/function/Supplier;)Lcom/mojang/serialization/DataResult;",
78+
remap = false
79+
)
80+
)
81+
private static Supplier<String> unknownRegistryEntryUseBetterErrorMessage(Supplier<String> message, @Local(argsOnly = true) Identifier id) {
82+
return () -> "Cannot get a registry entry with id " + id;
83+
}
84+
}

src/main/resources/codecium.mixins.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
"mixins": [
66
"minecraft.nbt.NbtOpsExtender",
77
"minecraft.nbt.NbtOpsExtender$MapLikeExtender",
8+
"minecraft.registry.entry.RegistryElementCodecExtender",
9+
"minecraft.registry.entry.RegistryEntryListCodecExtender",
10+
"minecraft.registry.entry.RegistryFixedCodecExtender",
811
"minecraft.util.dynamic.CodecsExtender",
912
"mojang.serialization.CodecExtender",
1013
"mojang.serialization.DataResultExtender",

0 commit comments

Comments
 (0)