Помогите [РЕШЕНО]isSprinting и !isSprinting. Почему не работает как надо?

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

Listvli

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
ListvliLiveGames
Здравсвуйте. Имею следующий код:

Java:
[USER=74023]@EventHandler[/USER]
    public void onPlayerMove(PlayerMoveEvent event){
        final Player p = event.getPlayer();
        if (p.isSprinting()){
            if(!testArrayList.contains(p.getName())) {
                testArrayList.add(p.getName());
                Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
                    public void run() {
                        testArrayList.remove(p.getName());
                        if (p.getExp() <= 0.1) {
                            return;
                        } else {
                            p.setExp((float) (p.getExp() - 0.001));
                        }
                     
                    }
                }, 0L, 10L);
            }
        }
        if (!p.isSprinting()){
            if(!testArrayList.contains(p.getName())) {
                testArrayList.add(p.getName());
                Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
                    public void run() {
                        testArrayList.remove(p.getName());
                        if (p.getExp() >= 0.9) {
                            return;
                        } else {
                            p.setExp((float) (p.getExp() + 0.001));
                        }
                     
                    }
                }, 0L, 10L);
            }
        }

    }

По сути в данном коде полоска опыта является недоработанной выносливостью. Суть заключается в том, если выполняется isSprinting, то полоска опыта потихоньку опускается, но и при этом, зараза такая, одновременно работает условие !isSprinting. В чем загвоздка и где я тупой? Везде, как отвечал уже один участник данного форума.(Не мне:lol:).
При этом, кстати, если подходит условие !isSprinting, то isSprinting не запускается, как при ранее сказанном мною.:mad::mad::mad:
 
Последнее редактирование:
Добавь подсветку синаксиса [сode=Java]
 
Здравсвуйте. Имею следующий код:

Java:
[USER=74023]@EventHandler[/USER]
    public void onPlayerMove(PlayerMoveEvent event){
        final Player p = event.getPlayer();
        if (p.isSprinting()){
            if(!testArrayList.contains(p.getName())) {
                testArrayList.add(p.getName());
                Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
                    public void run() {
                        testArrayList.remove(p.getName());
                        if (p.getExp() <= 0.1) {
                            return;
                        } else {
                            p.setExp((float) (p.getExp() - 0.001));
                        }
                    
                    }
                }, 0L, 10L);
            }
        }
        if (!p.isSprinting()){
            if(!testArrayList.contains(p.getName())) {
                testArrayList.add(p.getName());
                Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
                    public void run() {
                        testArrayList.remove(p.getName());
                        if (p.getExp() >= 0.9) {
                            return;
                        } else {
                            p.setExp((float) (p.getExp() + 0.001));
                        }
                    
                    }
                }, 0L, 10L);
            }
        }

    }

По сути в данном коде полоска опыта является недоработанной выносливостью. Суть заключается в том, если выполняется isSprinting, то полоска опыта потихоньку опускается, но и при этом, зараза такая, одновременно работает условие !isSprinting. В чем загвоздка и где я тупой? Везде, как отвечал уже один участник данного форума.(Не мне:lol:).
При этом, кстати, если подходит условие !isSprinting, то isSprinting не запускается, как при ранее сказанном мною.:mad::mad::mad:
Должно быть так:
Java:
if(p.isSpringting()) {
Если бежит
} else {
Если не бежит
}
 
Что-то типа
Java:
@EventHandler
public void onPlayerMove(PlayerMoveEvent event) {
    final Player p = event.getPlayer();
    if(!testArrayList.contains(p.getName())) {
        testArrayList.add(p.getName());
        Bukkit.getScheduler().scheduleSyncRepeatingTask(this, () -> {
            testArrayList.remove(p.getName());
            if (p.isSprinting()) {
                if (p.getExp() <= 0.1) {
                    return;
                }

                p.setExp((float) (p.getExp() - 0.001));
            } else {
                if (p.getExp() >= 0.9) {
                    return;
                }

                p.setExp((float) (p.getExp() + 0.001));
            }
        }, 0L, 10L);
    }
}
Тут Runnable заменен на лямбду. Если Java < 1.8, придется вернуть Runnable
Только не понял зачем ты делаешь testArrayList.remove(p.getName());
Это ж наплодится куча шедулеров для каждого игрока.
 
Да, верно. Спасибо. Не понимаю, почему я ранее не догадался так сделать.
Что-то типа
Java:
@EventHandler
public void onPlayerMove(PlayerMoveEvent event) {
    final Player p = event.getPlayer();
    if(!testArrayList.contains(p.getName())) {
        testArrayList.add(p.getName());
        Bukkit.getScheduler().scheduleSyncRepeatingTask(this, () -> {
            testArrayList.remove(p.getName());
            if (p.isSprinting()) {
                if (p.getExp() <= 0.1) {
                    return;
                }

                p.setExp((float) (p.getExp() - 0.001));
            } else {
                if (p.getExp() >= 0.9) {
                    return;
                }

                p.setExp((float) (p.getExp() + 0.001));
            }
        }, 0L, 10L);
    }
}
Тут Runnable заменен на лямбду. Если Java < 1.8, придется вернуть Runnable
Только не понял зачем ты делаешь testArrayList.remove(p.getName());
Это ж наплодится куча шедулеров для каждого игрока.
Есть один очень интересный момент. Не знаю как плагин приходит к такому, ибо не понимаю в шедулерах и только сегодня я до него добрался. Суть в том, что вначале, шкала опыта меняется нормально. Так, как узазано в параметрах получения и отнимания опыта(то бишь все медленно и приятно). Но спустя какое-то время, данная шкала летает как ракета. После перезахода снова медленная.
 
Да, верно. Спасибо. Не понимаю, почему я ранее не догадался так сделать.

Есть один очень интересный момент. Не знаю как плагин приходит к такому, ибо не понимаю в шедулерах и только сегодня я до него добрался. Суть в том, что вначале, шкала опыта меняется нормально. Так, как узазано в параметрах получения и отнимания опыта(то бишь все медленно и приятно). Но спустя какое-то время, данная шкала летает как ракета. После перезахода снова медленная.
Это как раз из-за строки testArrayList.remove(p.getName());
Из-за неё с каждым движение создаётся новый шедулер и таким образом на игрока навешивается всё больше и больше шедулеров. А когда он перезаходит все заново
Её уберешь и всё будет нормально.
Надо еще в шедулер добавить проверку условия, что игрок не вышел с сервера. Иначе можно получить NPE
 
Это как раз из-за строки testArrayList.remove(p.getName());
Из-за неё с каждым движение создаётся новый шедулер и таким образом на игрока навешивается всё больше и больше шедулеров. А когда он перезаходит все заново
Её уберешь и всё будет нормально.
Надо еще в шедулер добавить проверку условия, что игрок не вышел с сервера. Иначе можно получить NPE
npe вроде не выбивает. А так вроде все стало нормально. Спасибо. В принципе понял как работает шедулер. Благодарствую)
Единственное, что смущает - это вечный мессадж
Код:
Can't keep up! Did the system time change, or is the server overloaded? Running 2139ms behind, skipping 42 tick(s)
после reload. До шедулера такого не было. Это нормально?
Зачеркиваю свои слова про то, что со скоростью шкалы все в норме. Все так же плохо. remove листа убрал.
 
Это не нормально. Это как раз из-за того, что у тебя плодились шедулеры в бешеном количестве.
 
Это не нормально. Это как раз из-за того, что у тебя плодились шедулеры в бешеном количестве.
Убрал лист, и ремув ему ставил)
Шкала опыта летает как ракета после трех-четырех гоняния этой шкалы в разные стороны)
Это как так вообще)
Это все не то, ибо надо именно на шкалу опыта. Да и разобраться надо самому до конца, а так уже готовенькое. Не то.
 
Я был написал тебе код, но я чёт приуныл щас. ;c
Если так лень, то можешь хотя бы направить? Может придумаю что. У самого сейчас, правда, голова болит. Но позаниматься никогда не вредно
 
Да он не сильно изменился
Код:
@EventHandler
    public void onPlayerMove(PlayerMoveEvent event){
        final Player p = event.getPlayer();
          
            Bukkit.getScheduler().scheduleSyncRepeatingTask(this, () -> {
                if (p.isSprinting()) {
                    if (p.getExp() <= 0.01) {
                        return;
                    } else {
                        p.setExp((float) (p.getExp() - 0.01));
                    }        
                } else {
                    if (p.getExp() >= 0.99) {
                        return;
                    } else {
                        p.setExp((float) (p.getExp() + 0.01));
                    }
                }              
            }, 0L, 200L);      
    }
 
Последнее редактирование:
Да он не сильно изменился
Код:
@EventHandler
    public void onPlayerMove(PlayerMoveEvent event){
        final Player p = event.getPlayer();
        
            Bukkit.getScheduler().scheduleSyncRepeatingTask(this, () -> {
                if (p.isSprinting()) {
                    if (p.getExp() <= 0.01) {
                        return;
                    } else {
                        p.setExp((float) (p.getExp() - 0.01));
                    }      
                } else {
                    if (p.getExp() >= 0.99) {
                        return;
                    } else {
                        p.setExp((float) (p.getExp() + 0.01));
                    }
                }            
            }, 0L, 200L);    
    }
Смотри. Ты при каждом движении игрока создаешь для него новый шедулер. И каждый шедулер раз в 200 тиков выполняет всё что внутри него. Допустим событие движения сработало 10 раз. Значит у тебя уже 10 шедулеров с задержкой 200 тиков и это равноценно одному с задержкой в 20 тиков. Когда наверётся 100 шедулеров это уже будет всего 2 тика задержки, что уже очень быстро. Я уже не говорю о том, что наличие такого кол-ва шедулеров дурно сказывается на происводительности.
Тебе надо единожды присваивать шедулер, поэтому можно делать это в событии входа на сервер, например, а не движения.
 
А не легче сделать один общий шедулер, который будет проверять бег?
 
Смотри. Ты при каждом движении игрока создаешь для него новый шедулер. И каждый шедулер раз в 200 тиков выполняет всё что внутри него. Допустим событие движения сработало 10 раз. Значит у тебя уже 10 шедулеров с задержкой 200 тиков и это равноценно одному с задержкой в 20 тиков. Когда наверётся 100 шедулеров это уже будет всего 2 тика задержки, что уже очень быстро. Я уже не говорю о том, что наличие такого кол-ва шедулеров дурно сказывается на происводительности.
Тебе надо единожды присваивать шедулер, поэтому можно делать это в событии входа на сервер, например, а не движения.
Ну, в итоге что-то такое получилось.

Код:
@EventHandler
    public void joinTest(PlayerJoinEvent event){
        BukkitScheduler scheduler = getServer().getScheduler();
        scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
            [USER=79777]@Override[/USER]
            public void run() {
                TestTest(event.getPlayer());
            }
        }, 0L, 20L);  
    }


    public void TestTest (Player p) {
        if (p.isSprinting()) {
           if (p.getExp() <= 0.01) {
               return;
           } else {
              p.setExp((float) (p.getExp() - 0.01));
           }      
        } else {
           if (p.getExp() >= 0.99) {
               return;
           } else {
              p.setExp((float) (p.getExp() + 0.01));
           }
        }
    }
Новые шедулеры вроде не добавляются. Шкала меняется как положено. Спасибо за разъяснение работы шедулера :)
Всецело СПАСИБО, что не оставил без ответа :) Всем остальным тоже большое спасибо :)
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх