Как взять ближайшего игрока?

  • Автор темы Автор темы Lairon1
  • Дата начала Дата начала

Lairon1

Новичок
Пользователь
Баллы
21
Имя в Minecraft
Lairon1
Я новичок в написании плагинов. Мне нужна помощь как мне определить ближайшего игрока?
Я создаю предмет при активации которого игрока который активировал предмет будет телепортировать к ближайшему игроку, но как определить ближайшего я не знаю.
 
Это не "я новичок в написании плагинов". Это банальное "я не хочу думать головой".
У тебя есть две точки, между ними надо определить расстояние:
upload_2021-4-16_19-43-24.png
Пройтись по всем игрокам, занося в ассоциативный массив расстояние между ними и их координаты. Потом берёшь элемент с минимальным расстоянием и работаешь с записанными координатами там.
Всё же просто.
 
PHP:
p.getNearbyEntities(0, 0, 0);
Это не то. Это вернёт ближайших всех игроков в определённом радиусе, а не конкретного.
upload_2021-4-16_19-52-10.png
Если использовать getNearbyEntities с радиусом в 100 блоков, то мы получим всех 3 игроков. Хотя по факту ближайший - 3. Именно поэтому надо считать по формуле. При этом мы ТОЧНО можем получить координаты всех игроков сразу и использовать их в расчёте.
 
Последнее редактирование:
Ему нужно подобрать игрока, который рядом с ним, следовательно вторая точка ему неизвестна =)
С каких пор нельзя сделать для любого игрока getPlayer().getLocation()?
Что что, а получить координаты всех игроков на сервере - это самое простое, что может быть.
 
Это не то. Это вернёт ближайших всех игроков в определённом радиусе, а не конкретного.
Посмотреть вложение 59220
Если использовать getNearbyEntities с радиусом в 100 блоков, то мы получим всех 3 игроков. Хотя по факту ближайший - 3. Именно поэтому надо считать по формуле. При этом мы ТОЧНО можем получить координаты всех игроков сразу и использовать их в расчёте.
ниче что если считать каждого игрока на сервере то это - серв ибо игроков может быть большое кол.во)
 
ниче что если считать каждого игрока на сервере то это - серв ибо игроков может быть большое кол.во)
От того, что ты циклом пройдёшь по всем игрокам в мире серверу плохо не станет) Плагины, которые обычно ставят на серваке ТАКОЕ творят, что это - ерунда по сравнению с этим.
Надеюсь, не будешь переживать, что в формуле нужно вычислять корень, ведь это тоже затратная операция типо как. Для компов 1950 года.
 
От того, что ты циклом пройдёшь по всем игрокам в мире серверу плохо не станет) Плагины, которые обычно ставят на серваке ТАКОЕ творят, что это - ерунда по сравнению с этим.
Надеюсь, не будешь переживать, что в формуле нужно вычислять корень, ведь это тоже затратная операция типо как. Для компов 1950 года.
хорошо тогда вопрос. как определить координаты игрока, свои координаты я нахожу через
org.bukkit.Location l = p.getLocation();
((Entity) p).getLocation();
 
хорошо тогда вопрос. как определить координаты игрока, свои координаты я нахожу через
org.bukkit.Location l = p.getLocation();
((Entity) p).getLocation();
Тебе знакомо, что вообще такое «цикл»?:lol:
 
Код:
    public Player get(Player player) {
        Map<Double, Player> map = new HashMap<Double, Player>();
        player.getWorld().getPlayers().forEach(p -> {
            if (player != p) {
                map.put(p.getLocation().distanceSquared(player.getLocation()), p);
            }
        });
        Double min = Collections.min(map.keySet());
        map.get(min);
        return map.get(min);
    }
Только не затирайте тему про getNearbyEntities, дропа с мобами вокруг игрока может быть больше онлайна на сервере.
 
Последнее редактирование:
Код:
    public Player get(Player player) {
        Map<Double, Player> map = new HashMap<Double, Player>();
        Bukkit.getOnlinePlayers().forEach(p -> {
            if (player != p) {
                map.put(p.getLocation().distance(player.getLocation()), p);
            }
        });
        Double min = Collections.min(map.keySet());
        map.get(min);
        return map.get(min);
    }
Втф? Мало того, что сломается на первом же игроке из другого мира, так и производительность жуткая.
 
Втф? Мало того, что сломается на первом же игроке из другого мира, так и производительность жуткая.
Ну так предложи свой вариант. Вон чел постарался, даже код написал) Мне вот лень было, а он взял - и написал, да и упростил мою задумку
 
В каком месте она жуткая, обоснуй?
С "жутью" утрировал, но к'мон, можно же лучше. Каждый раз создаем новые элементы в мапу, потом ищем в ней минимум - это можно и сразу всё сделать, без мапы; дистанцию можно и квадратную брать, до этого нам нет дела; forEach/for-each дело споров, но когда его можно не использовать без помех для восприятия, лучше использовать обычный for-each - производительности не добавит, но есть случаи, где оно выиграет; локацию лучше взять единожды, ибо она клонируется - мелочь, но неприятно.
Ну так предложи свой вариант. Вон чел постарался, даже код написал) Мне вот лень было, а он взял - и написал, да и упростил мою задумку
Да здесь предлагать то нечего, всё сказано, просто я бы делал немного иначе. А-ля
PHP:
public Player getClosestPlayer(Player player) {
    Location loc = player.getLocation();
    Player closestPlayer;
    double closestDistance = Double.MAX_VALUE;
    for (Player checked : player.getWorld().getPlayers()) {
        if (checked != player) {
            double distance = loc.distanceSquared(checked.getLocation());
            if (closestDistance > distance) {
                closestPlayer = checked;
                closestDistance = distance;
            }
        }
    }
    return closestPlayer;
}
 
Назад
Верх