9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-30 04:19:27 +00:00

注入战利品

This commit is contained in:
XiaoMoMi
2025-08-06 02:00:13 +08:00
parent 55d52432f6
commit caac0b713e
8 changed files with 44 additions and 4 deletions

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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 {

View File

@@ -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;

View File

@@ -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;

View File

@@ -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"
)
);
}

View File

@@ -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);