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

  • Автор темы Автор темы Den_Abr
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Den_Abr

Старожил
Девелопер
Пользователь
Баллы
173
Имя в Minecraft
Den_Abr
Собственно в чём вопрос. Мне нужно при определённом событии переместить игрока в определённое место. Так вот как лучше всего это сделать, чтобы сохранился взгляд игрока?
 
@Den_Abr,
Нужно скопировать его взгляд со старой позиции.
Это параметры pitch и yaw у location
UPD:
разумеется, сначала создать location с измененными x,y,z,world, но старыми pitch,yaw.
а потом уже телепортировать
 
@Den_Abr,
Нужно скопировать его взгляд со старой позиции.
Это параметры pitch и yaw у location
UPD:
разумеется, сначала создать location с измененными x,y,z,world, но старыми pitch,yaw.
а потом уже телепортировать
А если, допустим, у меня цикл перемещений, как сделать, чтобы взгляд можно было бы свободно двигать во время телепортов?
 
Ну, твой цикл явно состоит из шагов, верно? В таком случае, самый банальный вариант:
Java:
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...
}
 
У меня верстак сломался😬
d15eb8ed6183.jpg
 
Нечего пользоваться этим-вашим Эклипсом. Не понимаю, почему вы его предпочитаете %)
(дело вкусов, спорить не буду)
 
А если, допустим, у меня цикл перемещений, как сделать, чтобы взгляд можно было бы свободно двигать во время телепортов?
Наверное, немного повторюсь.
Между перемещениями проходит какое-то количество времени (иначе они бессмысленны)
В момент перед каждой телепортацией устанавливаем координате (пункту назначения) pitch и roll как у игрока.
Игрок заметит совсем незначительные лаги, если в это время будет крутить курсором (зависит от пинга). Если провести ряд телепортаций по цепочке координат с небольшой задержкой (менее секунды) то игрок скорее всего заметит неприятное дергание курсора. Исправить это невозможно, ибо так устроен протокол MC.
Если необходимо передвигать игрока по маршруту, тут лучше подойдет setVelocity(Vector). Но тяжелее, ибо надо рассчитывать траекторию и вектор касательной.
 
Но автор не указал, хочет-ли он именно передвигать человека, верно?
Возможно он хочет просто с задержкой ТПшнуть игрока на разные части карты, это было-бы логично, если бы он делал гайд сервера, или что-то вроде того.
 
Но автор не указал, хочет-ли он именно передвигать человека, верно?
Возможно он хочет просто с задержкой ТПшнуть игрока на разные части карты, это было-бы логично, если бы он делал гайд сервера, или что-то вроде того.
Не, я пытался сделать что-то похожее на гравитацию, но видимо это невозможно
 
entity.setVelocity(new Vector(0,1,0)) - подкинет объект вверх на высоту около 5 блоков.
entity.setVelocity(entity.getVelocity().add(0,1,0)) - почти то же, просто изменит вектор с учетом предыдущего.
Вектор означает скорость, единица измерения [блок/тик].
Взять скорость у игрока - большая проблема - т.к. перемещения игрока обрабатывает клиент, а не сервер.
Как вариант - каждый тик рассчитывать промежуточную скорость, путем измерения расстояния между координатами.
Остальное зависит от конкретной задачи.
Если нужно в каком-то регионе разрешить полет - это оч просто.
Чтобы сделать прыжковую платформу, а-ля Quake III, то нужно задать путь перемещения, формулу касательной, и игрока постоянно сетВелоситить по касательной, делая поправку на его координаты. (Можно просто 1 раз использовать setVelocity но тогда верный пункт назначения не гарантируется).
 
какой функцией можно определить находиться ли пользователь на заприваченой территории?
 
какой функцией можно определить находиться ли пользователь на заприваченой территории?
Пологаю, это зависит от способа, которым эти самые территории приватятся. Если у вас собственная система, то просто проверяете в духе: if(X0<=X && X <= X1 ....
x0 - координата первой точки квадрата
x1 - координата второй точки квадрата

Хотя, что-то мне подсказывает, что вы сами не знаете, чего хотите.
 
какой функцией можно определить находиться ли пользователь на заприваченой территории?
1) Подключать WorldGuard API и с ним уже разбираться (сложно).
2) Костыль: проверить, есть ли права у игрока чтобы поставить или сломать блок. Где-то в этой ветке было решение, там вроде-бы создавали событие OnBlockBreak, и проверяли, вызвал ли кто его отмену.
 
приват территории - стандартный /region claim, мне необходимо определить являеться ли территория, на которой стоит пользователь, приватной.
понятно что это делается через if и запрос к менеджеру территорий
а вот куда конкретно запрос отправить непонятно?
 
приват территории - стандартный /region claim, мне необходимо определить являеться ли территория, на которой стоит пользователь, приватной.
понятно что это делается через if и запрос к менеджеру территорий
а вот куда конкретно запрос отправить непонятно?
Начнем с того, что /region claim нифига не стандартный, а реализуется плагином WorldGuard.
Подойдет первый вариант. Но прежде чем взяться за его реализацию, советую прокачать скилл "Java-кодер", ибо тут все намного сложнее чем if, а менеджера территорий не существует. Можно получить список регионов через API другого плагина, затем проверять каждый из них. Насколько это сложно - зависит от автора этого плагина.
Второй - намного проще. Но может не подойти (результат зависит от многих факторов, не только от региона.) Как вызвать событие и посмотреть результат - есть туториалы на официальном вики.
 
приват территории - стандартный /region claim, мне необходимо определить являеться ли территория, на которой стоит пользователь, приватной.
понятно что это делается через if и запрос к менеджеру территорий
а вот куда конкретно запрос отправить непонятно?
Java:
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
....
public WorldGuard wg;
.....
if (!this.wg.canBuild(player, location))) {
// Что-то делать
}
 
Java:
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
....
public WorldGuard wg;
.....
if (!this.wg.canBuild(player, location))) {
// Что-то делать
}


Решение конечно интересное но для данной задачи оно не подходит.
Мне необходимо определить является ли территория принципе приватной
this.wg.canBuild - вернет true если данная территория запривачена мною либо никем не запривачена, и false если она чужая, те решение не универсальное....
одним словом this.wg.canBuild не различает территорию которую я заприватил от незаприваченой
 
boolean flag = false
set = worldGuard.getRegionManager(world).getApplicableRegions(vector);

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