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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:38:20