1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

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

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

    Lairon1 Новичок Пользователь

    Баллы:
    21
    Имя в Minecraft:
    Lairon1
    Я новичок в написании плагинов. Мне нужна помощь как мне определить ближайшего игрока?
    Я создаю предмет при активации которого игрока который активировал предмет будет телепортировать к ближайшему игроку, но как определить ближайшего я не знаю.
     
  2. Aquinary

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

    Баллы:
    66
    Имя в Minecraft:
    Aquinary
    Это не "я новичок в написании плагинов". Это банальное "я не хочу думать головой".
    У тебя есть две точки, между ними надо определить расстояние:
    upload_2021-4-16_19-43-24.png
    Пройтись по всем игрокам, занося в ассоциативный массив расстояние между ними и их координаты. Потом берёшь элемент с минимальным расстоянием и работаешь с записанными координатами там.
    Всё же просто.
     
  3. Aquinary

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

    Баллы:
    66
    Имя в Minecraft:
    Aquinary
    Это не то. Это вернёт ближайших всех игроков в определённом радиусе, а не конкретного.
    upload_2021-4-16_19-52-10.png
    Если использовать getNearbyEntities с радиусом в 100 блоков, то мы получим всех 3 игроков. Хотя по факту ближайший - 3. Именно поэтому надо считать по формуле. При этом мы ТОЧНО можем получить координаты всех игроков сразу и использовать их в расчёте.
     
    Последнее редактирование: 16 апр 2021
  4. Aquinary

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

    Баллы:
    66
    Имя в Minecraft:
    Aquinary
    С каких пор нельзя сделать для любого игрока getPlayer().getLocation()?
    Что что, а получить координаты всех игроков на сервере - это самое простое, что может быть.
     
  5. Автор темы
    Lairon1

    Lairon1 Новичок Пользователь

    Баллы:
    21
    Имя в Minecraft:
    Lairon1
    ниче что если считать каждого игрока на сервере то это - серв ибо игроков может быть большое кол.во)
     
  6. Aquinary

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

    Баллы:
    66
    Имя в Minecraft:
    Aquinary
    От того, что ты циклом пройдёшь по всем игрокам в мире серверу плохо не станет) Плагины, которые обычно ставят на серваке ТАКОЕ творят, что это - ерунда по сравнению с этим.
    Надеюсь, не будешь переживать, что в формуле нужно вычислять корень, ведь это тоже затратная операция типо как. Для компов 1950 года.
     
  7. Автор темы
    Lairon1

    Lairon1 Новичок Пользователь

    Баллы:
    21
    Имя в Minecraft:
    Lairon1
    хорошо тогда вопрос. как определить координаты игрока, свои координаты я нахожу через
    org.bukkit.Location l = p.getLocation();
    ((Entity) p).getLocation();
     
  8. Veyn12

    Veyn12 Активный участник Пользователь Заблокирован

    Баллы:
    76
    Имя в Minecraft:
    Veynique
    Тебе знакомо, что вообще такое «цикл»?:lol:
     
  9. alexandrage

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

    Баллы:
    173
    Код:
        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, дропа с мобами вокруг игрока может быть больше онлайна на сервере.
     
    Последнее редактирование: 17 апр 2021
  10. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Втф? Мало того, что сломается на первом же игроке из другого мира, так и производительность жуткая.
     
  11. Aquinary

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

    Баллы:
    66
    Имя в Minecraft:
    Aquinary
    Ну так предложи свой вариант. Вон чел постарался, даже код написал) Мне вот лень было, а он взял - и написал, да и упростил мою задумку
     
  12. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    С "жутью" утрировал, но к'мон, можно же лучше. Каждый раз создаем новые элементы в мапу, потом ищем в ней минимум - это можно и сразу всё сделать, без мапы; дистанцию можно и квадратную брать, до этого нам нет дела; 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;
    }
     

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