From 34c2e6dd051f6e844a85a1b2fbc3bedd9187e5fb Mon Sep 17 00:00:00 2001 From: Dcr Date: Fri, 25 Jul 2025 14:49:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=87=AA=E5=8A=A8Mod?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F=E9=85=8D?= =?UTF-8?q?=E7=BD=AEMod=20ID=EF=BC=8C=E8=87=AA=E5=8A=A8=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E5=92=8C=E6=9B=B4=E6=96=B0Mod=EF=BC=8C=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=BD=AF=E9=93=BE=E6=8E=A5=E5=88=9B=E5=BB=BA=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DockerFile/start.sh | 65 ++++++++++++++++++++++++++++++++++----------- README.md | 50 ++++++++++++++++++++++++++-------- 2 files changed, 89 insertions(+), 26 deletions(-) diff --git a/DockerFile/start.sh b/DockerFile/start.sh index 2670bbe..85cb048 100644 --- a/DockerFile/start.sh +++ b/DockerFile/start.sh @@ -80,30 +80,65 @@ start_dayzserver() { cd /root/Steam/steamapps/common/DayZServer # 启动服务器之前,检查mod是否有更新. + bash /opt/updatemod.sh updatemodpath="/root/Steam/steamapps/workshop/content/221100" target_dir="/root/Steam/steamapps/common/DayZServer/client_mod" - find "$updatemodpath" -mindepth 1 -maxdepth 1 -type d -print0 | while IFS= read -r -d $'\0' mod_dir; do - meta_file=$(find "$mod_dir" -type f -name "meta.cpp" -print -quit) + # 1. 删除target_dir目录下的所有软链接 + echo "清理现有的软链接..." + if [ -d "$target_dir" ]; then + find "$target_dir" -type l -delete + echo "已删除 $target_dir 目录下的所有软链接" + else + mkdir -p "$target_dir" + echo "创建目录: $target_dir" + fi + + # 2. 根据MOD_IDS列表创建软链接 + if [ -n "$MOD_IDS" ]; then + echo "开始根据MOD_IDS创建软链接..." + IFS=',' read -ra MOD_ARRAY <<< "$MOD_IDS" - if [[ -f "$meta_file" ]]; then - mod_name=$(grep -oP 'name\s*=\s*"\K[^"]*' "$meta_file") + for mod_id in "${MOD_ARRAY[@]}"; do + echo "处理Mod ID: $mod_id" - if [[ -n "$mod_name" ]]; then - symlink_path="${target_dir}/@${mod_name}" - if [[ ! -L "$symlink_path" ]]; then - echo "为 [$mod_name] 创建软链接: $symlink_path → $mod_dir" - ln -s "$mod_dir" "$symlink_path" + # 查找对应的mod目录 + mod_dir=$(find "$updatemodpath" -mindepth 1 -maxdepth 1 -type d -name "$mod_id" -print -quit) + + if [[ -n "$mod_dir" ]]; then + echo "找到Mod目录: $mod_dir" + + # 查找meta.cpp文件获取mod名称 + meta_file=$(find "$mod_dir" -type f -name "meta.cpp" -print -quit) + + if [[ -f "$meta_file" ]]; then + mod_name=$(grep -oP 'name\s*=\s*"\K[^"]*' "$meta_file") + + if [[ -n "$mod_name" ]]; then + symlink_path="${target_dir}/@${mod_name}" + echo "为 [$mod_name] (ID: $mod_id) 创建软链接: $symlink_path → $mod_dir" + ln -s "$mod_dir" "$symlink_path" + else + echo "警告: 在 $meta_file 中未找到 name 字段,使用ID作为名称" + symlink_path="${target_dir}/@${mod_id}" + echo "为 [ID: $mod_id] 创建软链接: $symlink_path → $mod_dir" + ln -s "$mod_dir" "$symlink_path" + fi else - echo "软链接已存在: $symlink_path, 跳过创建" + echo "警告: 在 $mod_dir 中未找到 meta.cpp 文件,使用ID作为名称" + symlink_path="${target_dir}/@${mod_id}" + echo "为 [ID: $mod_id] 创建软链接: $symlink_path → $mod_dir" + ln -s "$mod_dir" "$symlink_path" fi else - echo "警告: 在 $meta_file 中未找到 name 字段" + echo "警告: 未找到ID为 $mod_id 的Mod目录" fi - else - echo "警告: 在 $mod_dir 中未找到 meta.cpp 文件" - fi - done + done + + echo "软链接创建完成!" + else + echo "未配置MOD_IDS,跳过软链接创建" + fi # 初始化mod变量 diff --git a/README.md b/README.md index 967641d..5299169 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,10 @@ docker-compose up -d | `DAYZ_MISSIONS` | `dayzOffline.chernarusplus` | 服务器地图 | | `DAYZ_SERVER_PORT` | `2302` | 服务器端口 | | `DAYZ_CPU_COUNT` | `4` | 使用的CPU核心数 | -| `MOD_IDS` | `空` | 需要更新的modid,例如:"123456789,987654321" | +| `MOD_IDS` | - | Mod ID列表,用逗号分隔 | +| `ENABLE_AUTO_UPDATE` | `true` | 是否启用自动更新 | +| `UPDATE_INTERVAL` | `15` | 自动更新间隔(分钟) | + ### 端口映射 @@ -160,32 +163,49 @@ docker-compose up -d ## 🔧 Mod管理 -### 添加客户端Mod +### 自动Mod管理 + +项目现在支持自动Mod管理功能: + +1. **配置Mod ID**: 在环境变量中设置 `MOD_IDS`,例如: + ```bash + MOD_IDS=123456789,987654321,456789123 + ``` + +2. **自动更新**: 系统会自动下载和更新指定的Mod +3. **自动软链接**: 系统会根据Mod ID自动创建软链接到 `client_mod` 目录 +4. **智能命名**: 优先使用Mod的 `meta.cpp` 中的名称,如果没有则使用Mod ID + +### 手动Mod管理 + +如果您想手动管理Mod: 1. 将Mod文件放入 `dayz/client_mod/` 目录 2. Mod文件夹应以 `@` 开头 3. 重启服务器以加载新Mod -### 添加服务端Mod +### 更新Mod -1. 将Mod文件放入 `dayz/server_mod/` 目录 -2. Mod文件夹应以 `@` 开头 -3. 重启服务器以加载新Mod +#### 自动更新 +- **启用自动更新**: 设置 `ENABLE_AUTO_UPDATE=true`(默认启用) +- **更新间隔**: 通过 `UPDATE_INTERVAL` 设置(默认15分钟) +- **查看更新日志**: `docker-compose exec steamcmd cat /var/log/updatemod.log` -### 更新客户端Mod +#### 手动更新 1. 需要先停止容器运行 `docker compose down` 2. 然后运行更新命令 `docker compose run --rm steamcmd updatemod` -3. 更新完毕后启动docker容器即可. +3. 更新完毕后启动docker容器即可 ### Mod配置示例 ``` dayz/ ├── client_mod/ -│ ├── @CF -│ └── @DayZExpansion +│ ├── @CF # 自动创建的软链接 +│ ├── @DayZExpansion # 自动创建的软链接 +│ └── @CustomMod # 手动添加的Mod └── server_mod/ - └── @DayZExpansionServer + └── @DayZExpansionServer # 服务端Mod ``` ## 📊 监控和日志 @@ -259,6 +279,14 @@ docker-compose exec steamcmd netstat -tulpn ## 📝 更新日志 +### v1.1.0 +- 新增自动Mod管理功能 +- 支持通过MOD_IDS环境变量配置Mod +- 自动下载和更新Mod +- 智能软链接创建(优先使用meta.cpp中的名称) +- 新增自动更新功能(cron定时任务) +- 优化Mod加载逻辑 + ### v1.0.0 - 初始版本发布 - 支持基本的DayZ服务器部署