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

Версия Minecraft
1.7.10
11
0
Здравствуйте, друзья. Рас, скажем, в час по серверному времени необходимо изменять значение некоторой переменной. Как это можно реализовать?
 
 
@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);
 
Ну да, что то не подумал что 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);
            }
        }
    }
 
Из-за изменяющегося тпс(лаги) подсчет времени через тики может быть ошибочным
 
Назад
Сверху