客戶端與服務端模式
Be.D.D. 調試客戶端模組有三種方式:
| 模式 | 運行什麼 | 適合 |
|---|---|---|
| 僅客戶端 | 裝了 BeDD 模塊的遊戲,進單人或局域網世界 | 大多數客戶端模組測試 |
| 客戶端 + 服務端 | 裝了 BeDD 的遊戲,加上同一臺電腦上裝了 BeDD 服務端模塊的 Bedrock 專用服務器(BDS) | 在真實服務器上測客戶端行為,兩端都能用腳本驅動;客戶端的遊戲速度跟隨服務端 |
| 客戶端連遠程 | 裝了 BeDD 的遊戲,連到別處的服務器 | 不歸你管的服務器(BeDD 只在客戶端) |
三種模式下客戶端的用法都一樣:驅動遊戲、多開。本頁講服務端。
客戶端 + 服務端
BeDDSetup.psm1 準備服務器,Start-BeDDServer.ps1 在後臺運行它,兩者都在 bin\BeDD 裡、和模塊放在一起:
Import-Module .\BeDDSetup.psm1
Initialize-BeDDServer -Name s1 -ModuleDir ..\BeDD-server # %LOCALAPPDATA%\BeDD\servers\s1,准备就绪
$s = & .\Start-BeDDServer.ps1 -Name s1 # 启动完成,BeDD 管道也就绪;$s.Port、$s.PipeName
Connect-BeDD -PipeName $s.PipeName # 服务端的控制管道(BeDD.psm1)
# ……启动游戏(Start-BeDDGame.ps1),从游戏里加入 127.0.0.1:$($s.Port)……
& .\Start-BeDDServer.ps1 -Name s1 -Stop # 保存世界后退出準備服務器
Initialize-BeDDServer 用 lip 把 LeviLamina 的服務端包裝進一個空文件夾;這個包會連帶裝上 Minecraft 1.26.60 的官方
BDS(從 minecraft.net 下載,約 100 MB)。和準備遊戲一樣,已經做好的步驟會跳過,一臺電腦上同一時間只跑一個準備流程,
而且從不提問,所以測試框架和 CI 可以每次運行前都調用它。服務器的模組放在 mods\ 下,所以模塊裝到 mods\BeDD-server(LeviLamina 只從以模組名命名的文件夾加載模組)。
| 參數 | |
|---|---|
-Name | 服務器名,即 %LOCALAPPDATA%\BeDD\servers 下的文件夾(BEDD_SERVERS_DIR);默認 server |
-Port、-PortV6 | 默認:這臺服務器之前的端口,否則取 19140/19141、19142/19143……中第一對空閒的,不會撞上游戲的 19132,服務器之間也不會撞 |
-Transport | 默認 nethernet:從 1.26.60 起遊戲只通過 NetherNet 加入服務器(raknet 服務器會報 "Terracotta")。服務器在 TCP server-port 上握手,遊戲數據走 UDP;-ServerIp 127.0.0.1(默認)時它把 127.0.0.1:<port> 公佈為 UDP 地址(server-udp-ports),因為 BeDD 讓雙方的套接字都留在迴環上。第一次加入某個服務器會詢問"信任此服務器?" |
-ServerIp | 默認 127.0.0.1:只有本機的遊戲能加入;'' 監聽所有接口 |
-OnlineMode | 默認 $false:遊戲加入時不做 Xbox 驗證 |
-LevelName、-Gamemode、-Difficulty、-LevelSeed、-MaxPlayers、-AllowCheats | server.properties(默認 Bedrock level、creative、peaceful、隨機、10、$true) |
-Properties @{ 'view-distance' = 16 } | 其他任意 server.properties 鍵 |
-ModuleDir | BeDD 服務端模塊(bin\BeDD-server),有變化時複製到 mods\BeDD-server。沒有它,Start-BeDDServer.ps1 不會啟動服務器(不彈防火牆提示) |
-PipeName | 服務端裡 BeDD 的控制管道,默認 BeDD-Server-<Name> |
-TimeScale | 配置 timeScale:服務器啟動時的遊戲速度 |
-Trace、-Config @{ … } | 配置 trace,以及模塊 config\config.json 的其他任意鍵 |
它返回這臺服務器:Dir、Port、PortV6、PipeName、LogPath 和 Problems(沒有 BeDD 模塊時含 bedd)。
Get-BeDDServer -Name s1 返回同樣的內容,但什麼都不改。
啟動與停止
Start-BeDDServer.ps1 -Name s1 啟動 bedrock_server_mod.exe(帶 LeviLamina 的 BDS),完全沒有窗口:桌面上什麼都不會出現,也不會搶焦點。服務器的全部輸出
寫到它文件夾裡的 logs\console.log。腳本等服務器啟動完成,裝了模塊時還等 BeDD 的管道出現,然後返回 Process、
PipeName(沒有模塊時為 $null)、Port、PortV6、Dir 和 LogPath。服務器已經在運行時直接返回它。
| 參數 | |
|---|---|
-Name、-ServersDir | 哪臺服務器 |
-Command '<一行>' | 向服務器控制台輸入一行,例如 -Command 'time set day' |
-Stop | 發送 stop(服務器保存世界後退出),-StopTimeoutSeconds(30)後仍未退出就強制結束 |
-TimeoutSeconds | 等它啟動的時長(180) |
-AllowFirewallPrompt | 不帶 BeDD 的迴環綁定也啟動(見下文) |
不彈防火牆提示
BDS 會監聽所有網絡接口,而程序第一次這樣做時,Windows 防火牆會在桌面上彈窗詢問是否允許(每個服務器文件夾一次),無人值守的
測試就會卡住。BeDD 的服務端模塊把服務器的所有套接字改為只綁定迴環地址(配置 loopbackOnly,默認開啟,和客戶端一樣),
所以 Windows 不會詢問,也只有本機的遊戲能加入。Initialize-BeDDServer 還會設置 server-ip=127.0.0.1 並關掉局域網可見性,
否則它會另外綁定 Bedrock 的默認端口。
因此 Start-BeDDServer.ps1 拒絕啟動 mods\BeDD-server 裡沒有 BeDD 服務端模塊、裝的是別的模塊,或 config.json 裡
"loopbackOnly": false 的服務器,並說明原因。萬一 LeviLamina 仍沒能加載模塊,它會在服務器打開網絡之前把服務器停掉。
-AllowFirewallPrompt 照樣啟動它,用於要讓別的電腦上的遊戲加入的服務器(配合 -ServerIp ''):這時在 Windows 詢問時允許即可。
多臺服務器
每臺服務器有自己的文件夾、端口和管道,所以並行的測試各自啟動自己的服務器:各用一個自己的 -Name(比如它的遊戲的槽位),
不要給 -Port。