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

Помогите Странно работает двойной прыжок

Тема в разделе "Разработка плагинов для новичков", создана пользователем l_Slime_l, 22 май 2020.

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

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

    Баллы:
    76
    Никаких античитов и прочего не установлено.
     
  2. Автор темы
    l_Slime_l

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

    Баллы:
    76
    Ещё заметил, что игрока слабо подкидывает при определённой координате Y у вектора player.getVelocity (-0.0780004 или что-то около этого), в общем странно как-то, не знаю что и делать, другие плагины на двойной прыжок с этой же проблемой.

    Но иногда игрока нормально подкидывает при той же координате Y.
     
  3. NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Попробуй телепортировать игрока на его же координаты перед толчком
     
  4. Автор темы
    l_Slime_l

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

    Баллы:
    76
    А как это поможет?
     
  5. NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Хз, должно свести скорость игрока к нулю в тот тик, и если твой вектор +- константа, то всегда должно одинаково толкать
     
  6. alexandrage

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

    Баллы:
    173
    Так и быть, помогу не грамотным. Тяжело когда матешу не учат совсем.
    doubleJump условная ифка для активации.
    Код:
        @EventHandler
        public void on(PlayerMoveEvent e) {
            if (doubleJump) {
                Player p = e.getPlayer();
                Location vector = e.getFrom().subtract(e.getTo());
                p.setVelocity(new Vector(-vector.getX(), 0.5, -vector.getZ()));
            }
        }
     
  7. Автор темы
    l_Slime_l

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

    Баллы:
    76
    Так там вроде игроку velocity ставится не в PlayerMoveEvent, а в PlayerToggleFlightEvent
     
  8. alexandrage

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

    Баллы:
    173
    Я не разбираюсь как оно юзается для таких прыжков, никогда не делал, переменную вектора для вертикального ускорения можно поместить в хешмап.
     
  9. Автор темы
    l_Slime_l

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

    Баллы:
    76
    При каждом движении записывать вектор?
     
  10. alexandrage

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

    Баллы:
    173
    Ну да.
     
  11. Автор темы
    l_Slime_l

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

    Баллы:
    76
    Та ну, как-то не хорошо получается, в моём примере лучше было, только никак не могу решить проблему, попробую ещё может через 1 тик ставить velocity, вдруг поможет.
     
  12. alexandrage

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

    Баллы:
    173
    Идеально прыгает, не знаю о чем ты.
     
  13. alexandrage

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

    Баллы:
    173
    Код:
    public class EventListener implements Listener {
    
        private Map<String, Vector> v;
    
        public EventListener() {
            this.v = new HashMap<String, Vector>();
        }
    
        @EventHandler
        public void on(PlayerJoinEvent e) {
            Player p = e.getPlayer();
            this.v.put(p.getName(), new Vector(0, 0, 0));
        }
    
        @EventHandler
        public void on(PlayerQuitEvent e) {
            this.v.remove(e.getPlayer().getName());
        }
    
        @EventHandler
        public void on(PlayerToggleFlightEvent e) {
            Player p = e.getPlayer();
            if (e.isFlying() && e.getPlayer().getGameMode() != GameMode.CREATIVE) {
                p.setVelocity(new Vector(-this.v.get(p.getName()).getX(), 0.5, -this.v.get(p.getName()).getZ()));
                e.setCancelled(true);
            }
            p.setAllowFlight(false);
        }
    
        @EventHandler
        public void on(PlayerMoveEvent e) {
            Player p = e.getPlayer();
            this.v.put(p.getName(), e.getFrom().toVector().subtract(e.getTo().toVector()));
            if (p.isOnGround()) {
                p.setAllowFlight(true);
            }
        }
    }
     
    Последнее редактирование: 22 май 2020
  14. alexandrage

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

    Баллы:
    173
    Ну еще ифку надо да, чтоб в воздухе не повторяли много раз)
     
  15. Автор темы
    l_Slime_l

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

    Баллы:
    76
    Спасибо, попробую, там вроде просто флай отключается, когда игрока подбрасывает, точно не помню
     
  16. Автор темы
    l_Slime_l

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

    Баллы:
    76
    Что-то сейчас попробовал, и моя проблема никуда не ушла, так же плохо подбрасывает при приземлении. Могу сделать видео, если нужно.
     
    Последнее редактирование: 22 май 2020
  17. alexandrage

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

    Баллы:
    173
    Нет там никаких проблем, не нужно там скорость игрока гасить как я предположил ранее. Только вертикальную сохранять, что я и сделал. С велосити она не снимается, потому пришлось в ивент лезть. Иначе прыжок не естественный будет.
     
  18. Автор темы
    l_Slime_l

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

    Баллы:
    76
    Я же говорю, проблема присутствует. На какой версии проверяли? Я на paper 1.15.2 и spigot 1.15.2. Я для теста полностью скопировал код, который вы написали, проверил, ничего не изменилось, игрока в определённый момент перед приземлением слабо подкидывает. Возможно, вы не поймали этот момент. Если вниз просто лететь с высоты и использовать двойной прыжок, то все хорошо.
     
  19. alexandrage

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

    Баллы:
    173
    Да как только не прыгал, всегда одинаково и с воздуха и с земли и с высоты. Единственное, это требовалось сохранить вертикальное ускорение игрока.
     
  20. Автор темы
    l_Slime_l

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

    Баллы:
    76
    Ну давайте я тогда видео скину, посмотрите. Проблема не когда с земли быстро на пробел 2 раза жмешь, а когда 1 раз прыгнул, а потом перед приземлением двойной прыжок использовал.
     
    Последнее редактирование: 23 май 2020

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