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

Помогите Перемещение игрока

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

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

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Собственно в чём вопрос. Мне нужно при определённом событии переместить игрока в определённое место. Так вот как лучше всего это сделать, чтобы сохранился взгляд игрока?
     
    Forwolk нравится это.
  2. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    @Den_Abr,
    Нужно скопировать его взгляд со старой позиции.
    Это параметры pitch и yaw у location
    UPD:
    разумеется, сначала создать location с измененными x,y,z,world, но старыми pitch,yaw.
    а потом уже телепортировать
     
    Bazinga нравится это.
  3. Автор темы
    Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    А если, допустим, у меня цикл перемещений, как сделать, чтобы взгляд можно было бы свободно двигать во время телепортов?
     
  4. Date

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

    Баллы:
    63
    Имя в Minecraft:
    TheCaptainDate
    Ну, твой цикл явно состоит из шагов, верно? В таком случае, самый банальный вариант:
    Код:
    int yaw, pitch, roll; // На деле, они не int, а кажется float
     
    for(int i = 0; i < 10; i++) {
        switch(i)
        {
            case 0:
              yaw = 10;
              pitch = 20;
              roll = 30;
              break;
            // И далее заполняем позиции для последующих телепортов
        }
        Location loc = new Location(x, y, z, yaw, pitch, roll...
    }
     
    Forwolk и alden нравится это.
  5. Автор темы
    Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    У меня верстак сломался:eek:
    [​IMG]
     
  6. Date

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

    Баллы:
    63
    Имя в Minecraft:
    TheCaptainDate
    Нечего пользоваться этим-вашим Эклипсом. Не понимаю, почему вы его предпочитаете %)
    (дело вкусов, спорить не буду)
     
    LaserJet нравится это.
  7. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Наверное, немного повторюсь.
    Между перемещениями проходит какое-то количество времени (иначе они бессмысленны)
    В момент перед каждой телепортацией устанавливаем координате (пункту назначения) pitch и roll как у игрока.
    Игрок заметит совсем незначительные лаги, если в это время будет крутить курсором (зависит от пинга). Если провести ряд телепортаций по цепочке координат с небольшой задержкой (менее секунды) то игрок скорее всего заметит неприятное дергание курсора. Исправить это невозможно, ибо так устроен протокол MC.
    Если необходимо передвигать игрока по маршруту, тут лучше подойдет setVelocity(Vector). Но тяжелее, ибо надо рассчитывать траекторию и вектор касательной.
     
  8. Date

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

    Баллы:
    63
    Имя в Minecraft:
    TheCaptainDate
    Но автор не указал, хочет-ли он именно передвигать человека, верно?
    Возможно он хочет просто с задержкой ТПшнуть игрока на разные части карты, это было-бы логично, если бы он делал гайд сервера, или что-то вроде того.
     
  9. Автор темы
    Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Не, я пытался сделать что-то похожее на гравитацию, но видимо это невозможно
     
  10. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    setVelocity() подойдет для этого. Ну и еще нужна небольшая система математических рассчетов.
     
  11. Автор темы
    Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    А можно простенький пример использования? А то никак не вникну
     
    RVXman нравится это.
  12. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    entity.setVelocity(new Vector(0,1,0)) - подкинет объект вверх на высоту около 5 блоков.
    entity.setVelocity(entity.getVelocity().add(0,1,0)) - почти то же, просто изменит вектор с учетом предыдущего.
    Вектор означает скорость, единица измерения [блок/тик].
    Взять скорость у игрока - большая проблема - т.к. перемещения игрока обрабатывает клиент, а не сервер.
    Как вариант - каждый тик рассчитывать промежуточную скорость, путем измерения расстояния между координатами.
    Остальное зависит от конкретной задачи.
    Если нужно в каком-то регионе разрешить полет - это оч просто.
    Чтобы сделать прыжковую платформу, а-ля Quake III, то нужно задать путь перемещения, формулу касательной, и игрока постоянно сетВелоситить по касательной, делая поправку на его координаты. (Можно просто 1 раз использовать setVelocity но тогда верный пункт назначения не гарантируется).
     
    Den_Abr нравится это.
  13. maksim_rec

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

    Баллы:
    88
    Имя в Minecraft:
    maksimrec
    какой функцией можно определить находиться ли пользователь на заприваченой территории?
     
  14. Date

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

    Баллы:
    63
    Имя в Minecraft:
    TheCaptainDate
    Пологаю, это зависит от способа, которым эти самые территории приватятся. Если у вас собственная система, то просто проверяете в духе: if(X0<=X && X <= X1 ....
    x0 - координата первой точки квадрата
    x1 - координата второй точки квадрата

    Хотя, что-то мне подсказывает, что вы сами не знаете, чего хотите.
     
  15. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    1) Подключать WorldGuard API и с ним уже разбираться (сложно).
    2) Костыль: проверить, есть ли права у игрока чтобы поставить или сломать блок. Где-то в этой ветке было решение, там вроде-бы создавали событие OnBlockBreak, и проверяли, вызвал ли кто его отмену.
     
    LaserJet нравится это.
  16. maksim_rec

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

    Баллы:
    88
    Имя в Minecraft:
    maksimrec
    приват территории - стандартный /region claim, мне необходимо определить являеться ли территория, на которой стоит пользователь, приватной.
    понятно что это делается через if и запрос к менеджеру территорий
    а вот куда конкретно запрос отправить непонятно?
     
  17. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Начнем с того, что /region claim нифига не стандартный, а реализуется плагином WorldGuard.
    Подойдет первый вариант. Но прежде чем взяться за его реализацию, советую прокачать скилл "Java-кодер", ибо тут все намного сложнее чем if, а менеджера территорий не существует. Можно получить список регионов через API другого плагина, затем проверять каждый из них. Насколько это сложно - зависит от автора этого плагина.
    Второй - намного проще. Но может не подойти (результат зависит от многих факторов, не только от региона.) Как вызвать событие и посмотреть результат - есть туториалы на официальном вики.
     
  18. Автор темы
    Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Код:
    import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
    ....
    public WorldGuard wg;
    .....
    if (!this.wg.canBuild(player, location))) {
    // Что-то делать
    }
     
  19. maksim_rec

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

    Баллы:
    88
    Имя в Minecraft:
    maksimrec

    Решение конечно интересное но для данной задачи оно не подходит.
    Мне необходимо определить является ли территория принципе приватной
    this.wg.canBuild - вернет true если данная территория запривачена мною либо никем не запривачена, и false если она чужая, те решение не универсальное....
    одним словом this.wg.canBuild не различает территорию которую я заприватил от незаприваченой
     
    Stalkerdeni971 нравится это.
  20. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    boolean flag = false
    set = worldGuard.getRegionManager(world).getApplicableRegions(vector);

    for (ProtectedRegion region : set) {
    // проверяем region.getMembers().getPlayers()
    // или getOwners().getPlayers() - смотря кого ищем.
    // если нашли нужного игрока ставим flag=true и break;
    }
    а теперь уже if (flag) { /*... то что хотели*/ }
     
Статус темы:
Закрыта.

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