- Баллы
- 36
- Имя в Minecraft
- detamusi18429
Нужно при вводе команды получить в массив всех игроков в округе
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
На переменную ent ругаетсяГде x, y, z - что-то типа радиуса.PHP:List<Player> players = player.getNearbyEntities(x, y, z).stream().filter(ent -> ent.getType() == EntityType.PLAYER).map(ent -> (Player) ent).collect(Collectors.toList());
if (args[0].equalsIgnoreCase("near")) {
Player p = (Player)sender;
Player ent;
List<Player> players = p.getNearbyEntities(p.getLocation().getBlockX(), p.getLocation().getBlockY(), p.getLocation().getBlockZ()).stream().filter(ent -> ent.getType() == EntityType.PLAYER).map(ent -> (Player) ent).collect(Collectors.toList());
sender.sendMessage("§fNear: " + players);
return true;
}
List<Player> players = new ArrayList<>();
for (Entity entity : player.getNearbyEntities(x, y, z)) {
if (entity.getType() == EntityType.PLAYER) {
players.add(((Player) entity));
}
}
вроде как команда /near это уже делает, игроки в 200 метрах от тебя.
Мне нужно взаимодействовать в этими игрокамивроде как команда /near это уже делает, игроки в 200 метрах от тебя.
ПомоглоНе знаю чё у тебя там, но код рабочий.
На попробуй по проще:
PHP:List<Player> players = new ArrayList<>(); for (Entity entity : player.getNearbyEntities(x, y, z)) { if (entity.getType() == EntityType.PLAYER) { players.add(((Player) entity)); } }
Нужно отрефакторить, правильное решение такое:Помогло
for (Player p : Bukkit.getOnlinePlayers()) {
if (p.getLocation().distance(ent.getLocation(radius))) {
// Ваши действия
}
}
Iterator<Entity> entity = ent.getWorld().getEntitiesByClasses(new Class[] { Zombie.class /* И другие сущности через запятую, если они нам нужны */ }).iterator();
while (entity.hasNext()) {
// Проверка на дистанцию, тип сущности (если их в выборке несколько) и сам код. Например у меня только зомби и поэтому я сразу пишу код:
// Zombie z = (Zombie) entity.next();
// ...
}
Ну ок:Нужно отрефакторить, правильное решение такое:
Код:for (Player p : Bukkit.getOnlinePlayers()) { if (p.getLocation().distance(ent.getLocation(radius))) { // Ваши действия } }
Потому что предложенный ребятами выше метод перебирает ВСЕХ сущностей (мобов, предметов на земле, стрел и т.д., в том числе и игроков), затем сравнивает расстояние КАЖДОЙ, и вы еще делаете проверку на то, игрок ли это.
Нужно брать сразу игроков. А не все сущности, тратить ресурсы на рассчитывание расстояния каждого и только потом отлавливать нужных среди них.
Получается трата ресурсов ни на что. Высчитать кучу дистанций для сотен мобов, дропа, стрел и т.д. Это затратно. Из тысячей сущностей вы итоге возьмете ~10 (именно игроков и именно в радиусе). Какие потери!
Есть решение похуже моего, но уже лучше всех тех, что тут были предложены ранее:
Он хорош для взятия сугубо конкретных сущностей, например только зомби (только забыл в начале сделать проверку на дистанцию, возьмите из первого - оптимального варианта)Код:Iterator<Entity> entity = ent.getWorld().getEntitiesByClasses(new Class[] { Zombie.class /* И другие сущности через запятую, если они нам нужны */ }).iterator(); while (entity.hasNext()) { // Проверка на дистанцию, тип сущности (если их в выборке несколько) и сам код. Например у меня только зомби и поэтому я сразу пишу код: // Zombie z = (Zombie) entity.next(); // ... }
@Enotik050505 @Exception_Prototype @Slavkaa, лучше сотрите свои ответы, чтобы не вводить никого в заблуждение. @alexandrage пусть просто посмотрит для себя
List<Player> players = Bukkit.getOnlinePlayers().stream().filter(player -> player.getLocation().distance(p.getLocation()) <= radius).collect(Collectors.toList());
Можешь, пожалуйста, объяснить что именно делает этот "if", а то слегка не очень понятно.Нужно отрефакторить, правильное решение такое:
Код:for (Player p : Bukkit.getOnlinePlayers()) { if (p.getLocation().distance(ent.getLocation(radius))) { // Ваши действия } }
Это тот, кто ввел команду, а p итерация из всех онлайн игроков.Можешь, пожалуйста, объяснить что именно делает этот "if", а то слегка не очень понятно.
Берётся локация каждого игрока и distance возвращает true, если полученная локация "ent" попадает в радиус?
А от куда ent брать? У меня это всё происходит при выполнении команды.
Можешь, пожалуйста, объяснить что именно делает этот "if", а то слегка не очень понятно.
Берётся локация каждого игрока и distance возвращает true, если полученная локация "ent" попадает в радиус?
А от куда ent брать? У меня это всё происходит при выполнении команды.
distance возвращает дистанцию в блокахdistance возвращает true
А от куда ent брать?
Это тот, кто ввел команду
List<String> playersList = new ArrayList<>(); // Это лист, в котором будут храниться твои игроки.
Location location = player.getLocation // Локация. Сейчас это допустим локация игрока.
int radius = 200; // Это твой радиус.
for(Entity entity : location.getWorld().getNearbyEntities(location, radius, radius, radius)) { // С помощью цикла мы в определенной локации ищем всех существ на расстоянии 200 блоков.
if(entity == EntityType.PLAYER) playersList.add(entity.getName); // Проверяем, что существо является игроком и добавляем его в лист.
}
У меня не робитБоже, не мучайте парня:
Код:List<String> playersList = new ArrayList<>(); // Это лист, в котором будут храниться твои игроки. Location location = player.getLocation // Локация. Сейчас это допустим локация игрока. int radius = 200; // Это твой радиус. for(Entity entity : location.getWorld().getNearbyEntities(location, radius, radius, radius)) { // С помощью цикла мы в определенной локации ищем всех существ на расстоянии 200 блоков. if(entity == EntityType.PLAYER) playersList.add(entity.getName); // Проверяем, что существо является игроком и добавляем его в лист. }
Вариант не лучший, но рабочий.