项目地址

🔗TimeSynchronize

简介

最近受到动森启发,写了一个让现实时间与游戏时间同步的Bukkit插件,其实如果网上有轮子的话也不必大费周章造一个出来,但是网路上现存的最高适用版本只到1.12,而在1.13之后Bukkit有了比较大的变动(不允许多线程),mcbbs上找到的ViosinTime核心代码如下

    public void run() {
        while(!this.stop) {
            Calendar calendar = Calendar.getInstance();
            int hour = calendar.get(11);
            int min = calendar.get(12);
            int time = hour * 1000 + min * 16 - 6000;
            if (time < 0) {
                time = 24000 - time;
            }

            Iterator var5 = this.worlds.iterator();

            while(var5.hasNext()) {
                World world = (World)var5.next();
                long FullTime = world.getFullTime();
                long tickTime = world.getTime();
                if (this.debug) {
                    System.out.println(world.getName() + ":");
                    System.out.println("  FullTime: " + FullTime);
                    System.out.println("  Time: " + tickTime);
                }

                try {
                    world.setFullTime(FullTime - tickTime + (long)time);
                } catch (Exception var13) {
                    var13.printStackTrace();
                }
            }

            try {
                Thread.sleep(this.cooldown);
            } catch (InterruptedException var12) {
                var12.printStackTrace();
            }
        }

    }

其中Thread.sleep(this.cooldown)则是直接会让整个服务端暂停...因此我现学现卖了一些Bukkit的指令,写出了比较简短的代码,相较ViosinTime缺少多世界的时间同步功能(自用的话大概也没有这个问题),同时没有设置指令接口,还是相当早期的版本,不过自用的话问题不大,下面是我的核心代码。

    public void onEnable() {
        BukkitScheduler scheduler = Bukkit.getServer().getScheduler();
        scheduler.scheduleSyncRepeatingTask(this, new Runnable() {

            @Override
            public void run() {
                Calendar calendar = Calendar.getInstance();
                int hour = calendar.get(11);
                int min = calendar.get(12);
                int time = hour * 1000 + min * 16 - 6000;
                if (time < 0) {
                    time = 24000 - time;
                }
                World world = getServer().getWorld("world");
                long FullTime = world.getFullTime();
                long tickTime = world.getTime();
                world.setFullTime(FullTime - tickTime + (long)time);
            }
        }, 0L, 20*60L);
    }

写的比较丑,也就不挂到mcbbs之类的地方了。