2016-11-20 51 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