前言

经常玩单机游戏的玩家都会知道,在联机过程中房主的网络状态和电脑性能影响着整个房间中玩家的游戏体验,在房主网络状态差或电脑性能低的时候,经常会出现卡顿,丢包甚至掉线的情况。这是由于在房主开游戏的时候,会在其电脑本地启动一个服务器端,然后玩家的游戏客户端都与这个服务器端连接,进行联机游戏,当房主电脑性能不足或者网络波动时,必定会影响整个服务器中的玩家体验。

1.准备

① 用来买云主机的 Money ... ( 嗯 ... 钱是很重要的 .. 不过可以考虑一下学生机 ,如果还是学生的话 )

② 一台可以上网的电脑 ( 废话 )

③ SSH连接工具 ( 推荐Xshell,免费版即可,提取码:idvz )

2.购买云主机

此处使用阿里云主机作为示例。

首先打开阿里云官网,注册...登陆...实名制之类的东西,然后打开购买页面

地域:服务器地区尽量选择离你较近的地域,可以有效降低延迟。

实例:一定不要因为便宜而选突发性实例,这个规格的云主机每天只有2个多小时是满性能的,其他情况下都是超级卡的状态 ( 显然我是买过的...? )

镜像:选择CentOS 7.6 64位 ( 如果会Linux相关知识,系统可自己选择 )

存储:默认40G,完全够用了

点击下一步,进入网络和安全组配置:

网络:默认

公网带宽:选择按固定带宽1M ( 多人可以考虑2M,如果用量不大可以选择按量付费,不过不确定一个月的具体流量 )

安全组:默认

点击下一步,进入系统配置:

登录凭证:选择自定义密码,输入登录密码 ( 以后可以在控制台重置密码 )

其他默认,然后确认订单,付款。

关于服务器配置的选择,贴一张官网的图:

意思就是:

① 一个玩家需要8Kb/s的上传带宽 ( 云主机的宽带通常就是指的上传带宽,这个很容易满足 )

② 一个玩家大约需要65M内存 ( 内存是需要重视的问题,通常玩饥荒都会开启两个世界:一个地上,一个地下。因此在计算内存的时候,如果你选择开启两个世界,那么这个数据需要乘上2。而且这个是指不开任何Mod的情况下,如果是大型Mod,内存占用是很可怕的。之前试过一次智能敌对,一个世界的进程能吃1G的内存 )

③ 不是很清楚它说的CPU是N/A是任意的意思么,可是实际上后期世界中的生物越来越多的情况下,CPU特别容易爆 ( 推荐安装服务器清理Mod )

④ 需要的环境

参考 : 我使用的是1核2G2M带宽的服务器 ,一年费用是1000+,在装有服务器清理Mod的情况下,正常6人玩到200多天是没什么问题的,不过在青蛙雨和蜘蛛区的时候还是会很卡。( 吐槽一下:垃圾游戏渣优化,以前弄求生之路服务器的时候,完全不需要考虑内存的问题,饥荒这种贴图游戏实在是太吃内存了...? )

3.配置并连接云主机

付款后,过一分钟左右就可以在控制台看到云主机了,显示的都是一些基本信息,记录下公网IP地址。然后按照下图进入安全组配置:

点击配置规则:( 饥荒服务器默认端口为10999和10998,因此需要开启这两个端口 )


打开Xshell工具,使用快捷键ALT+N新建连接,如下图 ( 也可以点击 -> 文件 -> 新建 ):


点击连接,下面的提示点击确定,进入下面的界面就表示连接成功:

4.下载并安装游戏

接下来就是操作Linux系统了,下面命令按行敲入窗口中,按回车键执行。

首先更新yum ( Linux系统中安装软件包的工具 ) :

yum update
yum upgrade -y

安装游戏运行环境和常用工具

yum install glibc.i686 libstdc++.i686 libcurl.i686 vim screen -y

创建steam用户

useradd steam 
su steam
cd ~
mkdir steamcmd
cd steamcmd

下载并解压Steam的Linux客户端steamcmd

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

启动Steam客户端,并开始下载饥荒 ( 饥荒专用服务器ID为 343050 )

./steamcmd.sh +login anonymous +force_install_dir /home/dst +app_update 343050 validate +quit

下载完毕后 ( 大概十分钟左右 ),先启动一次服务器,验证是否缺失依赖

cd /home/steam/dst/bin
~/dst/bin/dontstarve_dedicated_server_nullrenderer -cluster MyDediServer -shard Master

此时可能会报找不到libcurl-gnutls.so.4,解决方法为将该依赖库复制到饥荒游戏文件夹中:

cp /usr/lib/libcurl.so.4 ~/dst/bin/lib32/libcurl-gnutls.so.4 

这里可能会有其他依赖包的缺失问题,解决办法即是将依赖复制到饥荒游戏文件夹中。

正常启动后,按Ctrl+C即可关闭服务器,也可以使用控制台命令c_shutdown()。

PS:饥荒服务器控制台指令自行百度。

5.存档配置

在存档配置之前,我们现在电脑上打开饥荒联机版游戏,进入主界面,点击下面的账号按钮,查看个人ID和个人服务器的token,如下:

个人ID: KU_uG******
服务器token: pds-g^KU_uGVY9tdU^M***************************Sdsg50g4A6jg=




饥荒默认存档位置在用户目录中.kiel文件夹中 ( ~/.kiel/DoNotStarveTogether),由于我们在上面的启动命令中增加了-cluster参数,因此会在该文件夹中自动创建名为MyDediServer的存档文件夹,如果不指定该参数,则会自动生成Cluster_1的文件夹。

由于饥荒服务器直接添加配置文件太过复杂,这里推荐使用存档替换的方式:

① 首先在个人电脑上启动游戏,创建一个新世界 ( 此处记住服务器栏位1~5 )

② 自定义自己的世界配置和Mod配置,启动世界后等到选人界面时退出

③ 在游戏首页点击数据图标,进入本地存档目录,按照你刚才的栏位找到名为Cluster_[栏位]的文件夹,即为刚才创建的世界存档,复制当前文档路径,例如:F:\我的文档\Klei\DoNotStarveTogether\Cluster_1

④ 打开Xftp工具,直接点击下图所示图标即可

⑤ 左边为本地文件目录,右边为远程服务器文件目录

⑥ 在左边粘贴刚才复制的文档路径,回车进入;右边输入服务器存档目录即 /home/steam/.klei/DoNotStarveTogether/MyDediServer,回车进入

文件对应说明:
Master 文件夹为主世界即地面世界存档及配置
Caves 文件夹为洞穴世界存档及配置
cluser.ini 文件为服务器信息,世界名称,密码等
cluster_token.txt 为服务器 token
Master和Caves中共有的:
    backup -> 服务器日志及聊天日志存档
    save ->存档文件夹
    sever_chat_log.txt -> 服务器此次启动中玩家的聊天内容
    server_log.txt -> 服务器日志
    server.ini -> 世界的配置信息,端口等
    leveldataoverride.lua->世界配置文件,即为世界详细配置,可以直接对其更改
    modoverrides.lua -> Mod配置文件,可以对其修改完成服务器Mod配置 

直接选中左侧所有文件及文件夹,拖拽至右侧,选择全部覆盖,等待文件全部传输至服务器即可关闭。然后再次回到Xshell窗口 ( 由于创建steam用户时没有添加密码,因此上传文件时默认使用的是root用户,此时需要先更改文件所有者 )

exit
chown -R steam:steam /home/steam 
su steam

再进入存档文件夹,修改服务器token:

cd /home/steam/.klei/DoNotStarveTogether/MyDediServer
# 编辑cluster_token.txt
vim cluster_token.txt
# 此时按i进入编辑模式,在文件中输入之前获取的服务器token
pds-g^KU_uGVY9tdU^M***************************Sdsg50g4A6jg=
# 编辑完成,按ESC,输入:wq 回车,即为保存并退出

修改服务器配置:

cd /home/steam/.klei/DoNotStarveTogether/MyDediServer
# 编辑cluster.ini
vim cluster.ini
# ...找到shard_enabled行,修改为true
shard_enabled = true
# 编辑完成,按ESC,输入:wq回车

编辑管理员列表 ( 非必须 ) :

# 编辑adminlist.txt管理员列表,输入你想添加的玩家ID(类似于之前获取的个人ID)由于服务器token所有者默认拥有管理员权限,因此不需要添加自己的ID,此处仅做为参考
vim adminlist.txt
# 输入
KU_uG******
# 编辑完成,按ESC,输入:wq 回车,即为保存并退出

编辑黑名单列表 ( 非必须 ) :

vim blocklist.txt
# 输入黑名单玩家ID
xxxxxxx
# 编辑完成,按ESC,输入:wq 回车,即为保存并退出

6.MOD下载及使用

Mod的配置文件即为上面所说的modoverrides.lua,使用编辑页面打开:

return {
  ["workshop-1160616621"]={
    configuration_options={ Language="def", Ownership=true, Travel_Cost=32 },
    enabled=false 
  },
  ["workshop-1216718131"]={ configuration_options={ clean=true, lang=true, stack=true }, enabled=true },
  ["workshop-362175979"]={ configuration_options={ ["Draw over FoW"]="disabled" }, enabled=true },
  ["workshop-378160973"]={
    configuration_options={
     ENABLEPINGS=true,
     FIREOPTIONS=2,
     OVERRIDEMODE=false,
     SHAREMINIMAPPROGRESS=true,
     SHOWFIREICONS=true,
     SHOWPLAYERICONS=true,
     SHOWPLAYERSOPTIONS=2 
    },
    enabled=true 
  },
  ["workshop-703758203"]={ configuration_options={  }, enabled=true },
  ["workshop-804317397"]={
    configuration_options={
      buffgo=false,
      fhl_cos=0.05,
      fhl_hjopen=false,
      likeornot=false,
      openli=false,
      openlight=false,
      zzj_cankanshu=false,
      zzj_canuseashammer=false,
      zzj_canuseasshovel=false,
      zzj_canwakuang=false,
      zzj_finiteuses=210,
      zzj_fireopen=false,
      zzj_pre=1 
    },
    enabled=true 
  },
--  Show Me
  ["workshop-666155465"]={
    configuration_options={ food_estimation=-1, food_order=0, food_style=0, lang="chs", show_food_units=-1 },
    enabled=true
  },
--  复活
  ["workshop-462434129"]={
    configuration_options={
      MOD_RESTART_ALLOW_KILL=false,
      MOD_RESTART_ALLOW_RESTART=true,
      MOD_RESTART_ALLOW_RESURRECT=true,
      MOD_RESTART_CD_KILL=100,
      MOD_RESTART_CD_RESTART=100,
      MOD_RESTART_CD_RESURRECT=100,
      MOD_RESTART_FORCE_DROP_MODE=1,
      MOD_RESTART_IGNORING_ADMIN=true,
      MOD_RESTART_TRIGGER_MODE=1,
      MOD_RESTART_WELCOME_TIPS=true,
      MOD_RESTART_WELCOME_TIPS_TIME=6 
    },
    enabled=false
  }
}

workshop-[id] 此处ID即为创意工坊中的ID,可直接在创意工坊中查看;configuration_options配置选项可以在mod文件中modinfo.lua(通常在游戏文件目录中的/mods/workshop-[id]文件夹中)中查看,不太熟悉的话不推荐手动修改,可以使用存档替换的方式仅替换对应Mod配置。

那如何下载Mod呢?首先需要编辑文件:

vim ~/dst/mods/dedicated_server_mods_setup.lua
# 在文件中添加如下 : ( 括号中为 Mod 在创意工坊中的 id,内容按照自身服务器所需Mod填写 ) 
ServerModSetup("1216718131")
ServerModSetup("375850593")
ServerModSetup("378160973")
ServerModSetup("458587300")
ServerModSetup("703758203")
ServerModSetup("804317397")
ServerModSetup("1699254645")
# 保存退出
# PS:此处还可以直接输入Mod合集,即ServerModCollectionSetup("[id]")

配置过之后,下次启动游戏时就会自动下载Mod并启用。

7.启动游戏

可以直接启动 ( 推荐使用脚本 ) :

cd ~/dst/bin
# 启动地面世界
./dontstarve_dedicated_server_nullrenderer -console -cluster MyDediServer -shard Master
# 启动洞穴世界
./dontstarve_dedicated_server_nullrenderer -console -cluster MyDediServer -shard Caves

关于启动命令中的参数:
-console : 启动控制台,即在服务器Shell端可以直接使用命令;
-cluster : 使用存档名为MyDediServer的存档,位置默认在~/.kiel/DoNotStarveTogether中;
-shard : 启动的世界名称,对应的是存档文件夹中的世界文件夹名;
-only_update_server_mods : 仅进行Mod更新。

编写启动脚本:

mkdir ~/dst_script
cd ~/dst_script
touch dst_master.sh
touch dst_caves.sh
chmod a+x dst_master.sh
chmod a+x dst_caves.sh
# 编辑脚本

vim dst_master.sh
# 输入
#!/bin/bash

cd ~/dst/bin
screen -dmS "dst_overworld" ./dontstarve_dedicated_server_nullrenderer -console -cluster MyDediServer -shard Master
# 保存退出

vim dst_caves.sh
# 输入
#!/bin/bash

cd ~/dst/bin
screen -dmS "dst_caves" ./dontstarve_dedicated_server_nullrenderer -console -cluster MyDediServer -shard Caves
# 保存退出

使用 screen -dmS 命令启动进程时,不会显示对应的控制台。如果需要使用控制台,则需要使用

# 恢复到地面世界进程
screen -r dst_overworld
# 隐藏控制台按下Ctrl+A然后按下Ctrl+D即可
# 恢复到洞穴世界进程
screen -r dst_caves
# 隐藏控制台按下Ctrl+A然后按下Ctrl+D即可

启动游戏,运行脚本

./dst_master.sh
./dst_caves.sh

等服务器启动后,即可在大厅搜索到对应服务器。

8.关于更新

编写更新脚本

touch ~/dst_script/update.sh
chmod a+x ~/dst_script/update.sh
vim ~/dst_script/update.sh

输入

#!/bin/bash

#更新游戏
~/steamcmd/steamcmd.sh +login anonymous +force_install_dir /home/steam/dst +app_update 343050 validate +quit

#更新mod
cd /home/steam/dst/bin
~/dst/bin/dontstarve_dedicated_server_nullrenderer -only_update_server_mods

执行时需要关闭服务器。

常用的服务器指令

Kick(userid)--踢出用户ID为“userid”的玩家 
Ban(userid)--禁止用户ID为“userid”的玩家加入 
c_save()--立即保存当前世界(一般会在每天早上自动保存)
c_reset(true|false)--true删除当前世界并新建一个全新的世界;false重新加载当前世界。 
c_shutdown(true|false)--true保存并关闭当前世界;false不保存直接关闭当前世界
SetAllowIncomingConnections(true|false)--true允许他人加入;false阻止任何人加入。 
c_regenerateworld() 重新生成世界
c_testruins() 测试模式 
c_supergodmode() 超级上帝模式 
c_announce() 服务器消息

参考文档

① 饥荒Wiki : 多人版饥荒独立服务器

② lpfuture的博客 : linux screen工具


时至今日,你依旧是我的光芒。