sapdon 3.2.2 → 3.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +245 -121
- package/doc/dev/architecture.md +415 -0
- package/doc/dev/cli.md +467 -0
- package/doc/dev/core.md +717 -0
- package/doc/dev/oc.md +582 -0
- package/doc/user/api/biome.md +558 -0
- package/doc/user/api/block.md +945 -0
- package/doc/user/api/entity.md +685 -0
- package/doc/user/api/extra.md +231 -0
- package/doc/user/api/item.md +896 -0
- package/doc/user/api/recipe.md +427 -0
- package/doc/user/api/texture.md +181 -0
- package/doc/user/config/build-config.md +84 -0
- package/doc/user/config/mod-info.md +33 -0
- package/doc/user/faq.md +160 -0
- package/doc/user/quick-start.md +108 -0
- package/doc/user/tutorials/block.md +463 -0
- package/doc/user/tutorials/entity.md +356 -0
- package/doc/user/tutorials/item.md +449 -0
- package/doc/user/tutorials/recipe.md +278 -0
- package/package.json +4 -3
- package/prod/cli/index.js +1 -1
- package/prod/cli/start.js +1 -1458
- package/prod/core/index.d.ts +3290 -2150
- package/prod/core/index.js +1 -59015
- package/prod/core/package.json +7 -0
- package/prod/oc/index.d.ts +348 -108
- package/prod/oc/index.js +1 -1
- package/prod/oc/package.json +7 -0
- package/prod/utils/index.d.ts +20 -2
- package/prod/utils/index.js +1 -1
- package/prod/utils/package.json +7 -0
- package/doc/BlockAPI.md +0 -145
- package/doc/api.md +0 -128
- package/doc/oc/index.md +0 -0
- package/doc/sapdon-ts.md +0 -64
- package/src/templates/js_sapdon/build.config +0 -23
- package/src/templates/js_sapdon/main.mjs +0 -4
- package/src/templates/js_sapdon/mod.info +0 -7
- package/src/templates/js_sapdon/pack_icon.png +0 -0
- package/src/templates/js_sapdon/package.json +0 -20
- package/src/templates/js_sapdon/res/animations/animation_item.animation.json +0 -34
- package/src/templates/js_sapdon/res/animations/large_item.animation.json +0 -27
- package/src/templates/js_sapdon/res/models/blocks/crop.geo.json +0 -48
- package/src/templates/js_sapdon/res/models/entity/animation/animation_item.geo.json +0 -26
- package/src/templates/js_sapdon/res/models/entity/animation/large_item.geo.json +0 -28
- package/src/templates/js_sapdon/res/textures/blocks/none.png +0 -0
- package/src/templates/js_sapdon/res/textures/blocks/test_log_oak.png +0 -0
- package/src/templates/js_sapdon/res/textures/blocks/test_log_top.png +0 -0
- package/src/templates/js_sapdon/res/textures/items/masterball.png +0 -0
- package/src/templates/js_sapdon/scripts/custom_components/cropComponent.js +0 -50
- package/src/templates/js_sapdon/scripts/custom_components/items/gui_book.js +0 -37
- package/src/templates/js_sapdon/scripts/custom_components/registry.js +0 -25
- package/src/templates/js_sapdon/scripts/index.js +0 -0
- package/src/templates/ts_sapdon/build.config +0 -23
- package/src/templates/ts_sapdon/main.ts +0 -11
- package/src/templates/ts_sapdon/mod.info +0 -7
- package/src/templates/ts_sapdon/pack_icon.png +0 -0
- package/src/templates/ts_sapdon/package.json +0 -20
- package/src/templates/ts_sapdon/res/models/blocks/crop.geo.json +0 -48
- package/src/templates/ts_sapdon/res/textures/blocks/test_log_oak.png +0 -0
- package/src/templates/ts_sapdon/res/textures/blocks/test_log_top.png +0 -0
- package/src/templates/ts_sapdon/res/textures/items/masterball.png +0 -0
- package/src/templates/ts_sapdon/scripts/components/cropComponent.ts +0 -44
- package/src/templates/ts_sapdon/scripts/components/items/guiBook.ts +0 -36
- package/src/templates/ts_sapdon/scripts/components/registry.ts +0 -24
- package/src/templates/ts_sapdon/scripts/index.ts +0 -7
- package/src/templates/ts_sapdon/tsconfig.json +0 -117
package/doc/dev/cli.md
ADDED
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
# CLI 模块文档
|
|
2
|
+
|
|
3
|
+
`src/cli/` 是 Sapdon 的命令行工具模块,负责项目初始化、构建编排、开发服务器、热更新等所有 CLI 功能。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. 目录结构
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
src/cli/
|
|
11
|
+
├── index.js # @sapdon/cli 包入口,导出 dev server 客户端
|
|
12
|
+
├── start.js # CLI 命令定义 (commander),入口脚本
|
|
13
|
+
├── build.js # 构建编排器:bundler、manifest 生成、注册
|
|
14
|
+
├── load.js # 处理注册数据,生成 JSON 文件
|
|
15
|
+
├── registryServer.ts # GRegistryServer — 服务端注册表,注册 submit/remote-logger handler
|
|
16
|
+
├── init.js # 项目初始化、路径辅助
|
|
17
|
+
├── utils.ts # 通用文件 I/O 工具
|
|
18
|
+
├── tools/
|
|
19
|
+
│ └── textureSet.js # 纹理图集生成 (item_texture.json / terrain_texture.json)
|
|
20
|
+
├── dev-server/
|
|
21
|
+
│ ├── index.ts # 开发服务器入口,导出 server 实例
|
|
22
|
+
│ ├── server.ts # DevelopmentServer 类 — HTTP 服务
|
|
23
|
+
│ ├── client.js # cliRequest() — 子进程向 dev server 发送数据
|
|
24
|
+
│ ├── hmr.js # 热更新文件监听
|
|
25
|
+
│ ├── syncFiles.js # 同步产物到 Minecraft 目录 + 复制库文件
|
|
26
|
+
│ └── config.js # dev server 配置 (端口)
|
|
27
|
+
├── meta/
|
|
28
|
+
│ ├── buildConfig.ts # 读取/解析 build.config (含 v1→v2 迁移)
|
|
29
|
+
│ ├── versionType.ts # Minecraft 安装路径 (release/beta)
|
|
30
|
+
│ └── package.ts # 读取框架自身的 package.json
|
|
31
|
+
├── res/
|
|
32
|
+
│ ├── server.ts # 资源提示文件生成 (res.hint.ts) + res/ 目录监听
|
|
33
|
+
│ └── fileResource.ts # FileResource 类 — 惰性文件资源加载器
|
|
34
|
+
└── remoteLogger/
|
|
35
|
+
├── server.ts # 远程日志服务端处理
|
|
36
|
+
├── client.ts # 远程日志客户端发送
|
|
37
|
+
└── message.ts # 日志消息类型定义
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
共 22 个文件。
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 2. 入口文件
|
|
45
|
+
|
|
46
|
+
### `start.js` — CLI 命令入口
|
|
47
|
+
|
|
48
|
+
此文件是 `package.json` 中 `bin` 字段指定的入口 (`prod/cli/start.js`),**不导出任何内容**,直接定义并执行 commander 命令。
|
|
49
|
+
|
|
50
|
+
| 命令 | 说明 |
|
|
51
|
+
|------|------|
|
|
52
|
+
| `init` | 为已有项目添加 sapdon 配置(修改 package.json scripts,生成 mod.info) |
|
|
53
|
+
| `create <name>` | 从模板脚手架新项目,支持 `js` / `ts` 选择 |
|
|
54
|
+
| `build <name>` | 完整构建 + 启动热更新 |
|
|
55
|
+
| `pack` | 构建当前目录(不启动 HMR) |
|
|
56
|
+
| `lib` | 复制 `prod/` 到 `node_modules/@sapdon/` |
|
|
57
|
+
| `res` | 生成资源提示文件 `res.hint.ts` |
|
|
58
|
+
| `config` | (占位) 读取 build.config |
|
|
59
|
+
|
|
60
|
+
### `index.js` — 包入口
|
|
61
|
+
|
|
62
|
+
`@sapdon/cli` 的包入口,供其他模块编程式使用:
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
import { devServer, client } from '@sapdon/cli'
|
|
66
|
+
|
|
67
|
+
// devServer: DevelopmentServer 单例
|
|
68
|
+
// client.call(name, ...args) — 向 dev server 发送请求
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 3. 构建管道
|
|
74
|
+
|
|
75
|
+
### `build.js` — 构建编排器
|
|
76
|
+
|
|
77
|
+
核心构建函数 `buildProject()` 的执行流程:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
1. projectCanBuild()
|
|
81
|
+
→ 验证项目存在 + build.config 存在
|
|
82
|
+
|
|
83
|
+
2. 生成 manifest.json(仅首次)
|
|
84
|
+
→ BP/manifest.json + RP/manifest.json
|
|
85
|
+
→ 通过 AddonManifest 类生成
|
|
86
|
+
|
|
87
|
+
3. 复制 pack_icon.png → BP + RP
|
|
88
|
+
|
|
89
|
+
4. 复制资源文件夹 (res/) → RP
|
|
90
|
+
|
|
91
|
+
5. startDevServer()
|
|
92
|
+
→ 启动 HTTP 服务器 (端口 49037)
|
|
93
|
+
|
|
94
|
+
6. GRegistryServer.startServer()
|
|
95
|
+
→ 注册 submit handler
|
|
96
|
+
|
|
97
|
+
7. runScript(absoluteModPath)
|
|
98
|
+
→ rollup 编译 buildEntry (main.ts)
|
|
99
|
+
→ fork 子进程执行
|
|
100
|
+
→ 子进程中用户代码注册数据
|
|
101
|
+
→ HTTP POST 提交到 dev server
|
|
102
|
+
→ generateAddon() 生成 JSON 文件
|
|
103
|
+
|
|
104
|
+
8. bundleScripts()
|
|
105
|
+
→ rollup 打包 scripts/main.ts → scripts/index.js
|
|
106
|
+
|
|
107
|
+
9. syncDevFilesServer()
|
|
108
|
+
→ 复制 BP/RP 到 Minecraft 开发包目录
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**导出的关键组件:**
|
|
112
|
+
|
|
113
|
+
| 导出 | 说明 |
|
|
114
|
+
|------|------|
|
|
115
|
+
| `scriptBundler` | Rollup 包装器,`.js()` / `.ts()` / `.any()` 三个方法 |
|
|
116
|
+
| `projectCanBuild(path)` | 验证项目可构建 |
|
|
117
|
+
| `buildProject(path, name)` | 完整构建流程 |
|
|
118
|
+
|
|
119
|
+
**scriptBundler 详细:**
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
scriptBundler.js(source, target, sourcemap)
|
|
123
|
+
→ 纯 JS 打包,使用 commonjs + node-resolve + json + terser(production)
|
|
124
|
+
|
|
125
|
+
scriptBundler.ts(source, target, sourcemap)
|
|
126
|
+
→ TS 打包,额外使用 typescript 插件 + typescript-paths 插件
|
|
127
|
+
→ tsconfig 使用项目自身的 tsconfig.json
|
|
128
|
+
|
|
129
|
+
scriptBundler.any(source, target)
|
|
130
|
+
→ 根据 useJs 配置委托给 .js() 或 .ts()
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### `load.js` — 注册数据处理
|
|
134
|
+
|
|
135
|
+
`generateAddon()` 在 `submit` handler 中调用,负责将 `GRegistryServer.dataList` 中的注册数据写出为 JSON 文件:
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
generateAddon(modPath, buildPath, projectName)
|
|
139
|
+
|
|
140
|
+
for each { name, root, path: dataPath, data } in dataList:
|
|
141
|
+
├── case "item_texture" → 暂存,稍后生成 item_texture.json
|
|
142
|
+
├── case "terrain_texture" → 暂存,稍后生成 terrain_texture.json
|
|
143
|
+
├── case "flipbook_textures" → 暂存,稍后生成 flipbook_textures.json
|
|
144
|
+
└── default:
|
|
145
|
+
root == "behavior"
|
|
146
|
+
→ writeFileSync(<buildPath>/<name>_BP/<dataPath>/<name>.json)
|
|
147
|
+
root == "resource"
|
|
148
|
+
→ writeFileSync(<buildPath>/<name>_RP/<dataPath>/<name>.json)
|
|
149
|
+
|
|
150
|
+
generateTextureFiles()
|
|
151
|
+
→ generateItemTextureJson()
|
|
152
|
+
→ generateBlockTextureJson()
|
|
153
|
+
→ saveFile(flipbook_textures.json)
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 4. 初始化模块
|
|
159
|
+
|
|
160
|
+
### `init.js` — 项目初始化与路径工具
|
|
161
|
+
|
|
162
|
+
| 导出 | 说明 |
|
|
163
|
+
|------|------|
|
|
164
|
+
| `initProject(path, data)` | 从模板创建新项目,复制文件 + 生成 mod.info + npm install |
|
|
165
|
+
| `initNPMProject(path, data)` | 为已有 npm 项目添加 sapdon 支持 |
|
|
166
|
+
| `readPackageJson(dir)` | 读取目录的 package.json,返回 `{ name, description, author, version }` |
|
|
167
|
+
| `globalObject` | 全局可变对象,存储运行时状态 (projectPath) |
|
|
168
|
+
| `getProjectPath()` | 返回当前项目路径 |
|
|
169
|
+
| `getProjectName()` | 返回项目名 (目录 basename) |
|
|
170
|
+
| `getBuildDirBp()` | 返回 BP 构建目录路径 |
|
|
171
|
+
| `getBuildDirRp()` | 返回 RP 构建目录路径 |
|
|
172
|
+
|
|
173
|
+
模板映射:`{ js: 'js_sapdon', ts: 'ts_sapdon' }`,对应 `src/templates/` 下的目录。
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## 5. 开发服务器
|
|
178
|
+
|
|
179
|
+
### `dev-server/` 子系统
|
|
180
|
+
|
|
181
|
+
架构图:
|
|
182
|
+
|
|
183
|
+
```
|
|
184
|
+
子进程 (用户代码) CLI 主进程
|
|
185
|
+
┌─────────────────────────┐ ┌──────────────────────────┐
|
|
186
|
+
│ │ │ │
|
|
187
|
+
│ GRegistry │ │ DevelopmentServer │
|
|
188
|
+
│ .register() │ POST │ (端口 49037) │
|
|
189
|
+
│ .submit() │─────→│ │
|
|
190
|
+
│ │ │ cliServerHandlers: │
|
|
191
|
+
│ core/transport/client.ts│ │ submit │
|
|
192
|
+
│ transportPost() │ │ remote-logger │
|
|
193
|
+
└─────────────────────────┘ └──────────────────────────┘
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### `server.ts` — DevelopmentServer 类
|
|
197
|
+
|
|
198
|
+
| 方法 | 说明 |
|
|
199
|
+
|------|------|
|
|
200
|
+
| `isListening()` | 服务器是否在监听 |
|
|
201
|
+
| `bootstrap()` | 创建 HTTP server,监听配置端口 |
|
|
202
|
+
| `handle(url, handler)` | 注册 URL handler |
|
|
203
|
+
| `getHandler(url)` | 获取已注册的 handler |
|
|
204
|
+
| `interceptHandler(url, interceptor)` | 用拦截器包装已有 handler |
|
|
205
|
+
|
|
206
|
+
**请求处理流程:**
|
|
207
|
+
|
|
208
|
+
```
|
|
209
|
+
HTTP POST /<url>
|
|
210
|
+
→ 匹配 cliServerHandlers 中的 handler
|
|
211
|
+
→ 收集 body chunk
|
|
212
|
+
→ end 时 decode(body) 解析 JSON
|
|
213
|
+
→ await handler(...decodedArgs)
|
|
214
|
+
→ 响应 200
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### `client.js` — 客户端通信
|
|
218
|
+
|
|
219
|
+
| 导出 | 说明 |
|
|
220
|
+
|------|------|
|
|
221
|
+
| `cliRequest(path, ...params)` | POST 请求到 dev server,body 用 `encode()` 编码 |
|
|
222
|
+
| `post(path, body)` | 发送原始 body 的 POST 请求 |
|
|
223
|
+
|
|
224
|
+
### `config.js` — 配置
|
|
225
|
+
|
|
226
|
+
```javascript
|
|
227
|
+
{ port: 49037 }
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## 6. 热更新 (HMR)
|
|
233
|
+
|
|
234
|
+
### `hmr.js`
|
|
235
|
+
|
|
236
|
+
```
|
|
237
|
+
hmr(projectPath, projectName)
|
|
238
|
+
→ 检查 buildConfig.buildOptions.useHMR
|
|
239
|
+
→ fs.watch(projectPath, { recursive: true })
|
|
240
|
+
→ 1 秒防抖
|
|
241
|
+
→ 过滤条件:
|
|
242
|
+
✅ .js / .ts 文件
|
|
243
|
+
✅ build.config / mod.info
|
|
244
|
+
❌ 点文件/目录 (.git, .vscode)
|
|
245
|
+
❌ buildDir (dev/)
|
|
246
|
+
❌ .tmp 文件
|
|
247
|
+
→ 变更时:
|
|
248
|
+
buildProject(projectPath, projectName)
|
|
249
|
+
syncDevFilesServer(projectPath, projectName)
|
|
250
|
+
→ 额外启动:
|
|
251
|
+
watchResourceDir() — 监听 res/ 目录 (3 秒防抖)
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## 7. 文件同步
|
|
257
|
+
|
|
258
|
+
### `syncFiles.js`
|
|
259
|
+
|
|
260
|
+
| 导出 | 说明 |
|
|
261
|
+
|------|------|
|
|
262
|
+
| `syncDevFilesServer(path, name)` | `fs.cpSync` 复制 BP/RP 到 Minecraft 开发包目录 |
|
|
263
|
+
| `writeLib(path)` | 复制 `prod/core`、`prod/cli`、`prod/oc` 到 `node_modules/@sapdon/` |
|
|
264
|
+
|
|
265
|
+
**Minecraft 目录路径**(由 `versionType` 决定):
|
|
266
|
+
|
|
267
|
+
| versionType | 路径 |
|
|
268
|
+
|-------------|------|
|
|
269
|
+
| `release` | `%USERPROFILE%/AppData/Roaming/Minecraft Bedrock/Users/Shared/games/com.mojang/` |
|
|
270
|
+
| `beta` | `%USERPROFILE%/AppData/Local/Packages/Microsoft.MinecraftWindowsBeta_8wekyb3d8bbwe/LocalState/games/com.mojang/` |
|
|
271
|
+
|
|
272
|
+
可被环境变量 `MC_PATH` / `MC_BETA_PATH` 覆盖。
|
|
273
|
+
|
|
274
|
+
**writeLib 写入的 package.json:**
|
|
275
|
+
|
|
276
|
+
```json
|
|
277
|
+
// node_modules/@sapdon/core/package.json
|
|
278
|
+
{ "name": "@sapdon/core", "main": "index.js", "version": "..." }
|
|
279
|
+
|
|
280
|
+
// node_modules/@sapdon/cli/package.json
|
|
281
|
+
{ "name": "@sapdon/cli", "main": "index.js", "version": "..." }
|
|
282
|
+
|
|
283
|
+
// node_modules/@sapdon/runtime/package.json
|
|
284
|
+
{ "name": "@sapdon/runtime", "main": "index.js", "version": "..." }
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## 8. 元数据模块
|
|
290
|
+
|
|
291
|
+
### `meta/buildConfig.ts` — build.config 解析
|
|
292
|
+
|
|
293
|
+
`getBuildConfig()` 读取项目根目录的 `build.config` 文件:
|
|
294
|
+
|
|
295
|
+
- 使用 `parseJsonWithComments()` 解析(支持 `//` 和 `/* */` 注释)
|
|
296
|
+
- 自动检测 v1 格式并迁移到 v2(`transferV1ToV2()`)
|
|
297
|
+
- 结果通过 `cacheSync` 缓存
|
|
298
|
+
|
|
299
|
+
**BuildConfig 接口:**
|
|
300
|
+
|
|
301
|
+
```typescript
|
|
302
|
+
interface BuildConfig {
|
|
303
|
+
formatVersion: number // 当前是 2
|
|
304
|
+
buildOptions: {
|
|
305
|
+
useHMR: boolean // 热更新
|
|
306
|
+
buildMode: 'development' | 'production' // 构建模式
|
|
307
|
+
buildEntry: string // main.ts 入口
|
|
308
|
+
scriptEntry: string // scripts/main.ts
|
|
309
|
+
scriptOutput: string // scripts/index.js
|
|
310
|
+
useJs: boolean // 是否用 JS
|
|
311
|
+
buildDir: string // dev/
|
|
312
|
+
dependencies: Array<{ module_name: string, version: string }>
|
|
313
|
+
resource: { path: string, resourceHints: boolean }
|
|
314
|
+
}
|
|
315
|
+
versionType: 'release' | 'beta'
|
|
316
|
+
}
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### `meta/versionType.ts` — Minecraft 路径
|
|
320
|
+
|
|
321
|
+
| 函数 | 说明 |
|
|
322
|
+
|------|------|
|
|
323
|
+
| `mojangPath()` | release 版路径(环境变量 `MC_PATH` 可覆盖) |
|
|
324
|
+
| `betaPath()` | beta 版路径(环境变量 `MC_BETA_PATH` 可覆盖) |
|
|
325
|
+
| `getGamePath()` | 根据 `buildConfig.versionType` 返回对应路径 |
|
|
326
|
+
|
|
327
|
+
### `meta/package.ts` — 框架自身信息
|
|
328
|
+
|
|
329
|
+
`getPackageJson()` 读取框架根目录的 `package.json`(用于获取版本号等)。
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
## 9. 资源提示系统
|
|
334
|
+
|
|
335
|
+
### `res/server.ts`
|
|
336
|
+
|
|
337
|
+
为 TypeScript 项目生成 `res.hint.ts`,提供类型安全的资源引用:
|
|
338
|
+
|
|
339
|
+
```
|
|
340
|
+
initResourceDir()
|
|
341
|
+
→ 仅 TS 项目 (buildEntry 不以 .js 结尾)
|
|
342
|
+
→ 创建 res/ 目录(如不存在)
|
|
343
|
+
→ walk(res/) 递归扫描文件
|
|
344
|
+
→ 生成 ResourceHint 树
|
|
345
|
+
→ 写入 res.hint.ts
|
|
346
|
+
|
|
347
|
+
res.hint.ts 示例:
|
|
348
|
+
import { FileResource } from '...'
|
|
349
|
+
export default {
|
|
350
|
+
"textures": {
|
|
351
|
+
"blocks": {
|
|
352
|
+
"stone": FileResource.get("res/textures/blocks/stone.png")
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
`watchResourceDir()` 监听 `res/` 目录变更,3 秒防抖,变更时执行 `sapdon res`。
|
|
359
|
+
|
|
360
|
+
### `res/fileResource.ts` — FileResource 类
|
|
361
|
+
|
|
362
|
+
惰性文件资源加载器,带全局缓存:
|
|
363
|
+
|
|
364
|
+
| 成员 | 说明 |
|
|
365
|
+
|------|------|
|
|
366
|
+
| `static cache` | 全局实例缓存(按 URI 键) |
|
|
367
|
+
| `static fileSystemLoader` | 默认加载器:`fs.readFileSync` |
|
|
368
|
+
| `static get(uri)` | 工厂方法,返回缓存或新实例 |
|
|
369
|
+
| `load(loader)` | 加载并缓存 |
|
|
370
|
+
| `clear()` | 清除缓存 |
|
|
371
|
+
| `ptr()` | 返回惰性 getter 函数 |
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
## 10. 纹理图集生成
|
|
376
|
+
|
|
377
|
+
### `tools/textureSet.js`
|
|
378
|
+
|
|
379
|
+
扫描资源目录的 PNG 文件,生成 Minecraft 所需的纹理图集 JSON:
|
|
380
|
+
|
|
381
|
+
| 导出 | 说明 |
|
|
382
|
+
|------|------|
|
|
383
|
+
| `generateItemTextureJson(dir, output, projectName, userData)` | 扫描 `textures/items/` 的 PNG,合并用户数据,输出 `item_texture.json` |
|
|
384
|
+
| `generateBlockTextureJson(dir, output, projectName, userData)` | 扫描 `textures/blocks/` 的 PNG,合并用户数据,输出 `terrain_texture.json` |
|
|
385
|
+
|
|
386
|
+
---
|
|
387
|
+
|
|
388
|
+
## 11. 远程日志系统
|
|
389
|
+
|
|
390
|
+
### `remoteLogger/`
|
|
391
|
+
|
|
392
|
+
用于 Minecraft 游戏内 Script API 向 CLI 发送日志消息:
|
|
393
|
+
|
|
394
|
+
```
|
|
395
|
+
游戏内 (Script API) CLI 主进程
|
|
396
|
+
┌──────────────────────┐ ┌──────────────────┐
|
|
397
|
+
│ remoteLogger.client │ │ remoteLogger.server
|
|
398
|
+
│ .info("msg") │─────→│ .handleRemoteLogger()
|
|
399
|
+
│ .error("err") │ POST │ → console[level]()
|
|
400
|
+
└──────────────────────┘ └──────────────────┘
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
| 文件 | 内容 |
|
|
404
|
+
|------|------|
|
|
405
|
+
| `message.ts` | `LogLevel` 枚举 + `Message` 接口 + `createMessage()` |
|
|
406
|
+
| `client.ts` | `sendMessage()` / `remoteLogger.info()` / `remoteLogger.error()` |
|
|
407
|
+
| `server.ts` | `handleRemoteLogger()` — 接收并输出日志 |
|
|
408
|
+
|
|
409
|
+
---
|
|
410
|
+
|
|
411
|
+
## 12. 通用工具
|
|
412
|
+
|
|
413
|
+
### `utils.ts`
|
|
414
|
+
|
|
415
|
+
| 导出 | 说明 |
|
|
416
|
+
|------|------|
|
|
417
|
+
| `generateUUID()` | 生成 UUID v4 |
|
|
418
|
+
| `copyFileSync(src, dest)` | 同步复制文件 |
|
|
419
|
+
| `pathNotExist(path)` | 检查路径是否**不存在** |
|
|
420
|
+
| `readFile(path)` | 同步读文件 (UTF-8),失败返回 null |
|
|
421
|
+
| `saveFile(path, data)` | 同步写文件,自动创建父目录 |
|
|
422
|
+
| `copyFolder(src, dest)` | 递归复制目录 |
|
|
423
|
+
| `dirname(importMeta)` | 从 `import.meta` 获取 `__dirname` |
|
|
424
|
+
| `asyncImport(path)` | 动态 import,非相对路径自动加 `file://` 前缀 |
|
|
425
|
+
| `parseJsonWithComments(str)` | 解析含 `//` 和 `/* */` 注释的 JSON |
|
|
426
|
+
|
|
427
|
+
---
|
|
428
|
+
|
|
429
|
+
## 13. 模块依赖关系
|
|
430
|
+
|
|
431
|
+
```
|
|
432
|
+
start.js (命令定义)
|
|
433
|
+
├── init.js → 项目创建/初始化
|
|
434
|
+
├── build.js → 构建编排
|
|
435
|
+
├── dev-server/hmr.js → 热更新
|
|
436
|
+
├── dev-server/syncFiles.js → writeLib
|
|
437
|
+
└── res/server.js → initResourceDir
|
|
438
|
+
|
|
439
|
+
build.js (构建核心)
|
|
440
|
+
├── load.js → generateAddon (数据处理)
|
|
441
|
+
├── dev-server/ → server, startDevServer, syncDevFilesServer
|
|
442
|
+
├── registryServer.js → GRegistryServer
|
|
443
|
+
├── core/addon/manifest.js → 清单生成
|
|
444
|
+
└── meta/buildConfig.js → 配置读取
|
|
445
|
+
|
|
446
|
+
load.js (JSON 文件生成)
|
|
447
|
+
├── tools/textureSet.js → 纹理图集
|
|
448
|
+
└── registryServer.js → GRegistryServer
|
|
449
|
+
|
|
450
|
+
dev-server/ (IPC 基础设施)
|
|
451
|
+
├── server.ts ←→ client.js (HTTP 通信)
|
|
452
|
+
├── hmr.js → build.js + syncFiles.js
|
|
453
|
+
└── syncFiles.js → meta/versionType.js + meta/package.js
|
|
454
|
+
|
|
455
|
+
meta/ (配置层)
|
|
456
|
+
├── buildConfig.ts → init.js (getProjectPath)
|
|
457
|
+
├── versionType.ts → buildConfig.ts
|
|
458
|
+
└── package.ts → (读取 package.json)
|
|
459
|
+
|
|
460
|
+
res/ (资源提示)
|
|
461
|
+
├── server.ts → fileResource.ts + meta/buildConfig.ts
|
|
462
|
+
└── fileResource.ts
|
|
463
|
+
|
|
464
|
+
remoteLogger/ (远程日志)
|
|
465
|
+
├── client.ts → dev-server/client.js + message.ts
|
|
466
|
+
└── server.ts → message.ts
|
|
467
|
+
```
|