Войти или зарегистрироваться

Помогите Смена значения в определенное время

Noctural

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
TheNoctural
Плагин как плейсхолдер расширение, когда вызивается плейсхолдер проверяется время, если сейчас 00:00, тогда вернуть значение с +1 к текущему, если нет тогда обычное число, но, не знаю успеет ли код выполниться, поэтому надежность этого вызивает сомнения, если проверять промежуточное время между сейчас и 00:00, тогда код выполниться несколько раз, а нужно лишь один раз добавить +1 к текущему числу, пытался поискать про "паузу" или какую нибудь задержку, но не смог найти. Поэтому решил спросить у более опытных, какой лучший путь для этого?

код для примера:
if (identifier.equals("years")) {
if (LocalTime.now().getHour() + LocalTime.now().getMinute() +LocalTime.now().getSecond() == 0) {
return String.valueOf(int1 + 1);
}
}
 
Если небольшая задержка не критична - можешь запустить шедулер с задержкой в нужное кол-во тиков. Но чем больше лагает сервер - тем больше будет задержка отработки такого шедулера.

Если нужна точность - можно запускать шедулер раз в секунду и каждый раз проверять, что наступило нужное тебе время
 
Если небольшая задержка не критична - можешь запустить шедулер с задержкой в нужное кол-во тиков. Но чем больше лагает сервер - тем больше будет задержка отработки такого шедулера.

Если нужна точность - можно запускать шедулер раз в секунду и каждый раз проверять, что наступило нужное тебе время
они ведь запускаются несколько раз? просто я пробововал, и когда таб быстрее обновляется шелудера, то шелудеров со временем больше стает, или нет?
 
Задержка тут тебе не понадобиться.
тоесть вот это:
if (LocalTime.now().getHour() + LocalTime.now().getMinute() +LocalTime.now().getSecond() == 0) {
return String.valueOf(int1 + 1);
}
должно работать и успевать в иф попадать в 00:00?
 
они ведь запускаются несколько раз? просто я пробововал, и когда таб быстрее обновляется шелудера, то шелудеров со временем больше стает, или нет?
Шедулеров запускается ровно столько, сколько их запускаешь ты. Сами по себе они не запускаются
 
Шедулеров запускается ровно столько, сколько их запускаешь ты. Сами по себе они не запускаются
ну таб обновляется быстрее чем шелудер, в итоге они накапливаются
 
Шедулеров запускается ровно столько, сколько их запускаешь ты. Сами по себе они не запускаются
только когда попытался разобраться в этом, получилось) я сначала пытался запустить шелудер в onRequest при вызове плейсхолдера, но уже запускаю шелудер при запуске сервера, шелудер сам подстраивается под время или нет? тоесть если он запустился в 14:24:51, прошло 20 тиков, будет 14:25:51 или 14:25/14:26? я запускал каждые 10 тиков проверку на время (0:00), и я заметил что оно два раза смогло вернуть true в проверке, тоесть нужно точно каждые 20 тиков запускать, или лучше каждые 15 тиков?
 
только когда попытался разобраться в этом, получилось) я сначала пытался запустить шелудер в onRequest при вызове плейсхолдера, но уже запускаю шелудер при запуске сервера, шелудер сам подстраивается под время или нет? тоесть если он запустился в 14:24:51, прошло 20 тиков, будет 14:25:51 или 14:25/14:26? я запускал каждые 10 тиков проверку на время (0:00), и я заметил что оно два раза смогло вернуть true в проверке, тоесть нужно точно каждые 20 тиков запускать, или лучше каждые 15 тиков?
1 тик = 50 мс. Но так только при стабильной работе сервера. Если начинает пролагивать, то продолжительность тика увеличивается. Таким образом, задача шедулера вполне может быть выполнена позже того времени, на которое ты рассчитываешь
 
1 тик = 50 мс. Но так только при стабильной работе сервера. Если начинает пролагивать, то продолжительность тика увеличивается. Таким образом, задача шедулера вполне может быть выполнена позже того времени, на которое ты рассчитываешь
всегда стабильно без просадок, 20 тиков будет как раз?
 
всегда стабильно без просадок, 20 тиков будет как раз?
Если сервер работает абсолютно стабильно, то в секунде 20 тиков. Но на длительных временных промежутках все равно будут заметны отставания
 
Если сервер работает абсолютно стабильно, то в секунде 20 тиков. Но на длительных временных промежутках все равно будут заметны отставания
ну тут всеравно на оставания, главное что бы оно переключило год, через секунду или когда, но главное что бы уловило 00:00 и переключило время
 
ну тут всеравно на оставания, главное что бы оно переключило год, через секунду или когда, но главное что бы уловило 00:00 и переключило время
Ну, пробуй тогда. Варианты реализации описывал выше
 
Ну, пробуй тогда. Варианты реализации описывал выше
пробовал, запускал каждые 20 тиков шелудер, иногда получаются неточности, не понимаю почему т.к не могу уследить каждую ночь
 
20 тиков шедуллер - глупость. Проще получать текущее время в милисекундах и время которое будет в 00:00, получить разницу и запускать TimerTask, когда он сработает как раз будет 00:00.
Я бы так сделал.
Плюсом, не будет зависеть от тиков, поэтому неточности пропадут.
 
20 тиков шедуллер - глупость. Проще получать текущее время в милисекундах и время которое будет в 00:00, получить разницу и запускать TimerTask, когда он сработает как раз будет 00:00.
Я бы так сделал.
Плюсом, не будет зависеть от тиков, поэтому неточности пропадут.
это каждый день будет работать?
 
пробовал, запускал каждые 20 тиков шелудер, иногда получаются неточности, не понимаю почему т.к не могу уследить каждую ночь

20 тиков шедуллер - глупость. Проще получать текущее время в милисекундах и время которое будет в 00:00, получить разницу и запускать TimerTask, когда он сработает как раз будет 00:00.
Я бы так сделал.
Плюсом, не будет зависеть от тиков, поэтому неточности пропадут.

Ровно в 00:00 не сработает. Только с некоторой задержкой, потому что далеко не всегда 20 тиков - это секунда. Даже если каждую секунду так проверять, то может не сработать ровно в 00:00:00.
Поэтому вместо == нужно при помощи >= время сравнивать.

Прост если зациклить проверку, пустить раз в минуту или раз в секунду, то задержка будет существенно меньше.

Но если задержка в 5-10-20 минут не критична, то можно и без регулярных проверок, а прост отложенный таск.

Ещё для точности можно использовать ServiceExecutor вместо BukkitScheduler, но для текущей задачи практически не вижу в нём смысла
 
Ровно в 00:00 не сработает. Только с некоторой задержкой, потому что далеко не всегда 20 тиков - это секунда. Даже если каждую секунду так проверять, то может не сработать ровно в 00:00:00.
Поэтому вместо == нужно при помощи >= время сравнивать.

Прост если зациклить проверку, пустить раз в минуту или раз в секунду, то задержка будет существенно меньше.

Но если задержка в 5-10-20 минут не критична, то можно и без регулярных проверок, а прост отложенный таск.

Ещё для точности можно использовать ServiceExecutor вместо BukkitScheduler, но для текущей задачи практически не вижу в нём смысла
если я правильно понял просто проверять если текущее время в районе 12:55 - 00:05?
 
если я правильно понял просто проверять если текущее время в районе 12:55 - 00:05?
Ну, раньше времени точно не выполнится. А вот верхнюю границу я бы не ставил. Получится условие типа time >= 01:00
 
Назад
Верх