项目地址
简介
最近受到动森启发,写了一个让现实时间与游戏时间同步的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之类的地方了。
Comments | NOTHING