与朋友玩DST(饥荒),开个5人局,卡到没法玩,所以想办法搭私服。
- 复制粘贴以下脚本保存为 install.sh
update
install.shat 2018-12-15
#!/bin/bash
dividing="================================================================================"
commandPath="steamcmd"
commandFile="./steamcmd.sh"
gamesPath="Steam/steamapps/common/Don't Starve Together Dedicated Server/bin"
gamesFile="./dontstarve_dedicated_server_nullrenderer"
dataPath=$(pwd)/.klei
function FilesDelete()
{
    echo -e "\033[32m[info] Choose File To Delete [1-5]\033[0m"
    read input_filedelete
    if [ -d $dataPath ]; then
        cd $dataPath
        if [ -d "DoNotStarveServer_$input_filedelete" ]; then
            rm -r DoNotStarveServer_$input_filedelete/save
            echo -e "\033[33m[info] File DoNotStarveServer_$input_filedelete Is Deleted\033[0m"
        fi
        if [ -d "DoNotStarveCaves_$input_filedelete" ]; then
            rm -r DoNotStarveCaves_$input_filedelete/save
            echo -e "\033[33m[info] File DoNotStarveCaves_$input_filedelete Is Deleted\033[0m"
        fi
        cd "../"
    fi
}
function FilesBackup()
{
    echo -e "\033[32m[info] Choose File To Backup [1-5]\033[0m"
    read input_filebackup
    if [ -d $dataPath ]; then
        cd $dataPath
        if [ -d "DoNotStarveServer_$input_filebackup" ]; then
            tar -zcf DoNotStarveServer_$input_filebackup.tar.gz DoNotStarveServer_$input_filebackup
            echo -e "\033[33m[info] File DoNotStarveServer_$input_filebackup Is Backuped\033[0m"
        fi
        if [ -d "DoNotStarveCaves_$input_filebackup" ]; then
            tar -zcf DoNotStarveCaves_$input_filebackup.tar.gz DoNotStarveCaves_$input_filebackup
            echo -e "\033[33m[info] File DoNotStarveCaves_$input_filebackup Is Backuped\033[0m"
        fi
        cd "../"
    fi
}
function FilesRecovery()
{
    echo -e "\033[32m[info] Choose File To Recovery [1-5]\033[0m"
    read input_filerecovery
    if [ -d $dataPath ]; then
        cd $dataPath
        if [ -f "DoNotStarveServer_$input_filerecovery.tar.gz" ]; then
            if [ -d "DoNotStarveServer_$input_filerecovery" ]; then
                rm -r DoNotStarveServer_$input_filerecovery
            fi
            tar -zxf DoNotStarveServer_$input_filerecovery.tar.gz DoNotStarveServer_$input_filerecovery
            echo -e "\033[33m[info] File DoNotStarveServer_$input_filerecovery Is Recovered\033[0m"
        else
            echo -e "\033[31m[warn] Backup File For DoNotStarveServer_$input_filerecovery Not Found\033[0m"
        fi
        if [ -f "DoNotStarveCaves_$input_filerecovery.tar.gz" ]; then
            if [ -d "DoNotStarveCaves_$input_filerecovery" ]; then
                rm -r DoNotStarveCaves_$input_filerecovery
            fi
            tar -zxf DoNotStarveCaves_$input_filerecovery.tar.gz DoNotStarveCaves_$input_filerecovery
            echo -e "\033[33m[info] File DoNotStarveCaves_$input_filerecovery Is Recovered\033[0m"
        else
            echo -e "\033[31m[warn] Backup File For DoNotStarveCaves_$input_filerecovery Not Found\033[0m"
        fi
        cd "../"
    else
        echo -e "\033[31m[warn] Main Archive Folder Not Found\033[0m"
    fi
}
function SystemPrepsDetail()
{
    echo -e "\033[33m[info] System Library Install\033[0m"
    sudo apt-get update
    sudo apt-get install screen
    sudo apt-get install lib32gcc1
    sudo apt-get install lib32stdc++6
    sudo apt-get install libcurl4-gnutls-dev:i386
    echo -e "\033[33m[info] System Library Install Finished\033[0m"
    echo "$dividing"
}
function SystemPreps()
{
    echo -e "\033[33m[info] System Library Preparing\033[0m"
    sudo apt-get update                                                         1>/dev/null
    sudo apt-get install screen                                                 1>/dev/null
    sudo apt-get install lib32gcc1                                              1>/dev/null
    sudo apt-get install lib32stdc++6                                           1>/dev/null
    sudo apt-get install libcurl4-gnutls-dev:i386                               1>/dev/null
    echo -e "\033[33m[info] System Library Prepare Finished\033[0m"
    echo "$dividing"
}
function CommandPreps()
{
    echo -e "\033[33m[info] Steam Command Line Files Preparing\033[0m"
    if [ ! -d "$commandPath" ]; then
        mkdir "$commandPath"
    fi
    cd "$commandPath"
    wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz 1>/dev/null
    tar -xvzf steamcmd_linux.tar.gz                                             1>/dev/null
    rm -f steamcmd_linux.tar.gz                                                 1>/dev/null
    echo -e "\033[33m[info] Steam Command Line Files Prepare Finished\033[0m"
    echo "$dividing"
}
function ServerStart()
{  
    echo -e "\033[32m[info] Choose Game Mode [1.noraml] [2.caves]\033[0m"
    read input_mode
    echo -e "\033[32m[info] Choose Save File [1-5]\033[0m"
    read input_save
    cd "$gamesPath"
    case $input_mode in
        1)
            screen -dm -S "DST Server" "$gamesFile" -conf_dir DoNotStarveServer_"$input_save";;
        2)
            screen -dm -S "DST Server" "$gamesFile" -conf_dir DoNotStarveCaves_"$input_save";;
        *)
            echo -e "\033[31m[warn] Illegal Command,Please Check\033[0m" ;;
    esac
    screen -r "DST Server"
    echo "$dividing"
}
function ServerPreps()
{
    echo -e "\033[33m[info] Preparing Server Files\033[0m"
    if [ ! -d "$commandPath" ]; then
        echo -e "\033[31m[warn] Steam Command Line Not Found\033[0m"
        CommandPreps
    else
        echo -e "\033[33m[info] Steam Command Line Found\033[0m"
        cd "$commandPath"
    fi
    echo -e "\033[32m[info] Choose Game Update Mode [1.noraml] [2.caves]\033[0m"
    read input_game
    case $input_game in
        1)
            "$commandFile" +login anonymous +app_update 343050 validate +quit;;
        2)
            "$commandFile" +login anonymous +app_update 343050 -beta cavesbeta validate +quit;;
        *)
            echo -e "\033[31m[warn] Illegal Command,Please Check\033[0m" ;;
    esac
    cd "../"
    echo "$dividing"
    ServerStart
}
clear
echo "$dividing"
if [ ! -d "$gamesPath" ]; then
    echo -e "\033[31m[warn] Server Files Not Found\033[0m"
    echo "$dividing"
    SystemPrepsDetail
    ServerPreps
else
    echo -e "\033[32m[info] Server Files Found\033[0m"
    echo "$dividing"
    echo -e "\033[33m[info] Choose An Action To Perform\033[0m"
    echo -e "\033[32m[info] System Library Files [0.Prepare]\033[0m"
    echo -e "\033[32m[info] Game Server [1.start]  [2.update]  [3.process kill]\033[0m"
    echo -e "\033[32m[info] Save Files  [7.backup] [8.recovery][9.delete]\033[0m"
    read input_update
    case $input_update in
        0)
            SystemPreps
            ;;
        1)
            ServerStart
            ;;
        2)
            ServerPreps
            ;;
        3)
            screen -X -S "DST Server" quit
            ;;
        7)
            FilesBackup
            ;;
        8)
            FilesRecovery
            ;;
        9)
            FilesDelete
            ;;
    esac
fi
- 添加运行权限
sudo chmod u+x install.sh
- 运行脚本
sh install.sh
# 按下面的输入数字选择:
# Game Mode: 1
# Save File: 1
# Ctrl+c 中断进程
- 获得 Token
如何获得参考这里:
游戏主界面右下角 Account -> Generate Server Token -> 复制粘贴保存到 cluster_token.txt。
- 本地打开DST,创建一个在线世界,Mod 什么都设置好,点击开始进游戏,然后关闭保存游戏。
找到存档 Linux存档位置:~/.klei/DoNotStarveTogether Windows存档位置:%HOMEPATH%\Klei\DoNotStarveTogether\。
将对应的 Cluster_X 目录覆盖到云主机的下面目录:~/.klei/DoNotStarveserver_1/。
这里我的存档为
Cluster_1。
将上一步获得的  存档目录下已存在该文件可以不用替换。cluster_token.txt 放到 Cluster_X 目录下
- 记录Mod编号
打开存档目录下的 Master/modoverrides.lua 文件,记录所有的 workshop-XXXXXXXXX 中的数字编号。
打开 ~/Steam/steamapps/common/Don't Starve Together Dedicated Server/mods/dedocated_server_mods_setup.lua 将Mod按 ServerModSetup("XXXXXXXXX") 的格式一行一行写进去并保存。
- 再次运行 install.sh,选择1.start。
几分钟后即可在 DST 的 online 列表中搜到你的服务器。
我上面写的教程没开 Cave,你可以通过看视频把 Cave 服务打开,过程类似。