[英]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.