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

Помогите Векторы, велосити, как правильно работать с этим?

Тема в разделе "Разработка плагинов для новичков", создана пользователем Mr_RoboMan, 3 июл 2016.

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

    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");
                });
            }
        }
    
    Но каждый раз подкидывает слишком резко, параметры влияют только на то насколько высоко подбросит (иди мне так кажется..)..
    В общем, как сделать медленное поднятие вверх?)
     
  2. Хостинг MineCraft
    <
  3. Larin

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

    Баллы:
    103
    Русские буквы в методе...
    Also, всё правильно сделал, но надо немного по-другому.
    https://bukkit.org/threads/setvelocity-help.45299/
    Последнее сообщение.
     
  4. Автор темы
    Mr_RoboMan

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

    Баллы:
    123
    Да это я по приколу сделал, я ведь сейчас все-равно тестирую..
    А вот насчет кода - не совсем понял... Локации to & from в его коде - это локации из PlayerMoveEvent, или это локации откуда и куда надо двигать игрока?[DOUBLEPOST=1467565820,1467565508][/DOUBLEPOST]Also, нет того метода что он юзает..
    [​IMG]
     
  5. Larin

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

    Баллы:
    103
    Откуда куда. Используй Vector в методе.
     
  6. fall.us

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

    Баллы:
    76
    Имя в Minecraft:
    fallus
    Чтобы игрока медленно поднимало вверх, нужно устанавливать ему постоянную скорость.
    Что-то типа такого:
    Код:
    Bukkit.getScheduler().scheduleSyncRepeatingTask(this, () ->
            {
                e.getPlayer().setVelocity(new Vector(0, 1, 0));
            }, 0, 1);
     
  7. Автор темы
    Mr_RoboMan

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

    Баллы:
    123
    Во, это уже то что надо спасибо, но пока еще не полностью работает.

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

    С помощью этих самых векторов, я хочу замутить красивые порталы (Кто играл в Disciples III - поймет).
    Типо сначало игрока в портале подымает, телепортирует во второй портал, и там его запускает!
    Вот что я имею сейчас:
    Код:
        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;
            }
        }
    
    Код:
        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));
            }
        }
    
    Код:
                    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);
    
    Однако почему-то все работает когда я телепортируюсь в один и тот-же портал, тогда меня просто озуенно красиво поднимает вверх и опускает, однако когда я пытаюсь телепортироватся в разные порталы, поднимает меня нормально, телепортирует нормально, однако опускает меня не сразу (сначало я "висю" в воздухе), и не полностью, большую часть "опускания" я просто падаю..[DOUBLEPOST=1467609834,1467609668][/DOUBLEPOST]PыSы. Класс TextLocation этот тот-же Location, только с кастомным toString():
    Код:
    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();
        }
    }
    
     
  8. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Если порталов не очень много и они физически привязаны к каким-то местам в мире, можно проще сделать анимацию для взлёта/посадки с помощью rscFirstJoinDemo? :)
     
  9. Автор темы
    Mr_RoboMan

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

    Баллы:
    123
    Задумка с порталами такая: порталов на карте около 10-30 штук, все они привязаны к месту, из любого портала можно попасть в любой портал..
    Я бы с удовольствием, но я пытаюсь реализовать на сервере все свое.
    Планирую вообще использовать только три плагина, DynMap, %Какой-то_плагин_на_анти_чит%, и мой, поэтому не хотелось бы что-то еще ставить..
    Тем более учитывая то что у меня уже получилось, осталось только найти небольшой баг, или что-то иное, что немножечко глючит при телепортации в другой портал...[DOUBLEPOST=1467611011,1467610625][/DOUBLEPOST]Как-то так.. Работает нормально только при телепортации в тот-же портал в котором я стою..
    [​IMG]
     
  10. Bohdan_Hrytsak

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

    Баллы:
    76
    Имя в Minecraft:
    NegaTiV
    Плагин прикольний =)
     
  11. Автор темы
    Mr_RoboMan

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

    Баллы:
    123
    UPчхи(
     
  12. Larin

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

    Баллы:
    103
    Так уж и быть. Код полное дерьмище, особенно запуск заданий, ведь у метода, который запускает поток есть аргумент "delay".
    Also, сделай callback, который будет запускать возвращение игрока на землю.
    Типа такого:
    У нас есть скорость и расстояние до игрока, следовательно можно рассчитать время, на которое запускать каждый таймер.
    А хотя мне лень расписывать.... Сейчас запилю тебе эту штуку, подожди часик, как освобожусь.
     
  13. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Висишь ты в воздухе потому что обработка пакетов ещё не дошла до обработки пакетов установки скорости. (Ибо надо чанки переслать, данные мобов, и многое другое).
    А ещё грустнее будет когда ты будешь тестировать плагин не на локали, а на реальном сервере и пинг будет за сотку скажем.
     
  14. Автор темы
    Mr_RoboMan

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

    Баллы:
    123
    Хм, круто..
    Все настолько страшно что нельзя бороться?
    Или я могу например как только игрок начал телепортацию (т.е. подыматся вверх) принудительно прогрузить чанк куда он тпшится и это немного поможет?
     
  15. tyumencev2004

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

    Баллы:
    66
    Нет. Не можешь.
     
  16. Автор темы
    Mr_RoboMan

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

    Баллы:
    123
    Ммм... Кайф..[DOUBLEPOST=1467631740,1467631697][/DOUBLEPOST]Пошел рыдать в подушку и делать простой телепорт..
     
  17. tyumencev2004

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

    Баллы:
    66
    Бывает :L
    P.S.: если хочешь оставить предыдущую идею - подсказка - я задом чую, что нужно порыскать в ProtocolLib.
    Т.к. эта фигнюшка умеет отправлять кастомные пакеты напрямую.
     
  18. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Только вот при телепорте чанки всё равно попадут в очередь пакетов на отправку раньше чем ты сможешь послать пакет с установкой скорости. Можно конечно похимичить рутём слушания пакетов и вставки пакетов до него, но это очень большой гемор.
     
  19. Bohdan_Hrytsak

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

    Баллы:
    76
    Имя в Minecraft:
    NegaTiV
    Чанк где телепорт прогружать всегда =).
     
  20. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Прогрузить чанк не поможет, ну никак, один хер пакеты с данными чанка уйдут игроку первыми, сразу после телепорта.
     
  21. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Банальная задержка игрока в воздухе и все.
     

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