Помогите Телепорт Entity вокруг заданной локации

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

Disca

Активный участник
Пользователь
Баллы
66
Как сделать плавный телепорт entity вокруг заданной локации?(ArmorStand)
 
Запускаешь Runnable, который будет срабатывать, скажем, раз в секунду и устанавливаешь координаты новой локации таким образом:
x = r * cos(3.14 * k / n)
y = y
z = r * sin(3.14 * k / n)
где r - нужный тебе радиус, k - счетчик, который увеличивается на единицу с каждой итерацией и n - число, сколько итераций нужно, чтобы пройти полный круг
 
Это скорее вопрос по геометрии, а не по баккиту.
Чтобы телепортировать - entity.teleport(location).
Человек выше кинул код для подсчёта координат точек (location). Добавлю только, что вместо 3.14 стоит использовать константу Math.PI
 
Запускаешь Runnable, который будет срабатывать, скажем, раз в секунду и устанавливаешь координаты новой локации таким образом:
x = r * cos(3.14 * k / n)
y = y
z = r * sin(3.14 * k / n)
где r - нужный тебе радиус, k - счетчик, который увеличивается на единицу с каждой итерацией и n - число, сколько итераций нужно, чтобы пройти полный круг
Код:
       private double x = 11.655;
    private double y = 87;
    private double z = -32.191;
    
    private World w = Bukkit.getWorld("world");
    
    private ArmorStand as = (ArmorStand) w.spawnEntity(new Location(w, 11.546, 87, -32.052), EntityType.ARMOR_STAND);

    private double r = 1;

    private double k = 1;

    private double n = 10;

@Override
    public void run() {
                k++;
                String name = "§cИгроков: §e" + Bukkit.getOnlinePlayers().size();
                as.setCustomName(name);
                x = r * Math.cos(3.14 * k / n);
                z = r * Math.sin(3.14 * k / n);
                as.teleport(new Location(w, x, y, z));
    }
Что-то не видно стойку. Без расчётов она видна.
 
Код:
       private double x = 11.655;
    private double y = 87;
    private double z = -32.191;
   
    private World w = Bukkit.getWorld("world");
   
    private ArmorStand as = (ArmorStand) w.spawnEntity(new Location(w, 11.546, 87, -32.052), EntityType.ARMOR_STAND);

    private double r = 1;

    private double k = 1;

    private double n = 10;

@Override
    public void run() {
                k++;
                String name = "§cИгроков: §e" + Bukkit.getOnlinePlayers().size();
                as.setCustomName(name);
                x = r * Math.cos(3.14 * k / n);
                z = r * Math.sin(3.14 * k / n);
                as.teleport(new Location(w, x, y, z));
    }
Что-то не видно стойку. Без расчётов она видна.
Кажется, тебе нужно сохранить оригинальную локацию и каждый раз по новой прибавлять к ней те x и z, которые тебе подкинули выше, т.е.
Код:
                int adjustedX = x + r * Math.cos(3.14 * k / n);
                int adjustedZ = z + r * Math.sin(3.14 * k / n);
                as.teleport(new Location(w, adjustedX, y, adjustedZ));
А вообще, если стойка всегда будет крутиться только вокруг одной локации, тебе стоит просчитать все локации заранее и записать их в какой-нибудь массив, дабы сервер не считал это всё раз за разом.
 
Кажется, тебе нужно сохранить оригинальную локацию и каждый раз по новой прибавлять к ней те x и z, которые тебе подкинули выше, т.е.
Код:
                int adjustedX = x + r * Math.cos(3.14 * k / n);
                int adjustedZ = z + r * Math.sin(3.14 * k / n);
                as.teleport(new Location(w, adjustedX, y, adjustedZ));
А вообще, если стойка всегда будет крутиться только вокруг одной локации, тебе стоит просчитать все локации заранее и записать их в какой-нибудь массив, дабы сервер не считал это всё раз за разом.
Спасибо.
 
Кажется, тебе нужно сохранить оригинальную локацию и каждый раз по новой прибавлять к ней те x и z, которые тебе подкинули выше, т.е.
Код:
                int adjustedX = x + r * Math.cos(3.14 * k / n);
                int adjustedZ = z + r * Math.sin(3.14 * k / n);
                as.teleport(new Location(w, adjustedX, y, adjustedZ));
А вообще, если стойка всегда будет крутиться только вокруг одной локации, тебе стоит просчитать все локации заранее и записать их в какой-нибудь массив, дабы сервер не считал это всё раз за разом.
А можно и если можно, то как рассчитать yaw и pitch, чтобы локация была всегда слева?
 
x = x + r * cos(Math.PI * (60 - k) / n)
z = z + r * sin(Math.PI * (60 - k) / n)
yaw = 180 * (60 - k) / n + 90
pitch = 0
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх