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

Интервалы времени!

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

Статус темы:
Закрыта.
  1. Автор темы
    AlexMor

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

    Баллы:
    66
    Здравствуйте, никак не могу понять как задать время и чтоб оно отслеживалось!
    Мне нужно сделать так чтоб каждый час (допустим) у игрока снимали деньги, а так же при вводе команды /wc info в чат выводилось сколько времени до списания осталось ( минуты:секунды ), как можно оформить такой счетчик?
     
  2. Хостинг MineCraft
    <
  3. Dymeth

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

    Баллы:
    76
    Запускаешь баккитовский шедулей, выполняющий код раз в минуту, например. Добавляешь счётчик. При каждом выполнении кода шедулером прибавляешь счётчику единицу. Как только счётчк достигает 60-и (60 выполнений, 60 минут, 1 час), выполняешь нужные действия.
    При вводе команды выводишь на экран значение счётчика.
    Если нужно считать ещё и секунды, то период шедулера должен составлять секунду, естественно.
    Для удобства можешь считать не от нуля до нужного количества, а наоборот - от максимума до нуля. При этом при выполнении кода шедулера нужно будет отнимать единицу, а не прибавлять. И, соответственно, проверять счётчик нужно будет уже именно на 0.
    Если нужно, не забудь сохранять куда-то счётчики игроков при выключении плагина и загружать при включении.
     
  4. alexandrage

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

    Баллы:
    173
    Skype:
    alexandr0116
    Тут таймер нужен, жедулер на тиках и они не ровны времени.
     
  5. Автор темы
    AlexMor

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

    Баллы:
    66
    Куда я могу сохранить счетчик? Config наверное не лучшая идея...
     
  6. alexandrage

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

    Баллы:
    173
    Skype:
    alexandr0116
    По файлу на игрока. Так не будет потерь в производительности. Сейвишь только при выходе игрока и выключение сервера.
     
  7. Dymeth

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

    Баллы:
    76
    Задержка не очень большая будет, если сервер не на калькуляторе стоит. Да и потом ещё с асинхронкой возиться... Можно, конечно, и поток создать, но особого смысла не вижу в данном случае.
    Зависит от конечной задачи. Можно хоть в yml, хоть в БД хранить, хоть свой формат сделать - самостоятельно сохранять, а потом загружать и парсить. Вопрос в том, нужно ли счётчики всех игроков всегда в оперативной памяти хранить на сервере.
     
  8. alexandrage

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

    Баллы:
    173
    Skype:
    alexandr0116
    Не придется. А смысл тут большой, ибо отклонение от времени будет большое.[DOUBLEPOST=1481913343,1481913214][/DOUBLEPOST]Да и как ты будешь писать точное время до окончания? Тпшатся в будущее?
     
  9. Dymeth

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

    Баллы:
    76
    Секунд 5, не больше, думаю...
    В счётчике можно хранить оставшееся время, как я уже писал выше.
     
  10. alexandrage

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

    Баллы:
    173
    Skype:
    alexandr0116
    Тики не время они не переменные по времени. Хранить он будет...
     
  11. AtomicInteger

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

    Баллы:
    46
    Зависит ещё от сборки.Если, например, сборка с 90+ модов, то отследить все лаго-блоки очень трудно.Иногда получается так что игрок сам того не зная, поставил какой-нибудь блок из говномода, тпс резко упал, вовремя не подняли и всё, кроме лагов ещё проблем прибавилось.
     
  12. Dymeth

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

    Баллы:
    76
    А что мешает создать счётчик-то? Без него, в общем-то, вообще никак и не выполнить поставленную задачу.
    Ну это уж совсем плохо. Тут уже разницы - использовать шедулер или создавать поток. По-любому у проца жизнь не из лёгких...
     
  13. alexandrage

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

    Баллы:
    173
    Skype:
    alexandr0116
    Потом игрок будет охреневать, что оставшееся время в минусе :D.
     
  14. Dymeth

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

    Баллы:
    76
    С чего оно в минусе будет, если сбрасывается при нуле на максимальное значение (10 минут в данном случае)?
     
  15. alexandrage

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

    Баллы:
    173
    Skype:
    alexandr0116
    С того, что пройдет больше часа, перед обновлением счетчика.[DOUBLEPOST=1481914328,1481914196][/DOUBLEPOST]
    Код:
            long l = System.currentTimeMillis()+5000;
            for(;;) {
                if(System.currentTimeMillis()>l) {
                    System.out.println("ok");
                    l=System.currentTimeMillis()+5000;
                }
            }
    Даже при самом наипнувшемся кпу не будет критичных потерь.
     
  16. Dymeth

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

    Баллы:
    76
    А, стоп, час... Что-то мне плелось, что 10 минут.
    Но суть-то от этого не меняется. Счётчик достигает нуля - сбрасываем на час (20 * 60 * 60).
    Или есть другие предложения? Можно хранить timestamp, можно Date. Но проще всего будет именно с таким счётчиком, про который я писал выше.
    Если так рассуждать, то и сервер бы не лагал, раз критичных потерь нет.
    Речь об асинхронном доступе к BukkitAPI.
     
  17. alexandrage

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

    Баллы:
    173
    Skype:
    alexandr0116
    Вообще не в тему.
     
  18. Автор темы
    AlexMor

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

    Баллы:
    66
    А как мне быть? можно наглядный код ваших предложений, на словах я ничего не понял...
     
  19. Dymeth

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

    Баллы:
    76
    В смысле?
    Я предлагаю Bukkit.getScheduler().scheduleSyncRepeatingTask(Plugin instance, Runnable run, long delay, long period),
    alexandrage предлагает new Thread(Runnable run).start()
     
  20. AtomicInteger

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

    Баллы:
    46
    Получай системное время и сравнивай его когда нужно, как выше написали.
     
  21. Автор темы
    AlexMor

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

    Баллы:
    66
    в твоем случае, "Bukkit.getScheduler().scheduleSyncRepeatingTask(Plugin instance, Runnable run, long delay, long period)" можно писать в любом классе? И задачи после этого метода будут исполняться или как? И что означают instance, run, delay, periad ?
     
Статус темы:
Закрыта.

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