Minecraft 1.21.4版本下,苦力怕桶插件自定义模型数据的NBT代码设置问题
Minecraft 1.21.4版本下,苦力怕桶插件自定义模型数据的NBT代码设置问题
嘿,我看你在折腾1.21.4版本的苦力怕桶插件,遇到了NBT格式更新的坑对吧?别担心,咱们一步步把这个问题捋清楚解决掉。
首先得明确:1.21.4对Minecraft物品的NBT结构做了不小的调整,尤其是item_model和custom_model_data这俩标签——它们不再是随便放在根节点的自定义标签,而是整合到了官方的components体系下,而且custom_model_data的格式也从简单字符串变成了复合标签结构。你之前的代码用了自己插件的命名空间来存这些标签,自然和新版本的命令格式对不上。
问题核心调整点
- 命名空间要对应官方:
item_model和custom_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




