@bkm016/calcite 0.0.0-stage → 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.
- package/LICENSE +21 -0
- package/README.md +314 -2
- package/THIRD_PARTY_NOTICES.md +44 -0
- package/dist/accounts.d.ts +27 -0
- package/dist/accounts.js +114 -0
- package/dist/accounts.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +242 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +251 -0
- package/dist/client.js +671 -0
- package/dist/client.js.map +1 -0
- package/dist/display.d.ts +23 -0
- package/dist/display.js +135 -0
- package/dist/display.js.map +1 -0
- package/dist/hmc.d.ts +33 -0
- package/dist/hmc.js +130 -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/java.d.ts +31 -0
- package/dist/java.js +218 -0
- package/dist/java.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 +252 -0
- package/dist/mcp.js.map +1 -0
- package/dist/mojang.d.ts +70 -0
- package/dist/mojang.js +109 -0
- package/dist/mojang.js.map +1 -0
- package/dist/net.d.ts +21 -0
- package/dist/net.js +246 -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 +27 -0
- package/dist/paths.js +48 -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/version.d.ts +2 -0
- package/dist/version.js +11 -0
- package/dist/version.js.map +1 -0
- package/package.json +57 -4
- package/vendor/calcite-probe.jar +0 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { writeFile } from 'node:fs/promises';
|
|
3
|
+
import { createInterface } from 'node:readline';
|
|
4
|
+
import { Command, InvalidArgumentError, Option } from 'commander';
|
|
5
|
+
import { listAccounts, removeAccount, startLogin } from './accounts.js';
|
|
6
|
+
import { Client, defaultUsername, installVersion } from './client.js';
|
|
7
|
+
import { hasSharedLib, which } from './display.js';
|
|
8
|
+
import { findJavaInstalls } from './java.js';
|
|
9
|
+
import { setLogLevel } from './log.js';
|
|
10
|
+
import { getManifest } from './mojang.js';
|
|
11
|
+
import { runMcpStdio } from './mcp.js';
|
|
12
|
+
import { resolvePaths } from './paths.js';
|
|
13
|
+
import { VERSION } from './version.js';
|
|
14
|
+
const out = (line = '') => process.stdout.write(`${line}\n`);
|
|
15
|
+
function positiveInt(value) {
|
|
16
|
+
const n = Number(value);
|
|
17
|
+
if (!Number.isInteger(n) || n <= 0)
|
|
18
|
+
throw new InvalidArgumentError('must be a positive integer');
|
|
19
|
+
return n;
|
|
20
|
+
}
|
|
21
|
+
function fail(err) {
|
|
22
|
+
const e = err;
|
|
23
|
+
process.stderr.write(`error${e.code ? ` [${e.code}]` : ''}: ${e.message}\n`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
const program = new Command()
|
|
27
|
+
.name('calcite')
|
|
28
|
+
.description('Run real Minecraft clients headlessly for testing and AI agents')
|
|
29
|
+
.version(VERSION)
|
|
30
|
+
.option('-v, --verbose', 'debug logging')
|
|
31
|
+
.hook('preAction', (cmd) => {
|
|
32
|
+
if (cmd.opts().verbose)
|
|
33
|
+
setLogLevel('debug');
|
|
34
|
+
});
|
|
35
|
+
program
|
|
36
|
+
.command('launch')
|
|
37
|
+
.description('Launch a client and control it from the terminal')
|
|
38
|
+
.argument('[server]', 'host[:port] to join')
|
|
39
|
+
.option('-n, --name <name>', 'client / instance name', 'calcite')
|
|
40
|
+
.option('-V, --mc-version <version>', 'Minecraft version, "release" or "snapshot"', 'release')
|
|
41
|
+
.option('-u, --username <name>', 'offline username (default: the client name)')
|
|
42
|
+
.option('-m, --microsoft [account]', 'use a stored Microsoft account (primary one, or by name)')
|
|
43
|
+
.addOption(new Option('-r, --render <mode>', 'renderer mode').choices(['on-demand', 'always', 'off']).default('on-demand'))
|
|
44
|
+
.option('--java <path>', 'java executable to use')
|
|
45
|
+
.option('--no-java-download', 'never download a Java runtime')
|
|
46
|
+
.option('--memory <size>', 'max heap, e.g. 2G', '2G')
|
|
47
|
+
.option('--no-reconnect', 'do not rejoin after a disconnect or crash')
|
|
48
|
+
.action(async (server, o) => {
|
|
49
|
+
const account = o.microsoft
|
|
50
|
+
? { type: 'microsoft', name: typeof o.microsoft === 'string' ? o.microsoft : undefined }
|
|
51
|
+
: { type: 'offline', username: o.username ?? defaultUsername(o.name) };
|
|
52
|
+
const client = new Client({
|
|
53
|
+
name: o.name,
|
|
54
|
+
version: o.mcVersion,
|
|
55
|
+
server,
|
|
56
|
+
account,
|
|
57
|
+
render: o.render,
|
|
58
|
+
javaPath: o.java,
|
|
59
|
+
allowJavaDownload: o.javaDownload,
|
|
60
|
+
memory: o.memory,
|
|
61
|
+
reconnect: o.reconnect,
|
|
62
|
+
});
|
|
63
|
+
client.on('phase', (p) => process.stderr.write(`[${p}]\n`));
|
|
64
|
+
client.on('chat', (c) => out(c.message));
|
|
65
|
+
let stopping = false;
|
|
66
|
+
const stop = async (code = 0) => {
|
|
67
|
+
if (stopping)
|
|
68
|
+
return;
|
|
69
|
+
stopping = true;
|
|
70
|
+
await client.stop();
|
|
71
|
+
process.exit(code);
|
|
72
|
+
};
|
|
73
|
+
process.once('SIGINT', () => void stop(130));
|
|
74
|
+
process.once('SIGTERM', () => void stop(143));
|
|
75
|
+
try {
|
|
76
|
+
await client.start();
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
process.stderr.write(client.logsSince({ limit: 30 }).map((l) => ` ${l.line}`).join('\n') + '\n');
|
|
80
|
+
await client.stop();
|
|
81
|
+
fail(err);
|
|
82
|
+
}
|
|
83
|
+
process.stderr.write('Ready. Type chat, /command, or :state :ents [radius] :shot [file] :render on|off :respawn :quit\n');
|
|
84
|
+
const rl = createInterface({ input: process.stdin });
|
|
85
|
+
rl.on('close', () => void stop());
|
|
86
|
+
for await (const raw of rl) {
|
|
87
|
+
const line = raw.trim();
|
|
88
|
+
if (!line)
|
|
89
|
+
continue;
|
|
90
|
+
try {
|
|
91
|
+
if (line === ':quit' || line === ':q')
|
|
92
|
+
break;
|
|
93
|
+
else if (line === ':state')
|
|
94
|
+
out(JSON.stringify(await client.state(), null, 2));
|
|
95
|
+
else if (line.startsWith(':ents')) {
|
|
96
|
+
const radius = Number(line.split(/\s+/)[1] ?? 32);
|
|
97
|
+
for (const e of await client.entities({ radius })) {
|
|
98
|
+
out(`${e.id}\t${e.type}\t${e.name ?? ''}${e.customName ? ` (${e.customName})` : ''}\t${e.x?.toFixed(1)} ${e.y?.toFixed(1)} ${e.z?.toFixed(1)}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else if (line.startsWith(':shot')) {
|
|
102
|
+
const file = line.split(/\s+/)[1] ?? `calcite-${Date.now()}.png`;
|
|
103
|
+
const shot = await client.screenshot();
|
|
104
|
+
await writeFile(file, shot.png);
|
|
105
|
+
out(`saved ${file} (${shot.png.length} bytes)`);
|
|
106
|
+
}
|
|
107
|
+
else if (line.startsWith(':render')) {
|
|
108
|
+
await client.setRender(line.endsWith('on'));
|
|
109
|
+
}
|
|
110
|
+
else if (line === ':respawn')
|
|
111
|
+
await client.respawn();
|
|
112
|
+
else if (line.startsWith('/'))
|
|
113
|
+
await client.command(line.slice(1));
|
|
114
|
+
else if (line.startsWith(':'))
|
|
115
|
+
process.stderr.write(`unknown command ${line}\n`);
|
|
116
|
+
else
|
|
117
|
+
await client.chat(line);
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
process.stderr.write(`error: ${err.message}\n`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
await stop();
|
|
124
|
+
});
|
|
125
|
+
program
|
|
126
|
+
.command('install')
|
|
127
|
+
.description('Download a version (client, libraries, assets, Java) without launching')
|
|
128
|
+
.argument('[version]', 'version id, "release" or "snapshot"', 'release')
|
|
129
|
+
.option('--java <path>', 'java executable to use')
|
|
130
|
+
.action(async (version, o) => {
|
|
131
|
+
try {
|
|
132
|
+
const r = await installVersion(version, { javaPath: o.java, onLine: (l) => process.stderr.write(` ${l}\n`) });
|
|
133
|
+
out(`installed ${r.id} (java ${r.java}; probe ${r.probe})`);
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
fail(err);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
program
|
|
140
|
+
.command('versions')
|
|
141
|
+
.description('List Minecraft versions')
|
|
142
|
+
.addOption(new Option('-t, --type <type>', 'version type').choices(['release', 'snapshot', 'old_beta', 'old_alpha', 'all']).default('release'))
|
|
143
|
+
.option('-l, --limit <n>', 'how many', positiveInt, 20)
|
|
144
|
+
.action(async (o) => {
|
|
145
|
+
try {
|
|
146
|
+
const manifest = await getManifest(resolvePaths());
|
|
147
|
+
out(`latest release ${manifest.latest.release}, snapshot ${manifest.latest.snapshot}`);
|
|
148
|
+
for (const v of manifest.versions.filter((v) => o.type === 'all' || v.type === o.type).slice(0, o.limit)) {
|
|
149
|
+
out(`${v.id.padEnd(24)} ${v.type.padEnd(9)} ${v.releaseTime.slice(0, 10)}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
fail(err);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
program
|
|
157
|
+
.command('login')
|
|
158
|
+
.description('Log in with a Microsoft account (device code); the login is saved and refreshed automatically')
|
|
159
|
+
.action(async () => {
|
|
160
|
+
try {
|
|
161
|
+
const handle = await startLogin(resolvePaths());
|
|
162
|
+
process.once('SIGINT', () => void handle.cancel().then(() => process.exit(130)));
|
|
163
|
+
out(`Open this URL in a browser and sign in:\n\n ${await handle.url}\n`);
|
|
164
|
+
out(`Logged in as ${await handle.done}`);
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
fail(err);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
program
|
|
171
|
+
.command('accounts')
|
|
172
|
+
.description('List saved Microsoft accounts')
|
|
173
|
+
.action(async () => {
|
|
174
|
+
try {
|
|
175
|
+
const accounts = await listAccounts(resolvePaths());
|
|
176
|
+
if (!accounts.length)
|
|
177
|
+
out('No saved accounts. Run `calcite login`.');
|
|
178
|
+
for (const a of accounts)
|
|
179
|
+
out(`${a.primary ? '*' : ' '} ${a.name}${a.uuid ? ` ${a.uuid}` : ''}`);
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
fail(err);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
program
|
|
186
|
+
.command('logout')
|
|
187
|
+
.description('Remove a saved Microsoft account')
|
|
188
|
+
.argument('<account>', 'profile name')
|
|
189
|
+
.action(async (name) => {
|
|
190
|
+
try {
|
|
191
|
+
if (!(await removeAccount(resolvePaths(), name)))
|
|
192
|
+
fail(Object.assign(new Error(`No saved account named "${name}"`), { code: 'unknown_account' }));
|
|
193
|
+
out(`Removed ${name}`);
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
fail(err);
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
program
|
|
200
|
+
.command('doctor')
|
|
201
|
+
.description('Check the environment')
|
|
202
|
+
.action(async () => {
|
|
203
|
+
const paths = resolvePaths();
|
|
204
|
+
out(`calcite ${VERSION} on node ${process.versions.node} (${process.platform}/${process.arch})`);
|
|
205
|
+
out(`home: ${paths.home}`);
|
|
206
|
+
out(`probe: ${paths.probe}`);
|
|
207
|
+
const javas = await findJavaInstalls(paths);
|
|
208
|
+
out(`java: ${javas.length ? '' : 'none found (will be downloaded on demand)'}`);
|
|
209
|
+
for (const j of javas)
|
|
210
|
+
out(` ${String(j.major).padStart(2)} ${j.version.padEnd(12)} ${j.path}`);
|
|
211
|
+
if (process.platform === 'linux') {
|
|
212
|
+
const xvfb = which('Xvfb');
|
|
213
|
+
out(`xvfb: ${xvfb ?? 'missing — needed for screenshots without a display (apt install xvfb libgl1-mesa-dri libegl1 libegl-mesa0)'}`);
|
|
214
|
+
out(`egl: ${hasSharedLib('libEGL.so.1') ? 'ok' : 'missing — Minecraft 26.x needs it to render on Xvfb (apt install libegl1 libegl-mesa0)'}`);
|
|
215
|
+
out(`display: ${process.env.DISPLAY ?? 'none (a virtual one will be started)'}`);
|
|
216
|
+
}
|
|
217
|
+
try {
|
|
218
|
+
const accounts = await listAccounts(paths);
|
|
219
|
+
out(`accounts: ${accounts.map((a) => a.name).join(', ') || 'none'}`);
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
out(`accounts: unreadable (${err.message})`);
|
|
223
|
+
}
|
|
224
|
+
try {
|
|
225
|
+
const m = await getManifest(paths, { refresh: true });
|
|
226
|
+
out(`mojang: reachable (latest ${m.latest.release})`);
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
out(`mojang: UNREACHABLE (${err.message})`);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
program
|
|
233
|
+
.command('mcp')
|
|
234
|
+
.description('Run the MCP server on stdio')
|
|
235
|
+
.addOption(new Option('-r, --render <mode>', 'default renderer mode').choices(['on-demand', 'always', 'off']))
|
|
236
|
+
.option('--memory <size>', 'default max heap')
|
|
237
|
+
.action(async (o) => {
|
|
238
|
+
// stdout belongs to the protocol; logs go to stderr
|
|
239
|
+
await runMcpStdio({ defaults: { render: o.render, memory: o.memory } });
|
|
240
|
+
});
|
|
241
|
+
program.parseAsync().catch(fail);
|
|
242
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import { type CalcitePaths } from './paths.js';
|
|
3
|
+
export type RenderMode = 'off' | 'on-demand' | 'always';
|
|
4
|
+
export type Account = {
|
|
5
|
+
type: 'offline';
|
|
6
|
+
username: string;
|
|
7
|
+
} | {
|
|
8
|
+
type: 'microsoft';
|
|
9
|
+
name?: string;
|
|
10
|
+
};
|
|
11
|
+
export type Phase = 'idle' | 'preparing' | 'waiting_for_server' | 'starting' | 'connecting' | 'in_game' | 'disconnected' | 'reconnecting' | 'stopping' | 'stopped' | 'crashed';
|
|
12
|
+
export interface ServerAddress {
|
|
13
|
+
host: string;
|
|
14
|
+
port: number;
|
|
15
|
+
}
|
|
16
|
+
export interface ClientOptions {
|
|
17
|
+
/** Instance name; also the game directory name. Letters, digits, '-', '_' and '.' only. */
|
|
18
|
+
name: string;
|
|
19
|
+
/** Minecraft version id, "latest" or "snapshot". */
|
|
20
|
+
version: string;
|
|
21
|
+
/** Server to join ("host[:port]"). Without a server the client stays on the title screen. */
|
|
22
|
+
server?: string | ServerAddress;
|
|
23
|
+
/** Account: offline (any username, for online-mode=false servers) or a stored Microsoft account. */
|
|
24
|
+
account?: Account;
|
|
25
|
+
/**
|
|
26
|
+
* World rendering: 'off' (no renderer, cheapest, no screenshots), 'on-demand' (renders only for screenshots,
|
|
27
|
+
* default), 'always'. Rendering needs a display (Linux: DISPLAY or Xvfb) and, with an offline account, Linux.
|
|
28
|
+
*/
|
|
29
|
+
render?: RenderMode;
|
|
30
|
+
/** Explicit java executable for the game. */
|
|
31
|
+
javaPath?: string;
|
|
32
|
+
/** Download a Temurin runtime when the required Java is missing (default true). */
|
|
33
|
+
allowJavaDownload?: boolean;
|
|
34
|
+
/** Max heap, e.g. "2G" (default "2G"). */
|
|
35
|
+
memory?: string;
|
|
36
|
+
/** Extra JVM / game arguments (must not contain spaces). */
|
|
37
|
+
jvmArgs?: string[];
|
|
38
|
+
gameArgs?: string[];
|
|
39
|
+
renderDistance?: number;
|
|
40
|
+
maxFps?: number;
|
|
41
|
+
/** Reconnect (relaunch) after a disconnect or crash. Default: enabled, 10 attempts. */
|
|
42
|
+
reconnect?: boolean | {
|
|
43
|
+
maxAttempts?: number;
|
|
44
|
+
};
|
|
45
|
+
/** How long to wait for the server port before launching (default 120 s). */
|
|
46
|
+
waitForServerMs?: number;
|
|
47
|
+
/** Overall start timeout including downloads (default 15 min). */
|
|
48
|
+
startTimeoutMs?: number;
|
|
49
|
+
paths?: CalcitePaths;
|
|
50
|
+
}
|
|
51
|
+
export interface LogLine {
|
|
52
|
+
seq: number;
|
|
53
|
+
time: number;
|
|
54
|
+
source: 'game' | 'calcite';
|
|
55
|
+
line: string;
|
|
56
|
+
}
|
|
57
|
+
export interface ChatLine {
|
|
58
|
+
seq: number;
|
|
59
|
+
time: number;
|
|
60
|
+
message: string;
|
|
61
|
+
}
|
|
62
|
+
export interface PlayerState {
|
|
63
|
+
id?: number;
|
|
64
|
+
uuid?: string;
|
|
65
|
+
name?: string;
|
|
66
|
+
x?: number;
|
|
67
|
+
y?: number;
|
|
68
|
+
z?: number;
|
|
69
|
+
yaw?: number;
|
|
70
|
+
pitch?: number;
|
|
71
|
+
health?: number;
|
|
72
|
+
dimension?: string;
|
|
73
|
+
}
|
|
74
|
+
export interface GameState {
|
|
75
|
+
ready: boolean;
|
|
76
|
+
headless: boolean;
|
|
77
|
+
inGame: boolean;
|
|
78
|
+
screen?: string | null;
|
|
79
|
+
/** A resource (re)load overlay is showing. */
|
|
80
|
+
loading?: boolean;
|
|
81
|
+
disconnectReason?: string | null;
|
|
82
|
+
fps?: number;
|
|
83
|
+
noRender?: boolean;
|
|
84
|
+
player?: PlayerState;
|
|
85
|
+
}
|
|
86
|
+
export interface EntityInfo {
|
|
87
|
+
id: number;
|
|
88
|
+
uuid: string;
|
|
89
|
+
type: string;
|
|
90
|
+
x?: number;
|
|
91
|
+
y?: number;
|
|
92
|
+
z?: number;
|
|
93
|
+
yaw?: number;
|
|
94
|
+
pitch?: number;
|
|
95
|
+
name?: string;
|
|
96
|
+
customName?: string;
|
|
97
|
+
vehicleId?: number | null;
|
|
98
|
+
invisible?: boolean;
|
|
99
|
+
removed?: boolean;
|
|
100
|
+
}
|
|
101
|
+
export interface EntityQuery {
|
|
102
|
+
/** Only entities within this distance of the player (blocks). */
|
|
103
|
+
radius?: number;
|
|
104
|
+
/** Entity type id, e.g. "minecraft:villager" (the "minecraft:" prefix is optional). */
|
|
105
|
+
type?: string;
|
|
106
|
+
uuid?: string;
|
|
107
|
+
/** Substring match on name or custom name (case-insensitive). */
|
|
108
|
+
name?: string;
|
|
109
|
+
limit?: number;
|
|
110
|
+
includeSelf?: boolean;
|
|
111
|
+
}
|
|
112
|
+
export interface ClientStatus {
|
|
113
|
+
name: string;
|
|
114
|
+
version: string;
|
|
115
|
+
phase: Phase;
|
|
116
|
+
render: RenderMode;
|
|
117
|
+
headless: boolean;
|
|
118
|
+
account: Account;
|
|
119
|
+
server?: ServerAddress;
|
|
120
|
+
gameDir: string;
|
|
121
|
+
pid?: number;
|
|
122
|
+
java?: string;
|
|
123
|
+
startedAt?: number;
|
|
124
|
+
reconnects: number;
|
|
125
|
+
lastError?: string;
|
|
126
|
+
probeConnected: boolean;
|
|
127
|
+
game?: GameState;
|
|
128
|
+
}
|
|
129
|
+
export declare class CalciteError extends Error {
|
|
130
|
+
readonly code: string;
|
|
131
|
+
constructor(code: string, message: string);
|
|
132
|
+
}
|
|
133
|
+
export declare function parseServer(server: string | ServerAddress): ServerAddress;
|
|
134
|
+
/** Offline username derived from a client name (3-16 chars of [A-Za-z0-9_]). */
|
|
135
|
+
export declare function defaultUsername(name: string): string;
|
|
136
|
+
export interface InstallOptions {
|
|
137
|
+
paths?: CalcitePaths;
|
|
138
|
+
javaPath?: string;
|
|
139
|
+
allowJavaDownload?: boolean;
|
|
140
|
+
onLine?: (line: string) => void;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Downloads everything a version needs (client, libraries, natives, assets, mappings, Java, HeadlessMC) without
|
|
144
|
+
* starting the game, so later launches start fast and work offline.
|
|
145
|
+
*/
|
|
146
|
+
export declare function installVersion(spec: string, opts?: InstallOptions): Promise<{
|
|
147
|
+
id: string;
|
|
148
|
+
java: string;
|
|
149
|
+
probe: string;
|
|
150
|
+
}>;
|
|
151
|
+
/**
|
|
152
|
+
* One Minecraft client controlled by Calcite.
|
|
153
|
+
*
|
|
154
|
+
* Events: 'phase' (Phase), 'log' (LogLine), 'chat' (ChatLine), 'state' (GameState), 'exit' (code).
|
|
155
|
+
*/
|
|
156
|
+
export declare class Client extends EventEmitter {
|
|
157
|
+
readonly options: Required<Pick<ClientOptions, 'name' | 'version'>> & ClientOptions;
|
|
158
|
+
readonly paths: CalcitePaths;
|
|
159
|
+
readonly gameDir: string;
|
|
160
|
+
readonly render: RenderMode;
|
|
161
|
+
readonly account: Account;
|
|
162
|
+
readonly server?: ServerAddress;
|
|
163
|
+
private phaseValue;
|
|
164
|
+
private logs;
|
|
165
|
+
private chats;
|
|
166
|
+
private seq;
|
|
167
|
+
private probe;
|
|
168
|
+
private run;
|
|
169
|
+
private display;
|
|
170
|
+
private releaseInstance;
|
|
171
|
+
private probeConfig;
|
|
172
|
+
private java;
|
|
173
|
+
private versionJson;
|
|
174
|
+
private names;
|
|
175
|
+
private headlessValue;
|
|
176
|
+
private lastState;
|
|
177
|
+
private lastError;
|
|
178
|
+
/** Error code of a failure that relaunching cannot fix (reported by start() instead of "crashed"). */
|
|
179
|
+
private fatalCode;
|
|
180
|
+
private startedAt;
|
|
181
|
+
private reconnects;
|
|
182
|
+
private stopping;
|
|
183
|
+
private poller;
|
|
184
|
+
private inGameSince;
|
|
185
|
+
private relaunching;
|
|
186
|
+
private everInGame;
|
|
187
|
+
private joinRequested;
|
|
188
|
+
private readonly log;
|
|
189
|
+
constructor(options: ClientOptions);
|
|
190
|
+
get phase(): Phase;
|
|
191
|
+
get headless(): boolean;
|
|
192
|
+
private setPhase;
|
|
193
|
+
private note;
|
|
194
|
+
private pushLog;
|
|
195
|
+
/**
|
|
196
|
+
* Prepares everything (Java, game files, mappings), launches the client and resolves once it is in a world
|
|
197
|
+
* (or on the title screen when no server is configured).
|
|
198
|
+
*/
|
|
199
|
+
start(): Promise<ClientStatus>;
|
|
200
|
+
/** Downloads and verifies everything needed to launch (idempotent). */
|
|
201
|
+
prepare(): Promise<void>;
|
|
202
|
+
private resolveHeadless;
|
|
203
|
+
private launch;
|
|
204
|
+
private onProbeConnected;
|
|
205
|
+
private poll;
|
|
206
|
+
private reconnectLimit;
|
|
207
|
+
private maybeReconnect;
|
|
208
|
+
private onGameExit;
|
|
209
|
+
private waitUntilStarted;
|
|
210
|
+
private cleanupRun;
|
|
211
|
+
private shutdown;
|
|
212
|
+
/** Stops the game and releases all resources. */
|
|
213
|
+
stop(): Promise<void>;
|
|
214
|
+
status(): ClientStatus;
|
|
215
|
+
private requireProbe;
|
|
216
|
+
state(): Promise<GameState>;
|
|
217
|
+
entities(query?: EntityQuery): Promise<EntityInfo[]>;
|
|
218
|
+
chat(message: string): Promise<void>;
|
|
219
|
+
command(command: string): Promise<void>;
|
|
220
|
+
respawn(): Promise<void>;
|
|
221
|
+
setRender(enabled: boolean): Promise<void>;
|
|
222
|
+
/** Takes a screenshot and returns the PNG. With {@code keep} the file stays in the game's screenshots folder. */
|
|
223
|
+
screenshot({ keep }?: {
|
|
224
|
+
keep?: boolean | undefined;
|
|
225
|
+
}): Promise<{
|
|
226
|
+
path?: string;
|
|
227
|
+
png: Buffer;
|
|
228
|
+
}>;
|
|
229
|
+
logsSince(opts?: {
|
|
230
|
+
since?: number;
|
|
231
|
+
limit?: number;
|
|
232
|
+
contains?: string;
|
|
233
|
+
source?: LogLine['source'];
|
|
234
|
+
}): LogLine[];
|
|
235
|
+
chatSince(since?: number, limit?: number): ChatLine[];
|
|
236
|
+
/**
|
|
237
|
+
* Waits for a condition: a chat line matching {@code chat} (regex), an entity appearing/disappearing, or a
|
|
238
|
+
* phase. Resolves with a description of what matched.
|
|
239
|
+
*/
|
|
240
|
+
waitFor(cond: {
|
|
241
|
+
chat?: string;
|
|
242
|
+
entity?: EntityQuery & {
|
|
243
|
+
present?: boolean;
|
|
244
|
+
};
|
|
245
|
+
phase?: Phase;
|
|
246
|
+
}, timeoutMs?: number): Promise<{
|
|
247
|
+
matched: string;
|
|
248
|
+
chat?: ChatLine;
|
|
249
|
+
entities?: EntityInfo[];
|
|
250
|
+
}>;
|
|
251
|
+
}
|