使用IntelliJ开发Minecraft Spigot插件:特定物品放置替换问题
解决Spigot插件开发的两个问题
一、触发特定名称物品的放置事件
要仅在放置带指定名称的灵魂火把时执行替换,需从BlockPlaceEvent中校验物品的类型和自定义名称:
- 通过
event.getItemInHand()获取玩家放置时使用的物品栈 - 校验物品栈不为空、类型为灵魂火把(
Material.SOUL_TORCH) - 读取物品的
ItemMeta,检查是否存在自定义名称且与目标字符串完全匹配
二、给替换后的木桶设置预设物品(使用NBT标签)
你已通过/data复制了目标木桶的NBT标签,直接将该标签应用到新木桶即可:
- 取消原放置事件,避免原灵魂火把残留
- 在目标位置放置木桶
- 将复制的NBT字符串解析为
CompoundTag,写入木桶的方块状态中
完整代码示例
import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.TagParser; public class TorchListener implements Listener { // 替换为你用/data命令复制的木桶NBT标签 private static final String BARREL_NBT = "{Items:[{Slot:0b,id:\"minecraft:diamond\",Count:1b},{Slot:1b,id:\"minecraft:gold_ingot\",Count:64b}]}"; @EventHandler(priority = EventPriority.LOW) public void onNamedSoulTorchPlace(BlockPlaceEvent event) { ItemStack placedItem = event.getItemInHand(); // 校验物品是否是带指定名称的灵魂火把 if (placedItem == null || placedItem.getType() != Material.SOUL_TORCH) { return; } ItemMeta meta = placedItem.getItemMeta(); if (meta == null || !meta.hasDisplayName() || !meta.getDisplayName().equals("hello")) { return; } // 取消原放置,替换为木桶 event.setCancelled(true); Block targetBlock = event.getBlock(); targetBlock.setType(Material.BARREL); // 给木桶应用预设NBT标签 try { BlockState state = targetBlock.getState(); CompoundTag nbt = TagParser.parseTag(BARREL_NBT); // 将NBT写入木桶的TileEntity net.minecraft.world.level.block.entity.BlockEntity nmsTile = ((org.bukkit.craftbukkit.v1_20_R3.block.CraftBlockState) state).getTileEntity(); nmsTile.load(nbt); state.update(true); } catch (Exception e) { event.getPlayer().sendMessage("木桶物品设置失败:" + e.getMessage()); e.printStackTrace(); } } }
注意事项
- 代码中的
BARREL_NBT需替换为你实际复制的NBT字符串,确保格式符合NBT语法 org.bukkit.craftbukkit.v1_20_R3部分需根据你的Spigot版本调整(比如v1_19_R2对应1.19版本)- 若不想依赖CraftBukkit类,可使用第三方NBT库(如NBTAPI),但直接解析NBT字符串的方式更适配你现有需求
内容的提问来源于stack exchange,提问作者randomUser153
相关产品推荐
相关产品推荐

