You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Minecraft 1.21.4版本下,苦力怕桶插件自定义模型数据的NBT代码设置问题

Minecraft 1.21.4版本下,苦力怕桶插件自定义模型数据的NBT代码设置问题

嘿,我看你在折腾1.21.4版本的苦力怕桶插件,遇到了NBT格式更新的坑对吧?别担心,咱们一步步把这个问题捋清楚解决掉。

首先得明确:1.21.4对Minecraft物品的NBT结构做了不小的调整,尤其是item_modelcustom_model_data这俩标签——它们不再是随便放在根节点的自定义标签,而是整合到了官方的components体系下,而且custom_model_data的格式也从简单字符串变成了复合标签结构。你之前的代码用了自己插件的命名空间来存这些标签,自然和新版本的命令格式对不上。

问题核心调整点

  • 命名空间要对应官方item_modelcustom_model_data都是Minecraft官方的标签,得用minecraft命名空间,不能用你插件的命名空间。
  • custom_model_data的格式:它不再是单个字符串,而是一个包含strings数组的复合NBT标签,和你给的命令里的{strings:[entity_bucket]}结构对应。

修改后的代码实现

咱们直接把你的代码里对应部分改好:

首先调整类里的NamespacedKey定义:

private final JavaPlugin plugin;
// 现在用minecraft命名空间的键,对应官方NBT标签
private final NamespacedKey keyItemModel;
private final NamespacedKey keyCustomModelData;

public CreeperBucketListener(JavaPlugin plugin) {
    this.plugin = plugin;
    this.keyItemModel = new NamespacedKey("minecraft", "item_model");
    this.keyCustomModelData = new NamespacedKey("minecraft", "custom_model_data");
}

然后修改捕获苦力怕时生成纸的代码,正确设置NBT:

@EventHandler
public void onCaptureCreeper(PlayerInteractEntityEvent event) {
    // ... 原来的前置判断逻辑保持不变 ...

    Bukkit.getScheduler().runTaskLater(plugin, () -> {
        ItemStack paper = new ItemStack(Material.PAPER);
        ItemMeta meta = paper.getItemMeta();
        if (meta != null) {
            meta.setDisplayName("§aCreeper in a Bucket");
            PersistentDataContainer pdc = meta.getPersistentDataContainer();
            
            // 设置item_model:对应命令里的minecraft:item_model="minecraft:creeper_bucket"
            pdc.set(keyItemModel, PersistentDataType.STRING, "minecraft:creeper_bucket");
            
            // 设置custom_model_data:对应命令里的custom_model_data={strings:[entity_bucket]}
            CompoundTag customModelTag = new CompoundTag();
            // 把字符串数组放进复合标签
            customModelTag.putStringArray("strings", List.of("entity_bucket"));
            pdc.set(keyCustomModelData, PersistentDataType.TAG, customModelTag);
            
            paper.setItemMeta(meta);
        }
        // ... 原来的物品添加逻辑保持不变 ...
    }, 1L);
}

最后修改使用苦力怕纸的判断逻辑,正确读取新格式的NBT:

@EventHandler
public void onUseCreeperPaper(PlayerInteractEvent event) {
    // ... 原来的前置判断逻辑保持不变 ...

    ItemMeta meta = item.getItemMeta();
    if (meta == null) return;
    PersistentDataContainer pdc = meta.getPersistentDataContainer();
    
    // 读取item_model
    String itemModel = pdc.get(keyItemModel, PersistentDataType.STRING);
    if (!"minecraft:creeper_bucket".equals(itemModel)) {
        return;
    }
    
    // 读取custom_model_data的复合标签
    CompoundTag customModelTag = pdc.get(keyCustomModelData, PersistentDataType.TAG);
    if (customModelTag == null) {
        return;
    }
    // 检查strings数组里是否包含entity_bucket
    List<String> customModelStrings = customModelTag.getStringArray("strings");
    if (!customModelStrings.contains("entity_bucket")) {
        return;
    }
    
    // ... 原来的生成苦力怕、返还水桶的逻辑保持不变 ...
}

额外注意事项

  • 确保你的资源包里的模型ID是minecraft:creeper_bucket,和代码里设置的item_model值对应,不然模型不会加载。
  • 测试的时候可以用你给的命令直接获取物品,对比插件生成的物品的NBT结构,确保一致。
  • 插件要基于1.21.4对应的Bukkit/Spigot版本开发,不然PersistentDataContainer的API可能有差异。

内容来源于stack exchange

火山引擎 最新活动