最近看到巴哈上有人問說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供大家看看這作品吧。 -> 作品鏈接
至於寫完後有什麼心得嗎?
我只想說:
「只有白痴才會寫這種無聊的插件吧……」