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

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

Discussion in 'Разработка плагинов для новичков' started by Listvli, May 3, 2017.

Thread Status:
Not open for further replies.
  1. Автор темы
    Listvli

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

    Trophy Points:
    66
    Имя в Minecraft:
    ListvliLiveGames
    Здравсвуйте. Имею следующий код:

    Code:
    [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:
     
    Last edited: May 3, 2017
  2. Хостинг MineCraft
    <
  3. OsipXD

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

    Trophy Points:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Добавь подсветку синаксиса [сode=Java]
     
  4. Larin

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

    Trophy Points:
    103
    Должно быть так:
    Code:
    if(p.isSpringting()) {
    Если бежит
    } else {
    Если не бежит
    }
     
  5. OsipXD

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

    Trophy Points:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Что-то типа
    Code:
    @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[DOUBLEPOST=1493810697,1493810349][/DOUBLEPOST]Только не понял зачем ты делаешь testArrayList.remove(p.getName());
    Это ж наплодится куча шедулеров для каждого игрока.
     
  6. Автор темы
    Listvli

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

    Trophy Points:
    66
    Имя в Minecraft:
    ListvliLiveGames
    Да, верно. Спасибо. Не понимаю, почему я ранее не догадался так сделать.[DOUBLEPOST=1493817678,1493816686][/DOUBLEPOST]
    Есть один очень интересный момент. Не знаю как плагин приходит к такому, ибо не понимаю в шедулерах и только сегодня я до него добрался. Суть в том, что вначале, шкала опыта меняется нормально. Так, как узазано в параметрах получения и отнимания опыта(то бишь все медленно и приятно). Но спустя какое-то время, данная шкала летает как ракета. После перезахода снова медленная.
     
  7. OsipXD

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

    Trophy Points:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Это как раз из-за строки testArrayList.remove(p.getName());
    Из-за неё с каждым движение создаётся новый шедулер и таким образом на игрока навешивается всё больше и больше шедулеров. А когда он перезаходит все заново
    Её уберешь и всё будет нормально.[DOUBLEPOST=1493817984][/DOUBLEPOST]Надо еще в шедулер добавить проверку условия, что игрок не вышел с сервера. Иначе можно получить NPE
     
  8. Автор темы
    Listvli

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

    Trophy Points:
    66
    Имя в Minecraft:
    ListvliLiveGames
    npe вроде не выбивает. А так вроде все стало нормально. Спасибо. В принципе понял как работает шедулер. Благодарствую)[DOUBLEPOST=1493819269,1493819161][/DOUBLEPOST]Единственное, что смущает - это вечный мессадж
    Code:
    Can't keep up! Did the system time change, or is the server overloaded? Running 2139ms behind, skipping 42 tick(s)
    после reload. До шедулера такого не было. Это нормально?[DOUBLEPOST=1493819662][/DOUBLEPOST]Зачеркиваю свои слова про то, что со скоростью шкалы все в норме. Все так же плохо. remove листа убрал.
     
  9. OsipXD

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

    Trophy Points:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Это не нормально. Это как раз из-за того, что у тебя плодились шедулеры в бешеном количестве.
     
  10. TheZefirrkka

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

    Trophy Points:
    76
    Skype:
    RomaMamkinHasker1337
    Имя в Minecraft:
    TheZefirrkka
  11. Автор темы
    Listvli

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

    Trophy Points:
    66
    Имя в Minecraft:
    ListvliLiveGames
    Убрал лист, и ремув ему ставил)
    Шкала опыта летает как ракета после трех-четырех гоняния этой шкалы в разные стороны)
    Это как так вообще)[DOUBLEPOST=1493838279,1493838238][/DOUBLEPOST]
    Это все не то, ибо надо именно на шкалу опыта. Да и разобраться надо самому до конца, а так уже готовенькое. Не то.
     
  12. Автор темы
    Listvli

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

    Trophy Points:
    66
    Имя в Minecraft:
    ListvliLiveGames
    По-моему, данный раздел форума предназначен для помощи новичкам, а не нравоучениям.
     
  13. Автор темы
    Listvli

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

    Trophy Points:
    66
    Имя в Minecraft:
    ListvliLiveGames
    Если так лень, то можешь хотя бы направить? Может придумаю что. У самого сейчас, правда, голова болит. Но позаниматься никогда не вредно
     
  14. TheZefirrkka

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

    Trophy Points:
    76
    Skype:
    RomaMamkinHasker1337
    Имя в Minecraft:
    TheZefirrkka
    Код новый дай
     
  15. Автор темы
    Listvli

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

    Trophy Points:
    66
    Имя в Minecraft:
    ListvliLiveGames
    Да он не сильно изменился
    Code:
    @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);      
        }
     
    Last edited: May 3, 2017
  16. OsipXD

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

    Trophy Points:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Смотри. Ты при каждом движении игрока создаешь для него новый шедулер. И каждый шедулер раз в 200 тиков выполняет всё что внутри него. Допустим событие движения сработало 10 раз. Значит у тебя уже 10 шедулеров с задержкой 200 тиков и это равноценно одному с задержкой в 20 тиков. Когда наверётся 100 шедулеров это уже будет всего 2 тика задержки, что уже очень быстро. Я уже не говорю о том, что наличие такого кол-ва шедулеров дурно сказывается на происводительности.
    Тебе надо единожды присваивать шедулер, поэтому можно делать это в событии входа на сервер, например, а не движения.
     
  17. TheZefirrkka

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

    Trophy Points:
    76
    Skype:
    RomaMamkinHasker1337
    Имя в Minecraft:
    TheZefirrkka
    А не легче сделать один общий шедулер, который будет проверять бег?
     
  18. Автор темы
    Listvli

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

    Trophy Points:
    66
    Имя в Minecraft:
    ListvliLiveGames
    Ну, в итоге что-то такое получилось.

    Code:
    @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));
               }
            }
        }
    Новые шедулеры вроде не добавляются. Шкала меняется как положено. Спасибо за разъяснение работы шедулера :)
    Всецело СПАСИБО, что не оставил без ответа :) Всем остальным тоже большое спасибо :)
     
  19. TheZefirrkka

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

    Trophy Points:
    76
    Skype:
    RomaMamkinHasker1337
    Имя в Minecraft:
    TheZefirrkka
    :oops:, закрой тему.
     
Thread Status:
Not open for further replies.

Share This Page