情況:我有一張玩了很久的Minecraft基岩版地圖,想要將其變成多人地圖,除了方便我在電腦和手機隨時玩以外,也方便多人連線。
那麼最直接的作法就是架BDS伺服器了。BDS是Mojang官方開發的原味生存伺服器軟體,相容Minecraft最新版本。不論是Android、iOS、Windows還是主機版的地圖,都可以用BDS軟體將其變成多人伺服器。
BDS伺服器有點像在自架Realms,自行準備伺服器硬體,再把世界/地圖上傳到私人BDS伺服器,就可以遠端遊玩了,還能設定備份規則自動備份世界。
注意:單人世界轉成多人世界後,伺服器只要開著,世界時間就會一直流逝。
1. 架設BDS伺服器#
我使用Linux系統+Docker架設,跑在樹莓派上: 以Docker架設Minecraft基岩版BDS伺服器
如果想用Windows系統架設,請參考這篇: Minecraft基岩版BDS伺服器架設教學 & 通訊埠轉發
試跑的時候伺服器會產生一個世界,請將BDS伺服器關閉,之後刪除該世界的目錄。
2. 將單人地圖遷移到BDS伺服器#
重要:如果你在玩單人世界的時候,沒有登入Xbox帳號,那麼在轉成伺服器地圖前,請將玩家身上所有東西取出,放到箱子裡面保管,否則身上的物品會消失。(這個有辦法補救,見後文)
參考 Minecraft世界存放位置,取出地圖目錄
比方說我的是Android版,利用電腦MTP找到世界目錄,複製到電腦上。一個地圖的目錄應該有這些檔案:
MyWorld
│ ├── db
│ ├── level.dat
│ ├── levelname.txt
│ └── world_icon.jpeg
- 地圖的目錄名稱不要有等號結尾,把它放到BDS伺服器的資料目錄。例如我使用scp指令上傳到樹莓派:
scp -r "/home/user/下載/MyWorld" "[email protected]:/home/user/minecraft_bds_server/worlds"
- 編輯BDS伺服器的
server.properties
,如下修改
# 設定遊戲模式
gamemode=survival
# 困難度
difficulty=normal
# 要讀取的世界目錄名稱
level-name=MyWorld
# 預設加入的玩家權限
default-player-permission-level=member
啟動BDS伺服器,接著就可以在任意Minecraft基岩版的伺服器界面,輸入IP連線了。
使用
docker logs <容器ID>
指令,玩家連線進來的時候就會顯示名字和xuid。接著強化伺服器安全性,編輯
server.properties
,啟用白名單機制
white-list=true
- 編輯
whitelist.json
,設定白名單玩家,填入Xbox ID
[
{
"ignoresPlayerLimit": false,
"name": "Ivon Huang",
"xuid": "114514918"
},
{
"ignoresPlayerLimit": false,
"name": "Second Player",
"xuid": "114514918"
}
]
- 如果要賦予特定玩家OP權限,編輯BDS伺服器的
permissions.json
檔案,將Xbox ID填進去
[
{
"permission": "operator",
"xuid": "114514918"
}
]
- 重新啟動伺服器。
3. 讓伺服器可從外部網路存取#
在BDS伺服器上 部署內網穿透服務,如此一來不論是用Wifi還是4G網路都能玩Minecraft了。
如果要加強伺服器安全性,僅限有連上「虛擬區域網路」的客戶端能連線的話,那麼編輯server.properties
,設定此值:enable-lan-visibility=false
關閉區域網路連線。
4. 解決玩家背包物品消失問題#
Minecraft多人連線是用UUID來認玩家的。不論有無登入Xbox帳號,單人地圖轉成BDS伺服器地圖後,原本玩家的背包東西都會噴掉,寵物也可能會認不得玩家。
根據 Mojang Bugjira,這是已知bug。
Minecraft 1.21之後這個問題似乎解決了?只要遊玩該單人世界的時候有登入Xbox帳號,Minecraft就會保留玩家背包。日後登入伺服器的時候只要使用同一個Xbox帳號,就不用擔心背包不見。
如果你的東西不見,可以考慮用 這個Python程式手動遷移玩家背包資料庫。
啟動BDS伺服器,嘗試登入遊戲。當你進入世界的時候,背包應該是空的。此時地圖資料已經更新,變為新地圖。
關閉伺服器
將BDS伺服器的新地圖下載回本機,跟舊地圖的目錄放置在不同的目錄
執行
./compare-worlds.py
比較舊地圖與新地圖的差異,應該會印出這個世界曾經遊玩過的玩家UUID
./compare-worlds.py "/home/user/下載/MyWorld" "/home/user/下載/New_MyWorld"
- 將ID資訊寫入到新地圖
./convert-local-player.py "/home/user/下載/New_MyWorld" <MSA ID> <self-signed ID> <player server ID>
- 將新地圖上傳回BDS伺服器。重新連線,背包應該就回來了。