1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Hashmap и onPlayerJoinEvent

Тема в разделе "Разработка плагинов для новичков", создана пользователем HolyGolf, 3 окт 2020.

Метки:
Статус темы:
Закрыта.
  1. Автор темы
    HolyGolf

    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;
    }
    }
     
  2. zabelov

    zabelov Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    Zabelov
    Ниче не понял. Покажи код
     
  3. Автор темы
    HolyGolf

    HolyGolf Активный участник

    Баллы:
    61
    Имя в Minecraft:
    Lammuit
    Код под спойлером
     
  4. zabelov

    zabelov Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    Zabelov
    Начнем с того, что зачем ты хранишь UUID стенда, когда можно хранить сам стенд?

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

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

    LOVEC3327 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    LOVEC3327
    Сделай мапу статической
     
  6. Автор темы
    HolyGolf

    HolyGolf Активный участник

    Баллы:
    61
    Имя в Minecraft:
    Lammuit
    Спасибо!!! Сделал мапу статической, сменил UUID стенда на сам стенд и поменял фукнцию делита. Теперь всё летает как надо :))))
     
Статус темы:
Закрыта.

Поделиться этой страницей