gpt4 book ai didi

java - bukkit - 跌落预防不起作用?

转载 作者:行者123 更新时间:2023-11-30 07:02:20 25 4
gpt4 key购买 nike

我想删除玩家掉落某些元素的能力,同时删除除我想要取消的元素之外的所有掉落,例如:玩家不能掉落剑,但当他掉落蘑菇汤空碗时,然后清洁水滴。我在主类上注册了两个监听器类。

听众:

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

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

遗憾的是,服务器只是忽略了我的第二个监听器,并清除了所有 drop,而不是使其无法删除 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();
}
}

最佳答案

如果我理解正确的话,您想要禁用掉落示例蘑菇汤的功能,并删除玩家尝试掉落的所有其他元素。如果是这样,为什么要使用两个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();
}
}

如果该元素是蘑菇汤,此代码将取消掉落事件,否则它将删除掉落事件。

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

关于java - bukkit - 跌落预防不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40707539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com