Spigot 1.19自定义刷怪笼插件问题:右键设刷物品无效
问题分析与解决方法
核心问题点
- 未校验点击方块的类型,直接强制转换
Block为CreatureSpawner会导致类型不匹配时静默失败 - 变量
player未定义,需通过event.getPlayer()获取触发事件的玩家 - 使用
setblock命令修改NBT的方式易出现格式错误,且效率低于直接调用Spigot API
修正后的完整代码
@EventHandler private void onRightClick(PlayerInteractEvent event) { // 仅响应右键方块的操作 if (event.getAction() != Action.RIGHT_CLICK_BLOCK) { return; } Block clickedBlock = event.getClickedBlock(); // 校验点击的是刷怪笼方块 if (clickedBlock == null || !(clickedBlock.getState() instanceof CreatureSpawner)) { return; } Player player = event.getPlayer(); ItemStack mainHandItem = player.getInventory().getItemInMainHand(); // 校验主手持有非空气物品 if (mainHandItem.getType().isAir()) { return; } CreatureSpawner spawner = (CreatureSpawner) clickedBlock.getState(); NamespacedKey itemKey = mainHandItem.getType().getKey(); // 直接用API构建刷怪笼的物品生成NBT数据 CompoundTag spawnData = new CompoundTag(); CompoundTag entityTag = new CompoundTag(); CompoundTag itemTag = new CompoundTag(); entityTag.putString("id", "minecraft:item"); itemTag.putString("id", itemKey.toString()); itemTag.putByte("Count", (byte) 1); entityTag.put("Item", itemTag); spawnData.put("entity", entityTag); spawner.setSpawnData(spawnData); spawner.update(true); // 保存修改并刷新刷怪笼状态 }
关键改进说明
- 增加操作与类型校验:过滤非右键方块的操作,提前排除非刷怪笼方块,避免无效执行
- 替换命令为API操作:通过
CreatureSpawner原生方法设置生成数据,无需依赖控制台执行命令,稳定性和效率更高 - 补充空值校验:防止主手为空或方块为空时触发异常
- 修正玩家对象获取:从事件中正确获取玩家实例
内容的提问来源于stack exchange,提问作者Minecreator200
相关产品推荐
相关产品推荐

