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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:57:03