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 e1d51a0e9..45476205a 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 @@ -13,17 +13,17 @@ import net.momirealms.craftengine.bukkit.compatibility.model.modelengine.ModelEn import net.momirealms.craftengine.bukkit.compatibility.model.modelengine.ModelEngineUtils; import net.momirealms.craftengine.bukkit.compatibility.mythicmobs.MythicItemDropListener; import net.momirealms.craftengine.bukkit.compatibility.mythicmobs.MythicSkillHelper; +import net.momirealms.craftengine.bukkit.compatibility.nameplates.CustomNameplateHatSettings; +import net.momirealms.craftengine.bukkit.compatibility.nameplates.CustomNameplateProviders; import net.momirealms.craftengine.bukkit.compatibility.packetevents.WrappedBlockStateHelper; import net.momirealms.craftengine.bukkit.compatibility.papi.PlaceholderAPIUtils; import net.momirealms.craftengine.bukkit.compatibility.permission.LuckPermsEventListeners; import net.momirealms.craftengine.bukkit.compatibility.quickshop.QuickShopItemExpressionHandler; -import net.momirealms.craftengine.bukkit.compatibility.worldguard.WorldGuardRegionCondition; import net.momirealms.craftengine.bukkit.compatibility.skript.SkriptHook; import net.momirealms.craftengine.bukkit.compatibility.slimeworld.SlimeFormatStorageAdaptor; -import net.momirealms.craftengine.bukkit.compatibility.nameplates.CustomNameplateHatSettings; -import net.momirealms.craftengine.bukkit.compatibility.nameplates.CustomNameplateProviders; import net.momirealms.craftengine.bukkit.compatibility.viaversion.ViaVersionUtils; import net.momirealms.craftengine.bukkit.compatibility.worldedit.WorldEditBlockRegister; +import net.momirealms.craftengine.bukkit.compatibility.worldguard.WorldGuardRegionCondition; import net.momirealms.craftengine.bukkit.font.BukkitFontManager; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.core.block.BlockManager; @@ -77,36 +77,30 @@ public class BukkitCompatibilityManager implements CompatibilityManager BukkitBlockEntityElementConfigs.register(Key.of("craftengine:better_model"), new BetterModelBlockEntityElementConfig.Factory()), "BetterModel"); } if (this.hasPlugin("ModelEngine")) { - BukkitBlockEntityElementConfigs.register(Key.of("craftengine:model_engine"), new ModelEngineBlockEntityElementConfig.Factory()); - logHook("ModelEngine"); + runCatchingHook(() -> BukkitBlockEntityElementConfigs.register(Key.of("craftengine:model_engine"), new ModelEngineBlockEntityElementConfig.Factory()), "ModelEngine"); } if (this.hasPlugin("CustomNameplates")) { - registerTagResolverProvider(new CustomNameplateProviders.Background()); - registerTagResolverProvider(new CustomNameplateProviders.Nameplate()); - registerTagResolverProvider(new CustomNameplateProviders.Bubble()); - new CustomNameplateHatSettings().register(); - logHook("CustomNameplates"); + runCatchingHook(() -> { + registerTagResolverProvider(new CustomNameplateProviders.Background()); + registerTagResolverProvider(new CustomNameplateProviders.Nameplate()); + registerTagResolverProvider(new CustomNameplateProviders.Bubble()); + new CustomNameplateHatSettings().register(); + }, "CustomNameplates"); } Key worldGuardRegion = Key.of("worldguard:region"); if (this.hasPlugin("WorldGuard")) { - EventConditions.register(worldGuardRegion, new WorldGuardRegionCondition.FactoryImpl<>()); - LootConditions.register(worldGuardRegion, new WorldGuardRegionCondition.FactoryImpl<>()); - logHook("WorldGuard"); + runCatchingHook(() -> { + EventConditions.register(worldGuardRegion, new WorldGuardRegionCondition.FactoryImpl<>()); + LootConditions.register(worldGuardRegion, new WorldGuardRegionCondition.FactoryImpl<>()); + }, "WorldGuard"); } else { EventConditions.register(worldGuardRegion, new AlwaysFalseCondition.FactoryImpl<>()); LootConditions.register(worldGuardRegion, new AlwaysFalseCondition.FactoryImpl<>()); @@ -127,39 +121,38 @@ public class BukkitCompatibilityManager implements CompatibilityManager new MythicItemDropListener(this.plugin), "MythicMobs"); } if (this.isPluginEnabled("QuickShop-Hikari")) { - new QuickShopItemExpressionHandler(this.plugin).register(); - logHook("QuickShop-Hikari"); + runCatchingHook(() -> new QuickShopItemExpressionHandler(this.plugin).register(), "QuickShop-Hikari"); } - if (this.isPluginEnabled("packetevents")) { - try { - WrappedBlockStateHelper.register(null); - } catch (Throwable e) { - this.plugin.logger().warn("Failed to register block to WrappedBlockState", e); - } - logHook("packetevents"); + if (this.isPluginEnabled("packetevents") && Config.injectPacketEvents()) { + runCatchingHook(() -> WrappedBlockStateHelper.register(null), "packetevents"); } - if (this.isPluginEnabled("GrimAC")) { - try { - WrappedBlockStateHelper.register("ac{}grim{}grimac{}shaded{}com{}github{}retrooper{}packetevents"); - } catch (Throwable e) { - this.plugin.logger().warn("Failed to register block to WrappedBlockState", e); - } - logHook("GrimAC"); + if (this.isPluginEnabled("GrimAC") && Config.injectPacketEvents()) { + runCatchingHook(() -> WrappedBlockStateHelper.register("ac{}grim{}grimac{}shaded{}com{}github{}retrooper{}packetevents"), "GrimAC"); } } + private void runCatchingHook(ThrowableRunnable runnable, String plugin) { + try { + runnable.run(); + logHook(plugin); + } catch (Throwable e) { + this.plugin.logger().warn("Failed to hook " + plugin, e); + } + } + + private interface ThrowableRunnable { + void run() throws Throwable; + } + @Override public void executeMMSkill(String skill, float power, Player player) { MythicSkillHelper.execute(skill, power, player); diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/mythicmobs/MythicItemDropListener.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/mythicmobs/MythicItemDropListener.java index 7ecd424c0..c5d95ee1b 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/mythicmobs/MythicItemDropListener.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/mythicmobs/MythicItemDropListener.java @@ -2,14 +2,12 @@ package net.momirealms.craftengine.bukkit.compatibility.mythicmobs; import io.lumine.mythic.bukkit.events.MythicDropLoadEvent; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; -import net.momirealms.craftengine.core.item.CustomItem; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.LazyReference; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.inventory.ItemStack; import java.util.Locale; diff --git a/common-files/src/main/resources/config.yml b/common-files/src/main/resources/config.yml index 99faaa714..c2e4a1f19 100644 --- a/common-files/src/main/resources/config.yml +++ b/common-files/src/main/resources/config.yml @@ -6,11 +6,6 @@ metrics: true update-checker: true # Forces a specific locale (e.g., zh_cn) forced-locale: '' -# Filter configuration phase player disconnection logs -filter-configuration-phase-disconnect: false -# This option delays CraftEngine's config reading until after all plugins start. -# Don't disable this setting unless you need datapack-generated spawn chunks. -delay-configuration-load: true resource-pack: # This option determines the location of the generated resource pack @@ -580,6 +575,17 @@ client-optimization: bucket-size: 1000 restore-per-tick: 25 +misc: + # Filter configuration phase player disconnection logs + filter-configuration-phase-disconnect: false + # This option delays CraftEngine's config reading until after all plugins start. + # Don't disable this setting unless you need datapack-generated spawn chunks. + delay-configuration-load: true + # The registry of packetevents is sometimes inaccurate. This option determines whether + # to enable injection to resolve certain issues with plugins that rely on packetevents. + # This option may become outdated at any time. If errors occur after enabling it, please report them promptly. + inject-packetevents: false + # Enables or disables debug mode debug: common: false diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java index 643150355..87888fe94 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java @@ -45,9 +45,11 @@ public class Config { protected boolean firstTime = true; protected boolean checkUpdate; protected boolean metrics; - protected boolean filterConfigurationPhaseDisconnect; protected Locale forcedLocale; - protected boolean delayConfigurationLoad; + + protected boolean misc$filterConfigurationPhaseDisconnect; + protected boolean misc$delayConfigurationLoad; + protected boolean misc$inject_packet_vents; protected boolean debug$common; protected boolean debug$packet; @@ -311,13 +313,14 @@ public class Config { public void loadFullSettings() { YamlDocument config = settings(); forcedLocale = TranslationManager.parseLocale(config.getString("forced-locale", "")); - delayConfigurationLoad = config.getBoolean("delay-configuration-load", false); + misc$delayConfigurationLoad = config.getBoolean("misc.delay-configuration-load", false); + misc$inject_packet_vents = config.getBoolean("misc.inject-packetevents", false); // basics metrics = config.getBoolean("metrics", false); checkUpdate = config.getBoolean("update-checker", false); - filterConfigurationPhaseDisconnect = config.getBoolean("filter-configuration-phase-disconnect", false); - DisconnectLogFilter.instance().setEnable(filterConfigurationPhaseDisconnect); + misc$filterConfigurationPhaseDisconnect = config.getBoolean("misc.filter-configuration-phase-disconnect", false); + DisconnectLogFilter.instance().setEnable(misc$filterConfigurationPhaseDisconnect); // debug debug$common = config.getBoolean("debug.common", false); @@ -630,7 +633,11 @@ public class Config { } public static boolean delayConfigurationLoad() { - return instance.delayConfigurationLoad; + return instance.misc$delayConfigurationLoad; + } + + public static boolean injectPacketEvents() { + return instance.misc$inject_packet_vents; } public static boolean debugCommon() { @@ -678,7 +685,7 @@ public class Config { } public static boolean filterConfigurationPhaseDisconnect() { - return instance.filterConfigurationPhaseDisconnect; + return instance.misc$filterConfigurationPhaseDisconnect; } public static boolean resourcePack$overrideUniform() { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/StringKeyConstructor.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/StringKeyConstructor.java index 10f7f8bea..13f34a143 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/StringKeyConstructor.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/StringKeyConstructor.java @@ -98,7 +98,6 @@ public class StringKeyConstructor extends SafeConstructor { return map; } - // 处理版本化块合并 private void processVersionedBlock(Map targetMap, String key, Node valueNode) { String versionSpec = key.substring(VERSION_PREFIX.length()); @@ -155,7 +154,6 @@ public class StringKeyConstructor extends SafeConstructor { setValueWithDuplicationCheck(targetMap, key, newValue, key, keyNode); } - // 设置值并检查重复键 @SuppressWarnings("unchecked") private void setValueWithDuplicationCheck(Map targetMap, String key, Object newValue, String fullKeyPath, Node keyNode) { @@ -174,7 +172,6 @@ public class StringKeyConstructor extends SafeConstructor { } } - // 合并两个Map并检查重复键 @SuppressWarnings("unchecked") private void mergeMap(Map target, Map source, String parentPath, Node sourceNode) { @@ -197,7 +194,6 @@ public class StringKeyConstructor extends SafeConstructor { } } - /** * 检查一个MappingNode是否是“值选择器”(即所有键都以 '$$' 开头)。 */ diff --git a/gradle.properties b/gradle.properties index 333e50c03..59a8d4798 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ org.gradle.jvmargs=-Xmx4G # Project settings -project_version=0.0.66.6 +project_version=0.0.66.7 config_version=64 lang_version=46 project_group=net.momirealms @@ -38,7 +38,7 @@ zstd_version=1.5.7-6 commons_io_version=2.21.0 commons_lang3_version=3.20.0 sparrow_nbt_version=0.10.9 -sparrow_util_version=0.76 +sparrow_util_version=0.77 fastutil_version=8.5.18 netty_version=4.1.128.Final joml_version=1.10.8