Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Как из HashMap вытащить всех игроков которые там есть?

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

  1. Автор темы
    HunterGaming

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

    Баллы:
    46
    Имя в Minecraft:
    HunterGaming13
    Мне нужно чтобы у кого в HashMap<String, Boolean> было true, тому сообщение отправлялось с префиксом [Чат-Персонала] Имя игрок : Сообщение. А тех у кого в HashMap false, тем писались обычные сообщение от игроков
     
  2. Хостинг MineCraft
    <
  3. slavik123123123

    slavik123123123 Старожил Пользователь

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    for (String a : hashmap.keySet()){
    if (hashmap.get(a)) {
    //do something
    }}
     
  4. Bohdan_Hrytsak

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

    Баллы:
    76
    Имя в Minecraft:
    NegaTiV
    Код:
            HashMap<String, Boolean> hash = new HashMap<String,Boolean>();
            for(String key : hash.keySet()){
                if(hash.get(key)){
                    player.sendmessage(prefix + player.getDisplayName() + ":"+ msg);
                }
                else{
                    player.sendmessage(player.getDisplayName() + ":"+ msg);
                  
                }
            }
    
     
  5. GoodCoder

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

    Баллы:
    76
    Зачем тебе Map? Можно обойтись HashSet добавляя в него только тех игроков, для которых нужен префикс. Map нужен, если тебе нужно хранить больше состояний.
     
  6. Dymeth

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

    Баллы:
    76
    Код:
    for(Map.Entry<String, Boolean> entry : hashMap.entrySet()) {
        if(entry.getValue) {
            String playerName = entry.getKey();
            ...
        }
    }
    А вообще человек выше прав. Если это возможно, лучше просто не добавлять игроков в список. При этом HashMap можно будет заменить на HashSet...
     
  7. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    +1
    Код:
            HashSet<Player> hash = new HashSet<Player>();
            for(Player p : Bukkit.getOnlinePlayers()) {
                if(hash.contains(p)) {
                  
                } else {
                  
                }
            }
     
  8. GoodCoder

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

    Баллы:
    76
    -1 за хранение ссылок на игроков.
     
  9. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Причем тут ссылки на игроков?
     
  10. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Уже не раз обсуждалось это. Хранить ссылки на локации, миры и игроков не есть хорошо.

    Можно просто обойтись правами. Баккитовскими. И потом Bukkit.broadcast("You are now op!", "special.permission.for.nerds");
     
    Последнее редактирование: 15 дек 2016
  11. slavik123123123

    slavik123123123 Старожил Пользователь

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Помоему просто broadcast нужно
     
  12. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Да, broadcast(String message, String permission).
     
  13. TheZefirrkka

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

    Баллы:
    76
    Skype:
    RomaMamkinHasker1337
    Имя в Minecraft:
    TheZefirrkka
    Вот с правами стафф чат
    Код:
         if ((command.getName().equalsIgnoreCase("staffchat")) &&
           (p.hasPermission("staff.chat"))) {
           if (args.length == 0) {
              sender.sendMessage("Мало аргументов!");
             return false;
           }
           StringBuilder str = new StringBuilder();
           for (int i = 0; i < args.length; i++) {
             str.append(args[I] + " ");
           }
           String msg = str.toString();
           for (Player player : Bukkit.getOnlinePlayers()) {
             if (player.hasPermission("staff.chat")) {
               player.sendMessage(ChatColor.DARK_GRAY + "[" + ChatColor.YELLOW + "Персонал" + ChatColor.DARK_GRAY + "] " + p.getDisplayName() + ChatColor.YELLOW + ": " + msg);
             }
           }
         }
     
  14. slavik123123123

    slavik123123123 Старожил Пользователь

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Можно тупо Bukkit.broadcast(msg, "perm")
     
  15. gamerforEA

    gamerforEA Старожил Пользователь

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    Код:
    Set<Player> set = Collections.newSetFromMap(new WeakHashMap<>());
    Иногда это необходимо, так как частое использование getPlayer(UUID) - дорогое удовольствие при большом количестве игроков.
     
  16. GoodCoder

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

    Баллы:
    76
    Сборщик мусора не сможет очищать объекты вышедших игроков, из-за того что ссылки на них висят в коллекции. Также после перезахода для игрока создаётся новый объект.
     
  17. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Утечка памяти будет и на обычных String, если не чистить.
     
    Последнее редактирование: 16 дек 2016
  18. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    При более 250 игроков - да, уже дороговато.
     
  19. GoodCoder

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

    Баллы:
    76
    Весит значительно меньше, нежели объект игрока со многими свойствами.

    Для HashSet/Map это ничто. Они и с 5К элементов хорошо работать будут.
     
  20. slavik123123123

    slavik123123123 Старожил Пользователь

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Uuid, либо ники хранить то можно. Но если получать через них постоянно игрока, то это может очень плохо кончиться для сервера.
     
  21. gamerforEA

    gamerforEA Старожил Пользователь

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    Вот только getPlayer(UUID) дёргает не HashMap.get(Object), а getOnlinePlayers(), который каждый раз создаёт копию коллекции с игроками. Скорее всего, в последних версиях это исправлено, но на 1.7.10 у одного из моих клиентов getPlayer(UUID) отъедал около 20% CPU.
    Так что в критичных участках WeakReference/WeakHashMap и прослушивание PlayerQuitEvent - наше всё.
     

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