如何获取事件的项目名称(Minecraft插件)



我已经设法编码所有内容并独自审议所有内容,这是一项成就,除了一件事外,所有东西。

我需要帮助弄清楚如何检查项目名称以及该项目具有该特定名称,那么事件将发生。我正在尝试检查鸡蛋是否具有特定的暴民名称,例如爬行者或蜘蛛,如果是,那个暴民会从鸡蛋中产生。(我知道他们为此有暴民鸡蛋,但我正在弄乱我的能力ATM。)

这是命令的代码:

public class EggCommands implements CommandExecutor {
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        Player player = (Player) sender;
        if (cmd.getName().equalsIgnoreCase("egg") && sender instanceof Player) {
            if (args.length == 0) {
                player.sendMessage("Usage: /egg <mob>");
                return true;
            }
            if (args[0].equals("creeper")) {
                if (player.getInventory().getSize() == -1) {
                    player.sendMessage(ChatColor.DARK_RED + "You're inventory is full");
                    return true;
                } else {
                    ItemStack item = new ItemStack(Material.EGG, 1);
                    ItemMeta meta = item.getItemMeta();
                    meta.setDisplayName(ChatColor.DARK_GREEN + "Creeper");
                    ArrayList<String> lore = new ArrayList<String>();
                    lore.add(ChatColor.RED + "Spawns A Charged Creeper With Lightning Effect");
                    meta.setLore(lore);
                    item.setItemMeta(meta);
                    player.getInventory().addItem(item);
                    return true;
                }
            }
        }
        return true;
    }
}

这是事件侦听器的代码:

public class EggListener implements Listener {
public EggListener(EggMain plugin) {
    plugin.getServer().getPluginManager().registerEvents(this, plugin);
        }
        @EventHandler
        public void Eggs(PlayerEggThrowEvent e) {
            if (e.getEgg().getCustomName().equals(ChatColor.DARK_GREEN + "Creeper")) {
                    e.setHatchingType(EntityType.CREEPER);
                    e.setNumHatches((byte) 1);
                    e.setHatching(true);
        }
    }
}

您代码无法正常工作的原因是您要比较两个不同的名称。您将ItemStack的名称设置为"爬行者",但是在PlayerEggThrowEvent中,您检查了鸡蛋的名称是否与ItemStack相同,但事实并非如此。鸡蛋是一个实体,其名称与僵尸或玩家的头上的名字一样,与项目堆栈不同。除非您设置一个鸡蛋,否则没有名字。

我尝试了一段时间,并提出了这种结构,它不起作用,但可能会给您一个启动:

private HashMap<UUID, ItemStack> eggThrown = new HashMap<UUID, ItemStack>();
@EventHandler
public void eggthrown(PlayerEggThrowEvent event) {
    if(eggThrown.containsKey(event.getPlayer().getUniqueId())) {
        ItemStack egg = eggThrown.get(event.getPlayer().getUniqueId());
    }
}
@EventHandler(priority = EventPriority.HIGHEST)
public void storeEgg(PlayerInteractEvent event) {
    if(event.getAction().equals(Action.RIGHT_CLICK_AIR) || event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) {
        if(event.hasItem() && event.getItem().getType().equals(Material.EGG)) {
            eggThrown.put(event.getPlayer().getUniqueId(), event.getItem());
        }
    }
}

我要做的是使用playerInteractevent检索鸡蛋的项目堆栈,此事件仅在播放器右键单击(扔鸡蛋)时才称为IF语句。然后,我将ItemStack放入可以在Playereggthrowevent中使用的hashmap。当我们有项目斑时,我们可以比较名称。

另一个解决方案是取消鸡蛋催生到世界并给它一个自定义名称的任何事件。

相关内容

  • 没有找到相关文章