如何使用Bukkit为物品的CanPlaceOn和CanDestroy标签添加Block ID
1.17.1版本Spigot修改物品CanPlaceOn/CanDestroy标签方案
方案一:使用Spigot原生API(优先推荐,无需NMS)
1.16+版本的Spigot已经内置了操作CanPlaceOn、CanDestroy标签的官方API,不需要依赖NMS,跨版本兼容性更好,直接调用即可:
import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import java.util.Collections; public void addBlockToCanPlaceOn(ItemStack item, Material block){ // 入参合法性校验 if (item == null || block == null || !block.isBlock()) { return; } ItemMeta meta = item.getItemMeta(); if (meta == null) { return; } // 向CanPlaceOn标签追加目标方块 meta.addCanPlaceOn(Collections.singletonList(block)); // 将修改后的元数据写回物品 item.setItemMeta(meta); }
如果需要修改CanDestroy标签,只需要将addCanPlaceOn替换为addCanDestroy即可。
方案二:1.17.1专属NMS实现
如果你有特殊需求必须使用NMS实现,可以参考以下适配1.17.1版本的代码:
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.StringTag; import net.minecraft.world.item.ItemStack; import org.bukkit.Material; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; public void addBlockToCanPlaceOnNMS(org.bukkit.inventory.ItemStack bukkitItem, Material block){ if (bukkitItem == null || block == null || !block.isBlock()) { return; } // Bukkit物品实例转NMS物品实例 ItemStack nmsItem = CraftItemStack.asNMSCopy(bukkitItem); CompoundTag itemTag = nmsItem.getOrCreateTag(); // 读取或初始化CanPlaceOn标签列表 ListTag canPlaceOnList; if (itemTag.contains("CanPlaceOn", 9)) { // 9对应NBT List类型的ID canPlaceOnList = itemTag.getList("CanPlaceOn", 8); // 8对应NBT String类型的ID } else { canPlaceOnList = new ListTag(); } // 获取方块的标准命名ID(格式为 命名空间:方块名 例如 minecraft:stone) String blockStandardId = block.getKey().toString(); canPlaceOnList.add(StringTag.valueOf(blockStandardId)); // 将修改后的标签写回物品 itemTag.put("CanPlaceOn", canPlaceOnList); nmsItem.setTag(itemTag); bukkitItem.setItemMeta(CraftItemStack.getItemMeta(nmsItem)); }
注意事项
- 原生API方案支持所有1.16+版本的Spigot服务端,不需要随版本升级修改代码,优先选择该方案
- NMS方案中的包名
v1_17_R1仅适配1.17.1版本,服务端升级到其他版本时需要同步修改对应包名 - 所有操作完成后必须调用
setItemMeta将修改后的元数据写回原物品实例,否则修改不会生效
内容的提问来源于stack exchange,提问作者GamingForce4D
相关产品推荐
相关产品推荐

