Помогите Hashmap и onPlayerJoinEvent

Статус
Закрыто для дальнейших ответов.

HolyGolf

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

Как сделать так, чтобы при входе всё нормально заносилось в HashMap?

Код:
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;
}
}
 
Ниче не понял. Покажи код
 
Начнем с того, что зачем ты хранишь UUID стенда, когда можно хранить сам стенд?

Код удаления можно написать так:
Код:
public void unhide(Player player) {
    ArmorStand stand = hide.remove(player.getUniqueId());
    if ( stand != null) stand.remove();
}

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

Как сделать так, чтобы при входе всё нормально заносилось в HashMap?

Код:
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;
}
}
Сделай мапу статической
 
Начнем с того, что зачем ты хранишь UUID стенда, когда можно хранить сам стенд?

Код удаления можно написать так:
Код:
public void unhide(Player player) {
    ArmorStand stand = hide.remove(player.getUniqueId());
    if ( stand != null) stand.remove();
}

Что-то мне подсказывает, что нужно делать не PlayerJoinEvent, а PlayerSpawnLocationEvent

Сделай мапу статической

Спасибо!!! Сделал мапу статической, сменил UUID стенда на сам стенд и поменял фукнцию делита. Теперь всё летает как надо :))))
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх