Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

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

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

    Vaiter Активный участник

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

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

    Заранее спасибо.
     
  2. Хостинг MineCraft
    <
  3. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Отслеживать движения игроков PlayerMoveEvent / PlayerTeleportEvent / другие (про мобов не скажу какие, не знаю), проверять расстояние до нужной точки.
     
  4. Timings

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

    Баллы:
    88
    Имя в Minecraft:
    NextGeneric
    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("Игрок приблизился к точке меньше чем на пять блоков!");
     
  5. Reality_SC

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

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

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

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