如何选择可以放置项目的块?

时间:2017-06-21 09:45:42

标签: java minecraft bukkit

我想知道如何选择我的TNT所在的区块。这是我的代码。

ItemStack tnt = new ItemStack(Material.TNT, 1);

give @p tnt 1 0 {PlaceOn:emerald_block}一样。

我正在使用Spigot for Minecraft 1.12和Eclipse。

2 个答案:

答案 0 :(得分:6)

本机无法通过Spigot API实现这一点,您需要使用NMS和NBT:

net.minecraft.server.v1_12_R1.ItemStack stack = CraftItemStack.asNMSCopy(tnt);

NBTTagList tags = (NBTTagList) stack.getTag().get("CanPlaceOn");

if (tags == null)
    tags = new NBTTagList();

tags.add(new NBTTagString("minecraft:emerald_block"));

stack.getTag().set("CanPlaceOn", tags);

ItemStack toUse = CraftItemStack.asCraftMirror(stack);

答案 1 :(得分:1)

一般来说,如果你可以避免使用NMS,那么有一种非常简单的方法可以做到这一点。每当玩家放置一个块时,服务器就会调用BlockPlaceEvent。如果您不确定它们是如何工作的,请查看此处:http://bukkit.gamepedia.com/Event_API_Reference

如何处理此行为的示例如下:

public void onBlockPlace(BlockPlaceEvent e) {
    if (e.getBlockPlaced().getType() == Material.TNT) {
        Material belowType = e.getBlockPlaced().getRelative(BlockFace.DOWN).getType();
        // your code here...
    }
}

此代码允许您检查放置的块是否为TNT,然后检索直接位于其下方的块的类型。

希望这会有所帮助!!