mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-30 04:19:27 +00:00
注入战利品
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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"
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user