# Duckov Market Mod Duckov 联机市场 Mod 源码仓库,包含 `Core` 与 `Loader` 两个项目。 本仓库源码由作者通过逆向并进行二次开发得到,已对逆向出来的阅读性差的变量名、方法名进行语义化处理,并且完善了前后端,可直接使用。 只保留 Mod 相关内容,已经过脱敏处理,可用于二次开发与协作。 ## 1. 项目结构 ```text Duckov_marketmod/ ├─ duckmarket_core/ # 主功能模块(UI、网络、Patch、配置) ├─ duckmarket_loader/ # 加载器(版本检查、下载、校验、加载 Core) ├─ mod_assets/ │ ├─ info.ini.example # Mod 基础配置示例 │ └─ version/1.2.7/ # 版本目录(当前基线) ├─ DuckMarket_Config.json.example # 运行配置示例 ├─ DuckNewMarket.sln # 解决方案(Core + Loader) └─ README.md ``` ## 2. 版本与目录约束 - 当前基线版本为 `1.2.7`。 - 运行时核心 DLL 应放在:`version/1.2.7/`。 - `info.ini` 里的以下字段约束: - `name=DuckNewMarket.Loader` 必须保持不变。 - `displayName=...` 可以自定义。 ## 3. 环境要求 ### 3.1 必需软件 - Windows 10/11 - PowerShell 5+ - .NET SDK 8 或更高(建议 10) - 已安装 `Escape from Duckov` ### 3.2 必需依赖文件 编译需要能访问以下 DLL: - 游戏 Managed 目录(`Duckov_Data\Managed`)下的一系列 Unity/游戏 DLL。 - `0Harmony.dll`(通常来自 workshop 模组目录)。 ## 4. 准备本地路径 请先确定以下两个路径(示例仅作参考): - `DuckovManagedDir` 示例:`D:\steam\steamapps\common\Escape from Duckov\Duckov_Data\Managed` - `HarmonyDll` 示例:`D:\steam\steamapps\workshop\content\3167020\3591763519\version\1.2.7\0Harmony.dll` 可先用下面命令检查路径是否存在: ```powershell Test-Path "D:\steam\steamapps\common\Escape from Duckov\Duckov_Data\Managed" Test-Path "D:\steam\steamapps\workshop\content\3167020\3591763519\version\1.2.7\0Harmony.dll" ``` 返回 `True` 才能继续。 ## 5. 配置编译参数(详细) 项目已移除硬编码本机路径,必须通过环境变量或 `dotnet build` 参数传入。 ### 5.1 推荐方式:环境变量 ```powershell $env:DUCKOV_MANAGED_DIR = "D:\steam\steamapps\common\Escape from Duckov\Duckov_Data\Managed" $env:HARMONY_DLL = "D:\steam\steamapps\workshop\content\3167020\3591763519\version\1.2.7\0Harmony.dll" $env:NEWTONSOFT_JSON_DLL = "$env:DUCKOV_MANAGED_DIR\Newtonsoft.Json.dll" ``` ### 5.2 备选方式:构建参数 ```powershell dotnet build .\duckmarket_core\DuckMarket.Core.csproj -c Release ` /p:DuckovManagedDir="D:\...\Duckov_Data\Managed" ` /p:HarmonyDll="D:\...\0Harmony.dll" dotnet build .\duckmarket_loader\DuckMarket.Loader.csproj -c Release ` /p:DuckovManagedDir="D:\...\Duckov_Data\Managed" ``` ## 6. 编译步骤(从零开始) 在仓库根目录执行: ```powershell dotnet restore .\DuckNewMarket.sln dotnet build .\duckmarket_core\DuckMarket.Core.csproj -c Release dotnet build .\duckmarket_loader\DuckMarket.Loader.csproj -c Release ``` 编译成功后关键输出: - `duckmarket_core\bin\Release\netstandard2.1\DuckNewMarket.Core.dll` - `duckmarket_loader\bin\Release\netstandard2.1\DuckNewMarket.Loader.dll` ## 7. 组装本地 Mod 目录(详细) 以下用 `` 代表你的游戏目录,例如:`D:\steam\steamapps\common\Escape from Duckov`。 ### 7.1 创建目标目录 ```powershell $modRoot = "\Duckov_Data\Mods\DuckovNewMarket" $coreDir = Join-Path $modRoot "version\1.2.7" New-Item -ItemType Directory -Force -Path $modRoot | Out-Null New-Item -ItemType Directory -Force -Path $coreDir | Out-Null ``` ### 7.2 复制编译产物 ```powershell Copy-Item .\duckmarket_loader\bin\Release\netstandard2.1\DuckNewMarket.Loader.dll $modRoot -Force Copy-Item .\duckmarket_core\bin\Release\netstandard2.1\DuckNewMarket.Core.dll $coreDir -Force ``` ### 7.3 生成 info.ini ```powershell Copy-Item .\mod_assets\info.ini.example (Join-Path $modRoot "info.ini") -Force ``` 然后编辑 `info.ini`,确认: - `name` 必须是 `DuckNewMarket.Loader` - `displayName` 可自定义显示名 - `version` 保持 `1.2.7` ## 8. 配置运行参数(DuckMarket_Config.json) 将示例文件复制到 Mod 根目录并改为真实地址: ```powershell Copy-Item .\DuckMarket_Config.json.example "\Duckov_Data\Mods\DuckovNewMarket\DuckMarket_Config.json" -Force ``` 关键字段说明: - `ApiBaseUrl`: HTTP API 根地址(示例:`https://api.example.com/api/v1`) - `WsBaseUrl`: WebSocket 根地址(示例:`wss://api.example.com/api/v1`) - `VersionsBaseUrl`: 版本接口地址(示例:`https://api.example.com/api/v1/versions`) - `AllowInsecureTlsForLoader`: 是否忽略 TLS 证书错误(生产环境建议 `false`) - `SteamWebApiIdentity`: Steam 身份标识(按后端约定) ## 9. 启动验证(详细) ### 9.1 启动前检查 - 完全退出游戏后再覆盖 DLL(进程占用会导致复制失败)。 - 确认目标目录已包含: - `DuckNewMarket.Loader.dll` - `version\1.2.7\DuckNewMarket.Core.dll` - `info.ini` - `DuckMarket_Config.json` ### 9.2 启动后看日志 日志位置通常为: `C:\Users\<你的用户名>\AppData\LocalLow\TeamSoda\Duckov\Player.log` 可用命令快速筛选: ```powershell Select-String -Path "$env:USERPROFILE\AppData\LocalLow\TeamSoda\Duckov\Player.log" -Pattern "Duck Market Mod Loader Awake","Version Check","Loading mod dll at path" ``` 若能看到加载与版本检查相关日志,说明链路基本正常。 ## 10. 常见问题与处理 ### 10.1 编译时报找不到 UnityEngine 或 TeamSoda DLL - 原因:`DUCKOV_MANAGED_DIR` 未设置或路径错误。 - 处理:重新设置变量并确认 `Test-Path` 为 `True`。 ### 10.2 编译时报找不到 0Harmony.dll - 原因:`HARMONY_DLL` 未设置或版本目录不对。 - 处理:确认 `HARMONY_DLL` 指向真实文件。 ### 10.3 游戏不加载新 DLL - 原因:游戏进程占用旧文件、复制失败或目录层级错误。 - 处理:完全退出游戏后重拷贝;检查 DLL 是否在准确目录。 ### 10.4 能加载但无法连接后端 - 原因:`DuckMarket_Config.json` 中 API/WS 地址不正确,或证书问题。 - 处理:校验 `ApiBaseUrl/WsBaseUrl/VersionsBaseUrl`;开发环境临时开启 `AllowInsecureTlsForLoader=true` 进行定位(生产请关闭)。 ## 11. 开发迭代建议流程 1. 修改 `duckmarket_core` 或 `duckmarket_loader` 源码。 2. 执行编译命令。 3. 复制 DLL 到 Mod 目录。 4. 启动游戏并查看 `Player.log`。 5. 确认功能后再提交代码。 ## 12. 安全与脱敏规则 - 禁止提交真实密码、Token、私有证书、SSH 凭据。 - 禁止提交本机绝对路径或个人环境说明。 - `DuckMarket_Config.json` 属于本地运行配置,不应包含生产敏感信息。 ## 13. License 本项目使用 `MIT License`,详见仓库根目录 `LICENSE`。