在编写过程中, 本脚本参考了另外两个脚本。
感谢前人的付出~~
go.sh
- 贴吧置顶贴介绍的脚本, 想必大家都知道的
dstserver.sh
- 一个很好用的脚本, 详细请看作者网站
- 2021/12/15日停止更新, 2022/1/20测试时发现依赖库没装好
- 可以参考我的脚本装好依赖库后使用
dstserver.sh
- 可以参考我的脚本装好依赖库后使用
另外我把收集到的各种开服脚本存到云盘里了, 有兴趣的话可以下载看看
- 链接
- 提取码: a6hm
如果这个脚本没人维护了, 你也可以自己更新模板文件来继续使用。
- 某个设置的选项增加了(比如多了个
猫年活动
)- 找到
scripts/model/value_types_world.lua
文件, 在对应的地方添加新的值就行
- 找到
- 多了个设置(比如世界生成设置里面, 多了个
海的大小
)- 在
scripts/model/value_types_world.lua
里添加对应的选项类型, 如果有一样的就不需要添加 - 在
scripts/model
里的table_forest.lua
或者table_cave.lua
里添加对应的设置- 需要添加的是, 中文名, 英文名, 默认值, 选项类型。选项类型参考
value_types_world.lua
- 需要添加的是, 中文名, 英文名, 默认值, 选项类型。选项类型参考
- 更新
templates/world_presets
文件夹里面的模板
- 在
- 各种路径不以 / 结尾。所以连结路径和文件名时要注意下
- 给函数传递参数时, 带
-
的要写在不带-
的前面 - while, for, if的
; do
和; then
写在同一行 (Lua里也一样) - 条件式使用
[[ ]]
, 不要用[ ]
和test
- 需要确认命令是否正确执行时这样写:
if 命令; then ..... fi
- 需要确认命令是否正确执行时这样写:
- 使用
$()
而不是` `
- 字符串: 没必要的话不要用
" "
, 用' '
- 命名:
- 全局常量:
VERSION
- 绝对路径的话, 以
_PATH
结尾, 最后无需加上/
- 文件夹名的话, 以
_DIR
结尾, 最后无需加上/
- 绝对路径的话, 以
- 变量&局部常量:
select_item
- 函数名:
my_func()
- 文件名:
file_aaa.txt
- 全局常量:
- 声明变量使用
declare
(Lua里面用local
)- 能使用局部变量/常量就使用局部变量/常量
- 在函数内使用
declare
即为局部变量 - 使用
declare -r
声明常量 - 使用
declare -a
声明数组
- 注意:
for
select
read
命令使用的变量, 如果不事先用local
或者declare
声明的话, 会变成全局变量
版本1.3.0.10为止, 部分函数使用了declare -n来从函数里面传递数据, 但这在旧版本Bash无法使用。
具体哪个版本开始可以用不清楚, 目前只知道Bash 4.3用不了, Bash 5.0可以用。
为了降低Bash版本需求, 设置了这两个全局变量来传递值
服务器
=主机
=云服
=server
: 用来运行饥荒服务端的机器服务端
: 饥荒本体(没有图形界面)存档
=cluster
: 最普通的存档包含了 1地上世界 1洞穴世界世界
=shard
=level
: 特指1个地上世界, 或者洞穴世界双层世界
: 普通的 1地表 1洞穴 存档, 就是双层世界多层世界
: 3个以上世界相连。必须使用控制台或者Mod配置连接。推荐使用Mod配置。
我希望这么指定, 但脚本里没有强制, 由用户自己输入名字
Main
: 一个存档里只能有一个主世界。主世界的文件夹名设为MainForest
: 非主世界的地上世界, 文件夹名设为ForestCave
: 非主世界的洞穴世界, 文件夹名设为Cave
单主机开服
: cluster里的所有shard, 都在一台主机上运行多主机开服
: cluster里的shard, 分布在不同主机上运行cluster.ini
和cluster_token.txt
必须一样
ShellScript是主体。必要时执行Lua脚本。
DSTManager.sh
这个文件是要用户来执行的。
主要功能是环境检测(依赖包/Steam/dst/脚本仓库)
这里面定义了主面板, 根据用户输入来调用别的脚本里的面板。
另外, 全局变量 & 输出类的泛用函数也写在这里。
以下脚本会由DSTManager.sh
读取(而不是执行), 所以你可以在里面使用DSTManager.sh
里定义的全局变量和函数
server.sh
这个脚本里主要写的是开/关/更新服务端的功能。
入口是server_panel()
函数, 这个函数会在DSTManager.sh
被调用。cluster.sh
这个脚本里主要写的是存档相关的功能。
入口是cluster_panel()
函数, 这个函数会在DSTManager.sh
被调用。mod.sh
这个脚本里主要写的是Mod相关的功能。
入口是mod_panel()
函数, 这个函数会在DSTManager.sh
被调用。util.sh
这个脚本里定义了一些泛用函数。
和其他脚本一样, 这个脚本也会被DSTManager.sh
读取。
所以这里的函数你也可以在其他脚本里用。
utils.lua
这个脚本里定义了泛用函数。一部分是复刻ShellScript里的
另外这个脚本会被下面4个脚本读取。所以你可以在下面4个脚本里面使用泛用函数。edit_cluster_ini.lua
这个脚本是用来更新cluster.ini的。
流程是:- 读取
table__cluster.lua
里的model - 展示model
- 无限循环, 让用户修改
- 遍历model, 用
sed
命令更新cluster.ini
- 读取
edit_shard_ini.lua
这个脚本是用来更新server.ini的。
流程是:- 读取
table__shard.lua
里的model - 展示model
- 无限循环, 让用户修改
- 遍历model, 用
sed
命令更新server.ini
- 读取
configure_world.lua
这个脚本是用来生成/更新worldgenoverride.lua的。
流程是:- 读取
table_forest.lua
或者table_cave.lua
里的model - 展示model(生成世界时展示世界生成/世界选项, 其他时候只展示世界选项)
- 无限循环, 让用户修改
- 遍历model, 用
sed
命令生成/更新worldgenoverride.lua
- 读取
mod_manager.lua
这个脚本是用来更新modoverrides.lua的。- 添加Mod
- 先从
.cache/modinfo
文件夹里面列出所有id让用户选择(下载mod时会备份modinfo.lua到这个文件夹) - 然后读取这个文件夹里的对应文件, 提取设置
- 遍历设置, 然后用
sed
命令添加默认设置到modoverrides.lua里
- 先从
- 配置Mod
- 读取modoverrides.lua, 获得当前Mod配置 <-- 读取model
- 读取
.cache/modinfo
, 获得全部选项 - 展示当前配置, 输出选项让用户选择 <-- 更新model
- 遍历model, 用
sed
重新生成一个modoverrides.lua
- 添加Mod
model
文件夹里面定义了各种model。
因为Lua的table是无序的, 为了保证固定顺序, table里面有个array
来存储key的顺序
- cluster.ini和server.ini用的model
由于有些设置的选项列表
内容一模一样, 所以这边指定type
,
实际的选项列表
在value_types_ini.lua
里定义table__cluster.lua
要注意的是, 有些type
是例外。详细请看该文件开头注释table__shard.lua
要注意的是, 有些type
是例外。详细请看该文件开头注释value_types_ini.lua
定义了各种选项列表
的type
, 关键字以及中文显示
里面的en
是保存在文件里时用的key值
- worldgenoverride.lua用的model
由于有些设置的可选值内容一模一样, 所以这边指定type
,
实际的可选值的列表在value_types_world.lua
里定义table_forest.lua
地表的worldgenoverride.lua的配置选项table_cave.lua
洞穴的worldgenoverride.lua的配置选项value_types_world.lua
定义了各种选项列表
的type
, 关键字以及中文显示
里面的en
是保存在文件里时用的key值
- 输入名字 (检测重名)
- 复制
templates/cluster
文件夹到存档路径
(里面有cluster.ini文件, 所以之后可以直接调用lua脚本更新它) - 输入token (简单检测是否合法)
- 调用lua脚本配置cluster.ini
- 无限循环询问是否添加世界
- 复制
templates
里的shard_forest
或者shard_cave
文件夹到存档路径
(里面有server.ini文件, 所以之后可以直接调用lua脚本更新它) - 调用lua脚本配置server.ini
- 调用lua脚本配置并生成worldgenoverride.lua
这个文件夹里存放了世界配置的模板。
要添加新的模板, 只需要templates/world_presets
里面添加一个新的文件夹。
你可以复制standard
模板文件夹, 并修改里面的内容。
游戏更新之后要做的事情:
- 某个设置的选项列表多了个选项(比如猫年活动), 你只需要修改
scripts/model/value_types_world.lua
- 多了某个设置的话, 你得修改
scripts/model
里的table_forest.lua
或者table_cave.lua
- 如果
value_types_world.lua
里没有合适的选项列表的话, 你得新增个type - 同时你还要更新
world_presets
里面的所有模板
- 如果
在DSTManager.sh
前半部分, 以及utils.sh
文件和utils.lua
文件里, 我定义了一些经常使用的函数。
color_print()
定义在DSTManager.sh
和utils.lua
里。
用来输出有颜色的字符串。指定特定字符还会出现前缀。
可以通过option禁用前缀, 取消改行。accent_color_print()
定义在DSTManager.sh
里。
调用color_print()
用来更好的输出, 比如: 红 蓝 红 蓝 红print_divider()
定义在DSTManager.sh
和utils.lua
里。
输出和终端窗口一样长的分割线。可以自己指定长度1的字符。count_down()
定义在DSTManager.sh
和utils.lua
里。
输出倒计时。可以选择数字或者点
yes_or_no()
定义在DSTManager.sh
和utils.lua
里。
二选一select_one()
定义在DSTManager.sh
和utils.lua
里。
多选一read_line()
定义在utils.sh
和utils.lua
里。
read命令加color_print()multi_select()
定义在utils.sh
和utils.lua
里。
多选多, 空格隔开get_positive_number()
定义在utils.lua
里。
让用户输入大于0的数字get_port()
定义在utils.lua
里。
让用户输入端口(2000~65535)get_ipv4_address()
定义在utils.lua
里。
让用户输入ipv4地址
这些都是定义在utils.lua
里的
clear()
执行clear命令sleep()
执行sleep命令sleepms()
也是sleep, 但可以指定0.1秒exec_linux_command_get_output()
执行linux命令并获得输出file_exist()
检测文件是否存在copy_file()
复制文件
这些都是定义在utils.lua
里的
array2string()
把array组合成字符串, 用空格隔开indexof()
查找指定要素在array里的位置get_keys()
提取一个table里的全部key(仅第一层)split()
分割字符串, 获得arraytablelength()
获得table的key的个数
get_current_script_dir()
定义在DSTManager.sh
里。
获取当前脚本的绝对位置 -.generate_list_from_dir()
定义在utils.sh
里。
查找存档文件夹, 输出文件夹名字。
可以选择输出cluster文件夹名, shard文件夹名, 或者都输出generate_list_from_tmux()
定义在utils.sh
里。
查找运行中的tmux的session并输出。
可以选择输出cluster名, shard名, 或者都输出generate_list_from_cluster()
定义在utils.sh
里。
查找某个存档里面的第一层的文件夹并输出, 逆顺。
开关服务器时用。
Main --> Forest --> Caveremove_klei_from_worldgenoverride()
定义在utils.sh
里。
世界运行后的worldgenoverride.lua里面会多几个字, 导致lua无法读取。
这个函数是修改世界设置之前使用的is_shard_running()
定义在utils.sh
里。
检测指定世界是否存在于tmux的session列表里check_cluster()
定义在utils.sh
里。
粗略检测指定存档文件夹是否符合要求check_shard()
定义在utils.sh
里。
粗略检测指定世界文件夹是否符合要求get_mods_from_dir()
定义在utils.sh
里。
从v1模组文件夹和v2模组文件夹里面获取mod id列表get_mod_name_from_modinfo()
定义在utils.sh
里。
从modinfo.lua文件里面提取模组名字
好像没用到generate_mod_id_list_from_setting_file()
定义在utils.sh
里。
从dedicated_server_mods_setup.lua提取mod id列表value_en2zh()
定义在utils.lua
里。
model里中英文互换value_zh2en()
定义在utils.lua
里。
对value_types_??.lua
里的model, 进行中英文互换