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

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

Discussion in 'Разработка плагинов для новичков' started by HunterGaming, Dec 9, 2016.

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

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

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

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

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

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

    Trophy Points:
    76
    Имя в Minecraft:
    NegaTiV
    Code:
            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 Активный участник Пользователь

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

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

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

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

    Trophy Points:
    173
    Skype:
    alexandr0116
    +1
    Code:
            HashSet<Player> hash = new HashSet<Player>();
            for(Player p : Bukkit.getOnlinePlayers()) {
                if(hash.contains(p)) {
                  
                } else {
                  
                }
            }
     
  8. GoodCoder

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

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

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

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

    Dereku Старожил

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

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

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Помоему просто broadcast нужно
     
  12. Dereku

    Dereku Старожил

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

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

    Trophy Points:
    76
    Skype:
    RomaMamkinHasker1337
    Имя в Minecraft:
    TheZefirrkka
    Вот с правами стафф чат
    Code:
         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 Старожил Пользователь

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

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

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

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

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

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

    Trophy Points:
    173
    Skype:
    alexandr0116
    Утечка памяти будет и на обычных String, если не чистить.
     
    Last edited: Dec 16, 2016
  18. Dereku

    Dereku Старожил

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

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

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

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

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

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

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

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

Share This Page