最近看到巴哈上有人问说Minecraft时间太快要怎么调慢,看到他是说服务器的我第一个想法就是使用插件,啊结果底下都只有说用指令……
原文章
不过说真的,其实我也不知道是一开始没看清楚还是脑袋ㄎㄧㄤ掉,第一个想到的竟然是让Minecraft时间和现实一样,然后看了一下留言发现完全不对,是我想错了。但是突然觉得好有趣哦,就打算着手来试试看。
(附注一下,本人Java新手,如有任何问题请不吝赐教)
然后我就直接打开Intellij IDEA,导入Spigot的repository和dependency。
然后先说说我的设计思路:
首先在plug-in运行的时候先获取当前时间,然后任务调度的方法不断地get现在的时间,转换成Minecraft的时间设置Minecraft的时间,并且还要设置gamerule让游戏不会自己运行时间。
一开始我先找到了设置时间的方法是World.setTime(long l);
然后我就开始思考说long应该是要填入什么数字,于是我就写了一个简简单单的指令/gettime,可以用来获取现在时间。
然后装到服务器里面去试试看,发现到……
时间其实就是和原生Minecraftinecraft的指令/time set后面接的数字一样是0~24000的数字。
因此我更加深了思路,首先先获取当前时间,并且再分别获取小时、分钟、秒钟的数字。因为Minecraft时间是0~24000,相当于现实的24小时,所以我认为用小时*1000再加上用分钟和秒钟互相使用某些运算变成1000进位的时间单位(可能有点难懂,就是1000单位时间会等于1小时的意思),再用刚才乘以1000的小时加上刚刚算出来的时间单位就是我们需要的Minecraft时间。于是稍微再写了一下…
看起来蛮好的,但是一进到Minecraft里面却发现时间不太对劲(忘记截屏了),仔细来再代码发现了奇怪的地方。
UTF+8是什么时区???应该是这边出问题了。试了一下发现到果然是出问题了。
我在写plug-in的时候是晚上9点的时候,所以应该会是21才对。上网找了一下才知道应该是GMT+8而不是UTF+8。
仔细想一想,有一种字符编码叫做UTF-8,应该是和那个搞混了。哦天呐我是白痴吧怎么会和那个搞混 对的你是白痴呢
于是我就把它改成正确的时区了。
然后一试,果然是正确的,确实是21点没错。
试到这边我开始觉得差不多了,开始写起其他功能,像是设置时区的功能、还有config.yml文档。顺便还写了一个设置一个时区时会检测时区是否正确的功能了。
config.yml档:
然后我觉得差不多可以做最后测试的时候,我试了调整时区,JST就是日本标准时间,比我们快1小时。
但是改时区之后发生了奇怪的事情…
欸?怎么快天亮了?现在不是才晚上吗?
用自己写的/gettime发现时间是正确的,那么应该是时间格式搞错了吧?
上网一找才发现时间0对应的现实时间是6:00,也就是说我比现实快了6小时。
于是我让获取小时时再给它减掉6
然后我还发现了刚刚添加的指令都没有返回true还有发message给玩家,所以我又给加了上去。
然后呢有出现错误了。我要改回GMT+8的时候它题是我说这是错误的时区(又忘记截屏了)。what??? 刚刚不是好好的吗?
然后上网找了个方法ZoneId.of(String zoneId)似乎是可行的,于是我把刚刚检测的方式改掉…
如果ZoneId.of(String zoneId)的zoneId有错的话就会抛出错误,所以试着用try-catch写了这样的一个检测方式。
进入游戏测试发现可以改成GMT+8,正当我松了一口气的时候…
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
我当时一整个问号????????????????????????????????
然后看了一下ZoneId的可用的id和TimeZone可用的Id发现到有些许不同。
结果是:
(因为这实在是太长了,所以我把它存到这边了 -> )
总之我后来把两种方法都写上去了
进到游戏测试后,不论是GMT+8还是JST都能使用了。
(Asia/Taipei是台北标准时间)
写到这边才终于把全部的功能写完了,附上一张成果图。
最后终于写完了,我也把写好的plug-in上传到Github供大家看看这作品吧。 -> 作品链接
至于写完后有什么心得吗?
我只想说:
「只有白痴才会写这种无聊的插件吧……」