Серверное время

Версия Minecraft
1.7.10
11
0
Здравствуйте, друзья. Рас, скажем, в час по серверному времени необходимо изменять значение некоторой переменной. Как это можно реализовать?
 

tox1cozZ

aka Agravaine
8,455
598
2,892
 
243
28
202
@Tiron, настоятельно рекомендую использовать актуальные возможности java:

Для выполнения отложенных задач или задач с переодическим выполнением используй планировщик ScheduledExecutorService:
Java:
        //планировщик
        ScheduledExecutorService schedulerService = Executors.newScheduledThreadPool(1);

        //таск
        Runnable task = ()->{
            //your code here
        };

        //планировка выполнения каждый час со стартовой задержкой в 1 час
        schedulerService.scheduleAtFixedRate(task, 1L, 1L, TimeUnit.HOURS);

Для точной работы со временем и планирования выполнения задач в определённое время используй новое Time API java 1.8:
Java:
        ZonedDateTime
        currentTime = ZonedDateTime.now(ZoneId.of("Europe/Moscow")),
        initialExecutionTime = currentTime.plusHours(1L).withMinute(0).withSecond(0);

        long initalDelaySeconds = Duration.between(currentTime, initialExecutionTime).getSeconds();

        //планировка выполнения каждый час со стартом в начале слудующего часа
        schedulerService.scheduleAtFixedRate(task, initalDelaySeconds, TimeUnit.HOURS.toSeconds(1L), TimeUnit.SECONDS);

Учти что ExecutorService использует собственные потоки, так что весь потоконебезопасный код нужно отдавать на выполнение майнопотокам (код для 1.12.2, 1.7.10 нет под рукой):
Java:
        Runnable task;
      
        //server
        FMLCommonHandler.instance().getMinecraftServerInstance().addScheduledTask(task);
      
        //client
        Minecraft.getMinecraft().addScheduledTask(task);

Т.е. код внутри твоего таска (Runnable, Callable) для ScheduledExecutorService должен быть передан планировщику майна:
Java:
        Runnable task = ()->{
            FMLCommonHandler.instance().getMinecraftServerInstance().addScheduledTask(()->{
                //your server code here
            });
        };

        schedulerService.scheduleAtFixedRate(task, 1L, 1L, TimeUnit.HOURS);
 
243
28
202
Ну да, что то не подумал что ExecutorService это оверкил для изменения одной переменной переменной...
Для этого впринципе достаточно ServerTickEvent, однако на мой взгляд лучше не считать тики, а создавать переменную типа timestamp и сравнивать его с текущим временем и выполнять что нужно:
Java:
    private boolean running;

    private long nextExecutionTime;

    //запуск
    public void start() {
        this.nextExecutionTime = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(1L);
        this.running = true;
    }

    //в тикире
    public void run() {
        if (this.running) {
            if (System.currentTimeMillis() >= this.nextExecutionTime) {
                //выполнение периодической задачи
                
                this.nextExecutionTime = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(1L);
            }
        }
    }
 
7,099
324
1,510
Из-за изменяющегося тпс(лаги) подсчет времени через тики может быть ошибочным
 
Сверху