From caac0b713e6fde519bb019148218836235000b3f Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 6 Aug 2025 02:00:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E5=85=A5=E6=88=98=E5=88=A9=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/plugin/BukkitCraftEngine.java | 5 ++++ .../plugin/injector/LootEntryInjector.java | 23 +++++++++++++++++++ .../injector/ProtectedFieldVisitor.java | 2 +- .../plugin/injector/RecipeInjector.java | 2 +- .../plugin/injector/WorldStorageInjector.java | 2 +- .../reflection/minecraft/CoreReflections.java | 7 ++++++ .../minecraft/MBuiltInRegistries.java | 5 ++++ gradle.properties | 2 +- 8 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/LootEntryInjector.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java index ac1028f94..3c87fe07c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java @@ -113,6 +113,11 @@ public class BukkitCraftEngine extends CraftEngine { } catch (Exception e) { throw new InjectionException("Error injecting blocks", e); } + try { + LootEntryInjector.init(); + } catch (Exception e) { + throw new InjectionException("Error injecting loot entries", e); + } } @Override diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/LootEntryInjector.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/LootEntryInjector.java new file mode 100644 index 000000000..e2f1f4267 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/LootEntryInjector.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.bukkit.plugin.injector; + +import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBuiltInRegistries; +import net.momirealms.craftengine.bukkit.util.KeyUtils; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Set; + +public final class LootEntryInjector { + + public static void init() throws ReflectiveOperationException { + Object registry = MBuiltInRegistries.LOOT_POOL_ENTRY_TYPE; + CoreReflections.field$MappedRegistry$frozen.set(registry, false); + Object resourceLocation = KeyUtils.toResourceLocation(Key.of("craftengine:item")); + Object type = FastNMS.INSTANCE.getCraftEngineLootItemType(); + Object holder = CoreReflections.method$Registry$registerForHolder.invoke(null, registry, resourceLocation, type); + CoreReflections.method$Holder$Reference$bindValue.invoke(holder, type); + CoreReflections.field$Holder$Reference$tags.set(holder, Set.of()); + CoreReflections.field$MappedRegistry$frozen.set(registry, true); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/ProtectedFieldVisitor.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/ProtectedFieldVisitor.java index 5bba1337d..2aa8e66c3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/ProtectedFieldVisitor.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/ProtectedFieldVisitor.java @@ -15,7 +15,7 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkRefl import java.lang.reflect.Modifier; -public class ProtectedFieldVisitor { +public final class ProtectedFieldVisitor { private static FieldAccessor internalFieldAccessor; public static void init() throws ReflectiveOperationException { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/RecipeInjector.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/RecipeInjector.java index 208dc973a..1149aa9b9 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/RecipeInjector.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/RecipeInjector.java @@ -35,7 +35,7 @@ import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Predicate; -public class RecipeInjector { +public final class RecipeInjector { private static Class clazz$InjectedArmorDyeRecipe; private static Class clazz$InjectedRepairItemRecipe; private static Class clazz$InjectedFireworkStarFadeRecipe; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/WorldStorageInjector.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/WorldStorageInjector.java index 38a6c2ae2..ce3a33ac8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/WorldStorageInjector.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/WorldStorageInjector.java @@ -37,7 +37,7 @@ import java.util.Optional; import java.util.concurrent.Callable; import java.util.function.Consumer; -public class WorldStorageInjector { +public final class WorldStorageInjector { private static Class clazz$InjectedPalettedContainer; private static MethodHandle constructor$InjectedLevelChunkSection; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java index c5b48563d..0d494798a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java @@ -3965,4 +3965,11 @@ public final class CoreReflections { "world.item.DyeableLeatherItem" ), !VersionHelper.isOrAbove1_20_5() ); + + public static final Class clazz$LootPoolEntryType = requireNonNull( + BukkitReflectionUtils.findReobfOrMojmapClass( + "world.level.storage.loot.entries.LootEntryType", + "world.level.storage.loot.entries.LootPoolEntryType" + ) + ); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MBuiltInRegistries.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MBuiltInRegistries.java index b7d660248..ef6d7a8b1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MBuiltInRegistries.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/MBuiltInRegistries.java @@ -21,6 +21,7 @@ public final class MBuiltInRegistries { public static final Object RECIPE_TYPE; public static final Object PARTICLE_TYPE; public static final Object DATA_COMPONENT_TYPE; + public static final Object LOOT_POOL_ENTRY_TYPE; static { Field[] fields = CoreReflections.clazz$BuiltInRegistries.getDeclaredFields(); @@ -35,6 +36,7 @@ public final class MBuiltInRegistries { Object registries$Fluid = null; Object registries$RecipeType = null; Object registries$DataComponentType = null; + Object registries$LootPoolEntryType = null; for (Field field : fields) { Type fieldType = field.getGenericType(); if (fieldType instanceof ParameterizedType paramType) { @@ -63,6 +65,8 @@ public final class MBuiltInRegistries { registries$Item = field.get(null); } else if (type == CoreReflections.clazz$Fluid) { registries$Fluid = field.get(null); + } else if (type == CoreReflections.clazz$LootPoolEntryType) { + registries$LootPoolEntryType = field.get(null); } } } @@ -76,6 +80,7 @@ public final class MBuiltInRegistries { ENTITY_TYPE = requireNonNull(registries$EntityType); FLUID = requireNonNull(registries$Fluid); RECIPE_TYPE = requireNonNull(registries$RecipeType); + LOOT_POOL_ENTRY_TYPE = requireNonNull(registries$LootPoolEntryType); DATA_COMPONENT_TYPE = registries$DataComponentType; } catch (ReflectiveOperationException e) { throw new ReflectionInitException("Failed to init BuiltInRegistries", e); diff --git a/gradle.properties b/gradle.properties index 000724fdd..e223ac77b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -40,7 +40,7 @@ commons_io_version=2.18.0 commons_imaging_version=1.0.0-alpha6 commons_lang3_version=3.17.0 sparrow_nbt_version=0.9.4 -sparrow_util_version=0.50.8 +sparrow_util_version=0.50.9 fastutil_version=8.5.15 netty_version=4.1.121.Final joml_version=1.10.8