# __PROJECT_NAME__

这是由 `ShrinkModFramework` 生成器创建的外部 DLL 模组模板。

## 模板内容

- `src/__PROJECT_NAME__Mod.cs`
  - 模组主入口，演示 `ShrinkModFramework + ShrinkEventBus + ShrinkCommand + ShrinkNetwork`
- `src/__PROJECT_NAME__Contracts.cs`
  - 示例事件、RPC 请求与响应
- `__PROJECT_NAME__.csproj`
  - 独立类库工程，默认引用当前 SDK 仓库里的运行时工程
- `build.ps1`
  - 一键构建，可选复制 DLL 到你的模组目录
- `dev-env.ps1`
  - 先设置 `MSBuildEnableWorkloadResolver=false`，适合有些 IDE 打开项目前先跑一遍
- `global.json`
  - 锁定到生成模板时检测到的 `dotnet SDK` 版本

## 默认标识

- `ProjectName`: `__PROJECT_NAME__`
- `Namespace`: `__ROOT_NAMESPACE__`
- `ModId`: `__MOD_ID__`
- `DisplayName`: `__DISPLAY_NAME__`

生成后建议你先改这几处，再开始写正式业务。

## 构建

```powershell
dotnet build .\__PROJECT_NAME__.csproj -c Release /nr:false
```

或者直接运行：

```powershell
.\build.ps1
```

如果你的 IDE 打开项目时报类似：

```text
Microsoft.NET.SDK.WorkloadAutoImportPropsLocator
```

先在 PowerShell 里执行：

```powershell
.\dev-env.ps1
```

然后在**同一个 shell** 里启动 IDE，或者直接继续 `dotnet build`。

默认产物输出到：

```text
artifacts\Release\
```

## 投放到游戏

`ShrinkModFramework` 当前会扫描：

```text
Application.persistentDataPath/Mods
```

所以常见流程是：

1. 先构建出 `__PROJECT_NAME__.dll`
2. 把 DLL 复制到游戏实际使用的 `Mods` 目录
3. 启动游戏，让 `ShrinkModLoader` 自动发现

如果你已经知道目标 `Mods` 目录，也可以直接用：

```powershell
.\build.ps1 -ModsDir "D:\YourGameMods\Mods"
```

## 这个模板示范了什么

- `[ShrinkMod]` 模组声明
- `ShrinkModBase` 生命周期
- `EventBusSubscriber` 实例自动接入
- `ShrinkCommandSubscriber` 实例命令自动接入
- `ShrinkNetworkSubscriber` 实例网络处理自动接入
- `context.GetRegistry(...)` 注册内容
- `context.RegisterNetworkHandler(...)` 走模组网络抽象层

## 注意

- 示例里用到的 `opcode`、命令路径、`modId` 都只是模板默认值，正式模组请自己调整，避免冲突
- 当前模板默认依赖当前仓库根目录下的：
  - `ShrinkModFramework.Runtime.csproj`
  - `ShrinkEventBus.Runtime.csproj`
  - `ShrinkCommand.Runtime.csproj`
  - `ShrinkNetwork.Runtime.csproj`
- 如果你把模板工程移到别处，需要同步修正 `__PROJECT_NAME__.csproj` 里的 `ProjectReference`
- 某些 IDE / MSBuild 环境里，`MSBuildEnableWorkloadResolver=false` 写在项目文件内仍然太晚；这种情况要靠 `dev-env.ps1` 或系统环境变量在**打开项目之前**先设置
