9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-25 18:09:27 +00:00

fix(bukkit): 修复 1.20 ~ 1.20.4 无法启动的问题

This commit is contained in:
jhqwqmc
2025-08-04 12:26:34 +08:00
parent 75cce7f1d8
commit 429c33b1ee
7 changed files with 76 additions and 46 deletions

View File

@@ -19,6 +19,7 @@ import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.ItemKeys;
import net.momirealms.craftengine.core.item.recipe.*;
import net.momirealms.craftengine.core.item.recipe.postprocessor.PostProcessors;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.registry.BuiltInRegistries;
@@ -28,10 +29,8 @@ import org.bukkit.NamespacedKey;
import org.bukkit.event.HandlerList;
import org.bukkit.inventory.ItemStack;
import java.io.IOException;
import java.io.Reader;
import java.lang.reflect.Array;
import java.sql.Ref;
import java.util.*;
import java.util.function.BiFunction;
import java.util.function.Consumer;
@@ -288,6 +287,7 @@ public class BukkitRecipeManager extends AbstractRecipeManager<ItemStack> {
public BukkitRecipeManager(BukkitCraftEngine plugin) {
instance = this;
PostProcessors.init();
this.plugin = plugin;
this.recipeEventListener = new RecipeEventListener(plugin, this, plugin.itemManager());
}

View File

@@ -3755,11 +3755,14 @@ public final class CoreReflections {
methodHandle$ServerConfigurationPacketListenerImpl$finishCurrentTask =
ReflectionUtils.unreflectMethod(method$ServerConfigurationPacketListenerImpl$finishCurrentTask)
.asType(MethodType.methodType(void.class, Object.class, Object.class));
} else {
methodHandle$ServerConfigurationPacketListenerImpl$finishCurrentTask = null;
}
if (VersionHelper.isOrAbove1_20_5()) {
methodHandle$ServerCommonPacketListenerImpl$closedSetter =
ReflectionUtils.unreflectSetter(field$ServerCommonPacketListenerImpl$closed)
.asType(MethodType.methodType(void.class, Object.class, boolean.class));
} else {
methodHandle$ServerConfigurationPacketListenerImpl$finishCurrentTask = null;
methodHandle$ServerCommonPacketListenerImpl$closedSetter = null;
}
} catch (ReflectiveOperationException e) {

View File

@@ -3,21 +3,13 @@ package net.momirealms.craftengine.core.item.recipe;
import net.momirealms.craftengine.core.item.BuildableItem;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
import net.momirealms.craftengine.core.registry.BuiltInRegistries;
import net.momirealms.craftengine.core.registry.Registries;
import net.momirealms.craftengine.core.registry.WritableRegistry;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
import net.momirealms.craftengine.core.util.ResourceKey;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@SuppressWarnings("unchecked")
public record CustomRecipeResult<T>(BuildableItem<T> item, int count, PostProcessor<T>[] postProcessors) {
public T buildItemStack(ItemBuildContext context) {
@@ -34,24 +26,8 @@ public record CustomRecipeResult<T>(BuildableItem<T> item, int count, PostProces
return builtItem;
}
static {
registerPostProcessorType(Key.of("apply_data"), args -> {
List<ItemDataModifier<?>> modifiers = new ArrayList<>();
Map<String, Object> data = ResourceConfigUtils.getAsMap(args.get("data"), "data");
for (Map.Entry<String, Object> entry : data.entrySet()) {
Optional.ofNullable(BuiltInRegistries.ITEM_DATA_MODIFIER_FACTORY.getValue(Key.withDefaultNamespace(entry.getKey(), "craftengine")))
.ifPresent(factory -> modifiers.add(factory.create(entry.getValue())));
}
return new ApplyItemDataProcessor<>(modifiers.toArray(new ItemDataModifier[0]));
});
}
public static void registerPostProcessorType(Key id, PostProcessor.Type<?> type) {
((WritableRegistry<PostProcessor.Type<?>>) BuiltInRegistries.RECIPE_POST_PROCESSOR_TYPE)
.register(ResourceKey.create(Registries.RECIPE_POST_PROCESSOR_TYPE.location(), id), type);
}
@FunctionalInterface
@SuppressWarnings("unchecked")
public interface PostProcessor<T> {
static <T> PostProcessor<T> fromMap(Map<String, Object> map) {
@@ -71,20 +47,4 @@ public record CustomRecipeResult<T>(BuildableItem<T> item, int count, PostProces
PostProcessor<T> create(Map<String, Object> args);
}
}
public static class ApplyItemDataProcessor<T> implements PostProcessor<T> {
private final ItemDataModifier<T>[] modifiers;
public ApplyItemDataProcessor(ItemDataModifier<T>[] modifiers) {
this.modifiers = modifiers;
}
@Override
public Item<T> process(Item<T> item, ItemBuildContext context) {
for (ItemDataModifier<T> modifier : this.modifiers) {
item.apply(modifier, context);
}
return item;
}
}
}

View File

@@ -0,0 +1,46 @@
package net.momirealms.craftengine.core.item.recipe.postprocessor;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
import net.momirealms.craftengine.core.item.recipe.CustomRecipeResult;
import net.momirealms.craftengine.core.registry.BuiltInRegistries;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class ApplyItemDataProcessor<T> implements CustomRecipeResult.PostProcessor<T> {
public static final Type<?> TYPE = new Type<>();
private final ItemDataModifier<T>[] modifiers;
public ApplyItemDataProcessor(ItemDataModifier<T>[] modifiers) {
this.modifiers = modifiers;
}
@Override
public Item<T> process(Item<T> item, ItemBuildContext context) {
for (ItemDataModifier<T> modifier : this.modifiers) {
item.apply(modifier, context);
}
return item;
}
public static class Type<T> implements CustomRecipeResult.PostProcessor.Type<T> {
@Override
@SuppressWarnings("unchecked")
public CustomRecipeResult.PostProcessor<T> create(Map<String, Object> args) {
List<ItemDataModifier<?>> modifiers = new ArrayList<>();
Map<String, Object> data = ResourceConfigUtils.getAsMap(args.get("data"), "data");
for (Map.Entry<String, Object> entry : data.entrySet()) {
Optional.ofNullable(BuiltInRegistries.ITEM_DATA_MODIFIER_FACTORY.getValue(Key.withDefaultNamespace(entry.getKey(), "craftengine")))
.ifPresent(factory -> modifiers.add(factory.create(entry.getValue())));
}
return new ApplyItemDataProcessor<>(modifiers.toArray(new ItemDataModifier[0]));
}
}
}

View File

@@ -0,0 +1,21 @@
package net.momirealms.craftengine.core.item.recipe.postprocessor;
import net.momirealms.craftengine.core.item.recipe.CustomRecipeResult;
import net.momirealms.craftengine.core.registry.BuiltInRegistries;
import net.momirealms.craftengine.core.registry.Registries;
import net.momirealms.craftengine.core.registry.WritableRegistry;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.ResourceKey;
public class PostProcessors {
public static final Key APPLY_DATA = Key.of("craftengine", "apply_data");
public static void init() {
register(APPLY_DATA, ApplyItemDataProcessor.TYPE);
}
public static void register(Key id, CustomRecipeResult.PostProcessor.Type<?> type) {
((WritableRegistry<CustomRecipeResult.PostProcessor.Type<?>>) BuiltInRegistries.RECIPE_POST_PROCESSOR_TYPE)
.register(ResourceKey.create(Registries.RECIPE_POST_PROCESSOR_TYPE.location(), id), type);
}
}

View File

@@ -78,7 +78,7 @@ public class BuiltInRegistries {
public static final Registry<SlotDisplay.Type> SLOT_DISPLAY_TYPE = createConstantBoundRegistry(Registries.SLOT_DISPLAY_TYPE);
public static final Registry<RecipeDisplay.Type> RECIPE_DISPLAY_TYPE = createConstantBoundRegistry(Registries.RECIPE_DISPLAY_TYPE);
public static final Registry<LegacyRecipe.Type> LEGACY_RECIPE_TYPE = createConstantBoundRegistry(Registries.LEGACY_RECIPE_TYPE);
public static final Registry<CustomRecipeResult.ApplyItemDataProcessor.Type<?>> RECIPE_POST_PROCESSOR_TYPE = createConstantBoundRegistry(Registries.RECIPE_POST_PROCESSOR_TYPE);
public static final Registry<CustomRecipeResult.PostProcessor.Type<?>> RECIPE_POST_PROCESSOR_TYPE = createConstantBoundRegistry(Registries.RECIPE_POST_PROCESSOR_TYPE);
private static <T> Registry<T> createConstantBoundRegistry(ResourceKey<? extends Registry<T>> key) {
return new ConstantBoundRegistry<>(key);

View File

@@ -80,5 +80,5 @@ public class Registries {
public static final ResourceKey<Registry<SlotDisplay.Type>> SLOT_DISPLAY_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("slot_display_type"));
public static final ResourceKey<Registry<RecipeDisplay.Type>> RECIPE_DISPLAY_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("recipe_display_type"));
public static final ResourceKey<Registry<LegacyRecipe.Type>> LEGACY_RECIPE_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("legacy_recipe_type"));
public static final ResourceKey<Registry<CustomRecipeResult.ApplyItemDataProcessor.Type<?>>> RECIPE_POST_PROCESSOR_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("recipe_post_processor_type"));
public static final ResourceKey<Registry<CustomRecipeResult.PostProcessor.Type<?>>> RECIPE_POST_PROCESSOR_TYPE = ResourceKey.create(ROOT_REGISTRY, Key.withDefaultNamespace("recipe_post_processor_type"));
}