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

Помогите Постоянное отслеживание позиции игрока

Тема в разделе "Разработка плагинов для новичков", создана пользователем therimuru_, 27 июн 2024.

Статус темы:
Закрыта.
  1. Автор темы
    therimuru_

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

    Баллы:
    66
    Имя в Minecraft:
    therimuru_
    Приветствую! В одном из плагинов, который я пишу, у меня есть некая область (между координатами X и Z) в которой должен находиться игрок. Вопрос состоит в том, как наиболее хорошо постоянно проверять позицию игрока.

    В моей голове есть два варианта написания такого плагина:
    1. Использовать PlayerMoveEvent (или как он там называется), тоесть каждый раз когда игрок двигается проверять его позицию.
    2. Использовать шедулер, который раз в например 10 тиков будет проверять позицию ВСЕХ игроков.

    Какой вариант будет менее нагружать сервер?
    Если у Вас есть свои варианты и идеи, как это можно реализовать, пожалуйста, напишите мне их.
    Спасибо за помощ.
    paper-1.20.4

    UPD:
    Так-же хочу спросить, как наиболее граматно будет сохранить область координат, грубо говоря определенный невидимый куб в мире.
     
  2. BetterLex

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

    Баллы:
    76
    По сути, PlayerMoveEvent должен быть эффективнее, чем использование шедулера, потому что он будет срабатывать только в тот момент, когда игрок двигается, а шедулер будет постоянно проверять, даже если игрок стоит на месте. Для сохранения координат можешь использовать класс World и его методы, например, для получения чанка можешь использовать getChunkAt();, а для получения блока уже в этом чанке (позиции координат игрока) getBlock();
     
    Последнее редактирование: 27 июн 2024
  3. BetterLex

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

    Баллы:
    76
    Он же написал, как сохранить невидимый куб в мире. Лично я понял, что он имел ввиду чанк.
     
  4. alexandrage

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

    Баллы:
    173
    Куб сейвится 2мя координатами min и max
     
  5. Автор темы
    therimuru_

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

    Баллы:
    66
    Имя в Minecraft:
    therimuru_
    База-база.
     
  6. Автор темы
    therimuru_

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

    Баллы:
    66
    Имя в Minecraft:
    therimuru_
    Благодарю за ответ.
    Насколько сильно это будет нагружать сервер? WorldGuard как плагин на регионы использует этот ивент для проверки нахождения игрока в каком-либо регионе?
     
  7. alexandrage

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

    Баллы:
    173
    Зависит от реализации, оптимизацию придется делать однозначно, ведь этот ивент на каждый чих срабатывает, не только смена локации. Серверу явно не понравится, если будет проводиться итерация большого списка регионов 100500 раз за тик.
     
    Последнее редактирование: 27 июн 2024
  8. FeniksDEV

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

    Баллы:
    76
    Имя в Minecraft:
    Feniksovich
    PlayerMoveEvent вызывается даже если у игрока меняется yaw и pitch бошки. Половину таких вызовов можно отсекать сразу соответствующими проверками. Также можно не проверять позицию игрока, если он перемещается в рамках одного и того же блока – это в зависимости от того, для чего требуется отслеживание позиции в конечном счете.

    В Bukkit API также присутствует класс для хранения кубоидов BoundingBox, но его contains методы работают с граничными позициями особым образом – на случай, если будешь использовать его.
     
  9. Автор темы
    therimuru_

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

    Баллы:
    66
    Имя в Minecraft:
    therimuru_
    А вот это интерестно. Как я могу реализовать проверку, сменилась ли координата на которой стоит игрок? Тоесть целое число, без плавающей точки?
     
  10. FeniksDEV

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

    Баллы:
    76
    Имя в Minecraft:
    Feniksovich
    Ивент содержит два Location: откуда переместился игрок и куда переместился. У Location есть методы для получения целочисленных координат блоков (Location#getBlockX(), например). Если ни одна соответствующая целочисленная координата не изменилась, значит игрок переместился в рамках одного и того же блока.
     
  11. Автор темы
    therimuru_

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

    Баллы:
    66
    Имя в Minecraft:
    therimuru_
    Огромное спасибо! Как только буду писать плагин, применю всё что ты мне сказал!:cute:
     
Статус темы:
Закрыта.

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