饑荒聯機版獨立伺服器
獨立伺服器可以用來獨立的運行饑荒聯機版,而不使用圖形化界面,從而節約客戶端資源或者便於與他人聯機。
獨立伺服器可以搭建在 Windows/Linux 上,但一般建議搭建在獨立 Linux 主機上而不是 Windows 上,以防 Windows 自動更新等原因導致伺服器無法長期運行。
伺服器基本需求
至少一個可以正常遊玩饑荒聯機版的帳號。
一台向公網(或者至少向面向的玩家)開放了端口,可以使用 UDP 協議發送數據,能夠訪問 klei 伺服器的設備。 如果沒有公網 ip 地址,可以拿端口轉發湊合(增加延遲)。伺服器默認以 UDP 11000 端口開放。
運行一個穩定的伺服器,你的系統必須滿足以下條件:
- 上行速度: 每個玩家 8 Kb/s, 遊戲後期實體增多可能需要更高帶寬
- RAM:每個玩家 65Mb, 遊戲後期實體增多需要提高內存配置或使用 Mod 降低卡頓
- CPU:能跑就行
- VCRedist_2008 (x86)(Windows 下時)
安裝伺服器本體
目前 Steam 提供兩種方法下載伺服器:steamcmd 和 steam 本體,後者只需在「庫」中選擇工具,並找到 "Don't Starve Together Dedicated Server" 即可安裝。但是對於獨立伺服器可能沒有配置圖形界面,因此也可以使用 steamcmd 來完成下載(和更新)
- 安裝依賴包:
在伺服器本體執行時也會提示缺少某個文件,此時使用你的包管理器進行搜索安裝即可
- lib32gcc1 # If running a 64bit OS
- lib32stdc++6 # If running a 64bit OS
- libgcc1 # If running a 32bit OS
- libcurl4-gnutls-dev:i386(當提示包不存在時,應執行:dpkg --add-architecture i386,刷新後安裝即可)
- 不要使用 root 賬戶執行,可以新建一個用戶或使用現有的用戶
# sudo useradd -m steam # su steam
- 安裝 steamcmd (如果包管理器有 steamcmd 的話,一般直接使用包管理器安裝即可,實測至少兩年包管理器沒更新的 steamcmd 依舊工作)
$ cd /opt $ sudo mkdir steamcmd && sudo chown `whoami`:`whoami` steamcmd && cd steamcmd # 或者任何你想安裝的地方 $ wget http://media.steampowered.com/installer/steamcmd_linux.tar.gz $ tar -xvzf steamcmd_linux.tar.gz
- 下載伺服器本體
$ ./steamcmd.sh # 如果你是通过包管理器安装的,直接输入 steam > force_install_dir <你想安装服务器本体的位置> > login anonymous > app_update 343050 validate > quit
- 嘗試啟動伺服器
- 用戶的 $PWD 必須在該文件夾下才能正確啟動伺服器,否則會出現 "Mounting file system databundles/xxx.zip skipped" 的劇情並報錯退出。
$ cd <服务器本体的位置>/bin # 64位系统可以选择 bin64 $ screen -S "<sockname>" ./dontstarve_dedicated_server_nullrenderer # -S 表示制定这个窗口的名字(sockname)
伺服器開始運行後, 按下 ctrl-a 然後按下 d, 將其切入後台(Detach)
- 如果你想回到該窗口,使用
screen -r <sockname>
- 在 Linux 下創建更新伺服器腳本
創建更新腳本
$ touch ~/.local/bin/updateDST $ chmod 744 /home/steam/.local/bin/updateDST $ vimtutor # 如果你从未使用 vim (当然, 你也可以使用别的文本编辑器) $ vim /home/steam/.local/bin/updateDST # 请确保自己已经学会了退出 vim 再执行此命令
在腳本中輸入:
#!/bin/sh server_path=<服务器本体位置> backup_time=$(date +%s) mkdir /tmp/$backup_time cp $server_path/mods/dedicated_server_mods_setup.lua /tmp/$backup_time/dedicated_server_mods_setup.lua ~/steamcmd/steamcmd.sh +@ShutdownOnFailedCommand 1 \ +@NoPromptForPassword 1 \ +login anonymous \ +force_install_dir $server_path \ +app_update 343050 validate \ +quit cp /tmp/$backup_time/dedicated_server_mods_setup.lua $server_path/mods/dedicated_server_mods_setup.lua
- 當你需要更新時,輸入 updateDST 即可
- 如果你的設備過於上古導致找不到命令, 在用戶目錄的 .bashrc 下加入:
if [ -d .local/bin/ ] then PATH=$PATH:$HOME/.local/bin/ fi
配置存檔和 mod
獲得一份"模板"
讓伺服器"照本宣科"的生成世界,從而避免手動配置的麻煩
- 打開饑荒聯機版
- 新建世界,根據你的需求選擇 mod 和世界生成等選項。
- 將地表和洞穴的世界生成選項分別保存預設為 server, servercave
- 完整的創建世界,進入選擇人物界面後,關閉遊戲。
- 技術嫻熟的開發者也可以選擇無視此步驟,手動填寫 modoverrides、leveldataoverride 和 worldgenoverride。但由於其過於難以調試,並不建議手動填寫。
獲得一份框架
解壓從科雷官網獲取 token 時下載配置獲得的壓縮包到伺服器存檔的文件夾。
你可以考慮修改文件夾下 ini 文件的值,但非必要情況下不要修改端口。
整理 mod 列表
你需要將伺服器需要準備的 mod 整理為一個列表,並且讓伺服器加載它。
- 安裝 lua
- 獲取 modoverrides 的所有 mod id
$ cd <本地世界存档文件夹>/Master # 对于 Windows 用户,在世界存档文件夹空白处使用 Shift-右键来打开命令提示行 $ lua > p = require("modoverrides") > for i,_ in pairs(p) do if i:sub(1,9) == "workshop-" then print("ServerModSetup(\""..string.sub(i,10).."\")") end end
你會得到類似這樣的輸出:
ServerModSetup("xxxxxxx") ServerModSetup("xxxxxxx") ServerModSetup("xxxxxxx")
- 複製輸出,保存到 dedicated_server_mods_setup.lua (隨便你存在哪裏,如果沒頭緒就存在 /tmp 吧)
- 將保存的文件其複製到
<服务器本体的位置>/mods/dedicated_server_mods_setup.lua <服务器存档的位置>/dedicated_server_mods_setup.lua
導入 mod 配置和世界配置
將本地創建的遊戲存檔的任意一份 modoverrides.lua 複製到伺服器存檔
cp <本地世界存档文件夹>/Master/modoverrides.lua <服务器存档文件夹>/Master/modoverrides.lua # 如果本机和服务器不是一个物理设备,使用 scp 或者 rsync cp <本地世界存档文件夹>/Master/modoverrides.lua <服务器存档文件夹>/Caves/modoverrides.lua
將本地遊戲存檔的世界配置 leveldataoverride.lua 分別複製到伺服器
cp <本地世界存档文件夹>/Master/leveldataoverride.lua <服务器存档文件夹>/Master/leveldataoverride.lua cp <本地世界存档文件夹>/Caves/leveldataoverride.lua <服务器存档文件夹>/Caves/leveldataoverride.lua
通過模板來獲得世界生成配置
vim <本地世界文件夹>/../client_save/world_presets/<配置名称>.wgp
將本地的模板開頭的 "Klei 1" 刪掉
cp <本地世界文件夹>/../client_save/world_presets/<主世界配置名称>.wgp <服务器存档文件夹>/Master/worldgenoverride.lua cp <本地世界文件夹>/../client_save/world_presets/<洞穴配置名称>.wgp <服务器存档文件夹>/Caves/worldgenoverride.lua
檢查文件
最後你的伺服器存檔目錄會是這樣的:
. |-- Caves | |-- leveldataoverride.lua | |-- modoverrides.lua | |-- server.ini | `-- worldgenoverride.lua |-- Master | |-- leveldataoverride.lua | |-- modoverrides.lua | |-- server.ini | `-- worldgenoverride.lua |-- adminlist.txt |-- blocklist.txt |-- whitelist.txt |-- cluster.ini |-- cluster_token.txt `-- dedicated_server_mods_setup.lua
其中管理員名單,黑名單和白名單可以不創建,也可以每行寫入一個科雷 id
運行伺服器
Linux:
cd <服务器本体文件夹>/bin && ./dontstarve_dedicated_server_nullrenderer [启动参数..]
啟動參數
- 強制伺服器使用特定端口
-port [1024 .. 65535]
- 強制伺服器以特定的 tick 速率運行(影響網絡消耗和延遲)
-tick [15 .. 60]
- 強制伺服器中允許的最大玩家數,大於 64 的值被視為 64。
-players [1 .. 64]
- 啟用命令行控制台輸入機制。允許您直接在伺服器窗口中執行 Lua 代碼。
-console
- 強制伺服器進入局域網模式。伺服器將不需要令牌身份驗證,也不會出現在伺服器列表中,只能通過輸入伺服器的 ip 地址來進入。伺服器內的玩家無法拆禮物。
-lan
- 設置永久存儲的根目錄。
- 默認值是 %USER%/Document/klei (Windows) 或 $HOME/.klei。與 conf_dir 一起使用,便於控制存檔位置。
-persistent_storage_root <根目录位置>
- 強制伺服器從備用目錄加載保存和設置數據。
-conf_dir <存档相对位置>
- 世界名稱,決定世界文件夾的名字。
- 默認值是 Cluster_1
-cluster <世界文件夹的位置>
- 存檔最終將指向
<根目录位置>/<存档相对位置>/<世界文件夹的位置>
配置文件語法
雖然一般不需要更改配置文件,但你也可以自定義一下。[1]
[MISC] max_snapshots = 6 # 最大快照数,决定了可回滚的天数 console_enabled = true # 是否开启控制台 [SHARD] shard_enabled = true # 服务器共享,要开启洞穴服务器的必须启用 bind_ip = 127.0.0.1 # 服务器监听的地址,当所有实例都运行在同一台机器时,可填写 127.0.0.1,会被 server .ini 覆盖 master_ip = 127.0.0.1 # master 服务器的 IP,针对非 master 服务器,若与 master 服务器运行在同一台机器时,可填写 127.0.0.1,会被 server.ini 覆盖 master_port = 10888 # 监听 master 服务器的 UDP 端口,所有连接至 master 服务器的非 master 服务器必须相同 cluster_key = dst # 连接密码,每台服务器必须相同,会被 server.ini 覆盖 [STEAM] steam_group_only = false # 只允许某 Steam 组的成员加入 steam_group_id = 0 # 指定某个 Steam 组,填写组 ID steam_group_admins = false # 开启后,Steam 组的管理员拥有服务器的管理权限 [NETWORK] offline_server = false # 离线服务器,只有局域网用户能加入,并且所有依赖于 Steam 的任何功能都无效,比如说饰品掉落 tick_rate = 15 # 每秒通信次数,越高游戏体验越好,但是会加大服务器负担 whitelist_slots = 0 # 为白名单用户保留的游戏位 cluster_password = # 游戏密码,不设置表示无密码 cluster_name = ttionya test # 游戏房间名称 cluster_description = description # 游戏房间描述 lan_only_cluster = false # 局域网游戏 cluster_intention = madness # 游戏偏好,可选 cooperative, competitive, social, or madness,随便设置,没卵用 [GAMEPLAY] max_players = 16 # 最大游戏人数 pvp = true # 能不能攻击其他玩家,能不能给其他玩家喂屎 game_mode = survival # 游戏模式,可选 survival, endless or wilderness,与玩家死亡后的负面影响有关 pause_when_empty = false # 没人服务器暂停,刷天数必备 vote_kick_enabled = false # 投票踢人
管理員
管理員可以管理伺服器(也可以調試或作弊)
生成 token 的用戶默認是管理員。
在adminlist.txt中每行加入一個管理員的 klei id 即可
以下是一些簡單的命令:
c_reset(true) -- 删了世界重新创建 (false 的话,仅仅是重启服务器) c_shutdown(true) -- 保存并关闭服务器(false 的话,不保存关机) c_spawn("生成代码") -- 在鼠标位置生成一个实体 c_give("生成代码") -- 给你一个物品 TheWorld.topology.overrides.[key]=value -- 更改世界配置(如猎犬袭击频率为 hounds),你可以在任意存档的 leveldataoverride.lua 里的 overrides 对象内找到例子。
(過時的)問答
如何開本地(斷網)服?
在配置文件中加入:
dedicated_lan_server = true
玩家將無法拆禮物,且無法通過 klei 官方的伺服器列表查詢到這個伺服器(你得手動把伺服器地址告訴你的小夥伴)。
一個設備能跑多個服嗎?
可以,只要存檔位置不一樣就可以。
當然,如果你的伺服器不堪重負,那還是換另一個伺服器吧。(每個伺服器都需要大約 2-4 G 內存)
Troubleshooting
- If you ran the dedicated server before you put a token in the settings.ini you may need to delete your world data. Shutdown the server or client,
In C:\Users\Mark\Documents\Klei\DoNotStarveTogether\save\ delete survival_1. When you restart a new world will be generated
- If your server is running correctly, but you still can’t see it. Confirm it’s listing here:
===== http://my.jacklul.com/dstservers/ You will have to manually update the listing at the bottom of the page ===== If it’s still not visible from inside the game client, it’s because the client can’t ping your server. Did you make sure to forward UDP traffic on port 10999 to your machine
If you get the error Account Failed (6): "E_EXPIRED_TOKEN" you’ll want to verify that you saved the settings.ini file with the server token after you closed the game client, or your change will get overwritten. Also, make sure that there are no extra characters at the end of the file, even invisible ones.