LV. 6
GP 2

【心得】最近看到巴哈上的一個文...

樓主 猫村幻影 Huanying04
GP55 BP-

作者標示-非商業性

本授權條款允許使用者重製、散布、傳輸以及修改著作,但不得為商業目的之使用。使用時必須按照著作人指定的方式表彰其姓名。

最近看到巴哈上有人問說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發現到有些許不同。
結果是:
(因為這實在是太長了,所以我把它存到這邊了 -> https://github.com/Huanying04/Huanying04/blob/main/ZoneId%20and%20TimeZone)
總之我後來把兩種方法都寫上去了
進到遊戲測試後,不論是GMT+8還是JST都能使用了。
(Asia/Taipei是台北標準時間)

寫到這邊才終於把全部的功能寫完了,附上一張成果圖。

最後終於寫完了,我也把寫好的plug-in上傳到Github供大家看看這作品吧。 -> 作品連結
至於寫完後有什麼心得嗎?
我只想說:
「只有白痴才會寫這種無聊的插件吧......」
55
-
LV. 6
GP 13
2 樓 貓村幻影 Huanying04
GP5 BP-

作者標示-非商業性

本授權條款允許使用者重製、散布、傳輸以及修改著作,但不得為商業目的之使用。使用時必須按照著作人指定的方式表彰其姓名。

===2020.10.17更新===
感謝大家的回饋,目前已把已知bug修好了

最大的bug莫過於時間卡在同一天,感謝[merakx:璇]指出的bug。
目前已將bug修復了,直接給大家看結果吧
addDay是一個Map,如果時間為0且對應的value為true的話就把time設為24000,並且把addDay對應的value改回true,讓下次時間再回到0時還能繼續使用這功能。

另外,我還順便給調整時區修復了一下
以防將時區調整為比較慢的時區時天數不會跟著減1天。

修改前:
修改後:
5
-
LV. 6
GP 13
3 樓 貓村幻影 Huanying04
GP1 BP-

作者標示-非商業性

本授權條款允許使用者重製、散布、傳輸以及修改著作,但不得為商業目的之使用。使用時必須按照著作人指定的方式表彰其姓名。

又更新了,大略修復了換時區時天數轉換的bug
今天發完文後才發現換時區時天數轉換的程式碼越想越奇怪...然後還真的很奇怪......
(真的會有人想下載來用嗎...?)
1
-
LV. 27
GP 224
4 樓 此間半開一盞茶 chenjinsheng
GP0 BP-

作者標示-非商業性

本授權條款允許使用者重製、散布、傳輸以及修改著作,但不得為商業目的之使用。使用時必須按照著作人指定的方式表彰其姓名。

那我也來做一個好了,純粹手癢..

72星球『SeventyTwo』


Spigot版本: Spigot.1.16.3
JAVA版本: OpenJDK 11.0.8

此插件主要作用:

  • 製作名為SeventyTwo的世界
  • 世界時間流逝為原本的負72倍
  • 無權限、指令

解說:

minecraft 時間為現實世界的72倍,所以放慢72倍與現實流速相同
時間不需要同步沒關係,你晚上躺床一樣可以跳過夜晚,多人要自己去協調
玩家進入伺服器會直接傳送至SeventyTwo的世界,想傳出來用其他插件,自己解決

注意:

有使用NMS所以限定版本,另外我是使用JAVA11寫的,無法以低版本執行
主世界不要設同名子,主世界無法被變更,這樣會報錯

載點:


歷史:

V.0
初始版本。

V.1
可設定流速版本。

V.2
可加速版本。
0
-
未登入的勇者,要加入 5 樓的討論嗎?
板務人員:

1315 筆精華,昨天 更新
一個月內新增 3
歡迎加入共同維護。


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】