本文介绍了如何部署 Don't Starve Together(饥荒联机版)专用服务器多层世界,已经在 Windows 10 和 Ubuntu 20.04 上通过测试。

前言

Don't Starve Together(饥荒联机版)专用服务器多层世界(不止一个森林或洞穴) 和 双层世界(一个森林和一个洞穴)相比,服务器配置文件 和 脚本文件 都发生了变化。

服务器的配置文件需要增加 配置文件夹 和 修改一部分参数,而脚本文件需要增加对应的启动项。

以我创建的多层世界为例,其中 Master(主世界)和 Master2 是森林(地表世界),Caves 和 Caves2 是洞穴(地下世界)。

服务器配置文件

同一台机器

假设只有一台机器,Master(主世界)和 Master2 、Caves 和 Caves2 都运行在同一台机器上。

将 "Master" 文件夹复制并黏贴,最后重命名为 "Master2"。以此类推,又得到了 "Caves2" 文件夹。

每一个文件夹对应一个相应的世界,Master 和 Master2 、Caves 和 Caves2 共同使用同一个 "cluster_token.txt(访问令牌)" 和 "cluster.ini(服务器配置文件)"。

cluster.ini(服务器配置文件):

[GAMEPLAY]
game_mode = survival
max_players = 6
pvp = false
pause_when_empty = true


[NETWORK]
lan_only_cluster = false
cluster_intention = social
cluster_password = 
cluster_description = 
cluster_name = Jianrry的世界
offline_cluster = false
cluster_language = zh


[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

shard_enabled:true。是否开启共享。默认值是 false。如果开启多层世界,值只能是 true 。

bind_ip:127.0.0.1。默认值是 127.0.0.1。所有的世界都运行在同一台机器上,值只能是 127.0.0.1。

master_ip:127.0.0.1。主世界的 ip,默认值是空。所有的世界都运行在同一台机器上,值只能是 127.0.0.1。

master_port :10888。主服务器监听的 UDP 端口,默认值是 10888。所有的机器上的 master_port 必须保持一致,而且不能和同一台机器上的 server_port 相同。

cluster_key:defaultPass。服务器认证密码,默认值是空。所有的世界都运行在同一台机器上,值只需要设置一次。

Master(森林1) 中的 "server.ini(服务器配置文件)" :

[NETWORK]
server_port = 10999


[SHARD]
is_master = true
name = Master
id = 1


[ACCOUNT]
encode_user_path = true


[STEAM]
master_server_port = 27014
authentication_port = 8764

Master2(森林2) 中的 "server.ini(服务器配置文件)" :

[NETWORK]
server_port = 11000


[SHARD]
is_master = false
name = Master2
id = 2


[ACCOUNT]
encode_user_path = true


[STEAM]
master_server_port = 27015
authentication_port = 8765

Cave(洞穴1) 中的 "server.ini(服务器配置文件)" :

[NETWORK]
server_port = 11001


[SHARD]
is_master = false
name = Caves
id = 3


[ACCOUNT]
encode_user_path = true


[STEAM]
master_server_port = 27016
authentication_port = 8766

Cave2(洞穴2) 中的 "server.ini(服务器配置文件)" :

[NETWORK]
server_port = 11002


[SHARD]
is_master = false
name = Caves2
id = 4


[ACCOUNT]
encode_user_path = true


[STEAM]
master_server_port = 27017
authentication_port = 8767

其中 Master(主世界)的 is_master 只能是 true,其他的只能是 false。

每一个世界的 server_port(服务器端口)都是唯一的,不能和现有的端口相同。

不同的机器

假设有多台机器,Master(主世界)和 Master2 、Caves 和 Caves2 分别运行在不同的机器上。

Master(主世界)运行在 机器 A 上,Master2 运行在 机器 B 上,Caves 运行在 机器 C 上,Caves2 运行在 机器 D 上。

每一台机器上要求 一个 "cluster_token.txt(访问令牌)" 和 "cluster.ini(服务器配置文件)" 以及 至少一个 "Master" 或 "Caves" 文件夹,否则专用服务器无法启动。

cluster.ini(服务器配置文件):

[GAMEPLAY]
game_mode = survival
max_players = 6
pvp = false
pause_when_empty = true


[NETWORK]
lan_only_cluster = false
cluster_intention = social
cluster_password = 
cluster_description = 
cluster_name = Jianrry的世界
offline_cluster = false
cluster_language = zh


[MISC]
console_enabled = true


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

shard_enabled:true。是否开启共享。默认值是 false。如果开启多层世界,值只能是 true 。

bind_ip:0.0.0.0。默认值是 127.0.0.1。所有的世界运行在不同的机器上,值只能是 0.0.0.0。

master_ip:。主世界的 ip,默认值是空。所有的世界运行在不同的机器上,值只能是 运行主世界的那台机器的公网 ip。

master_port :10888。主服务器监听的 UDP 端口,默认值是 10888。所有的机器上的 master_port 必须保持一致,而且不能和同一台机器上的 server_port 相同。

cluster_key:defaultPass。服务器认证密码,默认值是空。所有的世界运行在不同的机器上,值只能保持一致。

Master 和 Master2 、Caves 和 Caves2 只是所在的机器不同,配置文件没有发生变化,不需要修改。

脚本文件

Windows

修改前:

c:\steamcmd\steamcmd.exe +login anonymous +app_update 343050 validate +quit
cd /D "c:\steamcmd\steamapps\common\Don't Starve Together Dedicated Server\bin"
start dontstarve_dedicated_server_nullrenderer -console -cluster MyDediServer -shard Master
start dontstarve_dedicated_server_nullrenderer -console -cluster MyDediServer -shard Caves

修改后

c:\steamcmd\steamcmd.exe +login anonymous +app_update 343050 validate +quit
cd /D "c:\steamcmd\steamapps\common\Don't Starve Together Dedicated Server\bin"
start dontstarve_dedicated_server_nullrenderer -console -cluster MyDediServer -shard Master
start dontstarve_dedicated_server_nullrenderer -console -cluster MyDediServer -shard Master2
start dontstarve_dedicated_server_nullrenderer -console -cluster MyDediServer -shard Caves
start dontstarve_dedicated_server_nullrenderer -console -cluster MyDediServer -shard Caves2

Linux

修改前:

#!/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: /'

修改后

#!/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 Caves  | sed 's/^/Caves2:  /' &
"${run_shared[@]}" -shard Master | sed 's/^/Master: /' &
"${run_shared[@]}" -shard Master | sed 's/^/Master2: /' 

"Master2" 和 "Caves2" 分别对应 Master2(森林2)和 Caves2(洞穴2),脚本文件中增加了 Master2(森林2)和 Caves2(洞穴2)的启动项。

以此类推,你如果想启动/停止一个世界,就需要增加/删除一个 "Master" 或 "Caves" 文件夹,还需要修改脚本文件中对应的启动项。

Matic 朋友之门 (旅行机器)

Step1:进入游戏

启动客户端,进入游戏。

Step2:打开控制台

切换到英文输入法,按下 ` 打开控制台。

然后按下 Ctrl 键,切换到远程模式。

Step3:生成 Matic 朋友之门 (旅行机器)

在鼠标指向的地方,生成一个 "Matic 朋友之门 (旅行机器)"

c_spawn("migration_portal")

靠近 "Matic 朋友之门",设置 "Matic 朋友之门" 连接的世界

c_find("migration_portal").components.worldmigrator:SetDestinationWorld("1",true)

1 为 世界的 id,主世界的 id 默认是 1,其他世界的 id 可以在 "server.ini(服务器配置文件)" 中设置。

参考资料

多层世界的建立