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

时间:2017-11-30 21:10:22

标签: java events event-handling

我已经设法编写所有内容并自行调试所有内容,这是一项成就,除了一件事之外的一切......

我需要帮助弄清楚如何检查项目的名称以及项目是否具有该特定名称,然后事件将发生。我正试图检查鸡蛋是否有特定的暴民名称,如爬行动物或蜘蛛,如果是这样,那些暴徒会从卵子中产卵。 (我知道他们有暴民蛋,但我正在搞乱我的能力。)

以下是该命令的代码:

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

1 个答案:

答案 0 :(得分:0)

您的代码无法工作的原因是您要比较两个不同的名称。您将ItemStack的名称设置为&#34; Creeper&#34;,然后在PlayerEggThrowEvent中检查Egg的名称是否与ItemStack相同,则不是。 鸡蛋是一个实体,它的名称与僵尸的名称标签或玩家的头部相同,与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来检索egg的ItemStack,只有当玩家右键点击(抛出一个蛋)时才会调用此事件,这要归功于if语句。然后我将ItemStack放入我们可以在PlayerEggThrowEvent中使用的hashmap。当我们有ItemStack时,我们可以比较名称。

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