From e3d22a3d213fb35f62d9f026ff638c24c7d7154c Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 22 Dec 2025 19:10:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E6=94=B9=E8=BF=9B=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BukkitCompatibilityManager.java | 53 ++++++++++---- .../compatibility/item/ItemBridgeSource.java | 68 ++++++++++++++++++ .../leveler/LevelerBridgeLeveler.java | 27 +++++++ .../api/event/CustomBlockBreakEvent.java | 1 - .../bukkit/item/BukkitItemManager.java | 24 ++----- .../item/factory/BukkitItemFactory.java | 11 ++- .../bukkit/plugin/BukkitCraftEngine.java | 7 +- .../feature/CreateResourceCommand.java | 3 - .../bukkit/world/score/BukkitTeamManager.java | 4 +- core/build.gradle.kts | 4 -- .../core/block/AbstractBlockManager.java | 1 - .../core/entity/furniture/Furniture.java | 1 - .../craftengine/core/item/ItemManager.java | 3 - .../core/item/modifier/ExternalModifier.java | 70 ++++++------------- .../craftengine/core/plugin/CraftEngine.java | 7 +- .../craftengine/core/plugin/Plugin.java | 2 +- .../compatibility/CompatibilityManager.java | 11 ++- .../core/plugin/compatibility/ItemSource.java | 14 ++++ .../plugin/compatibility/LevelerProvider.java | 4 +- .../context/function/LevelerExpFunction.java | 4 +- .../plugin/locale/TranslationManagerImpl.java | 1 - gradle.properties | 2 +- 22 files changed, 205 insertions(+), 117 deletions(-) create mode 100644 bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/ItemBridgeSource.java create mode 100644 bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/LevelerBridgeLeveler.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/ItemSource.java diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java index 45476205a..d2c300dc9 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java @@ -1,11 +1,15 @@ package net.momirealms.craftengine.bukkit.compatibility; +import cn.gtemc.itembridge.api.Provider; +import cn.gtemc.itembridge.core.BukkitItemBridge; import cn.gtemc.levelerbridge.core.BukkitLevelerBridge; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.momirealms.craftengine.bukkit.block.entity.renderer.element.BukkitBlockEntityElementConfigs; import net.momirealms.craftengine.bukkit.compatibility.bedrock.FloodgateUtils; import net.momirealms.craftengine.bukkit.compatibility.bedrock.GeyserUtils; +import net.momirealms.craftengine.bukkit.compatibility.item.ItemBridgeSource; import net.momirealms.craftengine.bukkit.compatibility.legacy.slimeworld.LegacySlimeFormatStorageAdaptor; +import net.momirealms.craftengine.bukkit.compatibility.leveler.LevelerBridgeLeveler; import net.momirealms.craftengine.bukkit.compatibility.model.bettermodel.BetterModelBlockEntityElementConfig; import net.momirealms.craftengine.bukkit.compatibility.model.bettermodel.BetterModelModel; import net.momirealms.craftengine.bukkit.compatibility.model.modelengine.ModelEngineBlockEntityElementConfig; @@ -30,9 +34,7 @@ import net.momirealms.craftengine.core.block.BlockManager; import net.momirealms.craftengine.core.entity.furniture.ExternalModel; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.loot.LootConditions; -import net.momirealms.craftengine.core.plugin.compatibility.CompatibilityManager; -import net.momirealms.craftengine.core.plugin.compatibility.ModelProvider; -import net.momirealms.craftengine.core.plugin.compatibility.TagResolverProvider; +import net.momirealms.craftengine.core.plugin.compatibility.*; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.context.condition.AlwaysFalseCondition; @@ -44,22 +46,26 @@ import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.world.WorldManager; import org.bukkit.Bukkit; +import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; import java.util.*; -public class BukkitCompatibilityManager implements CompatibilityManager { +public class BukkitCompatibilityManager implements CompatibilityManager { private final BukkitCraftEngine plugin; private final Map modelProviders; private final Map tagResolverProviders; + private final Map> itemSources; + private final Map levelerProviders; private TagResolverProvider[] tagResolverProviderArray = null; - private BukkitLevelerBridge levelerBridge; private boolean hasPlaceholderAPI; private boolean hasGeyser; private boolean hasFloodgate; public BukkitCompatibilityManager(BukkitCraftEngine plugin) { this.plugin = plugin; + this.itemSources = new HashMap<>(); + this.levelerProviders = new HashMap<>(); this.modelProviders = new HashMap<>(Map.of( "ModelEngine", ModelEngineModel::new, "BetterModel", BetterModelModel::new @@ -67,6 +73,27 @@ public class BukkitCompatibilityManager implements CompatibilityManager(); } + @Override + public ItemSource getItemSource(String id) { + return this.itemSources.get(id); + } + + @SuppressWarnings("unchecked") + @Override + public void registerItemSource(ItemSource itemSource) { + this.itemSources.put(itemSource.plugin(), (ItemSource) itemSource); + } + + @Override + public LevelerProvider getLevelerProvider(String id) { + return this.levelerProviders.get(id); + } + + @Override + public void registerLevelerProvider(LevelerProvider provider) { + this.levelerProviders.put(provider.plugin(), provider); + } + @Override public void onLoad() { } @@ -138,6 +165,14 @@ public class BukkitCompatibilityManager implements CompatibilityManager WrappedBlockStateHelper.register("ac{}grim{}grimac{}shaded{}com{}github{}retrooper{}packetevents"), "GrimAC"); } + BukkitLevelerBridge levelerBridge = BukkitLevelerBridge.builder(false).build(); + for (cn.gtemc.levelerbridge.api.LevelerProvider provider : levelerBridge.providers()) { + this.registerLevelerProvider(new LevelerBridgeLeveler(provider)); + } + BukkitItemBridge itemBridge = BukkitItemBridge.builder(true).build(); + for (Provider provider : itemBridge.providers()) { + this.registerItemSource(new ItemBridgeSource(provider)); + } } private void runCatchingHook(ThrowableRunnable runnable, String plugin) { @@ -304,12 +339,4 @@ public class BukkitCompatibilityManager implements CompatibilityManager { + private final Provider provider; + + public ItemBridgeSource(Provider provider) { + this.provider = provider; + } + + @Override + public String plugin() { + return this.provider.plugin(); + } + + @Nullable + @Override + public ItemStack build(String id, ItemBuildContext context) { + net.momirealms.craftengine.core.entity.player.Player player = context.player(); + Player bukkitPlayer = null; + if (player != null) { + bukkitPlayer = (Player) player.platformPlayer(); + } + return this.provider.buildOrNull(id, bukkitPlayer, adapt(context)); + } + + private static BuildContext adapt(ItemBuildContext context) { + if (!VersionHelper.IS_RUNNING_IN_DEV) return BuildContext.empty(); // 先不在生产环境启用 + ContextHolder contexts = context.contexts(); + if (contexts.isEmpty()) { + return BuildContext.empty(); + } + BuildContext.Builder builder = BuildContext.builder(); + for (Map.Entry, Supplier> entry : contexts.params().entrySet()) { + Object value = entry.getValue().get(); + if (value == null) { + continue; + } + Class type = value.getClass(); // fixme 这个获取办法并不正确,net.momirealms.craftengine.core.plugin.context.ContextKey 应该在创建的时候记录是什么类型 + @SuppressWarnings("unchecked") + ContextKey contextKey = (ContextKey) ContextKey.of(type, entry.getKey().node()); + with(builder, contextKey, entry.getValue()); + } + return builder.build(); + } + + private static void with(BuildContext.Builder builder, ContextKey key, Supplier value) { + builder.with(key, value); + } + + @Override + public String id(ItemStack item) { + return this.provider.idOrNull(item); + } +} diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/LevelerBridgeLeveler.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/LevelerBridgeLeveler.java new file mode 100644 index 000000000..42ccf12c9 --- /dev/null +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/LevelerBridgeLeveler.java @@ -0,0 +1,27 @@ +package net.momirealms.craftengine.bukkit.compatibility.leveler; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider; + +public class LevelerBridgeLeveler implements LevelerProvider { + private final cn.gtemc.levelerbridge.api.LevelerProvider provider; + + public LevelerBridgeLeveler(cn.gtemc.levelerbridge.api.LevelerProvider provider) { + this.provider = provider; + } + + @Override + public String plugin() { + return this.provider.plugin(); + } + + @Override + public void addExp(Player player, String target, double amount) { + this.provider.addExperience((org.bukkit.entity.Player) player.platformPlayer(), target, amount); + } + + @Override + public int getLevel(Player player, String target) { + return this.provider.getLevel((org.bukkit.entity.Player) player.platformPlayer(), target); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockBreakEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockBreakEvent.java index ccfcd8e5c..029961d73 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockBreakEvent.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockBreakEvent.java @@ -7,7 +7,6 @@ import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.event.Cancellable; import org.bukkit.event.HandlerList; -import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.player.PlayerEvent; import org.jetbrains.annotations.NotNull; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java index ce138ee0a..5d32c5594 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java @@ -1,7 +1,5 @@ package net.momirealms.craftengine.bukkit.item; -import cn.gtemc.itembridge.api.Provider; -import cn.gtemc.itembridge.core.BukkitItemBridge; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -22,6 +20,7 @@ import net.momirealms.craftengine.core.item.*; import net.momirealms.craftengine.core.item.recipe.DatapackRecipeResult; import net.momirealms.craftengine.core.item.recipe.UniqueIdItem; import net.momirealms.craftengine.core.pack.AbstractPackManager; +import net.momirealms.craftengine.core.plugin.compatibility.ItemSource; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.util.GsonHelper; @@ -59,7 +58,6 @@ public class BukkitItemManager extends AbstractItemManager { private final Item emptyItem; private final UniqueIdItem emptyUniqueItem; private final Function decoratedHashOpsGenerator; - private BukkitItemBridge itemBridge; private Set lastRegisteredPatterns = Set.of(); @SuppressWarnings("unchecked") @@ -86,13 +84,15 @@ public class BukkitItemManager extends AbstractItemManager { @Override public void delayedLoad() { super.delayedLoad(); - List> sources = new ArrayList<>(); + List> sources = new ArrayList<>(); for (String externalSource : Config.recipeIngredientSources()) { String sourceId = externalSource.toLowerCase(Locale.ENGLISH); - Optional> provider = itemBridgeProvider().provider(sourceId); - provider.ifPresent(sources::add); + ItemSource itemSource = this.plugin.compatibilityManager().getItemSource(sourceId); + if (itemSource != null) { + sources.add((ItemSource) itemSource); + } } - this.factory.resetRecipeIngredientSources(sources.isEmpty() ? null : sources.toArray(new Provider[0])); + this.factory.resetRecipeIngredientSources(sources.isEmpty() ? null : sources.toArray(new ItemSource[0])); } @Override @@ -444,14 +444,4 @@ public class BukkitItemManager extends AbstractItemManager { public Function decoratedHashOpsGenerator() { return decoratedHashOpsGenerator; } - - @Override - public BukkitItemBridge itemBridgeProvider() { - if (this.itemBridge == null) { - BukkitItemBridge.BukkitBuilder builder = BukkitItemBridge.builder(); - builder.removeById("craftengine"); - this.itemBridge = builder.build(); - } - return this.itemBridge; - } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java index 34ec2fa08..a769e1137 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java @@ -1,6 +1,5 @@ package net.momirealms.craftengine.bukkit.item.factory; -import cn.gtemc.itembridge.api.Provider; import com.google.gson.JsonElement; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; @@ -13,13 +12,13 @@ import net.momirealms.craftengine.core.item.ItemWrapper; import net.momirealms.craftengine.core.item.data.JukeboxPlayable; import net.momirealms.craftengine.core.item.setting.EquipmentData; import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.compatibility.ItemSource; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.StringUtils; import net.momirealms.craftengine.core.util.UniqueKey; import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.sparrow.nbt.Tag; import org.bukkit.Bukkit; -import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import java.util.Objects; @@ -27,7 +26,7 @@ import java.util.Optional; public abstract class BukkitItemFactory> extends ItemFactory { private boolean hasExternalRecipeSource = false; - private Provider[] recipeIngredientSources = null; + private ItemSource[] recipeIngredientSources = null; protected BukkitItemFactory(CraftEngine plugin) { super(plugin); @@ -51,7 +50,7 @@ public abstract class BukkitItemFactory> extend throw new IllegalStateException("Unsupported server version: " + VersionHelper.MINECRAFT_VERSION.version()); } - public void resetRecipeIngredientSources(Provider[] recipeIngredientSources) { + public void resetRecipeIngredientSources(ItemSource[] recipeIngredientSources) { if (recipeIngredientSources == null || recipeIngredientSources.length == 0) { this.recipeIngredientSources = null; this.hasExternalRecipeSource = false; @@ -103,8 +102,8 @@ public abstract class BukkitItemFactory> extend return null; } if (this.hasExternalRecipeSource) { - for (Provider source : this.recipeIngredientSources) { - String id = source.idOrNull(item.getItem()); + for (ItemSource source : this.recipeIngredientSources) { + String id = source.id(item.getItem()); if (id != null) { return UniqueKey.create(Key.of(source.plugin(), StringUtils.toLowerCase(id))); } 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 575bc7f4e..1154fe4ec 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 @@ -48,7 +48,6 @@ import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; @@ -93,7 +92,7 @@ public class BukkitCraftEngine extends CraftEngine { Class compatibilityClass = ReflectionUtils.getClazz(COMPATIBILITY_CLASS); if (compatibilityClass != null) { try { - super.compatibilityManager = (CompatibilityManager) Objects.requireNonNull(ReflectionUtils.getConstructor(compatibilityClass, 0)).newInstance(this); + super.compatibilityManager = (CompatibilityManager) Objects.requireNonNull(ReflectionUtils.getConstructor(compatibilityClass, 0)).newInstance(this); } catch (ReflectiveOperationException e) { logger().warn("Compatibility class could not be instantiated: " + compatibilityClass.getName()); } @@ -350,8 +349,8 @@ public class BukkitCraftEngine extends CraftEngine { } @Override - public CompatibilityManager compatibilityManager() { - return (CompatibilityManager) compatibilityManager; + public CompatibilityManager compatibilityManager() { + return compatibilityManager; } @Override diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/CreateResourceCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/CreateResourceCommand.java index cadc2a1d8..ce79c0a2e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/CreateResourceCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/CreateResourceCommand.java @@ -1,6 +1,5 @@ package net.momirealms.craftengine.bukkit.plugin.command.feature; -import dev.dejvokep.boostedyaml.YamlDocument; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; import net.momirealms.craftengine.core.pack.ResourceLocation; @@ -19,8 +18,6 @@ import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.representer.Representer; import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.HashMap; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/score/BukkitTeamManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/score/BukkitTeamManager.java index fd65bc1d6..3955ca340 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/score/BukkitTeamManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/score/BukkitTeamManager.java @@ -6,7 +6,9 @@ import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.core.util.LegacyChatFormatter; import net.momirealms.craftengine.core.world.score.TeamManager; -import java.util.*; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; public class BukkitTeamManager implements TeamManager { private static BukkitTeamManager instance; diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 3e91296ac..91872ec24 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -72,10 +72,6 @@ dependencies { compileOnly("ca.spottedleaf:concurrentutil:${rootProject.properties["concurrent_util_version"]}") // bucket4j compileOnly("com.bucket4j:bucket4j_jdk17-core:${rootProject.properties["bucket4j_version"]}") - // ItemBridge - compileOnly("cn.gtemc:itembridge:${rootProject.properties["itembridge_version"]}") - // LevelerBridge - compileOnly("cn.gtemc:levelerbridge:${rootProject.properties["levelerbridge_version"]}") } java { diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java b/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java index f4340ffec..9f620cd82 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java @@ -39,7 +39,6 @@ import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.*; -import net.momirealms.craftengine.core.world.Glowing; import net.momirealms.craftengine.core.world.collision.AABB; import net.momirealms.sparrow.nbt.CompoundTag; import org.incendo.cloud.suggestion.Suggestion; diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Furniture.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Furniture.java index fb28c47b0..e4127fb43 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Furniture.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Furniture.java @@ -14,7 +14,6 @@ import net.momirealms.craftengine.core.entity.furniture.hitbox.FurnitureHitBoxCo import net.momirealms.craftengine.core.entity.furniture.hitbox.FurnitureHitboxPart; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.entity.seat.Seat; -import net.momirealms.craftengine.core.entity.seat.SeatOwner; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.entityculling.CullingData; import net.momirealms.craftengine.core.util.Key; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java index f31ec93a0..7d7973d24 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java @@ -1,6 +1,5 @@ package net.momirealms.craftengine.core.item; -import cn.gtemc.itembridge.api.ItemBridge; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; import net.momirealms.craftengine.core.item.equipment.Equipment; @@ -121,6 +120,4 @@ public interface ItemManager extends Manageable, ModelGenerator { List getIngredientSubstitutes(Key item); ItemUpdateResult updateItem(Item item, Supplier contextSupplier); - -

ItemBridge itemBridgeProvider(); } \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ExternalModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ExternalModifier.java index 2774c34c0..8ec6eda1a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ExternalModifier.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ExternalModifier.java @@ -1,31 +1,24 @@ package net.momirealms.craftengine.core.item.modifier; -import cn.gtemc.itembridge.api.Provider; -import cn.gtemc.itembridge.api.context.BuildContext; -import cn.gtemc.itembridge.api.context.ContextKey; -import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemBuildContext; import net.momirealms.craftengine.core.item.ItemDataModifierFactory; -import net.momirealms.craftengine.core.item.ItemManager; import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.plugin.context.ContextHolder; -import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; +import net.momirealms.craftengine.core.plugin.compatibility.ItemSource; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.LazyReference; import net.momirealms.craftengine.core.util.ResourceConfigUtils; -import net.momirealms.craftengine.core.util.VersionHelper; import org.jetbrains.annotations.NotNull; import java.util.*; -import java.util.function.Supplier; public class ExternalModifier implements ItemDataModifier { public static final Factory FACTORY = new Factory<>(); private static final ThreadLocal> BUILD_STACK = ThreadLocal.withInitial(LinkedHashSet::new); private final String id; - private final Provider provider; + private final LazyReference> provider; - public ExternalModifier(String id, Provider provider) { + public ExternalModifier(String id, LazyReference> provider) { this.id = id; this.provider = provider; } @@ -34,18 +27,18 @@ public class ExternalModifier implements ItemDataModifier { return id; } - public Provider source() { - return provider; - } - @Override public Key type() { return ItemDataModifiers.EXTERNAL; } + @SuppressWarnings("unchecked") @Override public Item apply(Item item, ItemBuildContext context) { - Dependency dependency = new Dependency(provider.plugin(), id); + ItemSource provider = this.provider.get(); + if (provider == null) return item; + + Dependency dependency = new Dependency(provider.plugin(), this.id); Set buildStack = BUILD_STACK.get(); if (buildStack.contains(dependency)) { @@ -60,14 +53,12 @@ public class ExternalModifier implements ItemDataModifier { buildStack.add(dependency); try { - ItemManager itemManager = CraftEngine.instance().itemManager(); - Player player = context.player(); - I another = this.provider.buildOrNull(this.id, player == null ? null : player.platformPlayer(), adapt(context)); + I another = provider.build(this.id, context); if (another == null) { CraftEngine.instance().logger().warn("'" + this.id + "' could not be found in " + provider.plugin()); return item; } - Item anotherWrapped = itemManager.wrap(another); + Item anotherWrapped = (Item) CraftEngine.instance().itemManager().wrap(another); item.merge(anotherWrapped); return item; } catch (Throwable e) { @@ -79,49 +70,28 @@ public class ExternalModifier implements ItemDataModifier { } } - private static BuildContext adapt(ItemBuildContext context) { - if (!VersionHelper.IS_RUNNING_IN_DEV) return BuildContext.empty(); // 先不在生产环境启用 - ContextHolder contexts = context.contexts(); - if (contexts.isEmpty()) { - return BuildContext.empty(); - } - BuildContext.Builder builder = BuildContext.builder(); - for (Map.Entry, Supplier> entry : contexts.params().entrySet()) { - Object value = entry.getValue().get(); - if (value == null) { - continue; - } - Class type = value.getClass(); // fixme 这个获取办法并不正确,net.momirealms.craftengine.core.plugin.context.ContextKey 应该在创建的时候记录是什么类型 - @SuppressWarnings("unchecked") - ContextKey contextKey = (ContextKey) ContextKey.of(type, entry.getKey().node()); - with(builder, contextKey, entry.getValue()); - } - return builder.build(); - } - - private static void with(BuildContext.Builder builder, ContextKey key, Supplier value) { - builder.with(key, value); - } - public static class Factory implements ItemDataModifierFactory { + @SuppressWarnings("unchecked") @Override public ItemDataModifier create(Object arg) { Map data = ResourceConfigUtils.getAsMap(arg, "external"); String plugin = ResourceConfigUtils.requireNonEmptyStringOrThrow(ResourceConfigUtils.get(data, "plugin", "source"), "warning.config.item.data.external.missing_source"); String id = ResourceConfigUtils.requireNonEmptyStringOrThrow(data.get("id"), "warning.config.item.data.external.missing_id"); - ItemManager itemManager = CraftEngine.instance().itemManager(); - Provider provider = itemManager.itemBridgeProvider().provider(plugin.toLowerCase(Locale.ENGLISH)).orElseThrow( - () -> new LocalizedResourceConfigException("warning.config.item.data.external.invalid_source", plugin) - ); - return new ExternalModifier<>(id, provider); + return new ExternalModifier<>(id, LazyReference.lazyReference(() -> { + ItemSource itemSource = CraftEngine.instance().compatibilityManager().getItemSource(plugin.toLowerCase(Locale.ENGLISH)); + if (itemSource == null) { + CraftEngine.instance().logger().warn("Item source '" + plugin + "' not found for item '" + id + "'"); + } + return (ItemSource) itemSource; + })); } } private record Dependency(String source, String id) { public @NotNull String asString() { - return source + "[id=" + id + "]"; + return this.source + "[id=" + this.id + "]"; } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java index 9fbf307aa..4aa187172 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java @@ -88,7 +88,7 @@ public abstract class CraftEngine implements Plugin { protected SoundManager soundManager; protected VanillaLootManager vanillaLootManager; protected AdvancementManager advancementManager; - protected CompatibilityManager compatibilityManager; + protected CompatibilityManager compatibilityManager; protected GlobalVariableManager globalVariableManager; protected ProjectileManager projectileManager; protected SeatManager seatManager; @@ -644,10 +644,9 @@ public abstract class CraftEngine implements Plugin { return vanillaLootManager; } - @SuppressWarnings("unchecked") @Override - public CompatibilityManager compatibilityManager() { - return (CompatibilityManager) compatibilityManager; + public CompatibilityManager compatibilityManager() { + return compatibilityManager; } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java index 5fd3c3247..d4aae96e9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java @@ -94,7 +94,7 @@ public interface Plugin { VanillaLootManager vanillaLootManager(); - CompatibilityManager compatibilityManager(); + CompatibilityManager compatibilityManager(); GlobalVariableManager globalVariableManager(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/CompatibilityManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/CompatibilityManager.java index 6840694e2..8850bb1cb 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/CompatibilityManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/CompatibilityManager.java @@ -1,13 +1,12 @@ package net.momirealms.craftengine.core.plugin.compatibility; -import cn.gtemc.levelerbridge.api.LevelerBridge; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.momirealms.craftengine.core.entity.furniture.ExternalModel; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.network.NetWorkUser; -public interface CompatibilityManager

{ +public interface CompatibilityManager { void onLoad(); @@ -39,5 +38,11 @@ public interface CompatibilityManager

{ boolean isBedrockPlayer(Player player); - LevelerBridge

levelerBridge(); + ItemSource getItemSource(String id); + + void registerItemSource(ItemSource itemSource); + + LevelerProvider getLevelerProvider(String id); + + void registerLevelerProvider(LevelerProvider provider); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/ItemSource.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/ItemSource.java new file mode 100644 index 000000000..93aa6c9d6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/ItemSource.java @@ -0,0 +1,14 @@ +package net.momirealms.craftengine.core.plugin.compatibility; + +import net.momirealms.craftengine.core.item.ItemBuildContext; +import org.jetbrains.annotations.Nullable; + +public interface ItemSource { + + String plugin(); + + @Nullable + I build(String id, ItemBuildContext context); + + String id(I item); +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/LevelerProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/LevelerProvider.java index 228115d40..dbb1b9d97 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/LevelerProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/LevelerProvider.java @@ -4,7 +4,9 @@ import net.momirealms.craftengine.core.entity.player.Player; public interface LevelerProvider { + String plugin(); + void addExp(Player player, String target, double amount); int getLevel(Player player, String target); -} +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/LevelerExpFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/LevelerExpFunction.java index 52efe2ee6..faa46b884 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/LevelerExpFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/LevelerExpFunction.java @@ -33,12 +33,12 @@ public class LevelerExpFunction extends AbstractConditional public void runInternal(CTX ctx) { if (this.selector == null) { ctx.getOptionalParameter(DirectContextParameters.PLAYER).ifPresent(it -> { - CraftEngine.instance().compatibilityManager().levelerBridge().addExperience(this.plugin, it.platformPlayer(), this.leveler, this.count.getDouble(ctx)); + CraftEngine.instance().compatibilityManager().getLevelerProvider(this.plugin).addExp(it, this.leveler, this.count.getDouble(ctx)); }); } else { for (Player target : this.selector.get(ctx)) { RelationalContext relationalContext = ViewerContext.of(ctx, PlayerOptionalContext.of(target)); - CraftEngine.instance().compatibilityManager().levelerBridge().addExperience(this.plugin, target.platformPlayer(), this.leveler, this.count.getDouble(relationalContext)); + CraftEngine.instance().compatibilityManager().getLevelerProvider(this.plugin).addExp(target, this.leveler, this.count.getDouble(relationalContext)); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java index bcab027e8..429a2ba12 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java @@ -13,7 +13,6 @@ import net.momirealms.craftengine.core.plugin.text.minimessage.IndexedArgumentTa import net.momirealms.craftengine.core.plugin.text.minimessage.ShiftTag; import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.craftengine.core.util.MiscUtils; -import net.momirealms.craftengine.core.util.ResourceConfigUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.yaml.snakeyaml.DumperOptions; diff --git a/gradle.properties b/gradle.properties index e9c0caa73..162d77743 100644 --- a/gradle.properties +++ b/gradle.properties @@ -47,7 +47,7 @@ mojang_brigadier_version=1.0.18 byte_buddy_version=1.18.1 ahocorasick_version=0.6.3 snake_yaml_version=2.5 -anti_grief_version=1.0.5 +anti_grief_version=1.0.6 nms_helper_version=1.0.151 evalex_version=3.5.0 reactive_streams_version=1.0.4