饥荒 Don't Starve Together 服务器安装记录
这是一份饥荒联机服务器搭建记录的流水账。
记录的是在 单核 1GB内存 1Mbps 安装有Ubuntu14.04 的 腾讯云学生机上安装饥荒联机版的过程。
安装中包括了主世界和洞穴世界,且有安装人物Mod和工具Mod。
需要注意的是,这份安装记录适用于 Steam 最新正版饥荒。TGP 版似乎并不支持。
如果你希望借助这份记录安装属于你自己的服务器,需要准备好:
一台内存够大的机器,安装有 Debian8/Ubuntu14.04 (x64) 及更新的系统。
内存的消耗量取决与最大游戏人数,饥荒的服务程序是一个玩家开启一个新的进程,一条进程消耗65MB。
(实际配置时会发现,1GB的内存大概跑四个人同时玩还是可以的。)
有人或许觉得对网络消耗很大,其实不然。
官方的安装文档里标记每个用户需 8KB/s 的网速,也就是说跑四个人的服务器 1Mbps 够了。
(你说用户没装服务器的Mod怎么办?不用慌,这种情况客户端会自己去创意工坊下载Mod,不会占用服务器网络)
正式安装,第一步是配置一个用户给 Steam 用。
# 以下操作使用 root 用户进行:
dpkg --add-architecture i386
apt-get update
apt-get install lib32gcc1 lib32stdc++6 libcurl4-gnutls-dev:i386
useradd -m steam
chmod a+rw `tty`
第二步是切换到 steam 用户安装 steamcmd 和 饥荒服务器。
# 此时切换到 steam 用户
su - steam
mkdir ~/steamcmd
cd ~/steamcmd
# 进行正式安装前,建议使用 export 命令配置 http_proxy https_proxy 代理服务器环境变量
# 比如你可以用 Cow 配置一个监听 127.0.0.1:8000 的 HTTP 代理
# 然后使用命令
# export http_proxy=http://127.0.0.1:8000/
# export https_proxy=http://127.0.0.1:8000/
# 这样可以大大减少等待时间
wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz
tar -xvzf steamcmd_linux.tar.gz
./steamcmd.sh
# 使用匿名登录 steam
login anonymous
# 选择安装路径(绝对路径)
force_install_dir /home/steam/steamapps/DST
# 安装饥荒并验证
app_update 343050 validate
# 退出 steamcmd
quit
需要注意的是,安装完还需要配置世界安装 Mod 才可以玩耍。
如果你只需要默认配置游玩,到这一步可以直接使用以下命令:
cd /home/steam/steamapps/DST/bin/
screen -S "DST Server" ./dontstarve_dedicated_server_nullrenderer
以下是定制世界的必要步骤:
首先是配置世界。饥荒有主世界和洞穴世界,而这并不是在同一个服务程序完成的(重要)。
对于服务器而言,在你跳下地洞的一瞬间,你的游戏是从 主世界进程 移动到了 洞穴世界进程。
你需要先在 /home/steam/.klei/DoNotStarveTogether
目录下新建一个文件夹,然后依照以下文件结构新建文件夹及文件。
比如我新建的文件夹名字是 Hibiki
,以下是文件结构:
Hibiki
├── cluster.ini
├── cluster_token.txt
├── Caves
│ ├── modoverrides.lua
│ ├── server.ini
│ └── worldgenoverride.lua
└── Master
├── modoverrides.lua
├── server.ini
└── worldgenoverride.lua
新建好文件后,往文件里填充内容。
首先是 cluster_token.txt
,这里头包含了 KLEI 对你服务器的授权码,按照以下步骤申请:
- 从 Steam 启动饥荒联机(Don’t Starve Together),并点击开始游戏(Play!)
- 点击账户信息(Acct Info)按钮(右下角那排小图标)
- 点击 Generate Server Token 获取令牌,将生成的一串字符串复制到
cluster_token.txt
然后是 cluster.ini
,在这个文件里配置服务器的描述信息及服务器类型,以下为我使用的配置文件:
[GAMEPLAY]
;游戏模式,左往右依次是无尽、生存和荒野模式 (endless|survival|wilderness)
game_mode = survival
;最大玩家数,1-64任意一个数
max_players = 5
;PvP,true即为开启,false即为关闭
pvp = false
;世界没人时是否自动暂停。
pause_when_empty = true
;是否允许投票踢人,默认开启。
vote_kick_enabled = false
[NETWORK]
;离线
offline_cluster = false
;仅局域网玩家可加入
lan_only_cluster = false
;此行是默认世界名称
cluster_name = Everlasting Melody
;此行是默认世界描述
cluster_description = by SgDylan@Hibiki
;世界的分类标签 cooperative, competitive, social, or madness
cluster_intention = cooperative
;世界密码,输入你要设置的密码,空则没有密码。
cluster_password = qwerty
;[填写DNS服务器]覆盖DNS设置,如果log in很慢的情况下,可以改成8.8.8.8,8.8.8.8。
;override_dns = 119.29.29.29,114.114.115.115
;是否自动存档,以防意外,默认开启。
autosaver_enabled = true
;帧刷新率,越高将有越好的游戏体验,但会增加CPU和宽带的负担,自己抉择吧。
tick_rate = 30
;等待未响应玩家重新连接的时间,以毫秒计时。
connection_timeout = 8000
;白名单空位,预留通道
whitelist_slots = 6
[MISC]
console_enabled = true
autocompiler_enabled = false
max_snapshots = 6
language_code = schinese
[SHARD]
shard_enabled = true
bind_ip = 127.0.0.1
master_ip = 127.0.0.1
master_port = 10889
cluster_key = ZNlehY5e4OAALHidqe3b
[STEAM]
;仅steam组成员可加入
;steam_group_only = true
;steam组号码
;steam_group_id = *******
;steam组成员为管理员
;steam_group_admins = true
然后是 server.ini 文件,这个没啥好说的,照抄就好了。
Master 文件夹里的这么写:
[SHARD]
is_master = true
[STEAM]
authentication_port = 12345
master_server_port = 12346
[NETWORK]
server_port = 10999
Caves 文件夹里的这么写:
[SHARD]
is_master = false
name = caves
id = 4276971209
[STEAM]
authentication_port = 10333
master_server_port = 10444
[NETWORK]
server_port = 11000
然后是世界配置文件 worldgenoverride.lua,注意 Master 文件夹和 Caves 文件夹 的并不相同。
Master 文件夹里的:
return {
override_enabled = true,
preset = SURVIVAL_TOGETHER, -- "SURVIVAL_TOGETHER", "MOD_MISSING", "SURVIVAL_TOGETHER_CLASSIC", "SURVIVAL_DEFAULT_PLUS", "COMPLETE_DARKNESS", "DST_CAVE", "DST_CAVE_PLUS"
overrides = {
-- MISC -- 世界
task_set = "default", -- 生物群落 -- 基础-- "classic", "default", "cave_default"
start_location = "default", -- 初始环境 -- 基础-- "caves", "default", "plus", "darkness"
world_size = "default", -- 世界大小 -- 基础-- "small", "medium", "default", "huge"
branching = "default", -- 岔路地形 -- 基础-- "never", "least", "default", "most"
loop = "default", -- 环状地形 -- 基础-- "never", "default", "always"
autumn = "default", -- 秋 -- 基础-- "noseason", "veryshortseason", "shortseason", "default", "longseason", "verylongseason", "random"
winter = "default", -- 冬 -- 基础-- "noseason", "veryshortseason", "shortseason", "default", "longseason", "verylongseason", "random"
spring = "default", -- 春 -- 基础-- "noseason", "veryshortseason", "shortseason", "default", "longseason", "verylongseason", "random"
summer = "default", -- 夏 -- 基础-- "noseason", "veryshortseason", "shortseason", "default", "longseason", "verylongseason", "random"
season_start = "default", -- 初始季节 -- 基础-- "default", "winter", "spring", "summer", "autumnorspring", "winterorsummer", "random"
day = "default", -- 时长 -- 基础-- "default", "longday", "longdusk", "longnight", "noday", "nodusk", "nonight", "onlyday", "onlydusk", "onlynight"
weather = "default", -- 雨 -- 基础-- "never", "rare", "default", "often", "always"
lightning = "default", -- 闪电 -- 森林-- "never", "rare", "default", "often", "always"
frograin = "default", -- 青蛙雨 -- 森林-- "never", "rare", "default", "often", "always"
wildfires = "default", -- 自燃 -- 森林-- "never", "rare", "default", "often", "always"
touchstone = "default", -- 试金石 -- 基础-- "never", "rare", "default", "often", "always"
regrowth = "default", -- 世界再生 -- 基础-- "veryslow", "slow", "default", "fast", "veryfast"
boons = "default", -- 前辈 -- 基础-- "never", "rare", "default", "often", "always"
prefabswaps_start = "default", -- 初始资源的多样性 -- 基础-- "classic", "default", "highly random"
prefabswaps = "default", -- 资源变化 -- 基础-- "default", "none", "few", "normal", "many", "max"
-- RESOURCES -- 资源
flowers = "default", -- 花、恶魔花 -- 森林-- "never", "rare", "default", "often", "always"
grass = "default", -- 草 -- 基础-- "never", "rare", "default", "often", "always"
sapling = "default", -- 树苗 -- 基础-- "never", "rare", "default", "often", "always"
marshbush = "default", -- 尖刺灌木 -- 基础-- "never", "rare", "default", "often", "always"
tumbleweed = "default", -- 风滚草 -- 森林-- "never", "rare", "default", "often", "always"
reeds = "default", -- 芦苇 -- 基础-- "never", "rare", "default", "often", "always"
trees = "default", -- 树(全) -- 基础-- "never", "rare", "default", "often", "always"
flint = "default", -- 燧石 -- 基础-- "never", "rare", "default", "often", "always"
rock = "default", -- 卵石 -- 基础-- "never", "rare", "default", "often", "always"
rock_ice = "default", -- 迷你冰川 -- 森林-- "never", "rare", "default", "often", "always"
meteorspawner = "default", -- 流星区域 -- 森林-- "never", "rare", "default", "often", "always"
meteorshowers = "default", -- 流星频率 -- 森林-- "never", "rare", "default", "often", "always"
-- UNPREPARED -- 随机物种
berrybush = "default", -- 浆果丛 -- 基础-- "never", "rare", "default", "often", "always"
carrot = "default", -- 胡萝卜 -- 森林-- "never", "rare", "default", "often", "always"
mushroom = "default", -- 蘑菇 -- 基础-- "never", "rare", "default", "often", "always"
cactus = "default", -- 仙人球 -- 森林-- "never", "rare", "default", "often", "always"
-- ANIMALS -- 动物
rabbits = "default", -- 兔子 -- 森林-- "never", "rare", "default", "often", "always"
moles = "default", -- 地鼠 -- 森林-- "never", "rare", "default", "often", "always"
butterfly = "default", -- 蝴蝶 -- 森林-- "never", "rare", "default", "often", "always"
birds = "default", -- 鸟 -- 森林-- "never", "rare", "default", "often", "always"
buzzard = "default", -- 秃鹰 -- 森林-- "never", "rare", "default", "often", "always"
catcoon = "default", -- 浣猫 -- 森林-- "never", "rare", "default", "often", "always"
perd = "default", -- 火鸡 -- 森林-- "never", "rare", "default", "often", "always"
pigs = "often", -- 猪人 -- 森林-- "never", "rare", "default", "often", "always"
lightninggoat = "default", -- 伏特羊 -- 森林-- "never", "rare", "default", "often", "always"
beefalo = "default", -- 皮弗娄牛 -- 森林-- "never", "rare", "default", "often", "always"
beefaloheat = "default", -- 皮弗娄牛交配(红屁股)频率 -- 森林-- "never", "rare", "default", "often", "always"
hunt = "default", -- 足迹 -- 森林-- "never", "rare", "default", "often", "always"
alternatehunt = "often", -- 彩蛋 -- 森林-- "never", "rare", "default", "often", "always"
penguins = "default", -- 疼讯 -- 森林-- "never", "rare", "default", "often", "always"
ponds = "default", -- 洞穴池塘 -- 森林-- "never", "rare", "default", "often", "always"
bees = "default", -- 蜜蜂 -- 森林-- "never", "rare", "default", "often", "always"
angrybees = "default", -- 杀人蜂 -- 森林-- "never", "rare", "default", "often", "always"
tallbirds = "default", -- 高鸟 -- 森林-- "never", "rare", "default", "often", "always"
-- MONSTERS -- 怪物
spiders = "default", -- 蜘蛛 -- 森林-- "never", "rare", "default", "often", "always"
hounds = "default", -- 猎犬攻击 -- 森林-- "never", "rare", "default", "often", "always"
houndmound = "default", -- 猎犬丘 -- 森林-- "never", "rare", "default", "often", "always"
merm = "default", -- 鱼人 -- 森林-- "never", "rare", "default", "often", "always"
tentacles = "default", -- 触手 -- 基础-- "never", "rare", "default", "often", "always"
chess = "default", -- 发条生物 -- 基础-- "never", "rare", "default", "often", "always"
lureplants = "default", -- 食人花 -- 森林-- "never", "rare", "default", "often", "always"
walrus = "default", -- 海象巢穴 -- 森林-- "never", "rare", "default", "often", "always"
liefs = "default", -- 树精守卫 -- 基础-- "never", "rare", "default", "often", "always"
deciduousmonster = "default", -- 桦树精 -- 森林-- "never", "rare", "default", "often", "always"
krampus = "default", -- 坎普斯 -- 森林-- "never", "rare", "default", "often", "always"
bearger = "default", -- 熊獾 -- 森林-- "never", "rare", "default", "often", "always"
deerclops = "default", -- 独眼巨鹿 -- 森林-- "never", "rare", "default", "often", "always"
goosemoose = "default", -- 鹿角鹅 -- 森林-- "never", "rare", "default", "often", "always"
dragonfly = "default", -- 龙蝇 -- 森林-- "never", "rare", "default", "often", "always"
},
}
Caves 文件夹里的:
return {
override_enabled = true,
preset = "DST_CAVE", -- "SURVIVAL_TOGETHER", "MOD_MISSING", "SURVIVAL_TOGETHER_CLASSIC", "SURVIVAL_DEFAULT_PLUS", "COMPLETE_DARKNESS", "DST_CAVE", "DST_CAVE_PLUS"
overrides = {
-- defalut is "never", "rare", "default", "often", "always"
-- MISC
task_set = "cave_default", -- "classic", "default", "cave_default"
start_location = "default", -- "caves", "default", "plus", "darkness"
world_size = "default", -- "small", "medium", "default", "huge"
branching = "default", -- "never", "least", "default", "most"
loop = "default", -- "never", "default", "always"
autumn = "default", -- "noseason", "veryshortseason", "shortseason", "default", "longseason", "verylongseason", "random"
winter = "default", -- "noseason", "veryshortseason", "shortseason", "default", "longseason", "verylongseason", "random"
spring = "default", -- "noseason", "veryshortseason", "shortseason", "default", "longseason", "verylongseason", "random"
summer = "default", -- "noseason", "veryshortseason", "shortseason", "default", "longseason", "verylongseason", "random"
season_start = "default", -- "default", "winter", "spring", "summer", "autumnorspring", "winterorsummer", "random"
day = "default", -- "default", "longday", "longdusk", "longnight", "noday", "nodusk", "nonight", "onlyday", "onlydusk", "onlynight"
weather = "default",
earthquakes = "default",
lightning = "default",
frograin = "default",
wildfires = "default",
touchstone = "default",
regrowth = "default", -- "veryslow", "slow", "default", "fast", "veryfast"
cavelight = "default", -- "veryslow", "slow", "default", "fast", "veryfast"
boons = "default",
prefabswaps_start = "default", -- "classic", "default", "highly random"
prefabswaps = "default", -- "none", "few", "default", "many", "max"
-- RESOURCES
flowers = "default",
grass = "default",
sapling = "default",
marshbush = "default",
tumbleweed = "default",
reeds = "default",
trees = "default",
flint = "default",
rock = "default",
rock_ice = "default",
meteorspawner = "default",
meteorshowers = "default",
mushtree = "default",
fern = "default",
flower_cave = "default",
wormlights = "default",
-- UNPREPARED
berrybush = "default",
carrot = "default",
mushroom = "default",
cactus = "default",
banana = "default",
lichen = "default",
-- ANIMALS
rabbits = "default",
moles = "default",
butterfly = "default",
birds = "default",
buzzard = "default",
catcoon = "default",
perd = "default",
pigs = "default",
lightninggoat = "default",
beefalo = "default",
beefaloheat = "default",
hunt = "default",
alternatehunt = "default",
penguins = "default",
cave_ponds = "default",
ponds = "default",
bees = "default",
angrybees = "default",
tallbirds = "default",
slurper = "default",
bunnymen = "default",
slurtles = "default",
rocky = "default",
monkey = "default",
-- MONSTERS
spiders = "default",
cave_spiders = "default",
hounds = "default",
houndmound = "default",
merm = "default",
tentacles = "default",
chess = "default",
lureplants = "default",
walrus = "default",
liefs = "default",
deciduousmonster = "default",
krampus = "default",
bearger = "default",
deerclops = "default",
goosemoose = "default",
dragonfly = "default",
bats = "default",
fissure = "default",
worms = "default",
},
}
最后是 Mod 配置,Mod 的使用需要两个文件的支持,
一个是 /home/steam/steamapps/DST/mods
目录下的 dedicated_server_mods_setup.lua
,
另一个是游戏文件夹的两个 modoverrides.lua
文件。
首先到饥荒创意工坊的页面找到你需要的 Mod,比如这个:
https://steamcommunity.com/sharedfiles/filedetails/?id=721491336&searchtext=
然后可以看到网址里有个ID参数为 721491336
,这就是 Mod 的创意工坊ID。
然后将它填进 dedicated_server_mods_setup.lua
,这样游戏服务程序才会安装这个 Mod。
我是这样配置的:
--There are two functions that will install mods, ServerModSetup and ServerModCollectionSetup. Put the calls to the functions in this file and they will be executed on boot.
--ServerModSetup takes a string of a specific mod's Workshop id. It will download and install the mod to your mod directory on boot.
--The Workshop id can be found at the end of the url to the mod's Workshop page.
--Example: http://steamcommunity.com/sharedfiles/filedetails/?id=350811795
--ServerModSetup("350811795")
--ServerModCollectionSetup takes a string of a specific mod's Workshop id. It will download all the mods in the collection and install them to the mod directory on boot.
--The Workshop id can be found at the end of the url to the collection's Workshop page.
--Example: http://steamcommunity.com/sharedfiles/filedetails/?id=379114180
--ServerModCollectionSetup("379114180")
--Hibiki
ServerModSetup("721491336")
--Horo
ServerModSetup("441957490")
--Tamamo
ServerModSetup("399799824")
--Madoka
ServerModSetup("461627386")
--Neptunia
ServerModSetup("472803272")
--Asuna
ServerModSetup("438211232")
--Remilia Scarlet
ServerModSetup("684098549")
--雾雨魔理沙
ServerModSetup("684041335")
然后将 Mod 加载到游戏需要修改 modoverrides.lua
,这里两个文件夹使用的是相同的内容。
我是这么写的:
return {
["workshop-721491336"]={
configuration_options={
["General Winter"]="On",
["Phoenix's Resilience"]="On",
["Survivor's Guilt"]="On",
Trustworthy="On"
},
enabled=true
},
["workshop-441957490"]={ configuration_options={ }, enabled=true },
["workshop-399799824"]={ configuration_options={ }, enabled=true },
["workshop-461627386"]={ configuration_options={ }, enabled=true },
["workshop-472803272"]={ configuration_options={ }, enabled=true },
["workshop-438211232"]={ configuration_options={ }, enabled=true },
["workshop-684098549"]={ configuration_options={ }, enabled=true },
["workshop-684041335"]={ configuration_options={ }, enabled=true },
}
到这里就完成了游戏的配置,可以运行了。
首先是切换到 /home/steam/steamapps/DST/bin
目录,然后运行
screen -dmS "DST_master" ./dontstarve_dedicated_server_nullrenderer -console -cluster "Hibiki" -shard Master -monitor_parent_process $$
screen -dmS "DST_caves" ./dontstarve_dedicated_server_nullrenderer -console -cluster "Hibiki" -shard Caves -monitor_parent_process $$
你也可以这样偷懒:
cd /home/steam/steamapps/DST/bin && screen -dmS "DST_master" ./dontstarve_dedicated_server_nullrenderer -console -cluster "Hibiki" -shard Master -monitor_parent_process $$ && screen -dmS "DST_caves" ./dontstarve_dedicated_server_nullrenderer -console -cluster "Hibiki" -shard Caves -monitor_parent_process $$
注意命令中的 Hibiki
是我们最初创建文件夹的名字。
至此,游戏服务器已经正确运行了,但是还有Mod没有配置对吧。
那么回到对 Mod 进行配置,这一步必须你先运行一回服务器,这样程序才会下载 Mod,生成相关文件。
Mod 存放在 /home/steam/steamapps/DST/mods
目录,比如 IJN DD Hibiki
的 Mod 在 workshop-721491336
文件夹,这与其创意工坊ID是一致的。
进入 Mod 文件夹,可以找到 modinfo.lua
,在 configuration_options
条目里,可以看到 Mod 被允许设置的选项及选项支持的参数。
于是可以按照这样的格式写入 modoverrides.lua
配置
["workshop-721491336"]={
configuration_options={
["General Winter"]="On",
["Phoenix's Resilience"]="On",
["Survivor's Guilt"]="On",
Trustworthy="On"
},
enabled=true
},