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

Помогите Действие, при подходе к координатам

Vaiter

Активный участник
Баллы
61
Дорого времени суток. Я тут недавно решил попробовать себя в разработке плагинов и столкнулся с небольшой проблемой.

Суть проблемы: Допустим у меня есть координаты. Как только моб/игрок подходит к этим координатам, должно выполнятся какое-либо действие (не важно какое). Как только игрок выходил, действие прекращалось. Есть ли способ это реализовать? Если да, то подскажите как, пожалуйста.

Заранее спасибо.
 
Отслеживать движения игроков PlayerMoveEvent / PlayerTeleportEvent / другие (про мобов не скажу какие, не знаю), проверять расстояние до нужной точки.
 
PlayerMoveEvent, например.

Player player = event.getPlayer();
Location loc = player.getLocation();
double x = loc.getBlockX();
double y = loc.getBlockY();
double z = loc.getBlockZ();

if (x.equals(111) && y.equals(64) && z.equals(-5)) {
player.sendMessage("Действие выполнено!");
}

Думаю догадаетесь, что 111, 64 и -5 - X, Y и Z координаты соответственно.

Подходит ли к этим координатам?

Location loc = // - позиция, к которой приближается игрок
Location val = p.getLocation();

if (val.distance(loc) < 5)
player.sendMessage("Игрок приблизился к точке меньше чем на пять блоков!");
 
Для решения поставленной задачи накидал класс LocationReachDetector:
  • Создайте один экземпляр этого класса где-то в Вашем плагине, например:
    Java:
    private final LocationReachDetector lrd = new LocationReachDetector(this);
  • В Вашем onEnable плагина вызовите его метод lrd.onEnable(); соответственно в onDisable — lrd.onDisable();
  • Напишите обработчик события PlayerReachedPointEvent (используя аннотацию EventHandler, как и со всеми остальными событиями).
  • Добавляйте отслеживаемые Location-ы в объект, используя методы lrd.add(...), lrd.contains(...), lrd.remove(...). Аргументом служит обёртка вокруг Location, названная NamedLocation:
    Java:
    new NamedLocation(
       // Отслеживаемая точка в любом из миров Вашего сервера
       Location location,
       // Расстояние срабатывания события (не используйте ноль)
       double distance,
       // Допустимо использовать одинаковые названия точек или null
       String caption);
    Этот же объект придёт в отслеживаемом событии и получается из него методом getNamedLocation().
Код использует другой класс MovingPlayersCatcher. Не забудьте подключить к Вашему проекту rscCommonsLibrary и rscMinecraftLibrary.

Внимание! Я не тестировал этот код, хотя он достаточно прост. Буду очень признателен, если кто-то проведёт его ревизию и опробует его в деле. Были сомнения насчёт того, следует ли гонять проверку каждый цикл через шедулер, либо вынести её отдельным потоком с небольшой задержкой, к обсуждению.
 
Последнее редактирование:

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

Назад
Верх