2016-11-20 60 views
1

我想要移除玩家放弃某些物品的能力,同时移除除了我想取消的那些物品之外的所有物品,例如:玩家不能放下一把剑,但是当他放下一个蘑菇汤的空碗时,清理掉。我在主类上注册了两个监听器类。bukkit - 防摔预防不起作用?

听众:

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

PreventDropping:

@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); 
    } 
} 

主要(的onLoad部分):

@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中列出的itens。哪里不对?

附加问题:箭头错误,如评论中所述。

@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(); 
    } 
} 

回答

1

如果我理解你的权利,你需要禁用功能减退比如蘑菇汤,然后取出一个球员试图放弃所有其他项目。如果是这样,为什么使用两个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(); 
    } 
} 

这段代码,如果该项目是一个蘑菇汤取消drop事件,否则将删除该降。

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

+0

谢谢!有效。 – MucaP

+0

箭头怎么样?当我放弃它们时,它们会自我复制,当我达到64时,它们就消失了@Squiddie – MucaP

+0

使用OR ||像你在你的代码中完成的那样。 if(event.getItemDrop()。getItemStack()。getType()== Material.MUSHROOM_SOUP)|| event.getItemDrop()。getItemStack()。getType()== Material.ARROW'等 – Squiddie