You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
            }
        }
    }
}

问题分析与修复方案

你的代码存在几个核心问题:

  1. 监听对象错误:你监听的是Material.END_PORTAL(末地传送门方块),但玩家实际要挖掘的是Material.END_PORTAL_FRAME(末地传送门框架),完全搞错了处理对象。
  2. 未处理框架的默认特性:原版MC中末地传送门框架默认不可破坏,需要主动允许破坏行为。
  3. 掉落逻辑冗余:遍历相邻方块的逻辑完全没必要,直接处理被挖掘的框架方块即可。

修复后的代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 17:20:54