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

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

AlexMor

Активный участник
Пользователь
Баллы
76
Здравствуйте, никак не могу понять как задать время и чтоб оно отслеживалось!
Мне нужно сделать так чтоб каждый час (допустим) у игрока снимали деньги, а так же при вводе команды /wc info в чат выводилось сколько времени до списания осталось ( минуты:секунды ), как можно оформить такой счетчик?
 
Запускаешь баккитовский шедулей, выполняющий код раз в минуту, например. Добавляешь счётчик. При каждом выполнении кода шедулером прибавляешь счётчику единицу. Как только счётчк достигает 60-и (60 выполнений, 60 минут, 1 час), выполняешь нужные действия.
При вводе команды выводишь на экран значение счётчика.
Если нужно считать ещё и секунды, то период шедулера должен составлять секунду, естественно.
Для удобства можешь считать не от нуля до нужного количества, а наоборот - от максимума до нуля. При этом при выполнении кода шедулера нужно будет отнимать единицу, а не прибавлять. И, соответственно, проверять счётчик нужно будет уже именно на 0.
Если нужно, не забудь сохранять куда-то счётчики игроков при выключении плагина и загружать при включении.
 
Запускаешь баккитовский шедулей, выполняющий код раз в минуту, например. Добавляешь счётчик. При каждом выполнении кода шедулером прибавляешь счётчику единицу. Как только счётчк достигает 60-и (60 выполнений, 60 минут, 1 час), выполняешь нужные действия.
При вводе команды выводишь на экран значение счётчика.
Если нужно считать ещё и секунды, то период шедулера должен составлять секунду, естественно.
Для удобства можешь считать не от нуля до нужного количества, а наоборот - от максимума до нуля. При этом при выполнении кода шедулера нужно будет отнимать единицу, а не прибавлять. И, соответственно, проверять счётчик нужно будет уже именно на 0.
Если нужно, не забудь сохранять куда-то счётчики игроков при выключении плагина и загружать при включении.
Тут таймер нужен, жедулер на тиках и они не ровны времени.
 
Запускаешь баккитовский шедулей, выполняющий код раз в минуту, например. Добавляешь счётчик. При каждом выполнении кода шедулером прибавляешь счётчику единицу. Как только счётчк достигает 60-и (60 выполнений, 60 минут, 1 час), выполняешь нужные действия.
При вводе команды выводишь на экран значение счётчика.
Если нужно считать ещё и секунды, то период шедулера должен составлять секунду, естественно.
Для удобства можешь считать не от нуля до нужного количества, а наоборот - от максимума до нуля. При этом при выполнении кода шедулера нужно будет отнимать единицу, а не прибавлять. И, соответственно, проверять счётчик нужно будет уже именно на 0.
Если нужно, не забудь сохранять куда-то счётчики игроков при выключении плагина и загружать при включении.
Куда я могу сохранить счетчик? Config наверное не лучшая идея...
 
Тут таймер нужен, жедулер на тиках и они не ровны времени.
Задержка не очень большая будет, если сервер не на калькуляторе стоит. Да и потом ещё с асинхронкой возиться... Можно, конечно, и поток создать, но особого смысла не вижу в данном случае.
Куда я могу сохранить счетчик? Config наверное не лучшая идея...
Зависит от конечной задачи. Можно хоть в yml, хоть в БД хранить, хоть свой формат сделать - самостоятельно сохранять, а потом загружать и парсить. Вопрос в том, нужно ли счётчики всех игроков всегда в оперативной памяти хранить на сервере.
 
Задержка не очень большая будет, если сервер не на калькуляторе стоит. Да и потом ещё с асинхронкой возиться... Можно, конечно, и поток создать, но особого смысла не вижу в данном случае.
Не придется. А смысл тут большой, ибо отклонение от времени будет большое.
Да и как ты будешь писать точное время до окончания? Тпшатся в будущее?
 
Не придется. А смысл тут большой, ибо отклонение от времени будет большое.
Секунд 5, не больше, думаю...
Да и как ты будешь писать точное время до окончания? Тпшатся в будущее?
В счётчике можно хранить оставшееся время, как я уже писал выше.
 
Секунд 5, не больше, думаю...

В счётчике можно хранить оставшееся время, как я уже писал выше.
Зависит ещё от сборки.Если, например, сборка с 90+ модов, то отследить все лаго-блоки очень трудно.Иногда получается так что игрок сам того не зная, поставил какой-нибудь блок из говномода, тпс резко упал, вовремя не подняли и всё, кроме лагов ещё проблем прибавилось.
 
Тики не время они не переменные по времени. Хранить он будет...
А что мешает создать счётчик-то? Без него, в общем-то, вообще никак и не выполнить поставленную задачу.
Зависит ещё от сборки.Если, например, сборка с 90+ модов, то отследить все лаго-блоки очень трудно.Иногда получается так что игрок сам того не зная, поставил какой-нибудь блок из говномода, тпс резко упал, вовремя не подняли и всё, кроме лагов ещё проблем прибавилось.
Ну это уж совсем плохо. Тут уже разницы - использовать шедулер или создавать поток. По-любому у проца жизнь не из лёгких...
 
Зависит ещё от сборки.Если, например, сборка с 90+ модов, то отследить все лаго-блоки очень трудно.Иногда получается так что игрок сам того не зная, поставил какой-нибудь блок из говномода, тпс резко упал, вовремя не подняли и всё, кроме лагов ещё проблем прибавилось.
Потом игрок будет охреневать, что оставшееся время в минусе :D.
 
Потом игрок будет охреневать. что оставшееся время в минусе :D.
С чего оно в минусе будет, если сбрасывается при нуле на максимальное значение (10 минут в данном случае)?
 
С чего оно в минусе будет, если сбрасывается при нуле на максимальное значение (10 минут в данном случае)?
С того, что пройдет больше часа, перед обновлением счетчика.
Ну это уж совсем плохо. Тут уже разницы - использовать шедулер или создавать поток. По-любому у проца жизнь не из лёгких...
Java:
        long l = System.currentTimeMillis()+5000;
        for(;;) {
            if(System.currentTimeMillis()>l) {
                System.out.println("ok");
                l=System.currentTimeMillis()+5000;
            }
        }
Даже при самом наипнувшемся кпу не будет критичных потерь.
 
С того, что пройдет больше часа, перед обновлением счетчика.
А, стоп, час... Что-то мне плелось, что 10 минут.
Но суть-то от этого не меняется. Счётчик достигает нуля - сбрасываем на час (20 * 60 * 60).
Или есть другие предложения? Можно хранить timestamp, можно Date. Но проще всего будет именно с таким счётчиком, про который я писал выше.
Даже при самом наипнувшемся кпу не будет критичных потерь.
Если так рассуждать, то и сервер бы не лагал, раз критичных потерь нет.
Задержка не очень большая будет, если сервер не на калькуляторе стоит. Да и потом ещё с асинхронкой возиться...
Не придется. А смысл тут большой, ибо отклонение от времени будет большое.
Речь об асинхронном доступе к BukkitAPI.
 
А, стоп, час... Что-то мне плелось, что 10 минут.
Но суть-то от этого не меняется. Счётчик достигает нуля - сбрасываем на час (20 * 60 * 60).
Или есть другие предложения?

Если так рассуждать, то и сервер бы не лагал, раз критичных потерь нет.


Речь об асинхронном доступе к BukkitAPI.
Вообще не в тему.
 
А как мне быть? можно наглядный код ваших предложений, на словах я ничего не понял...
 
Вообще не в тему.
В смысле?
А как мне быть? можно наглядный код ваших предложений, на словах я ничего не понял...
Я предлагаю Bukkit.getScheduler().scheduleSyncRepeatingTask(Plugin instance, Runnable run, long delay, long period),
alexandrage предлагает new Thread(Runnable run).start()
 
В смысле?

Я предлагаю Bukkit.getScheduler().scheduleSyncRepeatingTask(Plugin instance, Runnable run, long delay, long period),
alexandrage предлагает new Thread(Runnable run).start()
в твоем случае, "Bukkit.getScheduler().scheduleSyncRepeatingTask(Plugin instance, Runnable run, long delay, long period)" можно писать в любом классе? И задачи после этого метода будут исполняться или как? И что означают instance, run, delay, periad ?
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх