1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

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

  1. Автор темы
    Noctural

    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);
    }
    }
     
  2. Dymeth

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

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

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

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

    Баллы:
    66
    Имя в Minecraft:
    TheNoctural
    они ведь запускаются несколько раз? просто я пробововал, и когда таб быстрее обновляется шелудера, то шелудеров со временем больше стает, или нет?
     
  4. alexandrage

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

    Баллы:
    173
    Задержка тут тебе не понадобиться.
     
  5. Автор темы
    Noctural

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

    Баллы:
    66
    Имя в Minecraft:
    TheNoctural
    тоесть вот это:
    if (LocalTime.now().getHour() + LocalTime.now().getMinute() +LocalTime.now().getSecond() == 0) {
    return String.valueOf(int1 + 1);
    }
    должно работать и успевать в иф попадать в 00:00?
     
  6. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Шедулеров запускается ровно столько, сколько их запускаешь ты. Сами по себе они не запускаются
     
  7. Автор темы
    Noctural

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

    Баллы:
    66
    Имя в Minecraft:
    TheNoctural
    ну таб обновляется быстрее чем шелудер, в итоге они накапливаются
     
  8. Автор темы
    Noctural

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

    Баллы:
    66
    Имя в Minecraft:
    TheNoctural
    только когда попытался разобраться в этом, получилось) я сначала пытался запустить шелудер в onRequest при вызове плейсхолдера, но уже запускаю шелудер при запуске сервера, шелудер сам подстраивается под время или нет? тоесть если он запустился в 14:24:51, прошло 20 тиков, будет 14:25:51 или 14:25/14:26? я запускал каждые 10 тиков проверку на время (0:00), и я заметил что оно два раза смогло вернуть true в проверке, тоесть нужно точно каждые 20 тиков запускать, или лучше каждые 15 тиков?
     
  9. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    1 тик = 50 мс. Но так только при стабильной работе сервера. Если начинает пролагивать, то продолжительность тика увеличивается. Таким образом, задача шедулера вполне может быть выполнена позже того времени, на которое ты рассчитываешь
     
  10. Автор темы
    Noctural

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

    Баллы:
    66
    Имя в Minecraft:
    TheNoctural
    всегда стабильно без просадок, 20 тиков будет как раз?
     
  11. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Если сервер работает абсолютно стабильно, то в секунде 20 тиков. Но на длительных временных промежутках все равно будут заметны отставания
     
  12. Автор темы
    Noctural

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

    Баллы:
    66
    Имя в Minecraft:
    TheNoctural
    ну тут всеравно на оставания, главное что бы оно переключило год, через секунду или когда, но главное что бы уловило 00:00 и переключило время
     
  13. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Ну, пробуй тогда. Варианты реализации описывал выше
     
  14. Автор темы
    Noctural

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

    Баллы:
    66
    Имя в Minecraft:
    TheNoctural
    пробовал, запускал каждые 20 тиков шелудер, иногда получаются неточности, не понимаю почему т.к не могу уследить каждую ночь
     
  15. OJIEKCAHDP

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

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

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

    Баллы:
    66
    Имя в Minecraft:
    TheNoctural
    это каждый день будет работать?
     
  17. OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Как поставишь, я же не знаю на когда тебе нужно. Просто вычитаешь время в миллисекундах до определённой даты - профит.
     
  18. Dymeth

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

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

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

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

    Ещё для точности можно использовать ServiceExecutor вместо BukkitScheduler, но для текущей задачи практически не вижу в нём смысла
     
  19. Автор темы
    Noctural

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

    Баллы:
    66
    Имя в Minecraft:
    TheNoctural
    если я правильно понял просто проверять если текущее время в районе 12:55 - 00:05?
     
  20. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Ну, раньше времени точно не выполнится. А вот верхнюю границу я бы не ставил. Получится условие типа time >= 01:00
     

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