0x00 前言

近期大件事,三年的疫情管控结束了,全国基本放开,不用做核酸,火车高铁和各种公共场合也不用查看健康码和行程码了;坏消息是🐏🐏🐏😥🐏🐏🐏…

起因是学校提前一个月把我们赶回家,但在家难免有些清闲,忽思与友同戏《饥荒》,然卡顿异常,忍无可忍,不得已自搭服务器与之同乐。顺便水篇博客

0x01 基础搭建

我太懒了,ssh一直的用root登录,建议一定要使用非root用户连接。

这是我的服务器配置,3-4个人感觉问题不大。

image-20221217184108264

安装一些依赖项,忘记了,必要时可以百度,接着安装steamcmd,并执行steamcmd.sh

1
2
3
4
5
6
7
8
9
10
mkdir ~/steamcmd
cd ~/steamcmd
wget http://media.steampowered.com/installer/steamcmd_linux.tar.gz
tar -xvzf steamcmd_linux.tar.gz

./steamcmd.sh
login anonymous
force_install_dir "../myDSTserver/" #修改DST安装路径
app_update 343050 validate
quit

启动游戏,点击账号,用户信息里获取用户ID;游戏里获取服务器token

image-20221217183345589image-20221217183540810

之后,可以使用旧存档的文件,或者点击配置服务器,新建一个新的存档文件夹。两种都差不多,我就把旧的存档上传到服务器上,路径是~/.klei/DoNotStarveTogether/Cluster_1/,目录结构是这样的

1
2
3
4
5
6
7
8
9
10
11
├── Cluster_1/
│ ├── cluster.ini
│ ├── cluster_token.txt
│ ├── Caves/
│ │ ├── server.ini
│ │ ├── leveldataoverride.lua
│ │ ├── modoverrides.lua
│ ├── Master/
│ │ ├── server.ini
│ │ ├── leveldataoverride.lua
│ │ ├── modoverrides.lua

这是一个完整的位面所需要配置的文件

  • cluster_token.txt 存储的是从 Klei 官网拿到的 token
  • cluster.ini 即这个位面的主配置,主要配置游戏模式、游戏人数、服务器名、密码、 steam 组等等
  • Master/server.iniCaves/server.ini 配置基本相同,主要是世界的端口号和主次世界设置
  • modoverrides.lua 配置开启的 mod 的设置
  • leveldataoverride.lua 配置这个世界的资源、设置

另外在安装目录中有个 mods 的目录,其中可以添加服务器模组,当然仅仅是安装到服务器上。用不用还是需要看世界中 modoverrides.lua 的设置。

地上世界(洞穴)基础配置文件 leveldataoverride.lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
return {
desc="The standard Don't Starve experience.",
hideminimap=false,
id="SURVIVAL_TOGETHER",
location="forest",
max_playlist_position=999,
min_playlist_position=0,
name="Standard Forest",
-- 雕像的数量
numrandom_set_pieces=4,
override_level_string=false,
overrides={
-- 资源设置的可选项分别为:
----- "never" 无
----- "rare" 较少
----- "default" 默认
----- "often" 较多
----- "always" 大量

-- 全局设置
--- 特殊事件
----- "none" 无
----- "default" 自动
----- "crow_carnival" 盛夏鸦年华
----- "hallowed_nights" 万圣之夜
----- "winters_feast" 冬季盛宴
----- "year_of_the_gobbler" 火鸡之年
----- "year_of_the_varg" 座狼之年
----- "year_of_the_pig" 猪王之年
----- "year_of_the_carrat" 胡萝卜鼠之年
----- "year_of_the_beefalo" 皮弗娄牛之年
specialevent="default",
--- 季节
----- "noseason" 无季节
----- "veryshortseason" 非常短
----- "shortseason" 较短
----- "default" 默认长度
----- "longseason" 较长
----- "verylongseason" 非常长
----- "random" 随机长度
autumn="default", --- 秋季, 根据设置天数依次为 5 / 12 / 20 / 30 / 50
winter="default", --- 冬季, 根据设置天数依次为 5 / 10 / 15 / 22 / 40
spring="default", --- 春季, 根据设置天数依次为 5 / 12 / 20 / 30 / 50
summer="default", --- 夏季, 根据设置天数依次为 5 / 10 / 15 / 22 / 40
--- 天类型
----- "default" 默认
----- "longday" 加长白天
----- "longdusk" 加长黄昏
----- "longnight" 加长黑夜
----- "noday" 无白天
----- "nodusk" 无黄昏
----- "nonight" 无黑夜
----- "onlyday" 只有白天
----- "onlydusk" 只有黄昏
----- "onlynight" 只有黑夜
day="default",
beefaloheat="default", --- 野牛发情
krampus="default", --- 坎普斯

-- 求生者设置
--- 额外起始资源
----- "0" 总是
----- "5" 5 天后
----- "default" 10 天后
----- "15" 15 天后
----- "20" 20 天后
----- "none" 从不
extrastartingitems="default",
seasonalstartingitems="default", --- 季节起始物品, "never" / "default"
spawnprotection="default", --- 出生点保护, "never" / "default" / "always"
dropeverythingondespawn="default", --- 退出掉落物品, "default" / "always"
brightmarecreatures="default", --- 启蒙怪兽数量
shadowcreatures="default", --- 理智怪兽数量

-- 世界设置
--- 石化
----- "none" 无
----- "few" 慢
----- "default" 默认
----- "many" 快
----- "max" 极快
petrification="default",
frograin="default", --- 蛙雨
hounds="default", --- 猎犬来袭频率
alternatehunt="default", --- 追猎惊喜
hunt="default", --- 狩猎
lightning="default", --- 闪电
meteorshowers="default", --- 流星
weather="default", --- 雨
wildfires="default", --- 野火

-- 资源再生的可选项分别为:
----- "never" 从不
----- "veryslow" 非常慢
----- "slow" 缓慢
----- "default" 默认
----- "fast" 快速
----- "veryfast" 非常快

-- 资源再生设置
regrowth="default", --- 再生速度
deciduoustree_regrowth="default", --- 桦栗树再生
carrots_regrowth="default", --- 胡萝卜再生
evergreen_regrowth="default", --- 常青树再生
flowers_regrowth="default", --- 花再生
moon_tree_regrowth="default", --- 月树再生
saltstack_regrowth="default", --- 盐矿再生
twiggytrees_regrowth="default", --- 多枝树再生

-- 生物设置
bees_setting="default", --- 蜜蜂
birds="default", --- 鸟
bunnymen_setting="default", --- 兔人
butterfly="default", --- 蝴蝶
catcoons="default", --- 浣猫
gnarwail="default", --- 一角鲸
perd="default", --- 火鸡
grassgekkos="default", --- 草蜥蜴
moles_setting="default", --- 鼹鼠
penguins="default", --- 企鹅
pigs_setting="default", --- 猪人
rabbits_setting="default", --- 兔子
fishschools="default", --- 鱼群
wobsters="default", --- 龙虾

-- 敌对生物设置
bats_setting="default", --- 蝙蝠
cookiecutters="default", --- 饼干切割机
frogs="default", --- 青蛙
mutated_hounds="default", --- 恐怖猎犬, "never" / "default"
hound_mounds="default", --- 猎犬
wasps="default", --- 杀人蜂
lureplants="default", --- 食人花
walrus_setting="default", --- 海象
merms="default", --- 鱼人
penguins_moon="default", --- 月石企鹅, "never" / "default"
mosquitos="default", --- 蚊子
sharks="default", --- 鲨鱼
moon_spider="default", --- 破碎蜘蛛
squid="default", --- 乌贼
spider_warriors="default", --- 蜘蛛战士, "never" / "default"
spiders_setting="default", --- 蜘蛛

-- 巨型生物设置
antliontribute="default", --- 蚁狮
bearger="default", --- 熊獾
beequeen="default", --- 蜂后
crabking="default", --- 帝王蟹
deerclops="default", --- 独眼巨鹿
dragonfly="default", --- 龙蝇
eyeofterror="default", --- 泰拉瑞亚之眼
klaus="default", --- 克劳斯
fruitfly="default", --- 果蝇王
malbatross="default", --- 邪天翁
goosemoose="default", --- 麋鹿鹅
deciduousmonster="default", --- 毒桦栗树
spiderqueen="default", --- 蜘蛛女王
liefs="default", --- 树精守卫

-- 世界生成中等级分别为:
----- "never" 无
----- "uncommon" 很少
----- "rare" 较少
----- "default" 默认
----- "often" 较多
----- "mostly" 很多
----- "always" 大量
----- "insane" 疯狂

-- 全局生成
--- 起始季节
----- "default" 秋
----- "winter" 冬
----- "spring" 春
----- "summer" 夏
----- "autumn|spring" 秋或春
----- "winter|summer" 冬或夏
----- "autumn|winter|spring|summer" 随机
season_start="default",

-- 世界生成
--- 生物群落
----- "default" 联机版
----- "classic" 经典
task_set="default",
--- 出生点
----- "plus" 额外资源
----- "darkness" 黑暗
----- "default" 默认
start_location="default",
world_size="default", --- 世界大小, "small" / "medium" / "default" / "huge"
--- 世界分支
----- "never" 从不
----- "least" 少
----- "default" 默认
----- "most" 多
----- "random" 随机
branching="default",
loop="default", --- 环形世界, "never" / "default" / "always"
touchstone="default", --- 试金石
boons="default", --- 前辈
prefabswaps_start="default", --- 初始资源多样化, "classic" / "default" / "random"
moon_fissure="default", --- 天体裂隙
terrariumchest="default", --- 泰拉瑞亚, "never" / "default"
roads="default", --- 道路, "never" / "default"
wormhole_prefab="wormhole", --- 虫洞多样性, "wormhole" (虫洞) / "tentacle_pillar" (巨大触手)

-- 资源
moon_starfish="default", --- 海星
moon_bullkelp="default", --- 公牛海带茎
berrybush="default", --- 浆果从
rock="default", --- 岩石
ocean_bullkelp="default", --- 公牛海带
cactus="default", --- 仙人掌
carrot="default", --- 胡萝卜
flint="default", --- 燧石
flowers="default", --- 花
grass="default", --- 草
moon_hotspring="default", --- 温泉
moon_rock="default", --- 月亮石
moon_sapling="default", --- 月亮树苗
moon_tree="default", --- 月树
meteorspawner="default", --- 流星区
rock_ice="default", --- 迷你冰川
mushroom="default", --- 蘑菇
ponds="default", --- 池塘
reeds="default", --- 芦苇
sapling="default", --- 小树苗
ocean_seastack="ocean_default", --- 海矿, 参数需要加 "ocean_" 前缀
marshbush="default", --- 荆棘树枝
moon_berrybush="default", --- 石果树
trees="default", --- 树 (所有)
tumbleweed="default", --- 风滚草

-- 生物及刷新点
bees="default", --- 蜂巢
beefalo="default", --- 皮弗娄牛
buzzard="default", --- 秃鸠
moon_carrot="default", --- 胡萝卜鼠
catcoon="default", --- 猫桩
moles="default", --- 鼹鼠洞
pigs="default", --- 猪人房
rabbits="default", --- 兔子洞
moon_fruitdragon="default", --- 沙拉蝾螈
ocean_shoal="default", --- 鱼群
lightninggoat="default", --- 伏特羊
ocean_wobsterden="default", --- 龙虾窝

-- 敌对生物及刷新点
chess="default", --- 发条装置
houndmound="default", --- 猎犬冢
angrybees="default", --- 杀人蜂巢
merm="default", --- 漏雨的小屋
walrus="default", --- 海象营地
ocean_waterplant="ocean_default", --- 海草
moon_spiders="default", --- 破碎蜘蛛洞
spiders="default", --- 蜘蛛巢
tallbirds="default", --- 高脚鸟巢
tentacles="default", --- 触手

--- Other
has_ocean=true,
keep_disconnected_tiles=true,
layout_mode="LinkNodesByKeys",
no_joining_islands=true,
no_wormholes_to_disconnected_tiles=true
},
random_set_pieces={r
"Sculptures_2",
"Sculptures_3",
"Sculptures_4",
"Sculptures_5",
"Chessy_1", -- 2发条骑士,2齿轮,长矛,棋盘地皮
"Chessy_2", -- 2发条主教,棋盘、牛毛地皮,Maxwell 雕像,(2齿轮)
"Chessy_3", -- 发条战车,蜂蜜药膏,背包,棋盘、牛毛地皮
"Chessy_4", -- 发条战车,2大理石,鹤嘴锄,2大理石柱,1大理石树,棋盘、牛毛地皮,Maxwell 雕像
"Chessy_5", -- 1发条骑士,1发条主教,竖琴雕像,棋盘、牛毛地皮
"Chessy_6", -- 1发条骑士,1发条主教,棋盘、牛毛地皮
"Maxwell1", -- 1发条战车,3发条骑士,棋盘、牛毛地皮,4大理石柱,9大理石树,大量恶魔花
"Maxwell2", -- 1发条战车,4发条骑士,棋盘、牛毛地皮,8大理石树,Maxwell 雕像
"Maxwell3", -- 5发条骑士,棋盘、牛毛地皮,Maxwell 雕像
"Maxwell4", -- 棋盘、牛毛地皮,8大理石树,Maxwell 雕像
"Maxwell5", -- 1发条骑士,牛毛地皮,8竖琴雕像,Maxwell 雕像,少量恶魔花
"Maxwell6", -- 5大理石树,牛毛地皮
"Maxwell7", -- 2发条骑士,棋盘、牛毛地皮,4大理石树,Maxwell 雕像,少量恶魔花
"Warzone_1",
"Warzone_2",
"Warzone_3"
},
required_prefabs={ "multiplayer_portal" },
-- 必须包含的雕像种类,而非随机生成。这里指定必须生成完整的三棋子雕像
required_setpieces={ "Sculptures_1" },
settings_desc="The standard Don't Starve experience.",
settings_id="SURVIVAL_TOGETHER",
settings_name="Standard Forest",
substitutes={ },
version=4,
worldgen_desc="The standard Don't Starve experience.",
worldgen_id="SURVIVAL_TOGETHER",
worldgen_name="Standard Forest"
}

根目录下的cluster.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[GAMEPLAY]
max_players = 6 # 最大游戏人数
pvp = true # 能不能攻击其他玩家,能不能给其他玩家喂屎
game_mode = survival # 游戏模式,可选 survival, endless or wilderness,与玩家死亡后的负面影响有关
pause_when_empty = false # 没人服务器暂停,刷天数必备
vote_kick_enabled = false # 投票踢人

[STEAM]
steam_group_only = false # 只允许某 Steam 组的成员加入
steam_group_id = 0 # 指定某个 Steam 组,填写组 ID
steam_group_admins = false # 开启后,Steam 组的管理员拥有服务器的管理权限

[NETWORK]
cluster_description = ~ # 游戏房间描述
cluster_name = ~ # 游戏房间名称
cluster_intention = social # 游戏偏好,可选 cooperative, competitive, social, madness
cluster_password = # 游戏密码,不设置表示无密码
offline_server = false # 是否离线服务器,只有局域网用户能加入,并且所有依赖于 Steam 的任何功能都无效,比如说饰品掉落
tick_rate = 15 # 每秒通信次数,越高游戏体验越好,但是会加大服务器负担
whitelist_slots = 0 # 为白名单用户保留的游戏位
lan_only_cluster = false # 局域网游戏

[MISC]
console_enabled = true # 是否开启控制台
max_snapshots = 6 # 最大快照数,决定了可回滚的天数

[SHARD]
shard_enabled = true # 是否允许地上及洞穴互通,开启洞穴的话必须填true
bind_ip = 127.0.0.1 # 服务器监听的地址,单服务器搭建填 127.0.0.1,双服务器搭建填0.0.0.0
master_ip = 127.0.0.1 # 主世界服务器的 IP,单服务器搭建填127.0.0.1,双服务器搭建填写服务器的公网IP
master_port = 10889 # 监听 master 服务器的 UDP 端口
cluster_key = supersecretkey # 游戏通讯密码,每台服务器必须相同

地上(洞穴)的server.ini

1
2
3
4
5
6
7
8
9
10
11
12
[NETWORK]
server_port = 11000 # 监听的 UDP 端口,只能介于 10998 - 11018 之间,确保每个实例都不相同

[SHARD]
is_master = true # 是否是 master 服务器,只能存在一个 true,其他全是 false

[STEAM]
master_server_port = 27018 # Steam 用的端口,确保每个实例都不相同
authentication_port = 8768 # Steam 用的端口,确保每个实例都不相同

[ACCOUNT]
encode_user_path = true

这些配置文件可根据自己的需求设置。最后执行脚本启动服务即可。

1
2
3
#!/bin/sh
cd ~/myDSTserver/bin
screen -S "Don't Starve Together Server" ./dontstarve_dedicated_server_nullrenderer

ctrl a ,ctrl d后台运行,screen -r 恢复

0x02 添加服务器mod

无mod,不饥荒。在本地目录可以找到自己的模组,可以先创建世界后,导出配置文件并上传到服务器。这里就不放了,还有更简单的方法,在服务器的DST的mods目录下,有个dedicated_server_mods_setup.lua文件,在里面写入想要更新的mod即可,很方便。下载并安装这些 Mod(如果没有下载的话),并更新到最新版本。

image-20221217190311944

接着启动mod,在~/.klei/DoNotStarveTogether/Cluster_1/Master目录下,编辑 modoverrides.lua 文件保存即可。格式如下:

1
2
3
4
return {
["workshop-797304209"]={ configuration_options={ }, enabled=true },
["workshop-806984122"]={ configuration_options={ }, enabled=true },
}

饥荒的模组很多,推荐几个比较常用的,服务器模组有显示食物补充值,显示地图队友位置,显示野怪血量,原地复活。

客户端模组有禁止弹出模组信息和Combined Status:显示状态信息,非常实用!

image-20221217190543967

0x03 添加管理员

饥荒的管理员会有特殊操作权限,如果创建者不在而你因为特殊原因要回滚世界 ,就需要被赋予管理员权限才能执行回退世界的操作。

1、首先获取自己的KLEI用户ID,进游戏之后点“账户”即可查看

2、在服务器存档下新建一个文本文档,命名为adminlist.txt,将你的KLEI用户ID写进去就可以,保存退出。

0x04 其他

运行 dontstarve_dedicated_server_nullrenderer,还有其他的启动参数。主要参数如下:

参数 用法
-persistent_storage_root 指定存档根目录的位置,必须是绝对目录。默认为 ~/.klei
-conf_dir 指定配置文件的目录名。默认为 DoNotStarveTogether,和上一个参数拼在一起就是你存档的完整位置了,默认为 ~/.klei/DoNotStarveTogether,所有的存档都在这里。
-cluster 指定启动的世界,默认为 Cluster_1。服务端启动时会去找 <persistent_storage_root>/<conf_dir>/<cluster> 目录下的 cluster.ini 这个配置文件,你的世界名称、密码、游戏模式之类的都是在这里配置的(网上有些教程里用的 setting.ini,那个是旧版的)。同理,你的存档文件夹也可以不使用类似 Cluster_X 的名字,改成其他什么乱七八糟的都可以,只要启动时指定本参数就行了。
-shard 默认为 Master,启动时将此参数指定为 Cave 就可以启动洞穴服务器。

如果游戏更新后,服务器DST不更新也无法运行,更新步骤如下:

1
2
3
4
5
6
cd ~/steamcmd
./steamcmd.sh
force_install_dir ../myDSTserver
login anonymous
app_update 343050 validate
quit

0x05 小结

这样就可以正常玩耍了,总体还是比较简单的,不需要太多的操作。后期如果还有要改进的地方再继续来更新。

image-20221227195422183