1.20.1 Bukkit-Paper插件问题:精准采集无法挖掘末地传送门框架
1.20.1 Bukkit-Paper插件:精准采集无法挖掘末地传送门框架并掉落
我需要开发一个适配1.20.1版本的Bukkit-Paper插件,目标是让玩家使用带有精准采集附魔的工具挖掘末地传送门框架时,方块被破坏并掉落对应的物品。
预期与实际结果
- 预期效果:使用带精准采集的工具挖掘末地传送门框架时,方块被破坏并掉落物品
- 实际结果:无法挖掘该方块
现有代码
package me.grubbauer.endcrafter; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.enchantments.Enchantment; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.plugin.java.JavaPlugin; public final class EndCrafter extends JavaPlugin implements Listener { @Override public void onEnable() { getServer().getPluginManager().registerEvents(this, this); } @EventHandler public void onBlockBreak(BlockBreakEvent event) { Block block = event.getBlock(); if (block.getType() == Material.END_PORTAL) { // Check if the player has silk touch if (event.getPlayer().getInventory().getItemInMainHand().containsEnchantment(Enchantment.SILK_TOUCH)) { // Drop end portal blocks dropEndPortalBlocks(block); // Cancel the event so the original block doesn't drop anything event.setCancelled(true); } } } private void dropEndPortalBlocks(Block block) { // Drop end portal blocks for (BlockFace face : BlockFace.values()) { Block adjacentBlock = block.getRelative(face); if (adjacentBlock.getType() == Material.END_PORTAL_FRAME) { adjacentBlock.breakNaturally(); } } } }
问题分析与修复方案
你的代码存在几个核心问题:
- 监听对象错误:你监听的是
Material.END_PORTAL(末地传送门方块),但玩家实际要挖掘的是Material.END_PORTAL_FRAME(末地传送门框架),完全搞错了处理对象。 - 未处理框架的默认特性:原版MC中末地传送门框架默认不可破坏,需要主动允许破坏行为。
- 掉落逻辑冗余:遍历相邻方块的逻辑完全没必要,直接处理被挖掘的框架方块即可。
修复后的代码:
package me.grubbauer.endcrafter; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.enchantments.Enchantment; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; public final class EndCrafter extends JavaPlugin implements Listener { @Override public void onEnable() { getServer().getPluginManager().registerEvents(this, this); } @EventHandler public void onBlockBreak(BlockBreakEvent event) { Block block = event.getBlock(); // 检查目标方块是否为末地传送门框架 if (block.getType() == Material.END_PORTAL_FRAME) { ItemStack tool = event.getPlayer().getInventory().getItemInMainHand(); // 验证工具是否带有精准采集附魔 if (tool.containsEnchantment(Enchantment.SILK_TOUCH)) { // 取消默认的不可破坏限制,允许方块被破坏 event.setCancelled(false); // 移除原方块并生成掉落物 block.setType(Material.AIR); block.getWorld().dropItemNaturally(block.getLocation(), new ItemStack(Material.END_PORTAL_FRAME)); } } } }
修复说明
- 将监听对象改为
Material.END_PORTAL_FRAME,确保响应玩家挖掘框架的操作 - 取消事件的默认取消状态,解除框架的不可破坏限制
- 直接生成框架物品掉落,符合精准采集的逻辑
- 移除冗余的相邻方块遍历,简化代码结构
内容的提问来源于stack exchange,提问作者Grubi
相关产品推荐
相关产品推荐

