- Баллы
- 96
- Имя в Minecraft
- sqdFendy
Мне нужно чтобы у кого в HashMap<String, Boolean> было true, тому сообщение отправлялось с префиксом [Чат-Персонала] Имя игрок : Сообщение. А тех у кого в HashMap false, тем писались обычные сообщение от игроков
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
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);
}
}
for(Map.Entry<String, Boolean> entry : hashMap.entrySet()) {
if(entry.getValue) {
String playerName = entry.getKey();
...
}
}
HashSet<Player> hash = new HashSet<Player>();
for(Player p : Bukkit.getOnlinePlayers()) {
if(hash.contains(p)) {
} else {
}
}
Причем тут ссылки на игроков?-1 за хранение ссылок на игроков.
Уже не раз обсуждалось это. Хранить ссылки на локации, миры и игроков не есть хорошо.Причем тут ссылки на игроков?
Можно просто обойтись правами. Баккитовскими. И потом Bukkit.broadcast("You are now op!", "special.permission.for.nerds");Зачем тебе Map? Можно обойтись HashSet добавляя в него только тех игроков, для которых нужен префикс.
Помоему просто broadcast нужноbroadcastMessage
Да, broadcast(String message, String permission).Помоему просто broadcast нужно
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);
}
}
}
Можно тупо Bukkit.broadcast(msg, "perm")
- 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);
- }
- }
Уже не раз обсуждалось это. Хранить ссылки на локации, миры и игроков не есть хорошо.
Set<Player> set = Collections.newSetFromMap(new WeakHashMap<>());
Утечка памяти будет и на обычных String, если не чистить.Сборщик мусора не сможет очищать объекты вышедших игроков, из-за того что ссылки на них висят в коллекции. Также после перезахода для игрока создаётся новый объект.
При более 250 игроков - да, уже дороговато.Иногда это необходимо, так как частое использование getPlayer(UUID) - дорогое удовольствие при большом количестве игроков.
Uuid, либо ники хранить то можно. Но если получать через них постоянно игрока, то это может очень плохо кончиться для сервера.Весит значительно меньше, нежели объект игрока со многими свойствами.
Для HashSet/Map это ничто. Они и с 5К элементов хорошо работать будут.
Вот только getPlayer(UUID) дёргает не HashMap.get(Object), а getOnlinePlayers(), который каждый раз создаёт копию коллекции с игроками. Скорее всего, в последних версиях это исправлено, но на 1.7.10 у одного из моих клиентов getPlayer(UUID) отъедал около 20% CPU.Для HashSet/Map это ничто. Они и с 5К элементов хорошо работать будут.
Ну давайте ещё раз обсудим... Я в таких обсуждениях ни разу не участвовал.Уже не раз обсуждалось это. Хранить ссылки на локации, миры и игроков не есть хорошо.
Сборщик мусора не сможет очищать объекты вышедших игроков, из-за того что ссылки на них висят в коллекции. Также после перезахода для игрока создаётся новый объект.
Я кстати тоже замечал. что getOnlinePlayers прожорливый.Вот только getPlayer(UUID) дёргает не HashMap.get(Object), а getOnlinePlayers(), который каждый раз создаёт копию коллекции с игроками. Скорее всего, в последних версиях это исправлено, но на 1.7.10 у одного из моих клиентов getPlayer(UUID) отъедал около 20% CPU.
Так что в критичных участках WeakReference/WeakHashMap и прослушивание PlayerQuitEvent - наше всё.
Ссылка на объект весит 4 байта. Новая строка - 20+ байт и опять же ссылка - ещё 4 = в сумме 24.Это ещё почему? Строка - это набор байт, а вот игрок - объект со множеством свойств и содержит ссылки на другие объекты...
Если уж прям так нужно хранить оффлайн-игроков, лучше для этого использовать отдельный список. Выше уже говорилось о том, что каждый раз получать игрока при помощи баккита - это не очень хорошо.Почему хранить ник/UUID? Позволяет сохранить привязку к игроку после перезахода (объект player новый создаётся) и не мешает сборщику мусора удалять вышедших игроков.
Потому что пока игрок онлайн, эта информация будет находиться в ядре в любом случае. Ты можешь в качестве ключа мапы хранить хоть String, хоть UUID, Player от этого весить меньше не будет.Почему вес объекта не учитываешь? Ссылка куда то же ссылается.