我想让我的 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();
}
}
}
}
预计: 当使用丝触开采时,方块会被破坏并且方块会掉落
结果: 不是我的
在这种情况下,您正在检查块
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);
}
}
}
}