bukkit - 跌落预防不起作用?

bukkit - Drop prevention not working?

我想移除玩家掉落某些物品的能力,同时移除除了我想取消的那些之外的所有掉落,例如:玩家不能掉落一把剑,但是当他掉落蘑菇汤时是空的碗,然后清洁水滴。我在主 class.

上注册了两个监听器 classes

听众:

@EventHandler
public void onPlayerDropItem(PlayerDropItemEvent e) {
    e.getItemDrop().remove();
}

防止掉落:

@EventHandler(priority = EventPriority.HIGH, ignoreCancelled=false)
public void onPlayerDropItem(PlayerDropItemEvent e) {
    if(e.getItemDrop().equals(new ItemStack(Material.MUSHROOM_SOUP)) 
        || (e.getItemDrop().equals(new ItemStack(Material.DIAMOND_SWORD)))
        || (e.getItemDrop().equals(new ItemStack(Material.IRON_SWORD)))
        || (e.getItemDrop().equals(new ItemStack(Material.TNT)))
        || (e.getItemDrop().equals(new ItemStack(Material.ARROW)))
        || (e.getItemDrop().equals(new ItemStack(Material.BOW)))
        || (e.getItemDrop().equals(new ItemStack(Material.WOOD_SWORD)))
        || (e.getItemDrop().equals(new ItemStack(Material.STONE_SWORD))))
        {
        e.setCancelled(true);
    }
}

主要(加载部分):

@Override
public void onEnable() {        
    System.out.println("Main plugin enabled");
    getCommand("pvp").setExecutor(new PvP(this));
    getCommand("instakiller").setExecutor(new InstaKiller(this));
    getCommand("wizard").setExecutor(new Wizard(this));
    getCommand("archer").setExecutor(new Archer(this));

    getServer().getPluginManager().registerEvents(new Listeners(this), this);
    getServer().getPluginManager().registerEvents(new PreventDropping(this), this);
}

遗憾的是,服务器只是忽略了我的第二个侦听器,并清除了所有掉落,而不是让 PreventDropping 中列出的物品无法掉落。怎么了?

其他问题:箭头错误,如评论中所述。

@EventHandler
public void onPlayerDropItem(PlayerDropItemEvent e) {
    if(e.getItemDrop().getItemStack().getType() == Material.DIAMOND_SWORD || 
    (e.getItemDrop().getItemStack().getType() == Material.IRON_SWORD)  ||
    (e.getItemDrop().getItemStack().getType() == Material.STONE_SWORD)  ||
    (e.getItemDrop().getItemStack().getType() == Material.WOOD_SWORD)  ||
    (e.getItemDrop().getItemStack().getType() == Material.TNT)  ||
    (e.getItemDrop().getItemStack().getType() == Material.BOW)  ||
    (e.getItemDrop().getItemStack().getType() == Material.ARROW)  ||
    (e.getItemDrop().getItemStack().getType() == Material.BLAZE_ROD)) {            
        e.setCancelled(true);
    } else {
        e.getItemDrop().remove();
    }
}

如果我没理解错的话,您想禁用掉落示例蘑菇汤的功能,并移除玩家试图掉落的所有其他物品。如果是这样,为什么要使用两个 PlayerDropItemEvent?此外,无需在每次要进行检查时都创建一个新的 ItemStack 对象,只需使用:

@EventHandler
public void onPlayerDropItem(PlayerDropItemEvent e) {
    if(event.getItemDrop().getItemStack().getType() == Material.MUSHROOM_SOUP)) 
       /* Your code here */
    {
        e.setCancelled(true);
    } else {
        e.getItemDrop().remove();
    }
}

如果物品是蘑菇汤,此代码将取消掉落事件,否则将移除掉落事件。

您的代码存在问题,无论如何,两个侦听器都会 运行。这意味着即使是蘑菇汤也会去除水滴。一个听众将覆盖另一个。