Update CraftBukkit reflection for 1.18
This commit is contained in:
parent
9dc4e87fa8
commit
66c803852c
6 changed files with 162 additions and 59 deletions
|
|
@ -32,7 +32,9 @@ import java.lang.reflect.Constructor;
|
|||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Arrays;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* Utilities for doing reflection on CraftBukkit, used by the cloud implementation.
|
||||
|
|
@ -65,8 +67,7 @@ public final class CraftBukkitReflection {
|
|||
}
|
||||
|
||||
@SafeVarargs
|
||||
public static <T> @NonNull T firstNonNullOrThrow(
|
||||
final @NonNull Supplier<@NonNull String> errorMessage,
|
||||
public static <T> @Nullable T firstNonNullOrNull(
|
||||
final @Nullable T @NonNull... elements
|
||||
) {
|
||||
for (final T element : elements) {
|
||||
|
|
@ -74,7 +75,20 @@ public final class CraftBukkitReflection {
|
|||
return element;
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException(errorMessage.get());
|
||||
return null;
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
@SuppressWarnings("varargs")
|
||||
public static <T> @NonNull T firstNonNullOrThrow(
|
||||
final @NonNull Supplier<@NonNull String> errorMessage,
|
||||
final @Nullable T @NonNull... elements
|
||||
) {
|
||||
final @Nullable T t = firstNonNullOrNull(elements);
|
||||
if (t == null) {
|
||||
throw new IllegalArgumentException(errorMessage.get());
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
||||
public static @NonNull Class<?> needNMSClassOrElse(
|
||||
|
|
@ -191,6 +205,13 @@ public final class CraftBukkitReflection {
|
|||
}
|
||||
}
|
||||
|
||||
public static <T> T streamMethods(
|
||||
final @NonNull Class<?> clazz,
|
||||
final @NonNull Function<Stream<Method>, T> function
|
||||
) {
|
||||
return function.apply(Arrays.stream(clazz.getDeclaredMethods()));
|
||||
}
|
||||
|
||||
private CraftBukkitReflection() {
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -193,19 +193,32 @@ public final class BlockPredicateArgument<C> extends CommandArgument<C, BlockPre
|
|||
CraftBukkitReflection.findMCClass("core.BlockPosition"),
|
||||
CraftBukkitReflection.findMCClass("core.BlockPos")
|
||||
);
|
||||
private static final @Nullable Class<?> TAG_CONTAINER_CLASS = CraftBukkitReflection.firstNonNullOrNull(
|
||||
CraftBukkitReflection.findClass("net.minecraft.tags.TagContainer"),
|
||||
CraftBukkitReflection.findClass("net.minecraft.tags.ITagRegistry")
|
||||
);
|
||||
private static final Constructor<?> BLOCK_POSITION_CTR =
|
||||
CraftBukkitReflection.needConstructor(BLOCK_POSITION_CLASS, int.class, int.class, int.class);
|
||||
private static final Constructor<?> SHAPE_DETECTOR_BLOCK_CTR = CraftBukkitReflection
|
||||
.needConstructor(SHAPE_DETECTOR_BLOCK_CLASS, LEVEL_READER_CLASS, BLOCK_POSITION_CLASS, boolean.class);
|
||||
private static final Method GET_HANDLE_METHOD = CraftBukkitReflection.needMethod(CRAFT_WORLD_CLASS, "getHandle");
|
||||
private static final Method CREATE_PREDICATE_METHOD =
|
||||
CraftBukkitReflection.needMethod(ARGUMENT_BLOCK_PREDICATE_RESULT_CLASS, "create", TAG_REGISTRY_CLASS);
|
||||
private static final Method GET_SERVER_METHOD =
|
||||
CraftBukkitReflection.needMethod(COMMAND_LISTENER_WRAPPER_CLASS, "getServer");
|
||||
private static final Method CREATE_PREDICATE_METHOD = CraftBukkitReflection.firstNonNullOrThrow(
|
||||
() -> "create on BlockPredicateArgument$Result",
|
||||
CraftBukkitReflection.findMethod(ARGUMENT_BLOCK_PREDICATE_RESULT_CLASS, "create", TAG_REGISTRY_CLASS),
|
||||
CraftBukkitReflection.findMethod(ARGUMENT_BLOCK_PREDICATE_RESULT_CLASS, "a", TAG_REGISTRY_CLASS)
|
||||
);
|
||||
private static final Method GET_SERVER_METHOD = CraftBukkitReflection.streamMethods(
|
||||
COMMAND_LISTENER_WRAPPER_CLASS,
|
||||
stream -> stream.filter(it -> it.getReturnType().equals(MINECRAFT_SERVER_CLASS) && it.getParameterCount() == 0)
|
||||
.findFirst().orElseThrow(() -> new IllegalStateException("Could not find CommandSourceStack#getServer."))
|
||||
);
|
||||
private static final Method GET_TAG_REGISTRY_METHOD = CraftBukkitReflection.firstNonNullOrThrow(
|
||||
() -> "getTags method on MinecraftServer",
|
||||
CraftBukkitReflection.findMethod(MINECRAFT_SERVER_CLASS, "getTagRegistry"),
|
||||
CraftBukkitReflection.findMethod(MINECRAFT_SERVER_CLASS, "getTags")
|
||||
CraftBukkitReflection.findMethod(MINECRAFT_SERVER_CLASS, "getTags"),
|
||||
TAG_CONTAINER_CLASS == null ? null : CraftBukkitReflection.streamMethods(MINECRAFT_SERVER_CLASS, stream ->
|
||||
stream.filter(it -> it.getReturnType().equals(TAG_CONTAINER_CLASS) && it.getParameterCount() == 0)
|
||||
.findFirst().orElse(null))
|
||||
);
|
||||
|
||||
private final ArgumentParser<C, BlockPredicate> parser;
|
||||
|
|
|
|||
|
|
@ -152,10 +152,18 @@ public final class ItemStackPredicateArgument<C> extends CommandArgument<C, Item
|
|||
CraftBukkitReflection.findMCClass("commands.arguments.item.ArgumentItemPredicate$b"),
|
||||
CraftBukkitReflection.findMCClass("commands.arguments.item.ItemPredicateArgument$Result")
|
||||
);
|
||||
private static final Method CREATE_PREDICATE_METHOD = CraftBukkitReflection.needMethod(
|
||||
ARGUMENT_ITEM_PREDICATE_RESULT_CLASS,
|
||||
"create",
|
||||
com.mojang.brigadier.context.CommandContext.class
|
||||
private static final Method CREATE_PREDICATE_METHOD = CraftBukkitReflection.firstNonNullOrThrow(
|
||||
() -> "ItemPredicateArgument$Result#create",
|
||||
CraftBukkitReflection.findMethod(
|
||||
ARGUMENT_ITEM_PREDICATE_RESULT_CLASS,
|
||||
"create",
|
||||
com.mojang.brigadier.context.CommandContext.class
|
||||
),
|
||||
CraftBukkitReflection.findMethod(
|
||||
ARGUMENT_ITEM_PREDICATE_RESULT_CLASS,
|
||||
"a",
|
||||
com.mojang.brigadier.context.CommandContext.class
|
||||
)
|
||||
);
|
||||
private static final Method AS_NMS_COPY_METHOD =
|
||||
CraftBukkitReflection.needMethod(CRAFT_ITEM_STACK_CLASS, "asNMSCopy", ItemStack.class);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue