Ver Fonte

新增自动Mod管理功能,支持通过环境变量配置Mod ID,自动下载和更新Mod,并优化软链接创建逻辑。

Dcr há 1 mês atrás
pai
commit
34c2e6dd05
2 ficheiros alterados com 89 adições e 26 exclusões
  1. 50 15
      DockerFile/start.sh
  2. 39 11
      README.md

+ 50 - 15
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变量

+ 39 - 11
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服务器部署