Вопрос Hashmap и onPlayerJoinEvent

HolyGolf

Пользователь
Сообщения
3
При подключении игрока к серверу - срабатывает ивент и создаётся стойка, но почему-то (как я понял) ничего не вносится в HashMap, следовательно не реагирует на команду "/hnames off" (функция unhiding) и при команде "/hnames on" (функция hiding) создаётся вторая стойка, которая реагирует на все команды и ивенты, т.к. она заносится в HashMap.

Java:
public class commands implements Listener, CommandExecutor {

private HideNickNames plugin = HideNickNames.getPlugin(HideNickNames.class);

public HashMap<UUID, UUID> hide = new HashMap<>();
public Boolean plugin_enable = plugin.getConfig().getBoolean("Hide_NameTags", true);

public void hiding(Player player){ /*Добавление стойки*/
    UUID plr = player.getUniqueId();
    if (!hide.containsKey(plr)) {
        ArmorStand stand = player.getWorld().spawn(new Location(player.getWorld(), 5, 5, 5), ArmorStand.class);
        stand.setVisible(true);
        stand.setGravity(false);
        stand.setInvulnerable(true);
        stand.setMarker(true);
        stand.setSmall(true);
        stand.setCustomNameVisible(false);
        player.addPassenger(stand);
        hide.put(plr, stand.getUniqueId());
    }
}

public void unhiding(Player player) { /*Включение ников (удаление стойки)*/
    UUID plr = player.getUniqueId();
    if (hide.containsKey(plr)) {
        for (World w : getServer().getWorlds()) {
            for (Entity entity : w.getEntities()) {
                if (entity.getUniqueId().equals(hide.get(plr))) {
                    entity.remove();
                    hide.remove(plr);
                    break;
                }
            }
        }
    }
}

public void check(Player player) { /*Проверка и действие*/
    String world = player.getWorld().getName();
    if (plugin.getConfig().getBoolean("Hide_NameTags", true) && plugin.getConfig().getStringList("Enabled_Worlds").contains(world)) {
        if (!plugin_enable) { /*Отображение ников при входе*/
            unhiding(player);
        } else { /*Скрытие ников при входе*/
            hiding(player);
        }
    }
}

/*-----------------------------------------------------------------------------*/
/*Проверка при входе человека и тыкание на людей (Можно и в людей, без разницы)*/
/*Проверка при смене мира, выходе с сервера, а так же смерти.*/
/*-----------------------------------------------------------------------------*/

@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
    Player p = event.getPlayer();
    unhiding(p);
}

@EventHandler
public void onPlayerRespawn(PlayerRespawnEvent event) {
    Player p = event.getPlayer();
    unhiding(p);
    if (!hide.containsKey(p.getUniqueId())) {
        check(p);
    }
}

@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
    Player p = event.getPlayer();
    check(p);
}

@EventHandler
public void PlayerChangedWorldEvent(PlayerChangedWorldEvent event){
    if(!(event.getFrom() == event.getPlayer().getWorld())) {
        Player p = event.getPlayer();
        unhiding(p);
        if (!hide.containsKey(p.getUniqueId())) {
            check(p);
        }
    }
}

/*--------*/
/*Команды*/
/*--------*/

@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {

    if (args.length == 0) /*Если нет аргументов*/ {
        sender.sendMessage(ChatColor.YELLOW + "" + ChatColor.BOLD + "HideNickName\n------{\n" + ChatColor.AQUA + "" + ChatColor.BOLD + "/HNames [on/off]\n" + ChatColor.YELLOW + "" + ChatColor.BOLD + "}------"); /*Отображение списка команд в чате*/
        return true;
    } else if (sender.hasPermission("HideNicknames.switching") || sender.isOp()) /*Проверка на права*/ {
        if (cmd.getName().equalsIgnoreCase("hnames") && sender instanceof Player) /*Проверка на консоль*/ {
            if (args[0].equals("on")) /*Команда выключения ников*/ {
                    sender.sendMessage(ChatColor.YELLOW + "HideNickNames plugin turns on...");
                    plugin_enable = true;
                    for (Player online : Bukkit.getOnlinePlayers()) {
                        String world = online.getWorld().getName();
                        if (plugin.getConfig().getStringList("Enabled_Worlds").contains(world)) {
                            hiding(online);
                    }
                }
                return true;
            } else if (args[0].equals("off")) /*Команда включения ников*/ {
                    sender.sendMessage(ChatColor.YELLOW + "HideNickNames plugin turns off...");
                    plugin_enable = false;
                    for (Player online : Bukkit.getOnlinePlayers()) {
                        unhiding(online);
                    }
            } else {
                sender.sendMessage(ChatColor.YELLOW + "What?!"); /*Неверный аргумент*/
            }
        } else {
            sender.sendMessage(ChatColor.RED + "HideNickNames: Only players can use this commands!");
            /*Если команда активирована с консоли*/
            return true;
        }
    } else {
        sender.sendMessage(ChatColor.RED + plugin.getConfig().getString("NoPermissionsMessage"));
        return true;
    }
    return true;
}
}
 
Java:
public void unhiding(Player player) { /*Включение ников (удаление стойки)*/
    UUID plr = player.getUniqueId();
    if (hide.containsKey(plr)) {
        for (World w : getServer().getWorlds()) {
            for (Entity entity : w.getEntities()) {
                if (entity.getUniqueId().equals(hide.get(plr))) {
                    entity.remove();
                    hide.remove(plr);
                    break;
                }
            }
        }
    }
}
Не очень понимаю, что ты делаешь.
Если у тебя мапа хранит значение "ид игрока" <=> "ид стэнда", то вот, аналогично:
Java:
public void unHide(Player player) {
    UUID playerUid = player.getUniqueId();
    UUID armorStandUid = hide.get(playerUid);
    Entity armorStand = player.getWorld().getEntity(armorStandUid);
    // можешь попробовать так
    LivingEntity l = (LivingEntity) armorStand;
    l.damage(l.getHealth() + 25);
   hide.remove(playerUid);
}
Правда у меня это 1.16.3, возможно на старых версиях нельзя получать существо по UUID.
 
Последнее редактирование:
q20w26a, Я там делал перебор по мирам, а затем перебор энтити с последующим удалением того, у кого такой-же ID как и в HashMap. У меня тоже версия spigot 1.16.3.

IDE (Intellij idea) жалуется на
Java:
Entity armorStand = player.getWorld().getEntity(armorStandUid);
Cannot resolve method 'getEntity' in 'World'
Авто объединение сообщений:

:mc_e_2:Нашёл решение.
 
Последнее редактирование:
Назад
Сверху Снизу