繁体   English   中英

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

[英]How to get the name of an item for an event (minecraft plugin)

我已经设法对所有内容进行编码并自行调试所有内容,这是一项成就,除了一件事之外,其他一切都很好。

我需要帮助弄清楚如何检查项目的名称,如果该项目具有该特定名称,则该事件将发生。 我正在尝试检查鸡蛋是否具有特定的暴民名称,例如爬行者或蜘蛛,如果是这样,则暴民会从鸡蛋中产卵。 (我知道他们为此准备了暴徒蛋,但我正在弄乱我的能力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的名称设置为“ Creeper”,但随后在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来检索鸡蛋的ItemStack,由于if语句,只有在玩家右键单击(扔鸡蛋)时才调用此事件。 然后,我将ItemStack放入一个可在PlayerEggThrowEvent中使用的哈希图中。 当我们拥有ItemStack时,我们可以比较名称。

另一个解决方案是取消将卵产卵时调用的任何事件,并为其指定一个自定义名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM