Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

Статус
Закрыто для дальнейших ответов.

therimuru_

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

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

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

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

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

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

UPD:
Так-же хочу спросить, как наиболее граматно будет сохранить область координат, грубо говоря определенный невидимый куб в мире.
По сути, PlayerMoveEvent должен быть эффективнее, чем использование шедулера, потому что он будет срабатывать только в тот момент, когда игрок двигается, а шедулер будет постоянно проверять, даже если игрок стоит на месте. Для сохранения координат можешь использовать класс World и его методы, например, для получения чанка можешь использовать getChunkAt();, а для получения блока уже в этом чанке (позиции координат игрока) getBlock();
 
Последнее редактирование:
По сути, PlayerMoveEvent должен быть эффективнее, чем использование шедулера, потому что он будет срабатывать только в тот момент, когда игрок двигается, а шедулер будет постоянно проверять, даже если игрок стоит на месте. Для сохранения координат можешь использовать класс World и его методы, например, для получения чанка можешь использовать getChunkAt();, а для получения блока уже в этом чанке (позиции координат игрока) getBlock();

Благодарю за ответ.
Насколько сильно это будет нагружать сервер? WorldGuard как плагин на регионы использует этот ивент для проверки нахождения игрока в каком-либо регионе?
 
Насколько сильно это будет нагружать сервер?
Зависит от реализации, оптимизацию придется делать однозначно, ведь этот ивент на каждый чих срабатывает, не только смена локации. Серверу явно не понравится, если будет проводиться итерация большого списка регионов 100500 раз за тик.
 
Последнее редактирование:
PlayerMoveEvent вызывается даже если у игрока меняется yaw и pitch бошки. Половину таких вызовов можно отсекать сразу соответствующими проверками. Также можно не проверять позицию игрока, если он перемещается в рамках одного и того же блока – это в зависимости от того, для чего требуется отслеживание позиции в конечном счете.

В Bukkit API также присутствует класс для хранения кубоидов BoundingBox, но его contains методы работают с граничными позициями особым образом – на случай, если будешь использовать его.
 
PlayerMoveEvent вызывается даже если у игрока меняется yaw и pitch бошки. Половину таких вызовов можно отсекать сразу соответствующими проверками. Также можно не проверять позицию игрока, если он перемещается в рамках одного и того же блока – это в зависимости от того, для чего требуется отслеживание позиции в конечном счете.

В Bukkit API также присутствует класс для хранения кубоидов BoundingBox, но его contains методы работают с граничными позициями особым образом – на случай, если будешь использовать его.
А вот это интерестно. Как я могу реализовать проверку, сменилась ли координата на которой стоит игрок? Тоесть целое число, без плавающей точки?
 
А вот это интерестно. Как я могу реализовать проверку, сменилась ли координата на которой стоит игрок? Тоесть целое число, без плавающей точки?
Ивент содержит два Location: откуда переместился игрок и куда переместился. У Location есть методы для получения целочисленных координат блоков (Location#getBlockX(), например). Если ни одна соответствующая целочисленная координата не изменилась, значит игрок переместился в рамках одного и того же блока.
 
Ивент содержит два Location: откуда переместился игрок и куда переместился. У Location есть методы для получения целочисленных координат блоков (Location#getBlockX(), например). Если ни одна соответствующая целочисленная координата не изменилась, значит игрок переместился в рамках одного и того же блока.

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

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

Назад
Верх