@bkm016/calcite 0.0.0-stage → 0.2.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.
- package/LICENSE +21 -0
- package/README.md +416 -2
- package/THIRD_PARTY_NOTICES.md +44 -0
- package/dist/accounts.d.ts +46 -0
- package/dist/accounts.js +194 -0
- package/dist/accounts.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +332 -0
- package/dist/cli.js.map +1 -0
- package/dist/client-core.d.ts +66 -0
- package/dist/client-core.js +530 -0
- package/dist/client-core.js.map +1 -0
- package/dist/client.d.ts +127 -0
- package/dist/client.js +185 -0
- package/dist/client.js.map +1 -0
- package/dist/display.d.ts +23 -0
- package/dist/display.js +164 -0
- package/dist/display.js.map +1 -0
- package/dist/hmc.d.ts +53 -0
- package/dist/hmc.js +168 -0
- package/dist/hmc.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +48 -0
- package/dist/install.js +119 -0
- package/dist/install.js.map +1 -0
- package/dist/java.d.ts +37 -0
- package/dist/java.js +222 -0
- package/dist/java.js.map +1 -0
- package/dist/loaders.d.ts +41 -0
- package/dist/loaders.js +86 -0
- package/dist/loaders.js.map +1 -0
- package/dist/lock.d.ts +13 -0
- package/dist/lock.js +79 -0
- package/dist/lock.js.map +1 -0
- package/dist/log.d.ts +13 -0
- package/dist/log.js +20 -0
- package/dist/log.js.map +1 -0
- package/dist/manager.d.ts +15 -0
- package/dist/manager.js +65 -0
- package/dist/manager.js.map +1 -0
- package/dist/mcp.d.ts +13 -0
- package/dist/mcp.js +377 -0
- package/dist/mcp.js.map +1 -0
- package/dist/mods.d.ts +21 -0
- package/dist/mods.js +135 -0
- package/dist/mods.js.map +1 -0
- package/dist/mojang.d.ts +54 -0
- package/dist/mojang.js +73 -0
- package/dist/mojang.js.map +1 -0
- package/dist/names.d.ts +53 -0
- package/dist/names.js +267 -0
- package/dist/names.js.map +1 -0
- package/dist/net.d.ts +26 -0
- package/dist/net.js +286 -0
- package/dist/net.js.map +1 -0
- package/dist/options.d.ts +14 -0
- package/dist/options.js +50 -0
- package/dist/options.js.map +1 -0
- package/dist/paths.d.ts +29 -0
- package/dist/paths.js +49 -0
- package/dist/paths.js.map +1 -0
- package/dist/probe-server.d.ts +28 -0
- package/dist/probe-server.js +132 -0
- package/dist/probe-server.js.map +1 -0
- package/dist/types.d.ts +235 -0
- package/dist/types.js +25 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +11 -0
- package/dist/version.js.map +1 -0
- package/dist/zip.d.ts +5 -0
- package/dist/zip.js +65 -0
- package/dist/zip.js.map +1 -0
- package/package.json +57 -4
- package/vendor/calcite-probe.jar +0 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 黑 <b@taboo.sh>
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,417 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Calcite 方解石
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://github.com/bkm016/Calcite/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/@bkm016/calcite)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
7
|
+
Calcite 用于以编程方式驱动**真实的 Minecraft Java 版客户端**。它负责下载与启动游戏、加入服务器,并提供读取客户端状态与实体、发送聊天和指令、截图等能力。Calcite 以三种形式提供:
|
|
8
|
+
|
|
9
|
+
- **命令行工具**(`calcite`)
|
|
10
|
+
- **MCP 服务器**:供 Claude、Cursor 等 AI Agent 直接调用
|
|
11
|
+
- **Node.js 库**
|
|
12
|
+
|
|
13
|
+
适用场景包括服务端插件与模组的端到端测试、AI Agent 在游戏内的感知与操作,以及服务器的自动化巡检。
|
|
14
|
+
|
|
15
|
+
<p align="center">
|
|
16
|
+
<img src="docs/images/landscape.jpg" alt="Minecraft 26.3 风景截图" width="49%">
|
|
17
|
+
<img src="docs/images/gameplay.jpg" alt="Agent 在游戏中发送聊天与指令" width="49%">
|
|
18
|
+
</p>
|
|
19
|
+
<p align="center"><sub>两张图均由 Calcite 在无显卡的 Linux 云服务器上截取(Minecraft 26.3,Xvfb + Mesa 软件渲染)。右图为 Agent 发送聊天与指令后的画面。</sub></p>
|
|
20
|
+
|
|
21
|
+
## 目录
|
|
22
|
+
|
|
23
|
+
- [特性](#特性)
|
|
24
|
+
- [环境要求](#环境要求)
|
|
25
|
+
- [安装](#安装)
|
|
26
|
+
- [命令行](#命令行)
|
|
27
|
+
- [MCP 服务器](#mcp-服务器)
|
|
28
|
+
- [Node.js API](#nodejs-api)
|
|
29
|
+
- [平台与账号](#平台与账号)
|
|
30
|
+
- [渲染模式](#渲染模式)
|
|
31
|
+
- [模组](#模组)
|
|
32
|
+
- [版本兼容性](#版本兼容性)
|
|
33
|
+
- [数据目录与环境变量](#数据目录与环境变量)
|
|
34
|
+
- [故障排查](#故障排查)
|
|
35
|
+
- [工作原理](#工作原理)
|
|
36
|
+
- [许可](#许可)
|
|
37
|
+
|
|
38
|
+
## 特性
|
|
39
|
+
|
|
40
|
+
- **支持所有版本**:可启动 Mojang 发布的任意版本,包括正式版与快照;1.14.4 及以上版本支持全部探针功能。
|
|
41
|
+
- **跨平台**:Linux、Windows、macOS。
|
|
42
|
+
- **账号**:支持离线账号,也支持微软正版账号。正版账号使用设备码登录,凭据持久保存并自动刷新。
|
|
43
|
+
- **无显卡环境截图**:在 Linux 服务器上通过 Xvfb 与 Mesa 软件渲染完成截图。
|
|
44
|
+
- **模组加载器**:一行参数安装 Fabric、Forge 或 NeoForge,并从本地文件、URL 或 Modrinth 加载模组(自动补全前置依赖),探针功能在模组环境中同样可用。
|
|
45
|
+
- **玩家操作**:转向、移动、寻路到坐标、攻击、使用物品与方块、挖掘、切换快捷栏、丢弃物品,以及打开箱子等容器并点击槽位。操作走原版客户端逻辑,与真实玩家输入等价。
|
|
46
|
+
- **按需渲染**:默认不渲染画面,截图时临时渲染。单次截图约 0.5 秒,进服后首次截图需等待区块编译,约 2–4 秒。
|
|
47
|
+
- **Java 自动管理**:按游戏版本自动选择 Java(render `off` 时原本需要 Java 8 的版本改用 Java 17,HeadlessMC 3 的 LWJGL 替身不支持 Java 8);本机缺少时从 Eclipse Adoptium 下载 Temurin,并校验 SHA-256。HeadlessMC 3 本身运行在 Java 25 上,同样按需下载。
|
|
48
|
+
- **自动重连**:掉线或崩溃后按指数退避自动重连。
|
|
49
|
+
- **多客户端**:一个进程可同时管理多个相互隔离的客户端实例。
|
|
50
|
+
|
|
51
|
+
## 环境要求
|
|
52
|
+
|
|
53
|
+
| 项目 | 要求 |
|
|
54
|
+
| --- | --- |
|
|
55
|
+
| Node.js | 20.18.1 或更高版本 |
|
|
56
|
+
| Java | 无需预装;缺少时自动下载(游戏所需版本,以及 HeadlessMC 所需的 Java 25) |
|
|
57
|
+
| 磁盘 | 每个游戏版本约 0.5–1 GB,资源文件在各版本间共享 |
|
|
58
|
+
| Linux 截图 | `xvfb`、`libgl1-mesa-dri`;Minecraft 26.x 另需 `libegl1`、`libegl-mesa0` |
|
|
59
|
+
|
|
60
|
+
Debian / Ubuntu 安装截图依赖:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
sudo apt install xvfb libgl1-mesa-dri libegl1 libegl-mesa0
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## 安装
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
npm install -g @bkm016/calcite
|
|
70
|
+
calcite doctor
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
`calcite doctor` 用于检查 Node.js、Java、显示环境、EGL、已保存账号以及 Mojang 服务的连通性。
|
|
74
|
+
|
|
75
|
+
## 命令行
|
|
76
|
+
|
|
77
|
+
### 快速开始
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# 以离线账号 Bot1 进入服务器
|
|
81
|
+
calcite launch play.example.com -V 1.21.11 -n Bot1
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
客户端进服后,终端进入交互模式:
|
|
85
|
+
|
|
86
|
+
- 直接输入文本:发送聊天
|
|
87
|
+
- 以 `/` 开头:执行指令
|
|
88
|
+
- 以 `:` 开头:控制命令,见下表
|
|
89
|
+
|
|
90
|
+
| 交互命令 | 说明 |
|
|
91
|
+
| --- | --- |
|
|
92
|
+
| `:state` | 输出当前游戏状态 |
|
|
93
|
+
| `:ents [半径]` | 列出附近实体,默认半径 32 |
|
|
94
|
+
| `:shot [文件]` | 截图并保存为 PNG |
|
|
95
|
+
| `:render on\|off` | 开启或关闭持续渲染 |
|
|
96
|
+
| `:respawn` | 死亡后重生 |
|
|
97
|
+
| `:look <yaw> <pitch>` / `:lookat <x> <y> <z>` | 设置视角 / 看向坐标 |
|
|
98
|
+
| `:goto <x> <z>` | 直线走到指定坐标,遇到台阶自动跳跃 |
|
|
99
|
+
| `:move <按键,...> [tick]` | 按住按键若干 tick(默认 20),按键为 `forward`、`back`、`left`、`right`、`jump`、`sneak`、`sprint`、`attack`、`use` |
|
|
100
|
+
| `:stop` | 停止当前移动、挖掘等持续操作 |
|
|
101
|
+
| `:attack [实体ID]` | 攻击指定实体;省略时攻击准星所指 |
|
|
102
|
+
| `:use [实体ID \| x y z] [tick]` | 右键实体或方块;省略目标时使用手中物品,可指定按住时长 |
|
|
103
|
+
| `:dig <x> <y> <z>` | 挖掘方块直至破坏 |
|
|
104
|
+
| `:block <x> <y> <z>` / `:target` | 查看方块 / 查看准星目标 |
|
|
105
|
+
| `:inv` / `:slot <0-8>` | 查看背包 / 切换快捷栏 |
|
|
106
|
+
| `:container` / `:close` | 查看 / 关闭当前打开的容器 |
|
|
107
|
+
| `:click <槽位> [按键] [模式]` | 点击容器槽位,模式见下文 |
|
|
108
|
+
| `:drop [all]` | 丢弃手中物品(`all` 丢弃整组) |
|
|
109
|
+
| `:quit` | 退出并关闭客户端 |
|
|
110
|
+
|
|
111
|
+
### 命令一览
|
|
112
|
+
|
|
113
|
+
| 命令 | 说明 |
|
|
114
|
+
| --- | --- |
|
|
115
|
+
| `calcite launch [server]` | 启动客户端并在终端中交互 |
|
|
116
|
+
| `calcite install [version]` | 预下载指定版本(客户端、库、资源、Java),不启动游戏;`-l, --loader` 同时安装模组加载器 |
|
|
117
|
+
| `calcite versions` | 列出可用版本(`-t release\|snapshot\|old_beta\|old_alpha\|all`,`-l <数量>`) |
|
|
118
|
+
| `calcite login` | 微软账号登录(设备码) |
|
|
119
|
+
| `calcite accounts` | 列出已保存的微软账号 |
|
|
120
|
+
| `calcite logout <name>` | 删除已保存的微软账号 |
|
|
121
|
+
| `calcite doctor` | 检查运行环境 |
|
|
122
|
+
| `calcite mcp` | 以 stdio 方式运行 MCP 服务器 |
|
|
123
|
+
|
|
124
|
+
### `launch` 参数
|
|
125
|
+
|
|
126
|
+
| 参数 | 默认值 | 说明 |
|
|
127
|
+
| --- | --- | --- |
|
|
128
|
+
| `-n, --name <name>` | `calcite` | 实例名,同时作为游戏目录名 |
|
|
129
|
+
| `-V, --mc-version <version>` | `release` | 版本号,也可使用 `release` 或 `snapshot` |
|
|
130
|
+
| `-u, --username <name>` | 实例名 | 离线用户名 |
|
|
131
|
+
| `-m, --microsoft [account]` | — | 使用已保存的微软账号(省略名称时使用主账号) |
|
|
132
|
+
| `-r, --render <mode>` | `on-demand` | 渲染模式:`on-demand`、`always`、`off` |
|
|
133
|
+
| `-l, --loader <loader>` | — | 模组加载器:`fabric`、`forge`、`neoforge`,可加 `@<版本>`,见[模组](#模组) |
|
|
134
|
+
| `--mod <spec>` | — | 加载模组,可重复;需同时指定加载器 |
|
|
135
|
+
| `--java <path>` | 自动选择 | 指定游戏使用的 Java |
|
|
136
|
+
| `--no-java-download` | — | 禁止自动下载 Java |
|
|
137
|
+
| `--memory <size>` | `2G` | 最大堆内存 |
|
|
138
|
+
| `--no-reconnect` | — | 掉线或崩溃后不自动重连 |
|
|
139
|
+
|
|
140
|
+
全局参数 `-v, --verbose` 用于输出调试日志。
|
|
141
|
+
|
|
142
|
+
### 微软正版账号
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
calcite login # 只需执行一次,按提示在浏览器中完成登录
|
|
146
|
+
calcite accounts
|
|
147
|
+
calcite launch mc.example.com -V 1.21.11 --microsoft
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## MCP 服务器
|
|
151
|
+
|
|
152
|
+
在支持 MCP 的客户端(Claude Code、Claude Desktop、Cursor 等)中添加如下配置:
|
|
153
|
+
|
|
154
|
+
```json
|
|
155
|
+
{
|
|
156
|
+
"mcpServers": {
|
|
157
|
+
"calcite": { "command": "npx", "args": ["-y", "@bkm016/calcite", "mcp"] }
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Claude Code 也可以通过命令添加:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
claude mcp add calcite -- npx -y @bkm016/calcite mcp
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
`calcite mcp` 支持 `-r, --render <mode>` 和 `--memory <size>`,用于设置新客户端的默认值。
|
|
169
|
+
|
|
170
|
+
### 工具列表
|
|
171
|
+
|
|
172
|
+
| 工具 | 说明 |
|
|
173
|
+
| --- | --- |
|
|
174
|
+
| `launch_client` | 启动客户端,可指定服务器、版本、离线用户名或微软账号、渲染模式、模组加载器与模组 |
|
|
175
|
+
| `stop_client` | 停止客户端 |
|
|
176
|
+
| `list_clients` | 列出当前管理的客户端 |
|
|
177
|
+
| `get_state` | 获取生命周期阶段与游戏状态(界面、坐标、生命值、维度、帧率、断开原因) |
|
|
178
|
+
| `get_entities` | 获取客户端已接收的实体,可按半径、类型、名称、UUID 过滤 |
|
|
179
|
+
| `send_chat` | 发送聊天消息 |
|
|
180
|
+
| `run_command` | 执行指令,并返回执行期间收到的聊天 |
|
|
181
|
+
| `screenshot` | 渲染并返回 PNG 截图 |
|
|
182
|
+
| `wait_for` | 等待条件成立:聊天匹配正则、实体出现或消失、进入指定阶段 |
|
|
183
|
+
| `get_chat` | 获取聊天记录 |
|
|
184
|
+
| `get_logs` | 获取游戏日志与 Calcite 日志,用于排查崩溃 |
|
|
185
|
+
| `set_render` | 开启或关闭持续渲染 |
|
|
186
|
+
| `respawn` | 死亡后重生 |
|
|
187
|
+
| `look` | 设置视角,或看向指定坐标 |
|
|
188
|
+
| `walk_to` | 直线走到指定坐标,遇障碍自动跳跃,返回是否到达 |
|
|
189
|
+
| `move` | 按住移动、跳跃、潜行、疾跑等按键若干 tick |
|
|
190
|
+
| `stop_actions` | 停止所有持续操作并松开按键 |
|
|
191
|
+
| `attack` | 攻击实体(按 ID 或准星目标) |
|
|
192
|
+
| `use` | 右键:使用手中物品、与方块交互(开箱、放置)、与实体交互 |
|
|
193
|
+
| `dig` | 挖掘方块直至破坏 |
|
|
194
|
+
| `get_block` | 查询方块 ID 与方块状态 |
|
|
195
|
+
| `get_target` | 查询准星所指的方块或实体 |
|
|
196
|
+
| `get_inventory` | 查询背包、快捷栏与手持物品 |
|
|
197
|
+
| `select_slot` | 切换快捷栏槽位 |
|
|
198
|
+
| `get_container` | 查询当前打开的容器(类型、标题、槽位物品) |
|
|
199
|
+
| `click_slot` | 点击容器槽位,支持拾取、快速移动、数字键交换、丢弃等模式 |
|
|
200
|
+
| `close_container` | 关闭当前容器 |
|
|
201
|
+
| `drop_item` | 丢弃手中物品 |
|
|
202
|
+
| `install_version` | 预下载指定版本,可同时安装模组加载器 |
|
|
203
|
+
| `list_versions` | 列出可用版本 |
|
|
204
|
+
| `account_login_start` | 开始微软账号登录,返回验证链接 |
|
|
205
|
+
| `account_login_status` | 查询登录进度 |
|
|
206
|
+
| `account_list` | 列出已保存的微软账号 |
|
|
207
|
+
| `account_remove` | 删除已保存的微软账号 |
|
|
208
|
+
|
|
209
|
+
仅运行一个客户端时,各工具的 `client` 参数可以省略。工具调用失败时返回 `isError` 结果,错误信息格式为 `[错误码] 描述`。
|
|
210
|
+
|
|
211
|
+
## Node.js API
|
|
212
|
+
|
|
213
|
+
```js
|
|
214
|
+
import { Client } from '@bkm016/calcite';
|
|
215
|
+
|
|
216
|
+
const bot = new Client({
|
|
217
|
+
name: 'Bot1',
|
|
218
|
+
version: '1.21.11',
|
|
219
|
+
server: 'localhost:25565',
|
|
220
|
+
account: { type: 'offline', username: 'Bot1' },
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
bot.on('chat', (line) => console.log(line.message));
|
|
224
|
+
|
|
225
|
+
await bot.start(); // 进入服务器后返回
|
|
226
|
+
console.log(await bot.state());
|
|
227
|
+
console.log(await bot.entities({ radius: 32, type: 'minecraft:player' }));
|
|
228
|
+
|
|
229
|
+
await bot.command('say hello');
|
|
230
|
+
await bot.waitFor({ chat: 'hello' }, 10_000);
|
|
231
|
+
|
|
232
|
+
const { png } = await bot.screenshot();
|
|
233
|
+
await bot.stop();
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### `Client` 主要选项
|
|
237
|
+
|
|
238
|
+
| 选项 | 说明 |
|
|
239
|
+
| --- | --- |
|
|
240
|
+
| `name` | 实例名,只允许字母、数字、`-`、`_`、`.` |
|
|
241
|
+
| `version` | 版本号、`release` 或 `snapshot` |
|
|
242
|
+
| `server` | `host[:port]`;省略时停留在标题界面 |
|
|
243
|
+
| `account` | `{ type: 'offline', username }` 或 `{ type: 'microsoft', name? }` |
|
|
244
|
+
| `render` | `on-demand`(默认)、`always`、`off` |
|
|
245
|
+
| `loader` | 模组加载器:`fabric`、`forge`、`neoforge`,可加 `@<版本>` |
|
|
246
|
+
| `mods` | 模组列表:本地 jar 或目录、http(s) URL、`modrinth:<项目>[@<版本>]` |
|
|
247
|
+
| `memory` | 最大堆内存,默认 `2G` |
|
|
248
|
+
| `javaPath` / `allowJavaDownload` | 指定 Java 路径 / 是否允许自动下载 |
|
|
249
|
+
| `jvmArgs` / `gameArgs` | 额外的 JVM 参数 / 游戏参数 |
|
|
250
|
+
| `renderDistance` / `maxFps` | 渲染距离 / 帧率上限 |
|
|
251
|
+
| `reconnect` | `false` 表示关闭自动重连,或传入 `{ maxAttempts }`(默认 10) |
|
|
252
|
+
| `startTimeoutMs` | 启动总超时,含下载时间,默认 15 分钟 |
|
|
253
|
+
|
|
254
|
+
### 方法
|
|
255
|
+
|
|
256
|
+
| 方法 | 说明 |
|
|
257
|
+
| --- | --- |
|
|
258
|
+
| `start()` / `stop()` | 启动(进入服务器后返回)/ 停止 |
|
|
259
|
+
| `prepare()` | 仅下载与校验依赖 |
|
|
260
|
+
| `status()` | 生命周期阶段、最近错误、玩家信息 |
|
|
261
|
+
| `state()` | 游戏状态 |
|
|
262
|
+
| `entities(query)` | 实体列表,`query` 支持 `radius`、`type`、`name`、`uuid`、`limit` |
|
|
263
|
+
| `chat(text)` / `command(cmd)` | 发送聊天 / 执行指令 |
|
|
264
|
+
| `screenshot({ keep })` | 返回 `{ png, path? }` |
|
|
265
|
+
| `waitFor(cond, timeoutMs)` | 等待聊天、实体或阶段条件 |
|
|
266
|
+
| `setRender(enabled)` / `respawn()` | 切换持续渲染 / 重生 |
|
|
267
|
+
| `chatSince(seq)` / `logsSince(opts)` | 读取聊天与日志缓冲 |
|
|
268
|
+
| `look({ yaw, pitch } \| { x, y, z })` | 设置视角或看向坐标 |
|
|
269
|
+
| `walkTo(x, z, { range, sprint, timeoutMs })` | 走到坐标,返回 `{ arrived, reason?, distance, x, y, z }` |
|
|
270
|
+
| `move(controls, { ticks })` / `stopActions()` | 按住按键若干 tick / 停止所有持续操作 |
|
|
271
|
+
| `attack(entityId?)` | 攻击实体,省略时攻击准星目标 |
|
|
272
|
+
| `use({ entityId?, block?, holdTicks? })` | 右键实体、方块或使用手中物品 |
|
|
273
|
+
| `dig(block, { timeoutMs })` | 挖掘方块,返回 `{ broken, block, ticks?, reason? }` |
|
|
274
|
+
| `block(pos)` / `target()` | 查询方块 / 准星目标 |
|
|
275
|
+
| `inventory()` / `selectSlot(n)` | 查询背包 / 切换快捷栏 |
|
|
276
|
+
| `container({ waitMs })` / `closeContainer()` | 查询 / 关闭当前容器 |
|
|
277
|
+
| `click(slot, { button, mode })` | 点击容器槽位 |
|
|
278
|
+
| `drop({ all })` | 丢弃手中物品 |
|
|
279
|
+
|
|
280
|
+
事件:`phase`、`state`、`chat`、`log`、`exit`。
|
|
281
|
+
|
|
282
|
+
### 玩家操作示例
|
|
283
|
+
|
|
284
|
+
```js
|
|
285
|
+
await bot.walkTo(100.5, 200.5); // 走到 (100.5, 200.5)
|
|
286
|
+
await bot.dig({ x: 101, y: 64, z: 200 }); // 挖掉一个方块
|
|
287
|
+
await bot.use({ block: { x: 100, y: 64, z: 202 } }); // 右键打开箱子
|
|
288
|
+
const chest = await bot.container({ waitMs: 3000 }); // 等待容器界面打开
|
|
289
|
+
for (const item of chest.items.filter((i) => i.slot < chest.containerSlots)) {
|
|
290
|
+
await bot.click(item.slot, { mode: 'quick_move' }); // Shift+点击 取出物品
|
|
291
|
+
}
|
|
292
|
+
await bot.closeContainer();
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
容器槽位编号与原版一致:容器自身的槽位在前(`0` 到 `containerSlots - 1`),玩家背包在后;`item.inventorySlot` 给出对应的背包槽位。`click` 的 `mode` 可取 `pickup`(默认,`button` 0 为左键、1 为右键)、`quick_move`(Shift+点击)、`swap`(数字键,`button` 为快捷栏序号 0–8)、`clone`、`throw`、`quick_craft`、`pickup_all`;槽位 `-999` 表示点击界面外部。未打开容器时,`click` 作用于玩家自身的背包界面。
|
|
296
|
+
|
|
297
|
+
操作有距离限制(6 格):目标过远时返回 `out_of_reach` 错误,需先用 `walkTo` 靠近。
|
|
298
|
+
|
|
299
|
+
此外还导出 `ClientManager`(多客户端管理)、`installVersion`、`startLogin`、`listAccounts`、`removeAccount` 等函数,类型定义随包发布。
|
|
300
|
+
|
|
301
|
+
## 平台与账号
|
|
302
|
+
|
|
303
|
+
| 平台 | 离线账号 | 微软账号 |
|
|
304
|
+
| --- | --- | --- |
|
|
305
|
+
| Linux | 全部功能(在 Xvfb 中渲染) | 全部功能 |
|
|
306
|
+
| Windows / macOS | 无渲染运行,不支持截图,其余功能正常 | 全部功能 |
|
|
307
|
+
|
|
308
|
+
HeadlessMC 仅在检测到 Xvfb 时允许离线账号渲染,否则强制以无渲染方式运行。这是上游策略,Calcite 遵循该策略。如需在 Windows 或 macOS 上截图,请使用正版账号。
|
|
309
|
+
|
|
310
|
+
离线账号只能进入 `online-mode=false` 的服务器。
|
|
311
|
+
|
|
312
|
+
从 0.1.x 升级:Calcite 现使用 HeadlessMC 3,其凭据格式与 HeadlessMC 2 不兼容,已保存的微软账号需要重新执行一次 `calcite login`。
|
|
313
|
+
|
|
314
|
+
## 渲染模式
|
|
315
|
+
|
|
316
|
+
| 模式 | 说明 |
|
|
317
|
+
| --- | --- |
|
|
318
|
+
| `on-demand`(默认) | 平时不渲染画面,截图时临时渲染。兼顾资源占用与截图能力 |
|
|
319
|
+
| `always` | 持续渲染,适合在本地桌面观察 |
|
|
320
|
+
| `off` | 以无渲染器方式运行(替换 LWJGL),资源占用最低,不支持截图 |
|
|
321
|
+
|
|
322
|
+
## 模组
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
# Fabric + Fabric API(从 Modrinth 下载,自动补全前置)
|
|
326
|
+
calcite launch localhost -V 1.21.11 -l fabric --mod modrinth:fabric-api --mod ./mods/my-mod.jar
|
|
327
|
+
|
|
328
|
+
# 指定加载器版本
|
|
329
|
+
calcite launch localhost -V 1.20.1 -l forge@47.4.26
|
|
330
|
+
calcite install 1.21.11 -l neoforge
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
```js
|
|
334
|
+
new Client({ version: '1.21.11', loader: 'fabric', mods: ['modrinth:fabric-api', './my-mod.jar'] });
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
- 加载器由 HeadlessMC 安装到共享的 `minecraft/versions/`,省略版本时使用最新版本(已安装过则复用本地最新版)。
|
|
338
|
+
- 模组来源:本地 jar、包含 jar 的目录、http(s) URL,或 `modrinth:<项目>[@<版本号>]`。Modrinth 模组按游戏版本与加载器挑选最新正式版,并自动下载必需的前置模组;下载文件按哈希校验并缓存在 `mods/`。
|
|
339
|
+
- 模组复制到实例的 `mods/` 目录。Calcite 只管理自己放入的文件(记录在 `mods/.calcite-mods.json`),手动放入的模组不受影响。
|
|
340
|
+
- 模组加载失败时,客户端会停在错误界面;Calcite 检测到后立即结束进程并返回 `mod_loading_failed`,错误信息附带相关日志。
|
|
341
|
+
|
|
342
|
+
| 加载器 | 支持的版本 | 探针 |
|
|
343
|
+
| --- | --- | --- |
|
|
344
|
+
| Fabric | Fabric 支持的所有版本 | 全部功能(自动将 Mojang 映射转换为 intermediary 名称) |
|
|
345
|
+
| NeoForge | 1.20.2 及以上 | 全部功能 |
|
|
346
|
+
| Forge | 1.17 及以上 | 全部功能(1.20.4 及以前自动转换为 SRG 名称) |
|
|
347
|
+
| Forge | 1.16.5 及以前 | 可以启动,探针功能不可用 |
|
|
348
|
+
|
|
349
|
+
Forge 与 NeoForge 的安装器要求与游戏版本完全一致的 Java 主版本(例如 1.20.1 需要 Java 17),缺少时自动下载。Forge 与 NeoForge 不支持在 render `off` 下运行原本需要 Java 8 的版本。
|
|
350
|
+
|
|
351
|
+
已验证:Fabric 1.21.11 / 26.3(含 Fabric API)、NeoForge 1.20.4 / 1.21.11、Forge 1.20.1 / 1.21.1。
|
|
352
|
+
|
|
353
|
+
## 版本兼容性
|
|
354
|
+
|
|
355
|
+
| 版本范围 | 支持情况 |
|
|
356
|
+
| --- | --- |
|
|
357
|
+
| 1.14.4 及以上 | 全部功能(状态、实体、聊天、指令、截图、玩家操作) |
|
|
358
|
+
| 1.14.4 以前 | 可以启动并进入服务器;Mojang 未发布这些版本的映射表,探针功能不可用 |
|
|
359
|
+
|
|
360
|
+
已验证的版本:1.16.5、1.20.4、1.21.11、26.3。
|
|
361
|
+
|
|
362
|
+
## 数据目录与环境变量
|
|
363
|
+
|
|
364
|
+
所有数据保存在 `~/.calcite`,可通过 `CALCITE_HOME` 修改。
|
|
365
|
+
|
|
366
|
+
| 目录 | 内容 |
|
|
367
|
+
| --- | --- |
|
|
368
|
+
| `minecraft/` | 各版本共享的游戏文件、库与资源 |
|
|
369
|
+
| `instances/<name>/` | 各实例独立的游戏目录(`options.txt`、日志、截图) |
|
|
370
|
+
| `hmc-home/.auth/default/` | 已保存的微软登录凭据(权限 600,请妥善保管) |
|
|
371
|
+
| `instances/<name>/.headlessmc/` | 该实例的 HeadlessMC 配置、账号副本与缓存 |
|
|
372
|
+
| `java/` | 自动下载的 Java 运行时 |
|
|
373
|
+
| `mods/` | 从 URL 与 Modrinth 下载的模组缓存 |
|
|
374
|
+
| `mappings/` | 映射表及为模组加载器转换后的名称表 |
|
|
375
|
+
|
|
376
|
+
| 环境变量 | 说明 |
|
|
377
|
+
| --- | --- |
|
|
378
|
+
| `CALCITE_HOME` | 数据目录 |
|
|
379
|
+
| `CALCITE_LOG_LEVEL` | 日志级别:`debug`、`info`、`warn`、`error`、`silent` |
|
|
380
|
+
| `HTTPS_PROXY` / `HTTP_PROXY` / `NO_PROXY` | HTTP 代理。Calcite 自身的下载使用该代理,并将其转换为 Java 系统属性传给 HeadlessMC 与游戏进程(Java 不支持代理认证;游戏与服务器之间的连接不经过代理) |
|
|
381
|
+
| `CALCITE_JAVA_<主版本>` | 指定某个 Java 主版本的路径,例如 `CALCITE_JAVA_8` |
|
|
382
|
+
| `CALCITE_HMC_JAR` / `CALCITE_HMC_URL` | 使用自定义的 HeadlessMC |
|
|
383
|
+
| `CALCITE_PROBE_DIR` | 探针目录,路径中不能包含空格 |
|
|
384
|
+
|
|
385
|
+
## 故障排查
|
|
386
|
+
|
|
387
|
+
错误均带有错误码。CLI 输出格式为 `error [code]: ...`,MCP 返回格式为 `[code] ...`。
|
|
388
|
+
|
|
389
|
+
| 错误码 | 原因与处理 |
|
|
390
|
+
| --- | --- |
|
|
391
|
+
| `server_unreachable` | 服务器端口不可达。请检查地址、端口与防火墙 |
|
|
392
|
+
| `start_timeout` | 未在规定时间内进入游戏。可用 `get_logs` 或 `logsSince()` 查看游戏日志 |
|
|
393
|
+
| `crashed` | 游戏进程退出。错误信息中附有日志末尾内容 |
|
|
394
|
+
| `renderer_unavailable` | 无法创建任何图形后端。Linux 无显卡环境请安装 `libegl1 libegl-mesa0`(或 `mesa-vulkan-drivers`),也可改用 `render: 'off'` |
|
|
395
|
+
| `headless` | 当前客户端以无渲染方式运行,无法截图。参见[平台与账号](#平台与账号) |
|
|
396
|
+
| `not_logged_in` / `unknown_account` | 未登录微软账号或账号名不存在。请先执行 `calcite login` |
|
|
397
|
+
| `instance_busy` | 同名实例已在其他进程中运行 |
|
|
398
|
+
| `unsupported_version` | 版本不存在或不受支持 |
|
|
399
|
+
| `bad_loader` / `unsupported_loader` | 加载器名称或版本格式错误 / 该版本组合无法运行 |
|
|
400
|
+
| `install_failed` | HeadlessMC 未能安装加载器(该游戏版本可能没有对应构建) |
|
|
401
|
+
| `bad_mod` / `mod_not_found` | 模组参数错误 / 找不到模组文件或 Modrinth 上没有适配的版本 |
|
|
402
|
+
| `mod_loading_failed` | 模组加载失败(缺少前置、版本不兼容等),错误信息附带日志 |
|
|
403
|
+
|
|
404
|
+
排查环境问题时,建议先运行 `calcite doctor`。
|
|
405
|
+
|
|
406
|
+
## 工作原理
|
|
407
|
+
|
|
408
|
+
1. Calcite 解析 Mojang 版本清单,下载客户端、库与资源文件,并逐一校验哈希。
|
|
409
|
+
2. 使用 [HeadlessMC](https://github.com/headlesshq/headlessmc) 3 启动游戏。每个实例拥有独立的游戏目录、HeadlessMC 配置和启动参数,并发启动互不干扰。
|
|
410
|
+
3. 向游戏注入一个轻量 Java Agent(探针)。探针借助 Mojang 官方映射表(模组环境下转换为 intermediary 或 SRG 名称)定位游戏内部类,并通过本地 TCP 连接与 Calcite 交换 JSON 消息。
|
|
411
|
+
4. 在 Linux 无显示环境中,Calcite 启动共享的 Xvfb,并配置 Mesa 软件渲染。Minecraft 26.x 的渲染器改用 EGL。
|
|
412
|
+
|
|
413
|
+
## 许可
|
|
414
|
+
|
|
415
|
+
本项目以 [MIT](LICENSE) 许可证发布。第三方组件的许可信息见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。
|
|
416
|
+
|
|
417
|
+
使用 Minecraft 须遵守 [Minecraft EULA](https://www.minecraft.net/eula)。连接正版服务器时,请使用您本人的正版账号。本项目与 Mojang Studios、Microsoft 无关。
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
Calcite does not bundle the software below; it downloads it at runtime from the original publishers and
|
|
4
|
+
verifies the published checksums.
|
|
5
|
+
|
|
6
|
+
## HeadlessMC
|
|
7
|
+
|
|
8
|
+
Calcite launches Minecraft through [HeadlessMC](https://github.com/headlesshq/headlessmc) (pinned release,
|
|
9
|
+
SHA-256 verified), which is distributed under the following license:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
MIT License
|
|
13
|
+
|
|
14
|
+
Copyright (c) 2025 3arthqu4ke
|
|
15
|
+
|
|
16
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
17
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
18
|
+
in the Software without restriction, including without limitation the rights
|
|
19
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
20
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
21
|
+
furnished to do so, subject to the following conditions:
|
|
22
|
+
|
|
23
|
+
The above copyright notice and this permission notice shall be included in all
|
|
24
|
+
copies or substantial portions of the Software.
|
|
25
|
+
|
|
26
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
27
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
28
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
29
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
30
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
31
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
32
|
+
SOFTWARE.```
|
|
33
|
+
|
|
34
|
+
## Minecraft
|
|
35
|
+
|
|
36
|
+
Minecraft game files, libraries, assets and mappings are downloaded from Mojang's servers and are subject to the
|
|
37
|
+
[Minecraft EULA](https://www.minecraft.net/eula) and the
|
|
38
|
+
[Minecraft Usage Guidelines](https://www.minecraft.net/usage-guidelines). Mojang's obfuscation maps are used only
|
|
39
|
+
at runtime to locate game classes and are never redistributed.
|
|
40
|
+
|
|
41
|
+
## Java runtimes
|
|
42
|
+
|
|
43
|
+
When no suitable Java installation is found, Calcite downloads Eclipse Temurin builds from
|
|
44
|
+
[Adoptium](https://adoptium.net) (GPLv2 with Classpath Exception).
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { CalcitePaths } from './paths.js';
|
|
2
|
+
/** HeadlessMC files location holding the Microsoft sessions created by `calcite login`. */
|
|
3
|
+
export declare function accountsHome(paths: CalcitePaths): string;
|
|
4
|
+
/** Microsoft sessions of `calcite login`; Calcite restricts the file to the current user. */
|
|
5
|
+
export declare function accountsFile(paths: CalcitePaths): string;
|
|
6
|
+
export declare function accountsLock(paths: CalcitePaths): string;
|
|
7
|
+
export interface AccountInfo {
|
|
8
|
+
name: string;
|
|
9
|
+
uuid?: string;
|
|
10
|
+
/** The account used when a client does not name one. */
|
|
11
|
+
primary: boolean;
|
|
12
|
+
}
|
|
13
|
+
/** Stored Microsoft accounts (no secrets). */
|
|
14
|
+
export declare function listAccounts(paths: CalcitePaths): Promise<AccountInfo[]>;
|
|
15
|
+
export declare function removeAccount(paths: CalcitePaths, name: string): Promise<boolean>;
|
|
16
|
+
/** UUID the vanilla server assigns to an offline player (version 3, from "OfflinePlayer:<name>"), without dashes. */
|
|
17
|
+
export declare function offlineUuid(name: string): string;
|
|
18
|
+
export type LaunchAccount = {
|
|
19
|
+
type: 'offline';
|
|
20
|
+
username: string;
|
|
21
|
+
} | {
|
|
22
|
+
type: 'microsoft';
|
|
23
|
+
name?: string;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Prepares the private HeadlessMC location of one client so that HeadlessMC launches exactly this account.
|
|
27
|
+
* Microsoft sessions are copied from the `calcite login` store; {@link syncAccount} writes refreshed tokens back.
|
|
28
|
+
* Returns the account name.
|
|
29
|
+
*/
|
|
30
|
+
export declare function prepareAccount(paths: CalcitePaths, location: string, account: LaunchAccount): Promise<string>;
|
|
31
|
+
/** Copies a Microsoft session refreshed by a launch back into the `calcite login` store. */
|
|
32
|
+
export declare function syncAccount(paths: CalcitePaths, location: string, name: string): Promise<void>;
|
|
33
|
+
export interface LoginHandle {
|
|
34
|
+
/** Microsoft device login URL (contains the code); open it in a browser and approve. */
|
|
35
|
+
url: Promise<string>;
|
|
36
|
+
/** Resolves with the Minecraft profile name once the login completed and the account was stored. */
|
|
37
|
+
done: Promise<string>;
|
|
38
|
+
cancel(): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Starts a Microsoft device-code login through HeadlessMC. The session (including the refresh token) is stored
|
|
42
|
+
* in Calcite's HeadlessMC location and refreshed automatically on every launch.
|
|
43
|
+
*/
|
|
44
|
+
export declare function startLogin(paths: CalcitePaths, { timeoutMs }?: {
|
|
45
|
+
timeoutMs?: number | undefined;
|
|
46
|
+
}): Promise<LoginHandle>;
|