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();
}
}
如果物品是蘑菇汤,此代码将取消掉落事件,否则将移除掉落事件。
您的代码存在问题,无论如何,两个侦听器都会 运行。这意味着即使是蘑菇汤也会去除水滴。一个听众将覆盖另一个。
我想移除玩家掉落某些物品的能力,同时移除除了我想取消的那些之外的所有掉落,例如:玩家不能掉落一把剑,但是当他掉落蘑菇汤时是空的碗,然后清洁水滴。我在主 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();
}
}
如果物品是蘑菇汤,此代码将取消掉落事件,否则将移除掉落事件。
您的代码存在问题,无论如何,两个侦听器都会 运行。这意味着即使是蘑菇汤也会去除水滴。一个听众将覆盖另一个。