Minecraft bukkit 插件右键单击项目

Minecraft bukkit plugin right click item

我正在为我作为开发人员的服务器制作一个插件,并且我正在开发一个插件! 我想在你执行命令后执行 /boss give lvl <lvl> slime 命令来生成一个 Boss 蛋,它会给你一个项目,你可以右键单击它来生成 Boss!就像所有新开发人员一样,事情并不总是按照您认为的方式进行。这是我输入的代码,用于检查玩家是否右键单击空气或玩家手中带有物品 SLIME_BALL 的方块。

@EventHandler
public void onPlayerClicks(PlayerInteractEvent event) {
    Player player = event.getPlayer();
    Action action = event.getAction();

     if (action.equals(Action.RIGHT_CLICK_AIR) || action.equals(Action.RIGHT_CLICK_BLOCK)) {
         if (player.getItemInHand().getType() == Material.SLIME_BALL) {
             player.sendMessage("You have right click a slime ball!");
         } 
     }

}

鉴于您在日志中没有看到任何堆栈跟踪,我同意您的事件侦听器未注册。假设您的侦听器 class 被称为 MyEventHandler 它将在 onEnable() 方法中注册,类似于此

class MyPlugin extends JavaPlugin {
    ...
    public void onEnable() {
        Listener myEvtHnd = new MyEventHandler();
        Bukkit.getPluginManager().registerEvents( myEvtHnd, this );
        ...
    }
}

总的来说,您的处理程序看起来很合适。 PlayerInteractEvent 提供了一个方便的方法 getItem() 即 returns 玩家的当前 item-in-hand。但是,无论使用哪种方法,您都必须检查返回的ItemStack是否不为空,如果玩家没有物品in-hand,就会发生这种情况。

@EventHandler
public void onPlayerClicks(PlayerInteractEvent event) {
    Player player = event.getPlayer();
    Action action = event.getAction();
    ItemStack item = event.getItem();

     if ( action.equals( Action.RIGHT_CLICK_AIR ) || action.equals( Action.RIGHT_CLICK_BLOCK ) ) {
         if ( item != null && item.getType() == Material.SLIME_BALL ) {
             player.sendMessage( "You have right click a slime ball!" );
         } 
     }

}

也许您可以使用 action == 而不是 action.equals(),如:

if (action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK) {
     if (player.getItemInHand().getType() == Material.SLIME_BALL) {
         player.sendMessage("You have right click a slime ball!");
     } 
 }