cortico 0.1.0

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.
Files changed (311) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +47 -0
  3. package/package.json +43 -0
  4. package/src/boot.ts +46 -0
  5. package/src/bot.ts +1342 -0
  6. package/src/config-file.ts +41 -0
  7. package/src/core/README.md +92 -0
  8. package/src/core/billing.ts +26 -0
  9. package/src/core/blobs.ts +106 -0
  10. package/src/core/bus.ts +311 -0
  11. package/src/core/config-schema.ts +201 -0
  12. package/src/core/config.ts +262 -0
  13. package/src/core/core.ts +699 -0
  14. package/src/core/cost.ts +244 -0
  15. package/src/core/event-store.ts +304 -0
  16. package/src/core/fork.ts +113 -0
  17. package/src/core/generation.ts +118 -0
  18. package/src/core/instance-lock.ts +215 -0
  19. package/src/core/ipc-logger.ts +105 -0
  20. package/src/core/language.ts +62 -0
  21. package/src/core/log-context.ts +38 -0
  22. package/src/core/loop.ts +1858 -0
  23. package/src/core/markers.ts +48 -0
  24. package/src/core/prefix.ts +121 -0
  25. package/src/core/run.ts +95 -0
  26. package/src/core/secrets.ts +18 -0
  27. package/src/core/session.ts +56 -0
  28. package/src/core/sessions.ts +261 -0
  29. package/src/core/state.ts +104 -0
  30. package/src/core/template.ts +72 -0
  31. package/src/core/timers.ts +129 -0
  32. package/src/core/tool-log.ts +135 -0
  33. package/src/core/transcript.ts +92 -0
  34. package/src/core/truncate.ts +121 -0
  35. package/src/core/types.ts +1140 -0
  36. package/src/core/usage-log.ts +79 -0
  37. package/src/core/util.ts +386 -0
  38. package/src/deploy-listing.ts +160 -0
  39. package/src/deploy.ts +162 -0
  40. package/src/extensions/README.md +72 -0
  41. package/src/extensions/dry-mount.ts +390 -0
  42. package/src/extensions/manifest.ts +153 -0
  43. package/src/extensions/runtime.ts +42 -0
  44. package/src/extensions.ts +519 -0
  45. package/src/launcher.ts +285 -0
  46. package/src/paths.ts +155 -0
  47. package/src/protocol/open-responses/LICENSE +201 -0
  48. package/src/protocol/open-responses/README.md +14 -0
  49. package/src/protocol/open-responses/context-helpers.ts +27 -0
  50. package/src/protocol/open-responses/context-log.ts +59 -0
  51. package/src/protocol/open-responses/context.ts +89 -0
  52. package/src/protocol/open-responses/generated.ts +115 -0
  53. package/src/protocol/open-responses/index.ts +33 -0
  54. package/src/protocol/open-responses/openapi.json +4230 -0
  55. package/src/protocol/open-responses/stream.ts +146 -0
  56. package/src/protocol/open-responses/tokens.ts +31 -0
  57. package/src/providers/README.md +86 -0
  58. package/src/providers/base.ts +111 -0
  59. package/src/providers/configuration.ts +97 -0
  60. package/src/providers/console/config.ts +21 -0
  61. package/src/providers/console/settings.ts +443 -0
  62. package/src/providers/console/strings.ts +74 -0
  63. package/src/providers/console/types.ts +11 -0
  64. package/src/providers/llamacpp/archive.ts +148 -0
  65. package/src/providers/llamacpp/catalog.ts +247 -0
  66. package/src/providers/llamacpp/config.ts +36 -0
  67. package/src/providers/llamacpp/console/client.ts +6 -0
  68. package/src/providers/llamacpp/console/models-panel.ts +120 -0
  69. package/src/providers/llamacpp/console/runtime-panel.ts +173 -0
  70. package/src/providers/llamacpp/console/server.ts +153 -0
  71. package/src/providers/llamacpp/index.ts +95 -0
  72. package/src/providers/llamacpp/native.ts +51 -0
  73. package/src/providers/llamacpp/options.ts +117 -0
  74. package/src/providers/llamacpp/runtime-store.ts +139 -0
  75. package/src/providers/llamacpp/runtime.ts +214 -0
  76. package/src/providers/llamacpp/server.ts +286 -0
  77. package/src/providers/llamacpp/strings.ts +230 -0
  78. package/src/providers/openai-responses-compat/config.ts +20 -0
  79. package/src/providers/openai-responses-compat/index.ts +89 -0
  80. package/src/providers/openai-responses-compat/native.ts +127 -0
  81. package/src/providers/openai-responses-compat/strings.ts +19 -0
  82. package/src/providers/pricebook.ts +75 -0
  83. package/src/providers/registry.ts +137 -0
  84. package/src/providers/strings.ts +71 -0
  85. package/src/providers/transport/chat.ts +156 -0
  86. package/src/providers/transport/errors.ts +48 -0
  87. package/src/providers/transport/history.ts +68 -0
  88. package/src/providers/transport/native-input.ts +83 -0
  89. package/src/providers/transport/native-types.ts +13 -0
  90. package/src/providers/transport/response-assembly.ts +191 -0
  91. package/src/providers/transport/response-http.ts +196 -0
  92. package/src/providers/transport/response-meters.ts +27 -0
  93. package/src/providers/transport/responses-input.ts +56 -0
  94. package/src/web/README.md +84 -0
  95. package/src/web/client/console-pages/builtins/llm-settings/panel.ts +625 -0
  96. package/src/web/client/console-pages/builtins/llm-settings/pricing-panel.ts +168 -0
  97. package/src/web/client/console-pages/builtins/llm-settings/strings.ts +213 -0
  98. package/src/web/client/console-pages/builtins.ts +10 -0
  99. package/src/web/client/console-pages/context.ts +135 -0
  100. package/src/web/client/console-pages/host.ts +633 -0
  101. package/src/web/client/console-pages/loader.ts +132 -0
  102. package/src/web/client/console-pages/strings.ts +90 -0
  103. package/src/web/client/console-pages/tools/strings.ts +49 -0
  104. package/src/web/client/console-pages/tools/view.ts +215 -0
  105. package/src/web/client/core/api.ts +200 -0
  106. package/src/web/client/core/language.ts +56 -0
  107. package/src/web/client/core/lifecycle.ts +132 -0
  108. package/src/web/client/core/router.ts +199 -0
  109. package/src/web/client/core/stream.ts +157 -0
  110. package/src/web/client/core/websocket.ts +82 -0
  111. package/src/web/client/features/appearance/index.ts +333 -0
  112. package/src/web/client/features/appearance/strings.ts +87 -0
  113. package/src/web/client/features/config/index.ts +11 -0
  114. package/src/web/client/features/config/strings.ts +41 -0
  115. package/src/web/client/features/config/view.ts +428 -0
  116. package/src/web/client/features/core/events.ts +197 -0
  117. package/src/web/client/features/core/index.ts +254 -0
  118. package/src/web/client/features/core/run.ts +56 -0
  119. package/src/web/client/features/core/runlog.ts +214 -0
  120. package/src/web/client/features/core/sessions.ts +53 -0
  121. package/src/web/client/features/core/strings.ts +157 -0
  122. package/src/web/client/features/extensions/index.ts +422 -0
  123. package/src/web/client/features/extensions/strings.ts +164 -0
  124. package/src/web/client/features/feature.ts +93 -0
  125. package/src/web/client/features/live/context.ts +280 -0
  126. package/src/web/client/features/live/fork.ts +156 -0
  127. package/src/web/client/features/live/index.ts +392 -0
  128. package/src/web/client/features/live/onboarding.ts +113 -0
  129. package/src/web/client/features/live/protocol.ts +122 -0
  130. package/src/web/client/features/live/sessions.ts +71 -0
  131. package/src/web/client/features/live/status.ts +68 -0
  132. package/src/web/client/features/live/strings.ts +252 -0
  133. package/src/web/client/features/live/timeline.ts +590 -0
  134. package/src/web/client/features/prompts/editor.ts +292 -0
  135. package/src/web/client/features/prompts/index.ts +346 -0
  136. package/src/web/client/features/prompts/strings.ts +136 -0
  137. package/src/web/client/features/prompts/view.ts +256 -0
  138. package/src/web/client/features/providers/index.ts +100 -0
  139. package/src/web/client/features/providers/strings.ts +23 -0
  140. package/src/web/client/features/settings/general.ts +28 -0
  141. package/src/web/client/features/settings/index.ts +82 -0
  142. package/src/web/client/features/settings/strings.ts +33 -0
  143. package/src/web/client/features/storage/index.ts +1 -0
  144. package/src/web/client/features/storage/strings.ts +45 -0
  145. package/src/web/client/features/storage/view.ts +154 -0
  146. package/src/web/client/features/usage/chart.ts +486 -0
  147. package/src/web/client/features/usage/index.ts +407 -0
  148. package/src/web/client/features/usage/labels.ts +46 -0
  149. package/src/web/client/features/usage/range.ts +36 -0
  150. package/src/web/client/features/usage/state.ts +37 -0
  151. package/src/web/client/features/usage/strings.ts +191 -0
  152. package/src/web/client/features/usage/tooltip.ts +86 -0
  153. package/src/web/client/features/usage/types.ts +96 -0
  154. package/src/web/client/features/worlds/index.ts +424 -0
  155. package/src/web/client/features/worlds/strings.ts +121 -0
  156. package/src/web/client/main.ts +273 -0
  157. package/src/web/client/shell/avatar.ts +233 -0
  158. package/src/web/client/shell/index.ts +549 -0
  159. package/src/web/client/shell/strings.ts +89 -0
  160. package/src/web/client/theme/handoff.ts +43 -0
  161. package/src/web/client/theme/palette.ts +109 -0
  162. package/src/web/client/theme/registry.ts +130 -0
  163. package/src/web/client/theme/storage.ts +72 -0
  164. package/src/web/client/theme/strings.ts +123 -0
  165. package/src/web/client/theme/studio.ts +366 -0
  166. package/src/web/client/ui/actions.ts +109 -0
  167. package/src/web/client/ui/data.ts +185 -0
  168. package/src/web/client/ui/dom.ts +23 -0
  169. package/src/web/client/ui/fields.ts +191 -0
  170. package/src/web/client/ui/format.ts +75 -0
  171. package/src/web/client/ui/icons.ts +183 -0
  172. package/src/web/client/ui/images.ts +91 -0
  173. package/src/web/client/ui/index.ts +89 -0
  174. package/src/web/client/ui/lamp.ts +125 -0
  175. package/src/web/client/ui/log.ts +98 -0
  176. package/src/web/client/ui/overlay.ts +184 -0
  177. package/src/web/client/ui/page.ts +8 -0
  178. package/src/web/client/ui/prompt-input.tsx +311 -0
  179. package/src/web/client/ui/sheet.ts +131 -0
  180. package/src/web/client/ui/strings.ts +71 -0
  181. package/src/web/console-pages.ts +367 -0
  182. package/src/web/files.ts +107 -0
  183. package/src/web/path-picker.ts +296 -0
  184. package/src/web/public/index.html +17 -0
  185. package/src/web/public/styles.css +1715 -0
  186. package/src/web/server.ts +1883 -0
  187. package/src/web/shared/client-panel.ts +603 -0
  188. package/src/web/shared/console-protocol.ts +560 -0
  189. package/src/web/shared/css.d.ts +1 -0
  190. package/src/web/shared/path-picker.ts +23 -0
  191. package/src/web/shared/theme.ts +256 -0
  192. package/src/web/theme-store.ts +37 -0
  193. package/src/world.ts +449 -0
  194. package/src/worlds/bilibili/ENV_PROMPT.md +5 -0
  195. package/src/worlds/bilibili/README.md +176 -0
  196. package/src/worlds/bilibili/audience-admission.ts +995 -0
  197. package/src/worlds/bilibili/client.ts +528 -0
  198. package/src/worlds/bilibili/coalescing-buffer.ts +125 -0
  199. package/src/worlds/bilibili/config.ts +185 -0
  200. package/src/worlds/bilibili/console/client.ts +202 -0
  201. package/src/worlds/bilibili/definition.ts +35 -0
  202. package/src/worlds/bilibili/gift-frame.ts +131 -0
  203. package/src/worlds/bilibili/normalize.ts +452 -0
  204. package/src/worlds/bilibili/overlay/announcement.ts +76 -0
  205. package/src/worlds/bilibili/overlay/assets.ts +82 -0
  206. package/src/worlds/bilibili/overlay/model.ts +494 -0
  207. package/src/worlds/bilibili/overlay/project.ts +202 -0
  208. package/src/worlds/bilibili/overlay/server.ts +286 -0
  209. package/src/worlds/bilibili/overlay/types.ts +217 -0
  210. package/src/worlds/bilibili/overlay/web/app.js +690 -0
  211. package/src/worlds/bilibili/overlay/web/editor.css +297 -0
  212. package/src/worlds/bilibili/overlay/web/editor.html +102 -0
  213. package/src/worlds/bilibili/overlay/web/editor.js +2116 -0
  214. package/src/worlds/bilibili/overlay/web/overlay.html +13 -0
  215. package/src/worlds/bilibili/overlay/web/styles.css +258 -0
  216. package/src/worlds/bilibili/protobuf.ts +123 -0
  217. package/src/worlds/bilibili/wire.ts +94 -0
  218. package/src/worlds/bilibili/world.ts +1389 -0
  219. package/src/worlds/console-fixture/ENV_PROMPT.md +1 -0
  220. package/src/worlds/console-fixture/console/client.ts +72 -0
  221. package/src/worlds/console-fixture/world.ts +73 -0
  222. package/src/worlds/index.ts +15 -0
  223. package/src/worlds/minecraft/ENV_PROMPT.md +32 -0
  224. package/src/worlds/minecraft/ENV_PROMPT_CAMERA.md +2 -0
  225. package/src/worlds/minecraft/LICENSE-mineflayer-pathfinder.txt +21 -0
  226. package/src/worlds/minecraft/README.md +917 -0
  227. package/src/worlds/minecraft/blueprint-plan.ts +915 -0
  228. package/src/worlds/minecraft/blueprint-registry.ts +566 -0
  229. package/src/worlds/minecraft/blueprint-repair.ts +236 -0
  230. package/src/worlds/minecraft/blueprint-resource.ts +272 -0
  231. package/src/worlds/minecraft/blueprint.ts +492 -0
  232. package/src/worlds/minecraft/body-lease.ts +340 -0
  233. package/src/worlds/minecraft/bridge.ts +749 -0
  234. package/src/worlds/minecraft/check.ts +651 -0
  235. package/src/worlds/minecraft/chests.ts +292 -0
  236. package/src/worlds/minecraft/client-launch.ts +272 -0
  237. package/src/worlds/minecraft/client-options.ts +85 -0
  238. package/src/worlds/minecraft/client-skins.ts +164 -0
  239. package/src/worlds/minecraft/client-window.ps1 +91 -0
  240. package/src/worlds/minecraft/client.ts +423 -0
  241. package/src/worlds/minecraft/combat-context.ts +109 -0
  242. package/src/worlds/minecraft/combat.ts +1552 -0
  243. package/src/worlds/minecraft/config.ts +499 -0
  244. package/src/worlds/minecraft/console/access.ts +218 -0
  245. package/src/worlds/minecraft/console/client.ts +244 -0
  246. package/src/worlds/minecraft/console/log.ts +110 -0
  247. package/src/worlds/minecraft/console/mount.ts +420 -0
  248. package/src/worlds/minecraft/console/skin.ts +257 -0
  249. package/src/worlds/minecraft/console/style.css +154 -0
  250. package/src/worlds/minecraft/console/world.ts +449 -0
  251. package/src/worlds/minecraft/deaths.ts +135 -0
  252. package/src/worlds/minecraft/definition.ts +18 -0
  253. package/src/worlds/minecraft/engine-child.ts +274 -0
  254. package/src/worlds/minecraft/engine-ipc.ts +98 -0
  255. package/src/worlds/minecraft/entity-facts.ts +132 -0
  256. package/src/worlds/minecraft/escape.ts +407 -0
  257. package/src/worlds/minecraft/executor.ts +14494 -0
  258. package/src/worlds/minecraft/explored.ts +156 -0
  259. package/src/worlds/minecraft/geometry.ts +205 -0
  260. package/src/worlds/minecraft/goal-plan.ts +647 -0
  261. package/src/worlds/minecraft/item-break.ts +126 -0
  262. package/src/worlds/minecraft/item-facts.ts +146 -0
  263. package/src/worlds/minecraft/item-pick.ts +67 -0
  264. package/src/worlds/minecraft/level-dat.ts +176 -0
  265. package/src/worlds/minecraft/log.ts +132 -0
  266. package/src/worlds/minecraft/mineflayer-fixes.ts +1180 -0
  267. package/src/worlds/minecraft/names.ts +377 -0
  268. package/src/worlds/minecraft/pathfinder-lib.d.ts +13 -0
  269. package/src/worlds/minecraft/pathfinder-perf.ts +796 -0
  270. package/src/worlds/minecraft/piglin.ts +49 -0
  271. package/src/worlds/minecraft/policy.ts +547 -0
  272. package/src/worlds/minecraft/precheck.ts +655 -0
  273. package/src/worlds/minecraft/proxy.ts +445 -0
  274. package/src/worlds/minecraft/ranged.ts +635 -0
  275. package/src/worlds/minecraft/readouts.ts +102 -0
  276. package/src/worlds/minecraft/round.ts +26 -0
  277. package/src/worlds/minecraft/search-observation.ts +92 -0
  278. package/src/worlds/minecraft/server-config.ts +467 -0
  279. package/src/worlds/minecraft/server.ts +658 -0
  280. package/src/worlds/minecraft/show.ts +84 -0
  281. package/src/worlds/minecraft/skills.ts +1763 -0
  282. package/src/worlds/minecraft/terrain.ts +1735 -0
  283. package/src/worlds/minecraft/window.ts +96 -0
  284. package/src/worlds/minecraft/works.ts +179 -0
  285. package/src/worlds/minecraft/world.ts +6438 -0
  286. package/src/worlds/qq/ENV_PROMPT.md +5 -0
  287. package/src/worlds/qq/config.ts +108 -0
  288. package/src/worlds/qq/console/client.ts +126 -0
  289. package/src/worlds/qq/console/events.ts +155 -0
  290. package/src/worlds/qq/console/gate.ts +232 -0
  291. package/src/worlds/qq/console/roster.ts +203 -0
  292. package/src/worlds/qq/console/style.css +65 -0
  293. package/src/worlds/qq/conversation.ts +28 -0
  294. package/src/worlds/qq/definition.ts +62 -0
  295. package/src/worlds/qq/driver.ts +375 -0
  296. package/src/worlds/qq/history-tools.ts +209 -0
  297. package/src/worlds/qq/normalize.ts +323 -0
  298. package/src/worlds/qq/qface-map.ts +282 -0
  299. package/src/worlds/qq/vision-prompt.ts +27 -0
  300. package/src/worlds/qq/vision.ts +642 -0
  301. package/src/worlds/qq/vlm.ts +142 -0
  302. package/src/worlds/qq/world.ts +1503 -0
  303. package/src/worlds/terminal/ENV_PROMPT.md +11 -0
  304. package/src/worlds/terminal/config.ts +9 -0
  305. package/src/worlds/terminal/definition.ts +14 -0
  306. package/src/worlds/terminal/world.ts +700 -0
  307. package/src/worlds/websearch/ENV_PROMPT.md +1 -0
  308. package/src/worlds/websearch/brave-client.ts +261 -0
  309. package/src/worlds/websearch/config.ts +75 -0
  310. package/src/worlds/websearch/definition.ts +20 -0
  311. package/src/worlds/websearch/world.ts +171 -0
@@ -0,0 +1,377 @@
1
+ /**
2
+ * 方块/物品/实体/群系的中文名。
3
+ *
4
+ * 这里只列两类词:整词表收不规则的与常见的,词素表收前缀(材质/颜色/木种)与
5
+ * 后缀(器物类别),其余靠组合拼出来。minecraft-data 只带 en_us,中文得自己给;
6
+ * 游戏 ID 采用组合命名(acacia_log = 金合欢 + 原木),因此只枚举不规则整词。
7
+ * 无法组合的名称返回原始 ID,表示中文词表未覆盖。
8
+ */
9
+ import { isRealId, type NameRegistry } from './chests.ts';
10
+
11
+ /**
12
+ * 组合生成的中文名附带注册表校验;不存在的 id 在名称后保留原始 id。
13
+ * 未安装注册表时仅返回组合名。
14
+ */
15
+ let nameRegistry: NameRegistry | null = null;
16
+
17
+ /**
18
+ * 连上服务端后装一次;传 null 卸掉。
19
+ * 两张表都没有的对象等于没装:判据答不出「这是不是真 id」时一个字都不加,不装作知道。
20
+ */
21
+ export function setNameRegistry(reg: NameRegistry | null | undefined): void {
22
+ nameRegistry = reg?.itemsByName || reg?.blocksByName ? reg : null;
23
+ }
24
+
25
+ /** 拼出来的名字:registry 里查无此 id 就把 id 摆出来,别让假 id 看着像真的 */
26
+ function stampUnknownId(id: string, zh: string): string {
27
+ if (nameRegistry === null || isRealId(nameRegistry, id)) return zh;
28
+ return `${zh}(${id},原版里没有这个 id)`;
29
+ }
30
+
31
+ /** 不规则或常用到值得单列的整词 */
32
+ const WHOLE: Record<string, string> = {
33
+ // 地形与自然
34
+ dirt: '泥土', coarse_dirt: '砂土', rooted_dirt: '缠根泥土', podzol: '灰化土',
35
+ grass_block: '草方块', mycelium: '菌丝', farmland: '耕地', dirt_path: '土径',
36
+ sand: '沙子', red_sand: '红沙', gravel: '沙砾', clay: '黏土', clay_ball: '黏土球',
37
+ stone: '石头', cobblestone: '圆石', deepslate: '深板岩', cobbled_deepslate: '深板岩圆石',
38
+ granite: '花岗岩', diorite: '闪长岩', andesite: '安山岩', calcite: '方解石', tuff: '凝灰岩',
39
+ sandstone: '砂岩', red_sandstone: '红砂岩', obsidian: '黑曜石', bedrock: '基岩',
40
+ netherrack: '下界岩', soul_sand: '灵魂沙', soul_soil: '灵魂土', magma_block: '岩浆块',
41
+ basalt: '玄武岩', blackstone: '黑石', end_stone: '末地石', ancient_debris: '远古残骸',
42
+ water: '水', lava: '岩浆', ice: '冰', packed_ice: '浮冰', blue_ice: '蓝冰',
43
+ snow: '雪', snow_block: '雪块', powder_snow: '细雪',
44
+ // 矿石(组合拼出来会丢官方叫法,单列)
45
+ coal_ore: '煤矿石', iron_ore: '铁矿石', copper_ore: '铜矿石', gold_ore: '金矿石',
46
+ diamond_ore: '钻石矿石', emerald_ore: '绿宝石矿石', lapis_ore: '青金石矿石',
47
+ redstone_ore: '红石矿石', nether_quartz_ore: '下界石英矿石', nether_gold_ore: '下界金矿石',
48
+ // 植物
49
+ cactus: '仙人掌', sugar_cane: '甘蔗', bamboo: '竹子', vine: '藤蔓', cobweb: '蜘蛛网',
50
+ kelp: '海带', kelp_plant: '海带', seagrass: '海草', tall_seagrass: '高海草',
51
+ dead_bush: '枯萎的灌木', short_grass: '草', tall_grass: '高草丛', fern: '蕨',
52
+ poppy: '虞美人', dandelion: '蒲公英', sunflower: '向日葵', torchflower: '火把花',
53
+ lily_pad: '睡莲', moss_block: '苔藓块', glow_lichen: '发光地衣',
54
+ blue_orchid: '兰花', allium: '绒球葱', azure_bluet: '蓝花美耳草', oxeye_daisy: '滨菊',
55
+ cornflower: '矢车菊', wither_rose: '凋灵玫瑰', lily_of_the_valley: '铃兰',
56
+ red_tulip: '红色郁金香', orange_tulip: '橙色郁金香', white_tulip: '白色郁金香',
57
+ pink_tulip: '粉红色郁金香', pink_petals: '粉红色花簇', spore_blossom: '孢子花',
58
+ mud: '泥巴', dripstone_block: '滴水石块', crimson_nylium: '绯红菌岩',
59
+ warped_nylium: '诡异菌岩', budding_amethyst: '紫水晶母岩', heavy_core: '重型核心',
60
+ air: '空气', fire: '火', soul_fire: '灵魂火', redstone_wire: '红石线',
61
+ iron_bars: '铁栏杆', chain: '锁链', hay_block: '干草捆', carved_pumpkin: '雕刻南瓜',
62
+ jack_o_lantern: '南瓜灯', packed_mud: '泥坯', prismarine: '海晶石',
63
+ dark_prismarine: '暗海晶石', sea_pickle: '海泡菜', azalea: '杜鹃花丛',
64
+ flowering_azalea: '盛开的杜鹃花丛', moss_carpet: '苔藓地毯', hanging_roots: '垂根',
65
+ sculk: '幽匿块', end_rod: '末地烛', chorus_plant: '紫颂植株', chorus_flower: '紫颂花',
66
+ chorus_fruit: '紫颂果', lightning_rod: '避雷针', honey_block: '蜜块', target: '标靶',
67
+ lilac: '丁香', rose_bush: '玫瑰丛', peony: '牡丹', carrots: '胡萝卜作物',
68
+ potatoes: '马铃薯作物', dragon_egg: '龙蛋', weeping_vines: '垂泪藤',
69
+ twisting_vines: '缠怨藤', smooth_quartz: '平滑石英块', nether_portal: '下界传送门',
70
+ tripwire: '绊线', tripwire_hook: '绊线钩', flower_pot: '花盆', cocoa: '可可',
71
+ barrier: '屏障', light: '光源方块', pitcher_plant: '瓶子草', structure_void: '结构空位',
72
+ wet_sponge: '湿海绵', mossy_cobblestone: '苔石圆石', piston_head: '活塞头',
73
+ moving_piston: '移动中的活塞', chiseled_bookshelf: '錾制书架',
74
+ // 功能方块
75
+ crafting_table: '工作台', furnace: '熔炉', blast_furnace: '高炉', smoker: '烟熏炉',
76
+ chest: '箱子', ender_chest: '末影箱', barrel: '木桶', hopper: '漏斗',
77
+ torch: '火把', soul_torch: '灵魂火把', lantern: '灯笼', soul_lantern: '灵魂灯笼',
78
+ campfire: '营火', glowstone: '荧石', sea_lantern: '海晶灯', redstone_lamp: '红石灯',
79
+ enchanting_table: '附魔台', anvil: '铁砧', brewing_stand: '酿造台', cauldron: '炼药锅',
80
+ bookshelf: '书架', beacon: '信标', conduit: '潮涌核心', respawn_anchor: '重生锚',
81
+ smithing_table: '锻造台', stonecutter: '切石机', grindstone: '砂轮', loom: '织布机',
82
+ cartography_table: '制图台', fletching_table: '制箭台', composter: '堆肥桶',
83
+ lectern: '讲台', bell: '钟', jukebox: '唱片机', note_block: '音符盒',
84
+ dispenser: '发射器', dropper: '投掷器', observer: '侦测器', piston: '活塞',
85
+ sticky_piston: '粘性活塞', lever: '拉杆', repeater: '红石中继器', comparator: '红石比较器',
86
+ ladder: '梯子', scaffolding: '脚手架', rail: '铁轨', tnt: '炸药', spawner: '刷怪笼',
87
+ // 材料
88
+ stick: '木棍', string: '线', bone: '骨头', bone_meal: '骨粉', feather: '羽毛',
89
+ flint: '燧石', gunpowder: '火药', leather: '皮革', paper: '纸', book: '书',
90
+ charcoal: '木炭', raw_iron: '粗铁', raw_gold: '粗金', raw_copper: '粗铜',
91
+ redstone: '红石粉', glowstone_dust: '荧石粉', blaze_rod: '烈焰棒', blaze_powder: '烈焰粉',
92
+ ender_pearl: '末影珍珠', ender_eye: '末影之眼', ghast_tear: '恶魂之泪',
93
+ nether_star: '下界之星', nether_wart: '下界疣', slime_ball: '黏液球',
94
+ honeycomb: '蜜脾', sponge: '海绵', rotten_flesh: '腐肉', spider_eye: '蜘蛛眼',
95
+ // 食物
96
+ apple: '苹果', golden_apple: '金苹果', bread: '面包', wheat: '小麦', wheat_seeds: '小麦种子',
97
+ carrot: '胡萝卜', golden_carrot: '金胡萝卜', potato: '马铃薯', baked_potato: '烤马铃薯',
98
+ poisonous_potato: '毒马铃薯', beetroot: '甜菜根', beetroot_seeds: '甜菜种子',
99
+ melon: '西瓜', melon_slice: '西瓜片', pumpkin: '南瓜', pumpkin_pie: '南瓜派',
100
+ sweet_berries: '甜浆果', glow_berries: '发光浆果', cookie: '曲奇', cake: '蛋糕',
101
+ beef: '生牛肉', cooked_beef: '牛排', porkchop: '生猪排', cooked_porkchop: '熟猪排',
102
+ chicken: '生鸡肉', cooked_chicken: '熟鸡肉', mutton: '生羊肉', cooked_mutton: '熟羊肉',
103
+ rabbit: '生兔肉', cooked_rabbit: '熟兔肉', cod: '生鳕鱼', cooked_cod: '熟鳕鱼',
104
+ salmon: '生鲑鱼', cooked_salmon: '熟鲑鱼', tropical_fish: '热带鱼', pufferfish: '河豚',
105
+ milk_bucket: '牛奶桶', mushroom_stew: '蘑菇煲', rabbit_stew: '兔肉煲', suspicious_stew: '谜之炖菜',
106
+ // 器物
107
+ bow: '弓', crossbow: '弩', arrow: '箭', shield: '盾牌', trident: '三叉戟',
108
+ fishing_rod: '钓鱼竿', flint_and_steel: '打火石', shears: '剪刀', bucket: '桶',
109
+ water_bucket: '水桶', lava_bucket: '岩浆桶', compass: '指南针', clock: '钟表',
110
+ map: '地图', spyglass: '望远镜', saddle: '鞍', name_tag: '命名牌', lead: '拴绳',
111
+ elytra: '鞘翅', totem_of_undying: '不死图腾', turtle_helmet: '海龟壳',
112
+ egg: '鸡蛋', snowball: '雪球', experience_bottle: '附魔之瓶',
113
+ bowl: '碗', sugar: '糖', ink_sac: '墨囊', glow_ink_sac: '荧光墨囊', cocoa_beans: '可可豆',
114
+ glass_bottle: '玻璃瓶', potion: '药水', splash_potion: '喷溅药水',
115
+ lingering_potion: '滞留药水', tipped_arrow: '药箭', dragon_breath: '龙息',
116
+ magma_cream: '岩浆膏', fermented_spider_eye: '发酵蜘蛛眼', netherite_scrap: '下界合金碎片',
117
+ rabbit_foot: '兔子脚', rabbit_hide: '兔子皮', shulker_shell: '潜影壳',
118
+ enchanted_book: '附魔书', written_book: '成书', writable_book: '书与笔', filled_map: '地图',
119
+ dried_kelp: '干海带', dried_kelp_block: '干海带块', beetroot_soup: '甜菜汤',
120
+ enchanted_golden_apple: '附魔金苹果', carrot_on_a_stick: '胡萝卜钓竿',
121
+ turtle_scute: '海龟鳞甲', armadillo_scute: '犰狳鳞甲', wolf_armor: '狼铠', mace: '重锤',
122
+ recovery_compass: '追溯指南针', bundle: '收纳袋', firework_star: '烟花之星',
123
+ fire_charge: '火焰弹', popped_chorus_fruit: '爆裂紫颂果', knowledge_book: '知识之书',
124
+ crafter: '合成器', bee_nest: '蜂巢', beehive: '蜂箱', crying_obsidian: '哭泣的黑曜石',
125
+ lodestone: '磁石', gilded_blackstone: '镀金黑石', shroomlight: '菌光体',
126
+ frogspawn: '蛙卵', pointed_dripstone: '滴水石锥', bubble_column: '气泡柱',
127
+ cave_air: '空气', void_air: '空气', sweet_berry_bush: '甜浆果丛',
128
+ beetroots: '甜菜作物', frosted_ice: '霜冰', daylight_detector: '阳光探测器',
129
+ end_portal_frame: '末地传送门框架', end_gateway: '末地折跃门',
130
+ glistering_melon_slice: '闪烁的西瓜片', painting: '画', bamboo_raft: '竹筏',
131
+ bamboo_chest_raft: '竹运输筏', cave_vines: '洞穴藤蔓', cave_vines_plant: '洞穴藤蔓',
132
+ big_dripleaf: '大型垂滴叶', small_dripleaf: '小型垂滴叶', item_frame: '物品展示框',
133
+ glow_item_frame: '荧光物品展示框', armor_stand: '盔甲架', end_crystal: '末影水晶',
134
+ firework_rocket: '烟花火箭', structure_block: '结构方块', jigsaw: '拼图方块',
135
+ phantom_membrane: '幻翼膜', nautilus_shell: '鹦鹉螺壳', heart_of_the_sea: '海洋之心',
136
+ honey_bottle: '蜂蜜瓶', goat_horn: '山羊角', echo_shard: '回响碎片', brush: '刷子',
137
+ spectral_arrow: '光灵箭', wind_charge: '风弹', dragon_head: '龙首',
138
+ trial_spawner: '试炼刷怪笼', vault: '宝库', ochre_froglight: '赭黄蛙明灯',
139
+ verdant_froglight: '青翠蛙明灯', pearlescent_froglight: '珠光蛙明灯',
140
+ small_amethyst_bud: '小型紫晶芽', medium_amethyst_bud: '中型紫晶芽',
141
+ large_amethyst_bud: '大型紫晶芽',
142
+ };
143
+
144
+ /** 前缀词素:木种、材质、颜色 */
145
+ const MODIFIER: Record<string, string> = {
146
+ oak: '橡木', spruce: '云杉', birch: '白桦', jungle: '丛林', acacia: '金合欢',
147
+ dark_oak: '深色橡木', mangrove: '红树', cherry: '樱花', bamboo: '竹', pale_oak: '苍白橡木',
148
+ crimson: '绯红', warped: '诡异', nether: '下界', end: '末地',
149
+ stone: '石', cobblestone: '圆石', deepslate: '深板岩', cobbled_deepslate: '深板岩圆石',
150
+ granite: '花岗岩', diorite: '闪长岩', andesite: '安山岩', sandstone: '砂岩',
151
+ red_sandstone: '红砂岩', blackstone: '黑石', basalt: '玄武岩', quartz: '石英',
152
+ purpur: '紫珀', prismarine: '海晶石', obsidian: '黑曜石', mud: '泥',
153
+ iron: '铁', gold: '金', golden: '金', diamond: '钻石', netherite: '下界合金',
154
+ copper: '铜', coal: '煤炭', lapis: '青金石', lapis_lazuli: '青金石', redstone: '红石',
155
+ emerald: '绿宝石', amethyst: '紫水晶', wooden: '木', leather: '皮革', chainmail: '锁链',
156
+ turtle: '海龟', raw_iron: '粗铁', raw_gold: '粗金', raw_copper: '粗铜',
157
+ white: '白色', orange: '橙色', magenta: '品红色', light_blue: '淡蓝色',
158
+ yellow: '黄色', lime: '黄绿色', pink: '粉红色', gray: '灰色', light_gray: '淡灰色',
159
+ cyan: '青色', purple: '紫色', blue: '蓝色', brown: '棕色', green: '绿色',
160
+ red: '红色', black: '黑色', mossy: '苔石', cracked: '裂纹', chiseled: '錾制',
161
+ polished: '磨制', smooth: '平滑', cut: '切制', waxed: '涂蜡', exposed: '斑驳',
162
+ weathered: '锈蚀', oxidized: '氧化', infested: '被虫蚀的', dead: '失活的',
163
+ stripped: '去皮', muddy: '泥泞', suspicious: '可疑的', flowering: '开花的',
164
+ budding: '紫晶簇生', wet: '湿', powered: '充能', detector: '探测', heavy: '重型',
165
+ large: '大型', small: '小型', tinted: '遮光', reinforced: '强化', ominous: '不祥',
166
+ azalea: '杜鹃', dripstone: '滴水石', pointed: '尖', sculk: '幽匿',
167
+ potted: '盆栽', tube: '管', brain: '脑', bubble: '气泡', horn: '鹿角', fire: '火',
168
+ activator: '激活', trapped: '陷阱', chipped: '开裂', damaged: '破损',
169
+ petrified: '石化', decorated: '饰纹', calibrated: '校频', repeating: '循环',
170
+ chain: '锁链', soul: '灵魂', attached: '附着', carved: '雕刻', packed: '压实',
171
+ };
172
+
173
+ /** 后缀词素:器物类别。长后缀在前,匹配时取最长的一条 */
174
+ const BASE: Record<string, string> = {
175
+ armor_trim_smithing_template: '盔甲纹饰锻造模板',
176
+ concrete_powder: '混凝土粉末', glazed_terracotta: '带釉陶瓦',
177
+ stained_glass_pane: '染色玻璃板', stained_glass: '染色玻璃', glass_pane: '玻璃板',
178
+ pressure_plate: '压力板', hanging_sign: '悬挂式告示牌', fence_gate: '栅栏门',
179
+ horse_armor: '马铠', shulker_box: '潜影盒', chest_boat: '运输船', spawn_egg: '刷怪蛋',
180
+ pottery_sherd: '陶片', banner_pattern: '旗帜图案', music_disc: '唱片',
181
+ brick_slab: '砖台阶', brick_stairs: '砖楼梯', brick_wall: '砖墙',
182
+ log: '原木', wood: '木头', planks: '木板', leaves: '树叶', sapling: '树苗',
183
+ stairs: '楼梯', slab: '台阶', fence: '栅栏', door: '门', trapdoor: '活板门',
184
+ button: '按钮', sign: '告示牌', wall: '墙', ore: '矿石', block: '块',
185
+ ingot: '锭', nugget: '粒', bricks: '砖块', brick: '砖', dust: '粉',
186
+ shard: '碎片', seeds: '种子', bucket: '桶', boat: '船', bed: '床',
187
+ wool: '羊毛', carpet: '地毯', concrete: '混凝土', terracotta: '陶瓦', glass: '玻璃',
188
+ banner: '旗帜', candle: '蜡烛', dye: '染料', minecart: '矿车', pickaxe: '镐',
189
+ sword: '剑', axe: '斧', shovel: '锹', hoe: '锄', helmet: '头盔',
190
+ chestplate: '胸甲', leggings: '护腿', boots: '靴子', pillar: '柱', tiles: '瓦片',
191
+ stem: '菌柄', hyphae: '菌核', roots: '根', fungus: '菌', mushroom: '蘑菇',
192
+ berries: '浆果', sprouts: '芽', vines: '藤', coral: '珊瑚', coral_block: '珊瑚块',
193
+ crystals: '晶簇', cluster: '簇', shulker: '潜影贝', golem: '傀儡',
194
+ froglight: '蛙明灯',
195
+ wall_hanging_sign: '墙上悬挂告示牌', wall_sign: '墙上告示牌', wall_torch: '墙上火把',
196
+ torch: '火把', rail: '铁轨', wire: '线', nylium: '菌岩', propagule: '胎生苗',
197
+ mosaic: '竹马赛克', sponge: '海绵', copper: '铜块', tuff: '凝灰岩', granite: '花岗岩',
198
+ diorite: '闪长岩', andesite: '安山岩', deepslate: '深板岩', sand: '沙子',
199
+ gravel: '沙砾', core: '核', bricks_slab: '砖块台阶', coral_fan: '珊瑚扇', tile: '瓦',
200
+ wall_skull: '墙上头颅', wall_head: '墙上的头', skull: '头颅', head: '头',
201
+ bars: '栏杆', rod: '棒', vein: '脉络', catalyst: '催发体', shrieker: '尖啸体',
202
+ sensor: '感测体', dripleaf: '垂滴叶', pickle: '海泡菜', lantern: '灯笼',
203
+ detector: '探测器', pot: '罐', plant: '植株', flower: '花', fruit: '果',
204
+ egg: '蛋', bush: '丛', cauldron: '炼药锅', portal: '传送门',
205
+ command_block: '命令方块', wart_block: '疣块', bricks_stairs: '砖块楼梯',
206
+ };
207
+
208
+ const BASE_KEYS = Object.keys(BASE).sort((a, b) => b.length - a.length);
209
+
210
+ const ENTITIES: Record<string, string> = {
211
+ allay: '悦灵', armadillo: '犰狳', armor_stand: '盔甲架', arrow: '箭', axolotl: '美西螈',
212
+ bat: '蝙蝠', bee: '蜜蜂', blaze: '烈焰人', boat: '船', bogged: '沼骸', breeze: '旋风人',
213
+ camel: '骆驼', cat: '猫', cave_spider: '洞穴蜘蛛', chest_boat: '运输船',
214
+ chest_minecart: '运输矿车', chicken: '鸡', cod: '鳕鱼', cow: '牛', creeper: '苦力怕',
215
+ dolphin: '海豚', donkey: '驴', dragon_fireball: '末影龙火球', drowned: '溺尸',
216
+ egg: '鸡蛋', elder_guardian: '远古守卫者', end_crystal: '末影水晶', ender_dragon: '末影龙',
217
+ ender_pearl: '末影珍珠', enderman: '末影人', endermite: '末影螨', evoker: '唤魔者',
218
+ evoker_fangs: '唤魔者尖牙', experience_bottle: '附魔之瓶', experience_orb: '经验球',
219
+ eye_of_ender: '末影之眼', falling_block: '下落的方块', fireball: '火球',
220
+ firework_rocket: '烟花火箭', fishing_bobber: '浮漂', fox: '狐狸', frog: '青蛙',
221
+ furnace_minecart: '动力矿车', ghast: '恶魂', giant: '巨人', glow_item_frame: '荧光展示框',
222
+ glow_squid: '发光鱿鱼', goat: '山羊', guardian: '守卫者', hoglin: '疣猪兽',
223
+ hopper_minecart: '漏斗矿车', horse: '马', husk: '尸壳', illusioner: '幻术师',
224
+ iron_golem: '铁傀儡', item: '掉落物', item_frame: '物品展示框', leash_knot: '拴绳结',
225
+ lightning_bolt: '闪电', llama: '羊驼', llama_spit: '羊驼唾沫', magma_cube: '岩浆怪',
226
+ minecart: '矿车', mooshroom: '哞菇', mule: '骡', ocelot: '豹猫', painting: '画',
227
+ panda: '熊猫', parrot: '鹦鹉', phantom: '幻翼', pig: '猪', piglin: '猪灵',
228
+ piglin_brute: '猪灵蛮兵', pillager: '掠夺者', polar_bear: '北极熊', potion: '药水',
229
+ pufferfish: '河豚', rabbit: '兔子', ravager: '劫掠兽', salmon: '鲑鱼', sheep: '羊',
230
+ shulker: '潜影贝', shulker_bullet: '潜影弹', silverfish: '蠹虫', skeleton: '骷髅',
231
+ skeleton_horse: '骷髅马', slime: '史莱姆', small_fireball: '小火球', sniffer: '嗅探兽',
232
+ snow_golem: '雪傀儡', snowball: '雪球', spectral_arrow: '光灵箭', spider: '蜘蛛',
233
+ squid: '鱿鱼', stray: '流浪者', strider: '炽足兽', tadpole: '蝌蚪', tnt: '炸药',
234
+ tnt_minecart: '炸药矿车', trader_llama: '行商羊驼', trident: '三叉戟',
235
+ tropical_fish: '热带鱼', turtle: '海龟', vex: '恼鬼', villager: '村民',
236
+ vindicator: '卫道士', wandering_trader: '流浪商人', warden: '监守者',
237
+ wind_charge: '风弹', breeze_wind_charge: '风弹', witch: '女巫', wither: '凋灵',
238
+ wither_skeleton: '凋灵骷髅', wither_skull: '凋灵之首', wolf: '狼',
239
+ zoglin: '僵尸疣猪兽', zombie: '僵尸', zombie_horse: '僵尸马',
240
+ zombie_villager: '僵尸村民', zombified_piglin: '僵尸猪灵', player: '玩家',
241
+ };
242
+
243
+ const BIOMES: Record<string, string> = {
244
+ badlands: '恶地', bamboo_jungle: '竹林', basalt_deltas: '玄武岩三角洲', beach: '沙滩',
245
+ birch_forest: '桦木森林', cherry_grove: '樱花树林', cold_ocean: '冷水海洋',
246
+ crimson_forest: '绯红森林', dark_forest: '黑森林', deep_cold_ocean: '冷水深海',
247
+ deep_dark: '深暗之域', deep_frozen_ocean: '封冻深海', deep_lukewarm_ocean: '温水深海',
248
+ deep_ocean: '深海', desert: '沙漠', dripstone_caves: '溶洞', end_barrens: '末地荒地',
249
+ end_highlands: '末地高地', end_midlands: '末地内陆', eroded_badlands: '风蚀恶地',
250
+ flower_forest: '繁花森林', forest: '森林', frozen_ocean: '封冻海洋',
251
+ frozen_peaks: '冰封山峰', frozen_river: '冻河', grove: '雪林', ice_spikes: '冰刺之地',
252
+ jagged_peaks: '尖峭山峰', jungle: '丛林', lukewarm_ocean: '温水海洋',
253
+ lush_caves: '繁茂洞穴', mangrove_swamp: '红树林沼泽', meadow: '草甸',
254
+ mushroom_fields: '蘑菇岛', nether_wastes: '下界荒地', ocean: '海洋',
255
+ old_growth_birch_forest: '原始桦木森林', old_growth_pine_taiga: '原始松木针叶林',
256
+ old_growth_spruce_taiga: '原始云杉针叶林', plains: '平原', river: '河流',
257
+ savanna: '热带草原', savanna_plateau: '热带高原', small_end_islands: '末地小型岛屿',
258
+ snowy_beach: '积雪沙滩', snowy_plains: '雪原', snowy_slopes: '积雪山坡',
259
+ snowy_taiga: '积雪针叶林', soul_sand_valley: '灵魂沙峡谷', sparse_jungle: '稀疏丛林',
260
+ stony_peaks: '裸岩山峰', stony_shore: '石岸', sunflower_plains: '向日葵平原',
261
+ swamp: '沼泽', taiga: '针叶林', the_end: '末地', the_void: '虚空',
262
+ warm_ocean: '暖水海洋', warped_forest: '诡异森林', windswept_forest: '风袭森林',
263
+ windswept_gravelly_hills: '风袭沙砾丘陵', windswept_hills: '风袭丘陵',
264
+ windswept_savanna: '风袭热带草原', wooded_badlands: '疏林恶地', unknown: '还没看清的地方',
265
+ };
266
+
267
+ const DIMENSIONS: Record<string, string> = {
268
+ overworld: '主世界', the_nether: '下界', nether: '下界', the_end: '末地',
269
+ };
270
+
271
+ const MODIFIER_KEYS = Object.keys(MODIFIER).sort((a, b) => b.length - a.length);
272
+
273
+ /**
274
+ * 方块/物品的中文名。整词表优先,拼不出整词就递归拆(先按最长后缀切出类别,
275
+ * 再按最长前缀切出修饰词),两个方向都会继续下探:`deepslate_iron_ore` 拆两层
276
+ * (深板岩 + 铁矿石),`waxed_exposed_cut_copper` 拆四层。
277
+ */
278
+ export function zhName(id: string, depth = 0): string {
279
+ const name = id.replace(/^minecraft:/, '');
280
+ const whole = WHOLE[name];
281
+ if (whole) return whole;
282
+ if (depth > 4) return name;
283
+ for (const base of BASE_KEYS) {
284
+ if (name === base) return BASE[base];
285
+ if (!name.endsWith(`_${base}`)) continue;
286
+ const head = name.slice(0, -(base.length + 1));
287
+ const mod = MODIFIER[head] ?? WHOLE[head] ?? ENTITIES[head] ?? zhTranslated(head, depth + 1);
288
+ // 拼出来的整词只在最外层核 id:递归里的分段(`deepslate` / `cobblestone`)
289
+ // 本来就是词素不是 id,拿去问 registry 会把真名也判成假
290
+ if (mod) return depth === 0 ? stampUnknownId(name, `${mod}${BASE[base]}`) : `${mod}${BASE[base]}`;
291
+ }
292
+ for (const key of MODIFIER_KEYS) {
293
+ if (!name.startsWith(`${key}_`)) continue;
294
+ const rest = zhTranslated(name.slice(key.length + 1), depth + 1);
295
+ if (rest) {
296
+ return depth === 0 ? stampUnknownId(name, `${MODIFIER[key]}${rest}`) : `${MODIFIER[key]}${rest}`;
297
+ }
298
+ }
299
+ // 材质词单用就是那样东西本身:coal / diamond / emerald 这些既是修饰也是物品
300
+ return MODIFIER[name] ?? name;
301
+ }
302
+
303
+ /** 译得出来才返回,译不出返回 null——递归时用它判断这一支走不走得通 */
304
+ function zhTranslated(name: string, depth: number): string | null {
305
+ const zh = zhName(name, depth);
306
+ return /[一-龥]/.test(zh) ? zh : null;
307
+ }
308
+
309
+ export function zhEntity(name: string): string {
310
+ const n = name.replace(/^minecraft:/, '');
311
+ // 实体 id 不在 itemsByName/blocksByName 里,走 depth=1 绕开「这个 id 存不存在」那一问:
312
+ // 那道判据只对物品/方块 id 成立,对实体一律会误报成假
313
+ return ENTITIES[n] ?? zhName(n, 1);
314
+ }
315
+
316
+ /**
317
+ * 村民职业,下标即网络元数据 villagerProfession 的注册表序(1.20.6)。
318
+ * 两点台架实锚:none=0、farmer=5;其余按原版注册表字母序推齐。
319
+ */
320
+ export const VILLAGER_PROFESSION_ZH: readonly string[] = [
321
+ '还没有职业', '盔甲匠', '屠夫', '制图师', '牧师', '农民', '渔夫', '制箭师',
322
+ '皮匠', '图书管理员', '石匠', '傻子', '牧羊人', '工具匠', '武器匠',
323
+ ];
324
+
325
+ export function zhBiome(name: string): string {
326
+ return BIOMES[name.replace(/^minecraft:/, '')] ?? name;
327
+ }
328
+
329
+ /** 附魔的中文名,键是原版 id */
330
+ const ENCHANTS: Record<string, string> = {
331
+ protection: '保护', fire_protection: '火焰保护', feather_falling: '摔落缓冲',
332
+ blast_protection: '爆炸保护', projectile_protection: '弹射物保护', respiration: '水下呼吸',
333
+ aqua_affinity: '水下速掘', thorns: '荆棘', depth_strider: '深海探索者', frost_walker: '冰霜行者',
334
+ binding_curse: '绑定诅咒', soul_speed: '灵魂疾行', swift_sneak: '迅捷潜行',
335
+ sharpness: '锋利', smite: '亡灵杀手', bane_of_arthropods: '节肢杀手', knockback: '击退',
336
+ fire_aspect: '火焰附加', looting: '抢夺', sweeping_edge: '横扫之刃',
337
+ efficiency: '效率', silk_touch: '精准采集', unbreaking: '耐久', fortune: '时运',
338
+ power: '力量', punch: '冲击', flame: '火矢', infinity: '无限',
339
+ luck_of_the_sea: '海之眷顾', lure: '饵钓', loyalty: '忠诚', impaling: '穿刺',
340
+ riptide: '激流', channeling: '引雷', multishot: '多重射击', quick_charge: '快速装填',
341
+ piercing: '穿透', density: '致密', breach: '破甲', wind_burst: '风爆',
342
+ mending: '经验修补', vanishing_curse: '消失诅咒',
343
+ };
344
+
345
+ /** 状态效果的中文名,键是 minecraft-data 的 effect name(驼峰,无下划线) */
346
+ const EFFECTS: Record<string, string> = {
347
+ Speed: '迅捷', Slowness: '缓慢', Haste: '急迫', MiningFatigue: '挖掘疲劳', Strength: '力量',
348
+ InstantHealth: '瞬间治疗', InstantDamage: '瞬间伤害', JumpBoost: '跳跃提升', Nausea: '反胃',
349
+ Regeneration: '生命恢复', Resistance: '抗性提升', FireResistance: '抗火',
350
+ WaterBreathing: '水下呼吸', Invisibility: '隐身', Blindness: '失明', NightVision: '夜视',
351
+ Hunger: '饥饿', Weakness: '虚弱', Poison: '中毒', Wither: '凋零', HealthBoost: '生命提升',
352
+ Absorption: '伤害吸收', Saturation: '饱和', Glowing: '发光', Levitation: '飘浮',
353
+ Luck: '幸运', Unluck: '霉运', SlowFalling: '缓降', ConduitPower: '潮涌能量',
354
+ DolphinsGrace: '海豚的恩惠', BadOmen: '不祥之兆', HeroOfTheVillage: '村庄英雄',
355
+ Darkness: '黑暗', TrialOmen: '试炼之兆', RaidOmen: '袭击之兆', WindCharged: '蓄风',
356
+ Weaving: '盘丝', Oozing: '渗浆', Infested: '寄生',
357
+ };
358
+
359
+ export function zhEnchant(name: string): string {
360
+ const n = name.replace(/^minecraft:/, '');
361
+ return ENCHANTS[n] ?? n;
362
+ }
363
+
364
+ export function zhEffect(name: string): string {
365
+ return EFFECTS[name] ?? name;
366
+ }
367
+
368
+ const ROMAN = ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X'];
369
+
370
+ /** 附魔与药水的等级按原版口径写罗马数字;10 以上原版也写不出,照报阿拉伯数字 */
371
+ export function roman(n: number): string {
372
+ return ROMAN[n] ?? String(n);
373
+ }
374
+
375
+ export function zhDimension(name: string): string {
376
+ return DIMENSIONS[name.replace(/^minecraft:/, '')] ?? name;
377
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * mineflayer-pathfinder 只在包导出面上带类型;性能补丁与基准要摸 lib 子路径
3
+ * (AStar/Move 未导出),这里补最小声明。形状在 pathfinder-perf.ts 使用处自行收窄。
4
+ */
5
+ declare module 'mineflayer-pathfinder/lib/astar.js' {
6
+ const AStar: unknown;
7
+ export default AStar;
8
+ }
9
+
10
+ declare module 'mineflayer-pathfinder/lib/move.js' {
11
+ const Move: unknown;
12
+ export default Move;
13
+ }