From 14c30982f78b1cf7475eb7bb4df3567b62382dcb Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sat, 26 Jul 2025 17:40:29 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A8=8D=E5=BE=AE=E6=94=B9=E8=BF=9B=E4=B8=80?= =?UTF-8?q?=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/build.gradle.kts | 2 +- .../worldedit/FastAsyncWorldEditDelegate.java | 4 -- bukkit/legacy/build.gradle.kts | 2 +- bukkit/loader/build.gradle.kts | 2 +- bukkit/paper-loader/build.gradle.kts | 2 +- .../item/listener/ItemEventListener.java | 46 ++++++++++--------- .../classpath/PaperClassPathAppender.java | 27 ++++++----- .../craftengine/bukkit/util/EntityUtils.java | 4 +- .../bukkit/util/InteractUtils.java | 45 +++++++++++++----- .../craftengine/bukkit/util/ItemTags.java | 5 -- core/build.gradle.kts | 2 +- .../core/item/AbstractItemManager.java | 1 - .../core/plugin/config/Config.java | 5 +- gradle.properties | 2 +- 14 files changed, 86 insertions(+), 63 deletions(-) diff --git a/bukkit/build.gradle.kts b/bukkit/build.gradle.kts index 78efcd56d..c9bf92f91 100644 --- a/bukkit/build.gradle.kts +++ b/bukkit/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("com.gradleup.shadow") version "9.0.0-beta13" + id("com.gradleup.shadow") version "9.0.0-rc2" id("maven-publish") } diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index 04669495f..e116d6e6c 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -1,12 +1,9 @@ package net.momirealms.craftengine.bukkit.compatibility.worldedit; -import com.fastasyncworldedit.bukkit.FaweBukkitWorld; import com.fastasyncworldedit.bukkit.adapter.CachedBukkitAdapter; import com.fastasyncworldedit.bukkit.adapter.FaweAdapter; -import com.fastasyncworldedit.bukkit.adapter.NMSAdapter; import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.extent.processor.ExtentBatchProcessorHolder; -import com.fastasyncworldedit.core.math.IntPair; import com.fastasyncworldedit.core.util.ExtentTraverser; import com.fastasyncworldedit.core.util.ProcessorTraverser; import com.sk89q.worldedit.EditSession; @@ -27,7 +24,6 @@ import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockStateHolder; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.nms.FastNMS; -import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.injector.WorldStorageInjector; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.core.block.EmptyBlock; diff --git a/bukkit/legacy/build.gradle.kts b/bukkit/legacy/build.gradle.kts index da89d9df8..2de912779 100644 --- a/bukkit/legacy/build.gradle.kts +++ b/bukkit/legacy/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("com.gradleup.shadow") version "9.0.0-beta13" + id("com.gradleup.shadow") version "9.0.0-rc2" } repositories { diff --git a/bukkit/loader/build.gradle.kts b/bukkit/loader/build.gradle.kts index 9e4762b96..29d893949 100644 --- a/bukkit/loader/build.gradle.kts +++ b/bukkit/loader/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("com.gradleup.shadow") version "9.0.0-beta13" + id("com.gradleup.shadow") version "9.0.0-rc2" id("de.eldoria.plugin-yml.bukkit") version "0.7.1" } diff --git a/bukkit/paper-loader/build.gradle.kts b/bukkit/paper-loader/build.gradle.kts index ac2894f04..1d5ce6703 100644 --- a/bukkit/paper-loader/build.gradle.kts +++ b/bukkit/paper-loader/build.gradle.kts @@ -1,7 +1,7 @@ import net.minecrell.pluginyml.paper.PaperPluginDescription plugins { - id("com.gradleup.shadow") version "9.0.0-beta13" + id("com.gradleup.shadow") version "9.0.0-rc2" id("de.eldoria.plugin-yml.paper") version "0.7.1" } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java index 73471279c..5145a7b05 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java @@ -77,6 +77,7 @@ public class ItemEventListener implements Listener { if (ItemUtils.isEmpty(itemInHand)) return; Optional> optionalCustomItem = itemInHand.getCustomItem(); if (optionalCustomItem.isEmpty()) return; + // 如果目标实体与手中物品可以产生交互,那么忽略 if (InteractUtils.isEntityInteractable(player, entity, itemInHand)) return; Cancellable cancellable = Cancellable.of(event::isCancelled, event::setCancelled); @@ -267,27 +268,7 @@ public class ItemEventListener implements Listener { } } - // execute item right click functions - if (hasCustomItem) { - Cancellable dummy = Cancellable.dummy(); - PlayerOptionalContext context = PlayerOptionalContext.of(serverPlayer, ContextHolder.builder() - .withParameter(DirectContextParameters.BLOCK, new BukkitBlockInWorld(block)) - .withOptionalParameter(DirectContextParameters.CUSTOM_BLOCK_STATE, immutableBlockState) - .withOptionalParameter(DirectContextParameters.ITEM_IN_HAND, itemInHand) - .withParameter(DirectContextParameters.POSITION, LocationUtils.toWorldPosition(block.getLocation())) - .withParameter(DirectContextParameters.HAND, hand) - .withParameter(DirectContextParameters.EVENT, dummy) - ); - CustomItem customItem = optionalCustomItem.get(); - if (!(InteractUtils.isInteractable(player, blockData, hitResult, itemInHand) && !player.isSneaking())) { - customItem.execute(context, EventTrigger.RIGHT_CLICK); - } - if (dummy.isCancelled()) { - event.setCancelled(true); - return; - } - } - + // 优先检查物品行为,再执行自定义事件 // 检查其他的物品行为,物品行为理论只在交互时处理 Optional> optionalItemBehaviors = itemInHand.getItemBehavior(); // 物品类型是否包含自定义物品行为,行为不一定来自于自定义物品,部分原版物品也包含了新的行为 @@ -315,8 +296,31 @@ public class ItemEventListener implements Listener { } } } + + // 执行物品右键事件 + if (hasCustomItem) { + // 要求服务端侧这个方块不可交互,或玩家处于潜行状态 + if (serverPlayer.isSecondaryUseActive() || !InteractUtils.isInteractable(player, blockData, hitResult, itemInHand)) { + Cancellable dummy = Cancellable.dummy(); + PlayerOptionalContext context = PlayerOptionalContext.of(serverPlayer, ContextHolder.builder() + .withParameter(DirectContextParameters.BLOCK, new BukkitBlockInWorld(block)) + .withOptionalParameter(DirectContextParameters.CUSTOM_BLOCK_STATE, immutableBlockState) + .withOptionalParameter(DirectContextParameters.ITEM_IN_HAND, itemInHand) + .withParameter(DirectContextParameters.POSITION, LocationUtils.toWorldPosition(block.getLocation())) + .withParameter(DirectContextParameters.HAND, hand) + .withParameter(DirectContextParameters.EVENT, dummy) + ); + CustomItem customItem = optionalCustomItem.get(); + customItem.execute(context, EventTrigger.RIGHT_CLICK); + if (dummy.isCancelled()) { + event.setCancelled(true); + return; + } + } + } } + // 执行物品左键事件 if (hasCustomItem && action == Action.LEFT_CLICK_BLOCK) { Cancellable dummy = Cancellable.dummy(); PlayerOptionalContext context = PlayerOptionalContext.of(serverPlayer, ContextHolder.builder() diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/classpath/PaperClassPathAppender.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/classpath/PaperClassPathAppender.java index ddacca6b9..24a89e13d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/classpath/PaperClassPathAppender.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/classpath/PaperClassPathAppender.java @@ -3,6 +3,7 @@ package net.momirealms.craftengine.bukkit.plugin.classpath; import net.momirealms.craftengine.core.plugin.classpath.ClassPathAppender; import net.momirealms.craftengine.core.plugin.classpath.URLClassLoaderAccess; import net.momirealms.craftengine.core.util.ReflectionUtils; +import org.bukkit.Bukkit; import java.lang.reflect.Field; import java.net.MalformedURLException; @@ -20,18 +21,20 @@ public class PaperClassPathAppender implements ClassPathAppender { private final URLClassLoaderAccess classLoaderAccess; public PaperClassPathAppender(ClassLoader classLoader) { - try { - if (clazz$PaperPluginClassLoader != null && clazz$PaperPluginClassLoader.isInstance(classLoader)) { - URLClassLoader libraryClassLoader = (URLClassLoader) field$PaperPluginClassLoader$libraryLoader.get(classLoader); - this.classLoaderAccess = URLClassLoaderAccess.create(libraryClassLoader); - } else if (classLoader instanceof URLClassLoader) { - this.classLoaderAccess = URLClassLoaderAccess.create((URLClassLoader) classLoader); - } else { - throw new IllegalStateException("ClassLoader is not instance of URLClassLoader"); - } - } catch (ReflectiveOperationException e) { - throw new RuntimeException("Failed to instantiate PaperPluginClassLoader", e); - } + // 25/7/26 往Bukkit类加载器里硬灌,就能保证库也被其他插件使用了 + this.classLoaderAccess = URLClassLoaderAccess.create((URLClassLoader) Bukkit.class.getClassLoader()); +// try { +// if (clazz$PaperPluginClassLoader != null && clazz$PaperPluginClassLoader.isInstance(classLoader)) { +// URLClassLoader libraryClassLoader = (URLClassLoader) field$PaperPluginClassLoader$libraryLoader.get(classLoader); +// this.classLoaderAccess = URLClassLoaderAccess.create(libraryClassLoader); +// } else if (classLoader instanceof URLClassLoader) { +// this.classLoaderAccess = URLClassLoaderAccess.create((URLClassLoader) classLoader); +// } else { +// throw new IllegalStateException("ClassLoader is not instance of URLClassLoader"); +// } +// } catch (ReflectiveOperationException e) { +// throw new RuntimeException("Failed to instantiate PaperPluginClassLoader", e); +// } } @Override diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java index e7fe96bb1..851c8e41b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java @@ -6,7 +6,9 @@ import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.world.BlockPos; import org.bukkit.Location; import org.bukkit.World; -import org.bukkit.entity.*; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; import org.bukkit.event.entity.CreatureSpawnEvent; import java.util.function.Consumer; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java index e610903df..47ff02f32 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java @@ -4,6 +4,8 @@ import io.papermc.paper.entity.Shearable; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.item.behavior.BlockItemBehavior; import net.momirealms.craftengine.bukkit.item.recipe.BukkitRecipeManager; +import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBuiltInRegistries; import net.momirealms.craftengine.core.block.BlockKeys; import net.momirealms.craftengine.core.entity.EntityTypeKeys; import net.momirealms.craftengine.core.item.Item; @@ -28,7 +30,10 @@ import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; public class InteractUtils { private static final Map, BlockData, BlockHitResult, Boolean>> INTERACTIONS = new HashMap<>(); @@ -67,11 +72,15 @@ public class InteractUtils { registerInteraction(BlockKeys.TEST_BLOCK, (player, item, blockState, result) -> player.isOp() && player.getGameMode() == GameMode.CREATIVE); registerInteraction(BlockKeys.LIGHT, (player, item, blockState, result) -> item.vanillaId().equals(ItemKeys.LIGHT)); registerInteraction(BlockKeys.LODESTONE, (player, item, blockState, result) -> item.vanillaId().equals(ItemKeys.COMPASS)); - registerInteraction(BlockKeys.BEE_NEST, (player, item, blockState, result) -> Set.of(ItemKeys.SHEARS, ItemKeys.GLASS_BOTTLE).contains(item.vanillaId())); - registerInteraction(BlockKeys.BEEHIVE, (player, item, blockState, result) -> Set.of(ItemKeys.SHEARS, ItemKeys.GLASS_BOTTLE).contains(item.vanillaId())); + registerInteraction(BlockKeys.BEE_NEST, (player, item, blockState, result) -> { + Key id = item.vanillaId(); + return ItemKeys.SHEARS.equals(id) || ItemKeys.GLASS_BOTTLE.equals(id); + }); + registerInteraction(BlockKeys.BEEHIVE, (player, item, blockState, result) -> { + Key id = item.vanillaId(); + return ItemKeys.SHEARS.equals(id) || ItemKeys.GLASS_BOTTLE.equals(id); + }); registerInteraction(BlockKeys.POWDER_SNOW, (player, item, blockState, result) -> item.vanillaId().equals(ItemKeys.BUCKET)); - registerWillConsume(BlockKeys.CAULDRON, (player, item, blockState, result) -> Set.of(ItemKeys.WATER_BUCKET, ItemKeys.LAVA_BUCKET).contains(item.vanillaId())); - registerWillConsume(BlockKeys.LAVA_CAULDRON, (player, item, blockState, result) -> Set.of(ItemKeys.BUCKET, ItemKeys.WATER_BUCKET, ItemKeys.LAVA_BUCKET).contains(item.vanillaId())); registerInteraction(BlockKeys.REDSTONE_ORE, (player, item, blockState, result) -> { Optional> behaviors = item.getItemBehavior(); if (behaviors.isPresent()) { @@ -90,11 +99,7 @@ public class InteractUtils { } return true; }); - registerWillConsume(BlockKeys.WATER_CAULDRON, (player, item, blockState, result) -> { - if (blockState instanceof Levelled levelled && levelled.getLevel() == levelled.getMaximumLevel()) - return item.vanillaId().equals(ItemKeys.BUCKET); - return Set.of(ItemKeys.GLASS_BOTTLE, ItemKeys.WATER_BUCKET, ItemKeys.LAVA_BUCKET).contains(item.vanillaId()); - }); + registerInteraction(BlockKeys.BELL, (player, item, blockState, result) -> { Direction direction = result.getDirection(); BlockPos pos = result.getBlockPos(); @@ -327,6 +332,20 @@ public class InteractUtils { static { registerWillConsume(BlockKeys.CACTUS, (player, item, blockState, result) -> result.getDirection() == Direction.UP && item.id().equals(ItemKeys.CACTUS)); + registerWillConsume(BlockKeys.CAULDRON, (player, item, blockState, result) -> { + Key id = item.vanillaId(); + return ItemKeys.WATER_BUCKET.equals(id) || ItemKeys.LAVA_BUCKET.equals(id); + }); + registerWillConsume(BlockKeys.LAVA_CAULDRON, (player, item, blockState, result) -> { + Key id = item.vanillaId(); + return ItemKeys.BUCKET.equals(id) || ItemKeys.LAVA_BUCKET.equals(id) || ItemKeys.WATER_BUCKET.equals(id); + }); + registerWillConsume(BlockKeys.WATER_CAULDRON, (player, item, blockState, result) -> { + if (blockState instanceof Levelled levelled && levelled.getLevel() == levelled.getMaximumLevel()) + return item.vanillaId().equals(ItemKeys.BUCKET); + Key id = item.vanillaId(); + return ItemKeys.GLASS_BOTTLE.equals(id) || ItemKeys.WATER_BUCKET.equals(id) || ItemKeys.LAVA_BUCKET.equals(id); + }); } static { @@ -466,8 +485,10 @@ public class InteractUtils { } public static boolean isEntityInteractable(Player player, Entity entity, @Nullable Item item) { - Key key = Key.of(String.valueOf(entity.getType())); - TriFunction, Boolean> func = ENTITY_INTERACTIONS.get(key); + Object nmsEntity = FastNMS.INSTANCE.method$CraftEntity$getHandle(entity); + Object entityType = FastNMS.INSTANCE.method$Entity$getType(nmsEntity); + Object id = FastNMS.INSTANCE.method$Registry$getKey(MBuiltInRegistries.ENTITY_TYPE, entityType); + TriFunction, Boolean> func = ENTITY_INTERACTIONS.get(KeyUtils.resourceLocationToKey(id)); return func != null && func.apply(player, entity, item); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemTags.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemTags.java index 6028485a4..1f35e3e90 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemTags.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemTags.java @@ -3,11 +3,6 @@ package net.momirealms.craftengine.bukkit.util; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistries; import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.VersionHelper; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.NamespacedKey; -import org.bukkit.Tag; import java.util.HashMap; import java.util.Map; diff --git a/core/build.gradle.kts b/core/build.gradle.kts index d41f1c2f1..df535d1cd 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("com.gradleup.shadow") version "9.0.0-beta13" + id("com.gradleup.shadow") version "9.0.0-rc2" id("maven-publish") } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java index 6865d2cf7..0bb7a59cf 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java @@ -16,7 +16,6 @@ import net.momirealms.craftengine.core.pack.AbstractPackManager; import net.momirealms.craftengine.core.pack.LoadingSequence; import net.momirealms.craftengine.core.pack.Pack; import net.momirealms.craftengine.core.pack.ResourceLocation; -import net.momirealms.craftengine.core.pack.host.ResourcePackHosts; import net.momirealms.craftengine.core.pack.model.*; import net.momirealms.craftengine.core.pack.model.generation.AbstractModelGenerator; import net.momirealms.craftengine.core.pack.model.generation.ModelGeneration; 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 04f031e4e..0f3c2d5d6 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 @@ -20,7 +20,10 @@ import net.momirealms.craftengine.core.plugin.PluginProperties; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.plugin.logger.filter.DisconnectLogFilter; -import net.momirealms.craftengine.core.util.*; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MinecraftVersion; +import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.world.InjectionTarget; import net.momirealms.craftengine.core.world.chunk.storage.CompressionMethod; diff --git a/gradle.properties b/gradle.properties index ec79d5386..f9c9970e9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.18 -nms_helper_version=1.0.37 +nms_helper_version=1.0.38 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23