Skip to content

Commit 50e743a

Browse files
committed
Update MinecraftArgumentTypes util for 1.18.2
1 parent e006518 commit 50e743a

1 file changed

Lines changed: 26 additions & 8 deletions

File tree

cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/internal/MinecraftArgumentTypes.java

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,11 @@
5252
import java.lang.reflect.Constructor;
5353
import java.lang.reflect.Field;
5454
import java.lang.reflect.Method;
55+
import java.lang.reflect.Modifier;
56+
import java.lang.reflect.ParameterizedType;
57+
import java.lang.reflect.Type;
5558
import java.util.Arrays;
59+
import java.util.Map;
5660
import org.bukkit.NamespacedKey;
5761
import org.checkerframework.checker.nullness.qual.NonNull;
5862

@@ -71,7 +75,7 @@ private MinecraftArgumentTypes() {
7175

7276
private static final Constructor<?> MINECRAFT_KEY_CONSTRUCTOR;
7377
private static final Method ARGUMENT_REGISTRY_GET_BY_KEY_METHOD;
74-
private static final Field ARGUMENT_REGISTRY_ENTRY_CLASS_FIELD;
78+
private static final Field BY_CLASS_MAP_FIELD;
7579

7680
static {
7781
try {
@@ -101,11 +105,20 @@ private MinecraftArgumentTypes() {
101105
.findFirst().orElseThrow(NoSuchMethodException::new);
102106
ARGUMENT_REGISTRY_GET_BY_KEY_METHOD.setAccessible(true);
103107

104-
Class<?> argumentRegistryEntry = ARGUMENT_REGISTRY_GET_BY_KEY_METHOD.getReturnType();
105-
ARGUMENT_REGISTRY_ENTRY_CLASS_FIELD = Arrays.stream(argumentRegistryEntry.getDeclaredFields())
106-
.filter(field -> field.getType() == Class.class)
107-
.findFirst().orElseThrow(NoSuchFieldException::new);
108-
ARGUMENT_REGISTRY_ENTRY_CLASS_FIELD.setAccessible(true);
108+
BY_CLASS_MAP_FIELD = Arrays.stream(argumentRegistry.getDeclaredFields())
109+
.filter(field -> Modifier.isStatic(field.getModifiers()))
110+
.filter(field -> field.getType().equals(Map.class))
111+
.filter(field -> {
112+
final ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType();
113+
final Type param = parameterizedType.getActualTypeArguments()[0];
114+
if (!(param instanceof ParameterizedType)) {
115+
return false;
116+
}
117+
return ((ParameterizedType) param).getRawType().equals(Class.class);
118+
})
119+
.findFirst()
120+
.orElseThrow(NoSuchFieldException::new);
121+
BY_CLASS_MAP_FIELD.setAccessible(true);
109122
} catch (ReflectiveOperationException e) {
110123
throw new ExceptionInInitializerError(e);
111124
}
@@ -129,8 +142,13 @@ public static Class<? extends ArgumentType<?>> getClassByKey(
129142
throw new IllegalArgumentException(key.toString());
130143
}
131144

132-
final Class<?> argument = (Class<?>) ARGUMENT_REGISTRY_ENTRY_CLASS_FIELD.get(entry);
133-
return (Class<? extends ArgumentType<?>>) argument;
145+
final Map<Class<?>, Object> map = (Map<Class<?>, Object>) BY_CLASS_MAP_FIELD.get(null);
146+
for (final Map.Entry<Class<?>, Object> mapEntry : map.entrySet()) {
147+
if (mapEntry.getValue() == entry) {
148+
return (Class<? extends ArgumentType<?>>) mapEntry.getKey();
149+
}
150+
}
151+
throw new IllegalArgumentException(key.toString());
134152
} catch (ReflectiveOperationException e) {
135153
throw new RuntimeException(e);
136154
}

0 commit comments

Comments
 (0)