Update MinecraftArgumentTypes util for 1.18.2

This commit is contained in:
Jason Penilla 2022-02-28 12:33:08 -07:00 committed by Jason
parent 5fb18ddc6e
commit 3d2d850533

View file

@ -52,7 +52,11 @@ import com.mojang.brigadier.arguments.ArgumentType;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Arrays; import java.util.Arrays;
import java.util.Map;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
@ -71,7 +75,7 @@ public final class MinecraftArgumentTypes {
private static final Constructor<?> MINECRAFT_KEY_CONSTRUCTOR; private static final Constructor<?> MINECRAFT_KEY_CONSTRUCTOR;
private static final Method ARGUMENT_REGISTRY_GET_BY_KEY_METHOD; private static final Method ARGUMENT_REGISTRY_GET_BY_KEY_METHOD;
private static final Field ARGUMENT_REGISTRY_ENTRY_CLASS_FIELD; private static final Field BY_CLASS_MAP_FIELD;
static { static {
try { try {
@ -101,11 +105,20 @@ public final class MinecraftArgumentTypes {
.findFirst().orElseThrow(NoSuchMethodException::new); .findFirst().orElseThrow(NoSuchMethodException::new);
ARGUMENT_REGISTRY_GET_BY_KEY_METHOD.setAccessible(true); ARGUMENT_REGISTRY_GET_BY_KEY_METHOD.setAccessible(true);
Class<?> argumentRegistryEntry = ARGUMENT_REGISTRY_GET_BY_KEY_METHOD.getReturnType(); BY_CLASS_MAP_FIELD = Arrays.stream(argumentRegistry.getDeclaredFields())
ARGUMENT_REGISTRY_ENTRY_CLASS_FIELD = Arrays.stream(argumentRegistryEntry.getDeclaredFields()) .filter(field -> Modifier.isStatic(field.getModifiers()))
.filter(field -> field.getType() == Class.class) .filter(field -> field.getType().equals(Map.class))
.findFirst().orElseThrow(NoSuchFieldException::new); .filter(field -> {
ARGUMENT_REGISTRY_ENTRY_CLASS_FIELD.setAccessible(true); final ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType();
final Type param = parameterizedType.getActualTypeArguments()[0];
if (!(param instanceof ParameterizedType)) {
return false;
}
return ((ParameterizedType) param).getRawType().equals(Class.class);
})
.findFirst()
.orElseThrow(NoSuchFieldException::new);
BY_CLASS_MAP_FIELD.setAccessible(true);
} catch (ReflectiveOperationException e) { } catch (ReflectiveOperationException e) {
throw new ExceptionInInitializerError(e); throw new ExceptionInInitializerError(e);
} }
@ -129,8 +142,13 @@ public final class MinecraftArgumentTypes {
throw new IllegalArgumentException(key.toString()); throw new IllegalArgumentException(key.toString());
} }
final Class<?> argument = (Class<?>) ARGUMENT_REGISTRY_ENTRY_CLASS_FIELD.get(entry); final Map<Class<?>, Object> map = (Map<Class<?>, Object>) BY_CLASS_MAP_FIELD.get(null);
return (Class<? extends ArgumentType<?>>) argument; for (final Map.Entry<Class<?>, Object> mapEntry : map.entrySet()) {
if (mapEntry.getValue() == entry) {
return (Class<? extends ArgumentType<?>>) mapEntry.getKey();
}
}
throw new IllegalArgumentException(key.toString());
} catch (ReflectiveOperationException e) { } catch (ReflectiveOperationException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }