Yet another otaku

某ロリコン的自白


  • 首頁
  • 歸檔
  • 分類
  • 標籤
  • 連結
  • 關於
  •    

© 2025 SgDylan

Theme Typography by Makito

Proudly published with Hexo

饥荒 Don't Starve Together 服务器安装记录

發佈於 2017-01-02 評論 笔记  饥荒 联机版 服务器 Linux SteamCMD 

这是一份饥荒联机服务器搭建记录的流水账。
记录的是在 单核 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 对你服务器的授权码,按照以下步骤申请:

  1. 从 Steam 启动饥荒联机(Don’t Starve Together),并点击开始游戏(Play!)
  2. 点击账户信息(Acct Info)按钮(右下角那排小图标)
  3. 点击 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 
  },

分享到 

 上一篇: 使用 ESP8266 搭建 IoT 节点 下一篇: 一种批量下载Bilibili视频的方法 

© 2025 SgDylan

Theme Typography by Makito

Proudly published with Hexo