记录一下自己使用Ubuntu 22.04开饥荒联机版服务器的过程。

1. 下载steamcmd

wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz
tar -xvzf steamcmd_linux.tar.gz

2. 安装依赖

如果直接运行./steamcmd.sh一般会报下面的错:

./steamcmd.sh: line 37: /root/games/steamcmd/linux32/steamcmd: No such file or directory

我使用的是Ubuntu 22.04, 安装依赖如下:

sudo add-apt-repository multiverse
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install libstdc++6 libgcc1 libcurl4-gnutls-dev:i386 lib32z1

3. 运行

./steamcmd.sh

如果运行成功,会自动开始下载更新,下载完成后会出现Steam>提示符。 image1 接着输入下面的命令:

force_install_dir ../dontstarvetogether
login anonymous
app_update 343050 validate
quit

app_update 343050 validate表示安装饥荒联机版,343050是饥荒联机版的appid。 注意先用force_install_dir指定安装目录,然后login anonymous登录,不然会出现警告:

Steam>force_install_dir ../dontstarvetogether
Please use force_install_dir before logon!

如果后面需要更新饥荒服务端,重新执行这几个命令即可。

4. 创建世界

进入饥荒联机版创建一个世界,然后退出游戏,会在C:/Users/{用户名}/Documents/Klei/DoNotStarveTogether/{id}/目录下生成一个cluster_1文件夹,将这个文件夹拷贝到服务器上的~/.klei/DoNotStarveTogether/目录下。可以使用任意文件传输工具,我使用的是vscode的remote ssh插件,直接拖拽文件即可。也可以用scp命令:

scp -r cluster_1 root@{服务器ip}:~/.klei/DoNotStarveTogether/

5. 获取服务器令牌和klie账号id

从饥荒联机版游戏首页左下角的账号进入到klei的账号界面,然后进入饥荒游戏服务器页面,或者直接访问https://accounts.klei.com/account/game/servers?game=DontStarveTogether 服务器

创建服务器,然后复制服务器票据。 服务器票据

6. 修改配置文件

进入服务器的~/.klei/DoNotStarveTogether/cluster_1目录。 存档目录结构

  1. 在该目录下创建一个cluster_token.txt文件,内容为上一步获取的服务器票据。
  2. 在该目录下创建一个adminlist.txt文件,内容为你的klei账号id。如果需要添加多个管理员,其他人的klei账号id也同样方式获取,然后一行一个id写入adminlist.txt文件。 获取方式为:从饥荒联机版游戏首页左下角的账号进入到klei的账号界面,或者直接访问https://accounts.klei.com/account/info获取服务器令牌。 个人账号
  3. 修改cluster.ini文件,修改cluster_name(服务器名称)、cluster_password(服务器密码)、max_players(最大玩家数)等参数。 ```ini [GAMEPLAY] game_mode = survival max_players = 6 pvp = false pause_when_empty = true

[NETWORK] lan_only_cluster = false cluster_password = my_password cluster_description = cluster_name = 饥荒服务器名称 offline_cluster = false cluster_language = zh cluster_cloud_id = CCF1ED350800900F

[MISC] console_enabled = true

[SHARD] shard_enabled = true bind_ip = 127.0.0.1 master_ip = 127.0.0.1 master_port = 10888 cluster_key = defaultPass


## 7. 创建启动脚本
可以直接获取官网的启动脚本:
```shell
wget https://accounts.klei.com/assets/gamesetup/linux/run_dedicated_servers.sh

内容如下:

#!/bin/bash

steamcmd_dir="$HOME/steamcmd"
install_dir="$HOME/dontstarvetogether_dedicated_server"
cluster_name="MyDediServer"
dontstarve_dir="$HOME/.klei/DoNotStarveTogether"

function fail()
{
	echo Error: "$@" >&2
	exit 1
}

function check_for_file()
{
	if [ ! -e "$1" ]; then
		fail "Missing file: $1"
	fi
}

cd "$steamcmd_dir" || fail "Missing $steamcmd_dir directory!"

check_for_file "steamcmd.sh"
check_for_file "$dontstarve_dir/$cluster_name/cluster.ini"
check_for_file "$dontstarve_dir/$cluster_name/cluster_token.txt"
check_for_file "$dontstarve_dir/$cluster_name/Master/server.ini"
check_for_file "$dontstarve_dir/$cluster_name/Caves/server.ini"

./steamcmd.sh +force_install_dir "$install_dir" +login anonymous +app_update 343050 validate +quit

check_for_file "$install_dir/bin64"

cd "$install_dir/bin64" || fail

run_shared=(./dontstarve_dedicated_server_nullrenderer_x64)
run_shared+=(-console)
run_shared+=(-cluster "$cluster_name")
run_shared+=(-monitor_parent_process $$)

"${run_shared[@]}" -shard Caves  | sed 's/^/Caves:  /' &
"${run_shared[@]}" -shard Master | sed 's/^/Master: /'

修改前面四个变量值为自己设置的目录,比如我的是:

# steamcmd安装目录
steamcmd_dir="$HOME/games/steamcmd"
# 饥荒服务器安装目录
install_dir="$HOME/games/dontstarvetogether"
# 存档目录名称
cluster_name="Cluster_1"
# 存档位置
dontstarve_dir="$HOME/.klei/DoNotStarveTogether"

然后给脚本添加执行权限:

chmod +x run_dedicated_servers.sh

注意,官方给的脚本每次启动时都会检查更新,如果不想检查更新,可以把执行./steamcmd.sh的那一行注释掉,然后手动更新一次即可。注意更新的时候如果加了模组,那么模组设置文件dedicated_server_mods_setup.lua会被覆盖。所以我对这部分稍微修改了一下:

# 检查更新
if [ $# -ge 1 ] && [ "$1" -eq 1 ]; then
    # 备份dedicated_server_mods_setup.lua文件
    if [ -f "$install_dir/mods/dedicated_server_mods_setup.lua" ]; then
        cp "$install_dir/mods/dedicated_server_mods_setup.lua" "$install_dir/mods/dedicated_server_mods_setup.lua.bak"
    fi
    
    # 执行steamcmd.sh
    ./steamcmd.sh +force_install_dir "$install_dir" +login anonymous +app_update 343050 validate +quit
    
    # 恢复备份的dedicated_server_mods_setup.lua文件
    if [ -f "$install_dir/mods/dedicated_server_mods_setup.lua.bak" ]; then
        mv "$install_dir/mods/dedicated_server_mods_setup.lua.bak" "$install_dir/mods/dedicated_server_mods_setup.lua"
    fi
fi

可以在执行脚本时加上参数1,表示检查更新,不加参数表示不检查更新。更新时候会先备份dedicated_server_mods_setup.lua文件,然后更新完成后再恢复备份的文件。

8. 添加模组

找到自己存档的modoverrides.lua文件,比如我的是~/.klei/DoNotStarveTogether/cluster_1/目录下的MasterCaves目录下的modoverrides.lua文件,如果创建世界的时候添加了模组,里面会有模组的配置信息,比如我这里添加了两个模组:

return {
  ["workshop-1998081438"]={ configuration_options={ StackMode=true, StackRadius=10 }, enabled=true },
  ["workshop-378160973"]={
    configuration_options={
      ENABLEPINGS=true,
      FIREOPTIONS=2,
      OVERRIDEMODE=false,
      SHAREMINIMAPPROGRESS=true,
      SHOWFIREICONS=true,
      SHOWPLAYERICONS=true,
      SHOWPLAYERSOPTIONS=2 
    },
    enabled=true 
  } 
}

这里面的1998081438378160973是模组的id,也可以在https://steamcommunity.com/app/322330/workshop/搜索模组,然后在url中找到模组的id。

然后进入到饥荒服务器安装目录~/games/dontstarvetogether/mods目录,修改dedicated_server_mods_setup.lua文件,添加模组id:

ServerModSetup("1998081438")
ServerModSetup("378160973")

注意, 如果加了模组,那么MasterCaves目录下的modoverrides.lua文件中的模组配置都要配置好,不然在切换世界的时候会直接卡死。

9. 启动服务器

./run_dedicated_servers.sh

一般来说需要给服务器开放以下端口:

  1. udp 10999 主世界, 在Master/server.ini文件中设置
  2. udp 10998 洞穴, 在Caves/server.ini文件中设置
  3. udp+tcp 10888 洞穴连接主世界, 在cluster.ini文件中设置

经过我自己测试,只开放1099910998两个端口似乎也可以正常运行。

服务器的命令可以在(https://dontstarve.huijiwiki.com/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0)[https://dontstarve.huijiwiki.com/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0]找到。

常用命令:

  1. c_shutdown(是否保存) 关闭服务器, true表示保存存档。
  2. c_save() 保存进度。
  3. c_rollback(天数) 回滚存档。
  4. c_reset() 相当于c_rollabck(0),回滚到30秒前保存的存档。
  5. c_regenerateshard() 重新生成本世界
  6. c_regenerateworld() 重新生成服务器的所有世界
  7. c_skip(天数) 跳过天数

10. 连接服务器

可以直接在服务器列表中搜索到自己的服务器,名称就是上面在cluster.ini文件中设置的cluster_name。 如果想直接通过ip连接,可以用下面几种方式(端口号是主世界的端口号):

  1. 在游戏中按~键打开控制台,然后输入c_connect("xx.xx.xx.xx", 10999, "000"),其中xx.xx.xx.xx是服务器ip,10999是主世界端口,000是服务器密码。
  2. 也可以在steam启动时添加启动参数+connect xx.xx.xx.xx:10999 +password “000”
  3. 找到电脑上饥荒的启动路径,比如我的是E:\games\Steam\steamapps\common\Don't Starve Together\bin64\dontstarve_steam_x64.exe,然后把这个exe创建快捷方式,然后右键属性,在目标后面添加 +connect 47.120.61.78:10999 +password "000",然后双击这个快捷方式就可以直接连接到服务器了。这种方法记得要先启动steam。