.

Статус
Закрыто для дальнейших ответов.

Mr_RoboMan

Старожил
Пользователь
Баллы
123
.
 
Последнее редактирование:
В общем ребят, я пытаюсь разобраться как работать с векторами и т.д.
Для начало решил сделать поднятия игрока в воздух типо эффекта левитации только своими немножечько кривыми ручками.
Так как джавадоки для слабаков (главное чтоб эту фразу не увидел Ларик..) то решил сделать наугад.
В итоге вышло вот так вот:
Код:
    @EventHandler
    public void ловимСообщение(AsyncPlayerChatEvent event) {
        if (event.getMessage().startsWith("I WANT FUCK THE SKY")) {
            Bukkit.getScheduler().runTask(this, () -> {
                String[] args = event.getMessage().split("\\|");
                Player player = event.getPlayer();
                player.setAllowFlight(true);
                player.setFlying(true);
                player.setVelocity(player.getVelocity().add(new Vector(0, Integer.parseInt(args[1]), 0).multiply(Double.parseDouble(args[2]))));
                player.sendMessage("YOU CAN FUCK THE SKY");
            });
        }
    }
Но каждый раз подкидывает слишком резко, параметры влияют только на то насколько высоко подбросит (иди мне так кажется..)..
В общем, как сделать медленное поднятие вверх?)
Русские буквы в методе...
Also, всё правильно сделал, но надо немного по-другому.
https://bukkit.org/threads/setvelocity-help.45299/
Последнее сообщение.
 
Русские буквы в методе....
Да это я по приколу сделал, я ведь сейчас все-равно тестирую..
А вот насчет кода - не совсем понял... Локации to & from в его коде - это локации из PlayerMoveEvent, или это локации откуда и куда надо двигать игрока?
Also, нет того метода что он юзает..
adeae94228e1.png
 
Да это я по приколу сделал, я ведь сейчас все-равно тестирую..
А вот насчет кода - не совсем понял... Локации to & from в его коде - это локации из PlayerMoveEvent, или это локации откуда и куда надо двигать игрока?
Also, нет того метода что он юзает..
adeae94228e1.png
Откуда куда. Используй Vector в методе.
 
Чтобы игрока медленно поднимало вверх, нужно устанавливать ему постоянную скорость.
Что-то типа такого:
Java:
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, () ->
        {
            e.getPlayer().setVelocity(new Vector(0, 1, 0));
        }, 0, 1);
 
Чтобы игрока медленно поднимало вверх, нужно устанавливать ему постоянную скорость.
Что-то типа такого:
Java:
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, () ->
        {
            e.getPlayer().setVelocity(new Vector(0, 1, 0));
        }, 0, 1);
Во, это уже то что надо спасибо, но пока еще не полностью работает.

АХТУНГ: дальше читать только людям устойчивым в гавнокоду.

С помощью этих самых векторов, я хочу замутить красивые порталы (Кто играл в Disciples III - поймет).
Типо сначало игрока в портале подымает, телепортирует во второй портал, и там его запускает!
Вот что я имею сейчас:
Java:
    public class Portal {

        private String name;
        private TextLocation location;
        private boolean blocked;

        public Portal(String name, TextLocation location) {
            this.name = name;
            this.location = location;
            blocked = false;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public TextLocation getLocation() {
            return new TextLocation(location.clone());
        }

        public void setLocation(TextLocation location) {
            this.location = location;
        }

        public boolean isBlocked() {
            return blocked;
        }

        public void setBlocked(boolean blocked) {
            this.blocked = blocked;
        }
    }
Java:
    public class MoveRunnable implements Runnable {

        public Player player;
        public double speed;

        public MoveRunnable(Player player, double speed) {
            this.player = player;
            this.speed = speed;
        }

        @Override
        public void run() {
            player.setVelocity(new Vector(0, speed, 0));
        }
    }
Java:
                portalIn.setBlocked(true);
                portalOut.setBlocked(true);
                player.setAllowFlight(true);
                player.setFlying(true);
                Bukkit.broadcastMessage("§0==================================");
                Bukkit.broadcastMessage("§cПорталы заблочены. Полет включеен.");
                MoveRunnable runnableUp = new MoveRunnable(player, 0.25);
                Bukkit.broadcastMessage("§aСоздан таск полета вверх.");
                BukkitTask taskUp = Bukkit.getScheduler().runTaskTimer(GWMServerPlugin.plugin, runnableUp, 0, 1);
                Bukkit.broadcastMessage("§6Запущен таск полета вверх.");
                Bukkit.getScheduler().runTaskLater(GWMServerPlugin.plugin, () -> {
                    Bukkit.broadcastMessage("§6Запущен таск отмены таска полета вверх.");
                    taskUp.cancel();
                    Bukkit.broadcastMessage("§cТаск полета вверх отменен.");
                    Location loc = portalOut.getLocation().clone();
                    loc.setY(loc.getY()+10);
                    player.teleport(loc);
                    Bukkit.broadcastMessage("§6Телепорт на второй портал Y+=10.");
                    MoveRunnable runnableDown = new MoveRunnable(player, -0.25);
                    Bukkit.broadcastMessage("§aСоздан таск полета вниз.");
                    BukkitTask taskDown = Bukkit.getScheduler().runTaskTimer(GWMServerPlugin.plugin, runnableDown, 0, 1);
                    Bukkit.broadcastMessage("§6Таск полета вниз запущен.");
                    Bukkit.getScheduler().runTaskLater(GWMServerPlugin.plugin, () -> {
                        Bukkit.broadcastMessage("§6Запущен таск отмены таска полета вниз.");
                        taskDown.cancel();
                        Bukkit.broadcastMessage("§cТаск полета вниз отменен.");
                        portalIn.setBlocked(false);
                        portalOut.setBlocked(false);
                        player.setAllowFlight(false);
                        player.setFlying(false);
                        Bukkit.broadcastMessage("§aПорталы разблокированы. Полет выключен.");
                        Bukkit.broadcastMessage("§0=======================================");
                    }, 40L);
                }, 40L);
Однако почему-то все работает когда я телепортируюсь в один и тот-же портал, тогда меня просто озуенно красиво поднимает вверх и опускает, однако когда я пытаюсь телепортироватся в разные порталы, поднимает меня нормально, телепортирует нормально, однако опускает меня не сразу (сначало я "висю" в воздухе), и не полностью, большую часть "опускания" я просто падаю..
PыSы. Класс TextLocation этот тот-же Location, только с кастомным toString():
Java:
public class TextLocation extends Location {

    public TextLocation(World world, double x, double y, double z) {
        super(world, x, y, z);
    }

    public TextLocation(Location location) {
        super(location.getWorld(), location.getX(), location.getY(), location.getZ());
    }

    public static TextLocation parse(String string) {
        String[] params = string.split("\\|");
        if (params.length != 4) throw new IllegalArgumentException("Чет не то с локацией");
        World world = Bukkit.getWorld(params[0]);
        double x = Double.valueOf(params[1]);
        double y = Double.valueOf(params[2]);
        double z = Double.valueOf(params[3]);
        return new TextLocation(world, x, y, z);
    }

    @Override
    public String toString() {
        return getWorld().getName() + "|" + getBlockX() + "|" + getBlockY() + "|" + getBlockZ();
    }
}
 
Если порталов не очень много и они физически привязаны к каким-то местам в мире, можно проще сделать анимацию для взлёта/посадки с помощью rscFirstJoinDemo? :)
 
Если порталов не очень много и они физически привязаны к каким-то местам в мире, можно проще сделать анимацию для взлёта/посадки с помощью rscFirstJoinDemo? :)
Задумка с порталами такая: порталов на карте около 10-30 штук, все они привязаны к месту, из любого портала можно попасть в любой портал..
Я бы с удовольствием, но я пытаюсь реализовать на сервере все свое.
Планирую вообще использовать только три плагина, DynMap, %Какой-то_плагин_на_анти_чит%, и мой, поэтому не хотелось бы что-то еще ставить..
Тем более учитывая то что у меня уже получилось, осталось только найти небольшой баг, или что-то иное, что немножечко глючит при телепортации в другой портал...
Как-то так.. Работает нормально только при телепортации в тот-же портал в котором я стою..
 
Так уж и быть. Код полное дерьмище, особенно запуск заданий, ведь у метода, который запускает поток есть аргумент "delay".
Also, сделай callback, который будет запускать возвращение игрока на землю.
Типа такого:
У нас есть скорость и расстояние до игрока, следовательно можно рассчитать время, на которое запускать каждый таймер.
А хотя мне лень расписывать.... Сейчас запилю тебе эту штуку, подожди часик, как освобожусь.
 
Висишь ты в воздухе потому что обработка пакетов ещё не дошла до обработки пакетов установки скорости. (Ибо надо чанки переслать, данные мобов, и многое другое).
А ещё грустнее будет когда ты будешь тестировать плагин не на локали, а на реальном сервере и пинг будет за сотку скажем.
 
Висишь ты в воздухе потому что обработка пакетов ещё не дошла до обработки пакетов установки скорости. (Ибо надо чанки переслать, данные мобов, и многое другое).
А ещё грустнее будет когда ты будешь тестировать плагин не на локали, а на реальном сервере и пинг будет за сотку скажем.
Хм, круто..
Все настолько страшно что нельзя бороться?
Или я могу например как только игрок начал телепортацию (т.е. подыматся вверх) принудительно прогрузить чанк куда он тпшится и это немного поможет?
 
Хм, круто..
Все настолько страшно что нельзя бороться?
Или я могу например как только игрок начал телепортацию (т.е. подыматся вверх) принудительно прогрузить чанк куда он тпшится и это немного поможет?
Нет. Не можешь.
 
Ммм... Кайф..
Пошел рыдать в подушку и делать простой телепорт..
Бывает :L
P.S.: если хочешь оставить предыдущую идею - подсказка - я задом чую, что нужно порыскать в ProtocolLib.
Т.к. эта фигнюшка умеет отправлять кастомные пакеты напрямую.
 
Бывает :L
P.S.: если хочешь оставить предыдущую идею - подсказка - я задом чую, что нужно порыскать в ProtocolLib.
Т.к. эта фигнюшка умеет отправлять кастомные пакеты напрямую.
Только вот при телепорте чанки всё равно попадут в очередь пакетов на отправку раньше чем ты сможешь послать пакет с установкой скорости. Можно конечно похимичить рутём слушания пакетов и вставки пакетов до него, но это очень большой гемор.
 
Чанк где телепорт прогружать всегда =).
 
Прогрузить чанк не поможет, ну никак, один хер пакеты с данными чанка уйдут игроку первыми, сразу после телепорта.
 
Банальная задержка игрока в воздухе и все.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх