Minecraft Java Bukkit

问题描述 投票:0回答:1

我想让我的 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();
            }
        }
    }
}

预计: 当使用丝触开采时,方块会被破坏并且方块会掉落

结果: 不是我的

java minecraft bukkit
1个回答
0
投票

在这种情况下,您正在检查块

END_PORTAL
,然后在
dropEndPortalBlocks()
方法上您正在寻找
END_PORTAL_FRAME
块。不可能是一样的。

END_PORTAL_FRAME
是世界块,而
END_PORTAL
是手中的物品。您应该两次都输入
END_PORTAL_FRAME
。如果您不知道,可以将两者都放在 if 中,如下所示:
if (block.getType() == Material.END_PORTAL || block.getType() == Material.END_PORTAL_FRAME)

然后,对于Rogue报告的逻辑问题,就解决了

BlockFace.SELF
。所以这应该不是问题,但你可以做得更好:让事件管理主块的掉落并忽略循环中的
BlockFace.SELF

另外,如果你想清除掉落,只需执行

event.setDropItems(false)
即可。

最后,

breakNaturally()
会像平常一样丢弃方块。但是,您可以添加手中玩家的物品,使其完全像破坏它的玩家一样破坏。示例:
breakNaturally(player.getInventory().getItemInMainHand())
.

完整代码:

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_FRAME) {
            // Check if the player has silk touch
            if (event.getPlayer().getInventory().getItemInMainHand().containsEnchantment(Enchantment.SILK_TOUCH)) {
                // Drop end portal blocks
                dropEndPortalBlocks(block, event.getPlayer().getInventory().getItemInMainHand());
            }
        }
    }

    private void dropEndPortalBlocks(Block block, ItemStack inHand) {
        // Drop end portal blocks
        for (BlockFace face : BlockFace.values()) {
            if(face == BlockFace.SELF) // ignore this one
                continue;
            Block adjacentBlock = block.getRelative(face);
            if (adjacentBlock.getType() == Material.END_PORTAL_FRAME) {
                adjacentBlock.breakNaturally(inHand);
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.