饥荒联机版独立服务器

来自Don't Starve Wiki
跳转到导航 跳转到搜索

独立服务器可以用来独立的运行Don't Starve Together icon.png饥荒联机版,而不使用图形化界面,从而节约客户端资源或者便于与他人联机。

独立服务器可以搭建在 Windows/Linux 上,但一般建议搭建在独立 Linux 主机上而不是 Windows 上,以防 Windows 自动更新等原因导致服务器无法长期运行。

伺服器基本需求

至少一个可以正常游玩Don't Starve Together icon.png饥荒联机版的帐号。

一台向公网(或者至少向面向的玩家)开放了端口,可以使用 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

获得一份"模板"

让服务器"照本宣科"的生成世界,从而避免手动配置的麻烦

  • 打开Don't Starve Together icon.png饥荒联机版
  • 新建世界,根据你的需求选择 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.