Skip to content

Latest commit

 

History

History
336 lines (295 loc) · 14.1 KB

脚本说明.md

File metadata and controls

336 lines (295 loc) · 14.1 KB

脚本说明

目录

关于本脚本

在编写过程中, 本脚本参考了另外两个脚本。
感谢前人的付出~~

  • go.sh
    • 贴吧置顶贴介绍的脚本, 想必大家都知道的
  • dstserver.sh
    • 一个很好用的脚本, 详细请看作者网站
    • 2021/12/15日停止更新, 2022/1/20测试时发现依赖库没装好
      • 可以参考我的脚本装好依赖库后使用dstserver.sh

另外我把收集到的各种开服脚本存到云盘里了, 有兴趣的话可以下载看看

更新模板文件

如果这个脚本没人维护了, 你也可以自己更新模板文件来继续使用。

  1. 某个设置的选项增加了(比如多了个猫年活动)
    • 找到scripts/model/value_types_world.lua文件, 在对应的地方添加新的值就行
  2. 多了个设置(比如世界生成设置里面, 多了个海的大小)
    • 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声明的话, 会变成全局变量

全局变量answerarray

版本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配置。

shard文件夹名字

我希望这么指定, 但脚本里没有强制, 由用户自己输入名字

  • Main: 一个存档里只能有一个主世界。主世界的文件夹名设为Main
  • Forest: 非主世界的地上世界, 文件夹名设为Forest
  • Cave: 非主世界的洞穴世界, 文件夹名设为Cave

开服方式

  • 单主机开服: cluster里的所有shard, 都在一台主机上运行
  • 多主机开服: cluster里的shard, 分布在不同主机上运行
    • cluster.inicluster_token.txt必须一样

脚本内容简介

ShellScript

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读取。
    所以这里的函数你也可以在其他脚本里用。

Lua Script

  • utils.lua
    这个脚本里定义了泛用函数。一部分是复刻ShellScript里的
    另外这个脚本会被下面4个脚本读取。所以你可以在下面4个脚本里面使用泛用函数。
  • edit_cluster_ini.lua
    这个脚本是用来更新cluster.ini的。
    流程是:
    1. 读取table__cluster.lua里的model
    2. 展示model
    3. 无限循环, 让用户修改
    4. 遍历model, 用sed命令更新cluster.ini
  • edit_shard_ini.lua
    这个脚本是用来更新server.ini的。
    流程是:
    1. 读取table__shard.lua里的model
    2. 展示model
    3. 无限循环, 让用户修改
    4. 遍历model, 用sed命令更新server.ini
  • configure_world.lua
    这个脚本是用来生成/更新worldgenoverride.lua的。
    流程是:
    1. 读取table_forest.lua或者table_cave.lua里的model
    2. 展示model(生成世界时展示世界生成/世界选项, 其他时候只展示世界选项)
    3. 无限循环, 让用户修改
    4. 遍历model, 用sed命令生成/更新worldgenoverride.lua
  • mod_manager.lua
    这个脚本是用来更新modoverrides.lua的。
    • 添加Mod
      1. 先从.cache/modinfo文件夹里面列出所有id让用户选择(下载mod时会备份modinfo.lua到这个文件夹)
      2. 然后读取这个文件夹里的对应文件, 提取设置
      3. 遍历设置, 然后用sed命令添加默认设置到modoverrides.lua里
    • 配置Mod
      1. 读取modoverrides.lua, 获得当前Mod配置 <-- 读取model
      2. 读取.cache/modinfo, 获得全部选项
      3. 展示当前配置, 输出选项让用户选择 <-- 更新model
      4. 遍历model, 用sed重新生成一个modoverrides.lua

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值

存档生成过程

  1. 输入名字 (检测重名)
  2. 复制templates/cluster文件夹到存档路径
    (里面有cluster.ini文件, 所以之后可以直接调用lua脚本更新它)
  3. 输入token (简单检测是否合法)
  4. 调用lua脚本配置cluster.ini
  5. 无限循环询问是否添加世界
  6. 复制templates里的shard_forest或者shard_cave文件夹到存档路径
    (里面有server.ini文件, 所以之后可以直接调用lua脚本更新它)
  7. 调用lua脚本配置server.ini
  8. 调用lua脚本配置并生成worldgenoverride.lua

关于world_presets文件夹

这个文件夹里存放了世界配置的模板。
要添加新的模板, 只需要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.shutils.lua里。
    用来输出有颜色的字符串。指定特定字符还会出现前缀。
    可以通过option禁用前缀, 取消改行。
  • accent_color_print()
    定义在DSTManager.sh里。
    调用color_print()
    用来更好的输出, 比如: 红 蓝 红 蓝 红
  • print_divider()
    定义在DSTManager.shutils.lua里。
    输出和终端窗口一样长的分割线。可以自己指定长度1的字符。
  • count_down()
    定义在DSTManager.shutils.lua里。
    输出倒计时。可以选择数字或者点

互动用的函数

  • yes_or_no()
    定义在DSTManager.shutils.lua里。
    二选一
  • select_one()
    定义在DSTManager.shutils.lua里。
    多选一
  • read_line()
    定义在utils.shutils.lua里。
    read命令加color_print()
  • multi_select()
    定义在utils.shutils.lua里。
    多选多, 空格隔开
  • get_positive_number()
    定义在utils.lua里。
    让用户输入大于0的数字
  • get_port()
    定义在utils.lua里。
    让用户输入端口(2000~65535)
  • get_ipv4_address()
    定义在utils.lua里。
    让用户输入ipv4地址

执行Linux命令的函数

这些都是定义在utils.lua里的

  • clear()
    执行clear命令
  • sleep()
    执行sleep命令
  • sleepms()
    也是sleep, 但可以指定0.1秒
  • exec_linux_command_get_output()
    执行linux命令并获得输出
  • file_exist()
    检测文件是否存在
  • copy_file()
    复制文件

扩展Lua基础功能的函数

这些都是定义在utils.lua里的

  • array2string()
    把array组合成字符串, 用空格隔开
  • indexof()
    查找指定要素在array里的位置
  • get_keys()
    提取一个table里的全部key(仅第一层)
  • split()
    分割字符串, 获得array
  • tablelength()
    获得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 --> Cave
  • remove_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, 进行中英文互换