specprotocol 1.0.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 +174 -0
- package/bin/specprotocol.js +136 -0
- package/dist/auth/microsoft.d.ts +23 -0
- package/dist/auth/microsoft.d.ts.map +1 -0
- package/dist/auth/microsoft.js +167 -0
- package/dist/auth/microsoft.js.map +1 -0
- package/dist/auth/offline.d.ts +20 -0
- package/dist/auth/offline.d.ts.map +1 -0
- package/dist/auth/offline.js +67 -0
- package/dist/auth/offline.js.map +1 -0
- package/dist/bot.d.ts +190 -0
- package/dist/bot.d.ts.map +1 -0
- package/dist/bot.js +624 -0
- package/dist/bot.js.map +1 -0
- package/dist/entity/entity.d.ts +71 -0
- package/dist/entity/entity.d.ts.map +1 -0
- package/dist/entity/entity.js +157 -0
- package/dist/entity/entity.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +73 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/built-in/chat.d.ts +19 -0
- package/dist/plugins/built-in/chat.d.ts.map +1 -0
- package/dist/plugins/built-in/chat.js +62 -0
- package/dist/plugins/built-in/chat.js.map +1 -0
- package/dist/plugins/built-in/combat.d.ts +20 -0
- package/dist/plugins/built-in/combat.d.ts.map +1 -0
- package/dist/plugins/built-in/combat.js +42 -0
- package/dist/plugins/built-in/combat.js.map +1 -0
- package/dist/plugins/plugin-manager.d.ts +49 -0
- package/dist/plugins/plugin-manager.d.ts.map +1 -0
- package/dist/plugins/plugin-manager.js +76 -0
- package/dist/plugins/plugin-manager.js.map +1 -0
- package/dist/protocol/compression.d.ts +23 -0
- package/dist/protocol/compression.d.ts.map +1 -0
- package/dist/protocol/compression.js +85 -0
- package/dist/protocol/compression.js.map +1 -0
- package/dist/protocol/connection.d.ts +73 -0
- package/dist/protocol/connection.d.ts.map +1 -0
- package/dist/protocol/connection.js +212 -0
- package/dist/protocol/connection.js.map +1 -0
- package/dist/protocol/encryption.d.ts +29 -0
- package/dist/protocol/encryption.d.ts.map +1 -0
- package/dist/protocol/encryption.js +116 -0
- package/dist/protocol/encryption.js.map +1 -0
- package/dist/protocol/packet.d.ts +75 -0
- package/dist/protocol/packet.d.ts.map +1 -0
- package/dist/protocol/packet.js +140 -0
- package/dist/protocol/packet.js.map +1 -0
- package/dist/protocol/states/handshake.d.ts +19 -0
- package/dist/protocol/states/handshake.d.ts.map +1 -0
- package/dist/protocol/states/handshake.js +32 -0
- package/dist/protocol/states/handshake.js.map +1 -0
- package/dist/protocol/states/login.d.ts +77 -0
- package/dist/protocol/states/login.d.ts.map +1 -0
- package/dist/protocol/states/login.js +125 -0
- package/dist/protocol/states/login.js.map +1 -0
- package/dist/protocol/states/play.d.ts +187 -0
- package/dist/protocol/states/play.d.ts.map +1 -0
- package/dist/protocol/states/play.js +316 -0
- package/dist/protocol/states/play.js.map +1 -0
- package/dist/protocol/types.d.ts +210 -0
- package/dist/protocol/types.d.ts.map +1 -0
- package/dist/protocol/types.js +495 -0
- package/dist/protocol/types.js.map +1 -0
- package/dist/types.d.ts +36 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/events.d.ts +23 -0
- package/dist/utils/events.d.ts.map +1 -0
- package/dist/utils/events.js +44 -0
- package/dist/utils/events.js.map +1 -0
- package/dist/utils/logger.d.ts +19 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +47 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/vec3.d.ts +25 -0
- package/dist/utils/vec3.d.ts.map +1 -0
- package/dist/utils/vec3.js +66 -0
- package/dist/utils/vec3.js.map +1 -0
- package/dist/world/block.d.ts +39 -0
- package/dist/world/block.d.ts.map +1 -0
- package/dist/world/block.js +84 -0
- package/dist/world/block.js.map +1 -0
- package/dist/world/world.d.ts +55 -0
- package/dist/world/world.d.ts.map +1 -0
- package/dist/world/world.js +95 -0
- package/dist/world/world.js.map +1 -0
- package/docs/README.md +29 -0
- package/docs/api/auth.md +210 -0
- package/docs/api/bot.md +137 -0
- package/docs/api/events.md +166 -0
- package/docs/api/plugins.md +207 -0
- package/docs/api/protocol.md +129 -0
- package/docs/api/world.md +138 -0
- package/docs/first-bot.md +114 -0
- package/docs/getting-started.md +103 -0
- package/docs/guides/architecture.md +122 -0
- package/docs/guides/custom-plugins.md +211 -0
- package/docs/guides/raw-packets.md +80 -0
- package/package.json +55 -0
package/dist/bot.js
ADDED
|
@@ -0,0 +1,624 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Bot — the main orchestrator class.
|
|
4
|
+
*
|
|
5
|
+
* This is the primary entry point for users. It coordinates:
|
|
6
|
+
* - TCP connection to the server
|
|
7
|
+
* - Authentication (offline or Microsoft)
|
|
8
|
+
* - Protocol state transitions (Handshake → Login → Configuration → Play)
|
|
9
|
+
* - Keep-alive responses
|
|
10
|
+
* - Entity and world state management
|
|
11
|
+
* - Plugin system
|
|
12
|
+
* - High-level API (chat, move, dig, attack)
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.Bot = void 0;
|
|
16
|
+
exports.createBot = createBot;
|
|
17
|
+
const connection_js_1 = require("./protocol/connection.js");
|
|
18
|
+
const events_js_1 = require("./utils/events.js");
|
|
19
|
+
const logger_js_1 = require("./utils/logger.js");
|
|
20
|
+
const vec3_js_1 = require("./utils/vec3.js");
|
|
21
|
+
const types_js_1 = require("./protocol/types.js");
|
|
22
|
+
// Auth
|
|
23
|
+
const offline_js_1 = require("./auth/offline.js");
|
|
24
|
+
const microsoft_js_1 = require("./auth/microsoft.js");
|
|
25
|
+
const encryption_js_1 = require("./protocol/encryption.js");
|
|
26
|
+
// Protocol states
|
|
27
|
+
const handshake_js_1 = require("./protocol/states/handshake.js");
|
|
28
|
+
const login_js_1 = require("./protocol/states/login.js");
|
|
29
|
+
const play_js_1 = require("./protocol/states/play.js");
|
|
30
|
+
// World & Entity
|
|
31
|
+
const world_js_1 = require("./world/world.js");
|
|
32
|
+
const entity_js_1 = require("./entity/entity.js");
|
|
33
|
+
// Plugins
|
|
34
|
+
const plugin_manager_js_1 = require("./plugins/plugin-manager.js");
|
|
35
|
+
const chat_js_1 = require("./plugins/built-in/chat.js");
|
|
36
|
+
const combat_js_1 = require("./plugins/built-in/combat.js");
|
|
37
|
+
// ─── Bot Class ──────────────────────────────────────────
|
|
38
|
+
class Bot extends events_js_1.TypedEventEmitter {
|
|
39
|
+
// Connection
|
|
40
|
+
connection;
|
|
41
|
+
logger;
|
|
42
|
+
// State
|
|
43
|
+
_username = '';
|
|
44
|
+
_uuid = '';
|
|
45
|
+
_entityId = 0;
|
|
46
|
+
_health = 20;
|
|
47
|
+
_food = 20;
|
|
48
|
+
_saturation = 5;
|
|
49
|
+
_gameMode = 0;
|
|
50
|
+
_isAlive = true;
|
|
51
|
+
// Auth
|
|
52
|
+
authMode;
|
|
53
|
+
accessToken;
|
|
54
|
+
// Subsystems
|
|
55
|
+
world;
|
|
56
|
+
entities;
|
|
57
|
+
plugins;
|
|
58
|
+
entity;
|
|
59
|
+
// Config
|
|
60
|
+
options;
|
|
61
|
+
// Packet handlers for play state
|
|
62
|
+
packetHandlers = new Map();
|
|
63
|
+
constructor(options) {
|
|
64
|
+
super();
|
|
65
|
+
this.options = {
|
|
66
|
+
host: options.host,
|
|
67
|
+
port: options.port ?? 25565,
|
|
68
|
+
version: options.version ?? handshake_js_1.PROTOCOL_VERSION,
|
|
69
|
+
viewDistance: options.viewDistance ?? 10,
|
|
70
|
+
};
|
|
71
|
+
this.authMode = options.auth ?? 'offline';
|
|
72
|
+
this._username = options.username;
|
|
73
|
+
this.logger = new logger_js_1.Logger('Bot', options.logLevel ?? logger_js_1.LogLevel.INFO);
|
|
74
|
+
// Initialize subsystems
|
|
75
|
+
this.world = new world_js_1.World();
|
|
76
|
+
this.entities = new entity_js_1.EntityManager();
|
|
77
|
+
this.plugins = new plugin_manager_js_1.PluginManager();
|
|
78
|
+
this.entity = new entity_js_1.Entity(0, '', 0);
|
|
79
|
+
// Initialize connection
|
|
80
|
+
this.connection = new connection_js_1.Connection({
|
|
81
|
+
host: this.options.host,
|
|
82
|
+
port: this.options.port,
|
|
83
|
+
logLevel: options.logLevel,
|
|
84
|
+
});
|
|
85
|
+
// Register built-in plugins (deferred init)
|
|
86
|
+
this.plugins.register(new chat_js_1.ChatPlugin());
|
|
87
|
+
this.plugins.register(new combat_js_1.CombatPlugin());
|
|
88
|
+
// Register user plugins
|
|
89
|
+
if (options.plugins) {
|
|
90
|
+
for (const plugin of options.plugins) {
|
|
91
|
+
this.plugins.register(plugin);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Initialize all plugins with bot instance
|
|
95
|
+
this.plugins.initializeAll(this);
|
|
96
|
+
}
|
|
97
|
+
// ─── Getters ────────────────────────────────────────
|
|
98
|
+
get username() { return this._username; }
|
|
99
|
+
get uuid() { return this._uuid; }
|
|
100
|
+
get entityId() { return this._entityId; }
|
|
101
|
+
get health() { return this._health; }
|
|
102
|
+
get food() { return this._food; }
|
|
103
|
+
get saturation() { return this._saturation; }
|
|
104
|
+
get gameMode() { return this._gameMode; }
|
|
105
|
+
get isAlive() { return this._isAlive; }
|
|
106
|
+
get position() { return this.entity.position; }
|
|
107
|
+
// ─── Connect & Login ────────────────────────────────
|
|
108
|
+
/**
|
|
109
|
+
* Connect to the server and begin the login process.
|
|
110
|
+
*/
|
|
111
|
+
async connect() {
|
|
112
|
+
this.logger.info(`Connecting to ${this.options.host}:${this.options.port}...`);
|
|
113
|
+
// Setup error/close handling
|
|
114
|
+
this.connection.on('error', (err) => this.emit('error', err));
|
|
115
|
+
this.connection.on('close', () => this.emit('end'));
|
|
116
|
+
// Connect TCP
|
|
117
|
+
await this.connection.connect();
|
|
118
|
+
this.emit('connect');
|
|
119
|
+
// Perform authentication and login
|
|
120
|
+
await this.performLogin();
|
|
121
|
+
}
|
|
122
|
+
async performLogin() {
|
|
123
|
+
// Step 1: Send Handshake
|
|
124
|
+
this.logger.info('Sending handshake...');
|
|
125
|
+
this.connection.sendPacket(0x00, (0, handshake_js_1.buildHandshakePacket)(this.options.version, this.options.host, this.options.port, handshake_js_1.NextState.LOGIN));
|
|
126
|
+
// Step 2: Authenticate and get profile
|
|
127
|
+
let uuid;
|
|
128
|
+
if (this.authMode === 'offline') {
|
|
129
|
+
const profile = (0, offline_js_1.createOfflineProfile)(this._username);
|
|
130
|
+
uuid = profile.uuid;
|
|
131
|
+
this._uuid = uuid;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
const result = await (0, microsoft_js_1.authenticateMicrosoft)((code, uri) => {
|
|
135
|
+
this.logger.info(`\n${'='.repeat(50)}`);
|
|
136
|
+
this.logger.info(`Open this URL: ${uri}`);
|
|
137
|
+
this.logger.info(`Enter code: ${code}`);
|
|
138
|
+
this.logger.info(`${'='.repeat(50)}\n`);
|
|
139
|
+
});
|
|
140
|
+
this._username = result.username;
|
|
141
|
+
this._uuid = result.uuid;
|
|
142
|
+
this.accessToken = result.accessToken;
|
|
143
|
+
uuid = result.uuid;
|
|
144
|
+
}
|
|
145
|
+
// Step 3: Send Login Start
|
|
146
|
+
this.logger.info(`Logging in as ${this._username} (${uuid})...`);
|
|
147
|
+
this.connection.sendPacket(login_js_1.LoginServerboundPackets.LOGIN_START, (0, login_js_1.buildLoginStartPacket)(this._username, uuid));
|
|
148
|
+
// Step 4: Handle login response packets
|
|
149
|
+
await this.handleLoginSequence();
|
|
150
|
+
}
|
|
151
|
+
async handleLoginSequence() {
|
|
152
|
+
return new Promise((resolve, reject) => {
|
|
153
|
+
const timeout = setTimeout(() => {
|
|
154
|
+
reject(new Error('Login timeout (30s)'));
|
|
155
|
+
}, 30000);
|
|
156
|
+
const onPacket = (packet) => {
|
|
157
|
+
try {
|
|
158
|
+
this.handleLoginPacket(packet, () => {
|
|
159
|
+
clearTimeout(timeout);
|
|
160
|
+
// Remove login handler IMMEDIATELY before entering config state
|
|
161
|
+
this.connection.off('packet', onPacket);
|
|
162
|
+
resolve();
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
clearTimeout(timeout);
|
|
167
|
+
this.connection.off('packet', onPacket);
|
|
168
|
+
reject(err);
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
this.connection.on('packet', onPacket);
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
handleLoginPacket(packet, onComplete) {
|
|
175
|
+
switch (packet.id) {
|
|
176
|
+
case login_js_1.LoginClientboundPackets.ENCRYPTION_REQUEST: {
|
|
177
|
+
this.handleEncryptionRequest(packet.data);
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
case login_js_1.LoginClientboundPackets.SET_COMPRESSION: {
|
|
181
|
+
const { threshold } = (0, login_js_1.parseSetCompressionPacket)(packet.data);
|
|
182
|
+
this.connection.enableCompression(threshold);
|
|
183
|
+
this.logger.info(`Compression enabled (threshold: ${threshold})`);
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
case login_js_1.LoginClientboundPackets.LOGIN_SUCCESS: {
|
|
187
|
+
const success = (0, login_js_1.parseLoginSuccessPacket)(packet.data);
|
|
188
|
+
this._username = success.username;
|
|
189
|
+
this._uuid = success.uuid;
|
|
190
|
+
this.logger.info(`Login successful! ${success.username} (${success.uuid})`);
|
|
191
|
+
// Send Login Acknowledged
|
|
192
|
+
this.connection.sendPacket(login_js_1.LoginServerboundPackets.LOGIN_ACKNOWLEDGED, (0, login_js_1.buildLoginAcknowledgedPacket)());
|
|
193
|
+
// Remove login handler FIRST, then enter Configuration state
|
|
194
|
+
onComplete();
|
|
195
|
+
// Enter Configuration state — handle config packets before Play
|
|
196
|
+
this.handleConfigurationState().then(() => {
|
|
197
|
+
this.setupPlayStateHandlers();
|
|
198
|
+
this.emit('login');
|
|
199
|
+
}).catch((err) => {
|
|
200
|
+
this.logger.error('Configuration state failed:', err);
|
|
201
|
+
});
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
case login_js_1.LoginClientboundPackets.DISCONNECT: {
|
|
205
|
+
const { reason } = (0, login_js_1.parseDisconnectPacket)(packet.data);
|
|
206
|
+
this.logger.error(`Disconnected during login: ${reason}`);
|
|
207
|
+
this.emit('kicked', reason);
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
case login_js_1.LoginClientboundPackets.LOGIN_PLUGIN_REQUEST: {
|
|
211
|
+
const pluginReq = (0, login_js_1.parseLoginPluginRequestPacket)(packet.data);
|
|
212
|
+
this.logger.debug(`Login plugin request: ${pluginReq.channel}`);
|
|
213
|
+
// Respond with "not understood"
|
|
214
|
+
this.connection.sendPacket(login_js_1.LoginServerboundPackets.LOGIN_PLUGIN_RESPONSE, (0, login_js_1.buildLoginPluginResponsePacket)(pluginReq.messageId));
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
handleEncryptionRequest(data) {
|
|
220
|
+
const request = (0, login_js_1.parseEncryptionRequestPacket)(data);
|
|
221
|
+
this.logger.info('Handling encryption...');
|
|
222
|
+
// Generate shared secret
|
|
223
|
+
const sharedSecret = (0, encryption_js_1.generateSharedSecret)();
|
|
224
|
+
// Encrypt shared secret and verify token with server's public key
|
|
225
|
+
const encryptedSecret = (0, encryption_js_1.encryptRSA)(request.publicKey, sharedSecret);
|
|
226
|
+
const encryptedToken = (0, encryption_js_1.encryptRSA)(request.publicKey, request.verifyToken);
|
|
227
|
+
// If online mode, join session server
|
|
228
|
+
if (request.shouldAuthenticate && this.accessToken) {
|
|
229
|
+
const serverHash = (0, encryption_js_1.computeServerHash)(request.serverId, sharedSecret, request.publicKey);
|
|
230
|
+
(0, microsoft_js_1.joinServer)(this.accessToken, this._uuid, serverHash)
|
|
231
|
+
.then(() => {
|
|
232
|
+
// Send encryption response
|
|
233
|
+
this.connection.sendPacket(login_js_1.LoginServerboundPackets.ENCRYPTION_RESPONSE, (0, login_js_1.buildEncryptionResponsePacket)(encryptedSecret, encryptedToken));
|
|
234
|
+
// Enable encryption for all subsequent packets
|
|
235
|
+
this.connection.enableEncryption(sharedSecret);
|
|
236
|
+
})
|
|
237
|
+
.catch((err) => {
|
|
238
|
+
this.logger.error('Failed to join session:', err);
|
|
239
|
+
this.emit('error', err);
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
// Offline mode or no auth needed
|
|
244
|
+
this.connection.sendPacket(login_js_1.LoginServerboundPackets.ENCRYPTION_RESPONSE, (0, login_js_1.buildEncryptionResponsePacket)(encryptedSecret, encryptedToken));
|
|
245
|
+
this.connection.enableEncryption(sharedSecret);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// ─── Configuration State ────────────────────────────
|
|
249
|
+
/**
|
|
250
|
+
* Handle Configuration state packets after Login Acknowledged.
|
|
251
|
+
* In 1.20.2+, the server sends registry data, feature flags, etc. before Play.
|
|
252
|
+
* When the server sends Finish Configuration (0x03), we transition to Play.
|
|
253
|
+
*
|
|
254
|
+
* 1.21.4 Configuration Clientbound Packet IDs:
|
|
255
|
+
* 0x00 = Cookie Request
|
|
256
|
+
* 0x01 = Plugin Message
|
|
257
|
+
* 0x02 = Disconnect
|
|
258
|
+
* 0x03 = Finish Configuration
|
|
259
|
+
* 0x04 = Keep Alive
|
|
260
|
+
* 0x05 = Ping
|
|
261
|
+
* 0x07 = Registry Data
|
|
262
|
+
* 0x09 = Add Resource Pack
|
|
263
|
+
* 0x0C = Feature Flags
|
|
264
|
+
* 0x0D = Update Tags
|
|
265
|
+
* 0x0E = Known Packs
|
|
266
|
+
* 0x10 = Server Links
|
|
267
|
+
*/
|
|
268
|
+
handleConfigurationState() {
|
|
269
|
+
return new Promise((resolve, reject) => {
|
|
270
|
+
const timeout = setTimeout(() => {
|
|
271
|
+
this.connection.off('packet', configHandler);
|
|
272
|
+
reject(new Error('Configuration state timeout (60s)'));
|
|
273
|
+
}, 60000);
|
|
274
|
+
const configHandler = (packet) => {
|
|
275
|
+
switch (packet.id) {
|
|
276
|
+
case 0x03: {
|
|
277
|
+
// Finish Configuration (clientbound)
|
|
278
|
+
this.logger.info('Configuration complete, entering Play state...');
|
|
279
|
+
// Send Acknowledge Finish Configuration (serverbound 0x03)
|
|
280
|
+
this.connection.sendPacket(0x03, Buffer.alloc(0));
|
|
281
|
+
clearTimeout(timeout);
|
|
282
|
+
this.connection.off('packet', configHandler);
|
|
283
|
+
resolve();
|
|
284
|
+
break;
|
|
285
|
+
}
|
|
286
|
+
case 0x04: {
|
|
287
|
+
// Keep Alive (clientbound) — must respond or get kicked
|
|
288
|
+
const reader = new types_js_1.BufferReader(packet.data);
|
|
289
|
+
const keepAliveId = reader.readLong();
|
|
290
|
+
this.logger.debug(`Config: Keep alive (${keepAliveId})`);
|
|
291
|
+
// Respond with same keep alive ID (serverbound 0x04)
|
|
292
|
+
const kaWriter = new types_js_1.BufferWriter();
|
|
293
|
+
kaWriter.writeLong(keepAliveId);
|
|
294
|
+
this.connection.sendPacket(0x04, kaWriter.toBuffer());
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
case 0x01: {
|
|
298
|
+
// Plugin Message (clientbound) — ignore
|
|
299
|
+
this.logger.debug('Config: Plugin message received');
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
case 0x07: {
|
|
303
|
+
// Registry Data — ignore (we don't track registry data yet)
|
|
304
|
+
this.logger.debug('Config: Registry data received');
|
|
305
|
+
break;
|
|
306
|
+
}
|
|
307
|
+
case 0x0C: {
|
|
308
|
+
// Feature Flags — ignore
|
|
309
|
+
this.logger.debug('Config: Feature flags received');
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
case 0x0D: {
|
|
313
|
+
// Update Tags — ignore
|
|
314
|
+
this.logger.debug('Config: Tags update received');
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
case 0x0E: {
|
|
318
|
+
// Known Packs (clientbound) — respond with empty known packs
|
|
319
|
+
this.logger.debug('Config: Known packs request');
|
|
320
|
+
// Send Known Packs response (serverbound 0x07) — empty
|
|
321
|
+
const knownPacksWriter = new types_js_1.BufferWriter();
|
|
322
|
+
knownPacksWriter.writeVarInt(0); // 0 known packs
|
|
323
|
+
this.connection.sendPacket(0x07, knownPacksWriter.toBuffer());
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
case 0x05: {
|
|
327
|
+
// Ping — respond with pong
|
|
328
|
+
this.logger.debug('Config: Ping received');
|
|
329
|
+
this.connection.sendPacket(0x02, packet.data); // Pong (serverbound 0x02)
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
case 0x00: {
|
|
333
|
+
// Cookie Request — ignore
|
|
334
|
+
this.logger.debug('Config: Cookie request');
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
case 0x09: {
|
|
338
|
+
// Add Resource Pack — respond with accepted (status 3 = accepted)
|
|
339
|
+
this.logger.debug('Config: Resource pack request');
|
|
340
|
+
break;
|
|
341
|
+
}
|
|
342
|
+
case 0x10: {
|
|
343
|
+
// Server Links — ignore
|
|
344
|
+
this.logger.debug('Config: Server links received');
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
case 0x02: {
|
|
348
|
+
// Disconnect
|
|
349
|
+
const reader = new types_js_1.BufferReader(packet.data);
|
|
350
|
+
const reason = reader.readString();
|
|
351
|
+
this.logger.error(`Disconnected during configuration: ${reason}`);
|
|
352
|
+
clearTimeout(timeout);
|
|
353
|
+
this.connection.off('packet', configHandler);
|
|
354
|
+
reject(new Error(`Disconnected during configuration: ${reason}`));
|
|
355
|
+
break;
|
|
356
|
+
}
|
|
357
|
+
default: {
|
|
358
|
+
this.logger.debug(`Config: Unknown packet 0x${packet.id.toString(16)} (${packet.data.length} bytes)`);
|
|
359
|
+
break;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
};
|
|
363
|
+
this.connection.on('packet', configHandler);
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
// ─── Play State ─────────────────────────────────────
|
|
367
|
+
setupPlayStateHandlers() {
|
|
368
|
+
this.connection.on('packet', (packet) => {
|
|
369
|
+
this.emit('rawPacket', packet);
|
|
370
|
+
this.handlePlayPacket(packet);
|
|
371
|
+
// Call registered packet handlers
|
|
372
|
+
const handlers = this.packetHandlers.get(packet.id);
|
|
373
|
+
if (handlers) {
|
|
374
|
+
for (const handler of handlers) {
|
|
375
|
+
try {
|
|
376
|
+
handler(packet.data);
|
|
377
|
+
}
|
|
378
|
+
catch (err) {
|
|
379
|
+
this.logger.error(`Packet handler error for 0x${packet.id.toString(16)}:`, err);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
handlePlayPacket(packet) {
|
|
386
|
+
switch (packet.id) {
|
|
387
|
+
case play_js_1.PlayClientboundPackets.KEEP_ALIVE: {
|
|
388
|
+
const { keepAliveId } = (0, play_js_1.parseKeepAlive)(packet.data);
|
|
389
|
+
this.connection.sendPacket(play_js_1.PlayServerboundPackets.KEEP_ALIVE, (0, play_js_1.buildKeepAlivePacket)(keepAliveId));
|
|
390
|
+
break;
|
|
391
|
+
}
|
|
392
|
+
case play_js_1.PlayClientboundPackets.LOGIN: {
|
|
393
|
+
try {
|
|
394
|
+
const login = (0, play_js_1.parseLoginPlay)(packet.data);
|
|
395
|
+
this._entityId = login.entityId;
|
|
396
|
+
this._gameMode = login.gameMode;
|
|
397
|
+
this.entity.id = login.entityId;
|
|
398
|
+
this.world.dimension = login.dimensionName;
|
|
399
|
+
this.world.seaLevel = login.seaLevel;
|
|
400
|
+
this.logger.info(`Spawned in ${login.dimensionName} (Entity ID: ${login.entityId})`);
|
|
401
|
+
this.emit('spawn');
|
|
402
|
+
}
|
|
403
|
+
catch (err) {
|
|
404
|
+
this.logger.error('Failed to parse Login (Play):', err);
|
|
405
|
+
}
|
|
406
|
+
break;
|
|
407
|
+
}
|
|
408
|
+
case play_js_1.PlayClientboundPackets.PLAYER_POSITION: {
|
|
409
|
+
try {
|
|
410
|
+
const pos = (0, play_js_1.parsePlayerPosition)(packet.data);
|
|
411
|
+
// Apply relative/absolute position based on flags
|
|
412
|
+
const flags = pos.flags;
|
|
413
|
+
const x = (flags & 0x01) ? this.entity.position.x + pos.x : pos.x;
|
|
414
|
+
const y = (flags & 0x02) ? this.entity.position.y + pos.y : pos.y;
|
|
415
|
+
const z = (flags & 0x04) ? this.entity.position.z + pos.z : pos.z;
|
|
416
|
+
this.entity.position = new vec3_js_1.Vec3(x, y, z);
|
|
417
|
+
this.entity.yaw = pos.yaw;
|
|
418
|
+
this.entity.pitch = pos.pitch;
|
|
419
|
+
// Must confirm teleportation
|
|
420
|
+
this.connection.sendPacket(play_js_1.PlayServerboundPackets.CONFIRM_TELEPORTATION, (0, play_js_1.buildConfirmTeleportationPacket)(pos.teleportId));
|
|
421
|
+
this.emit('position', this.entity.position);
|
|
422
|
+
}
|
|
423
|
+
catch (err) {
|
|
424
|
+
this.logger.error('Failed to parse Player Position:', err);
|
|
425
|
+
}
|
|
426
|
+
break;
|
|
427
|
+
}
|
|
428
|
+
case play_js_1.PlayClientboundPackets.SET_HEALTH: {
|
|
429
|
+
const { health, food, saturation } = (0, play_js_1.parseSetHealth)(packet.data);
|
|
430
|
+
this._health = health;
|
|
431
|
+
this._food = food;
|
|
432
|
+
this._saturation = saturation;
|
|
433
|
+
this.emit('health', health, food, saturation);
|
|
434
|
+
if (health <= 0) {
|
|
435
|
+
this._isAlive = false;
|
|
436
|
+
this.emit('death');
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
this._isAlive = true;
|
|
440
|
+
}
|
|
441
|
+
break;
|
|
442
|
+
}
|
|
443
|
+
case play_js_1.PlayClientboundPackets.BLOCK_UPDATE: {
|
|
444
|
+
try {
|
|
445
|
+
const update = (0, play_js_1.parseBlockUpdate)(packet.data);
|
|
446
|
+
this.world.setBlock(update.x, update.y, update.z, update.blockId);
|
|
447
|
+
this.emit('blockUpdate', update.x, update.y, update.z, update.blockId);
|
|
448
|
+
}
|
|
449
|
+
catch (err) {
|
|
450
|
+
this.logger.error('Failed to parse block update:', err);
|
|
451
|
+
}
|
|
452
|
+
break;
|
|
453
|
+
}
|
|
454
|
+
case play_js_1.PlayClientboundPackets.SPAWN_ENTITY: {
|
|
455
|
+
try {
|
|
456
|
+
const spawn = (0, play_js_1.parseSpawnEntity)(packet.data);
|
|
457
|
+
const entity = new entity_js_1.Entity(spawn.entityId, spawn.entityUUID, spawn.type, new vec3_js_1.Vec3(spawn.x, spawn.y, spawn.z));
|
|
458
|
+
entity.yaw = spawn.yaw;
|
|
459
|
+
entity.pitch = spawn.pitch;
|
|
460
|
+
this.entities.add(entity);
|
|
461
|
+
this.emit('entitySpawn', entity);
|
|
462
|
+
}
|
|
463
|
+
catch (err) {
|
|
464
|
+
this.logger.error('Failed to parse entity spawn:', err);
|
|
465
|
+
}
|
|
466
|
+
break;
|
|
467
|
+
}
|
|
468
|
+
case play_js_1.PlayClientboundPackets.REMOVE_ENTITIES: {
|
|
469
|
+
try {
|
|
470
|
+
const reader = new types_js_1.BufferReader(packet.data);
|
|
471
|
+
const count = reader.readVarInt();
|
|
472
|
+
for (let i = 0; i < count; i++) {
|
|
473
|
+
const entityId = reader.readVarInt();
|
|
474
|
+
this.entities.remove(entityId);
|
|
475
|
+
this.emit('entityRemove', entityId);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
catch (err) {
|
|
479
|
+
this.logger.error('Failed to parse entity removal:', err);
|
|
480
|
+
}
|
|
481
|
+
break;
|
|
482
|
+
}
|
|
483
|
+
case play_js_1.PlayClientboundPackets.DISCONNECT: {
|
|
484
|
+
const { reason } = (0, play_js_1.parseDisconnectPlay)(packet.data);
|
|
485
|
+
this.logger.warn(`Kicked: ${reason}`);
|
|
486
|
+
this.emit('kicked', reason);
|
|
487
|
+
break;
|
|
488
|
+
}
|
|
489
|
+
case play_js_1.PlayClientboundPackets.PLAYER_ABILITIES: {
|
|
490
|
+
try {
|
|
491
|
+
const abilities = (0, play_js_1.parsePlayerAbilities)(packet.data);
|
|
492
|
+
this.logger.debug(`Abilities: flags=${abilities.flags} fly=${abilities.flyingSpeed} walk=${abilities.walkingSpeed}`);
|
|
493
|
+
}
|
|
494
|
+
catch (err) {
|
|
495
|
+
this.logger.error('Failed to parse abilities:', err);
|
|
496
|
+
}
|
|
497
|
+
break;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
// ─── Packet API ─────────────────────────────────────
|
|
502
|
+
/**
|
|
503
|
+
* Register a handler for a specific play-state packet ID.
|
|
504
|
+
* Used by plugins to listen for specific packets.
|
|
505
|
+
*/
|
|
506
|
+
onPacket(packetId, handler) {
|
|
507
|
+
const handlers = this.packetHandlers.get(packetId) ?? [];
|
|
508
|
+
handlers.push(handler);
|
|
509
|
+
this.packetHandlers.set(packetId, handlers);
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Send a raw packet to the server.
|
|
513
|
+
*/
|
|
514
|
+
sendPacket(packetId, data) {
|
|
515
|
+
this.connection.sendPacket(packetId, data);
|
|
516
|
+
}
|
|
517
|
+
// ─── High-Level API ─────────────────────────────────
|
|
518
|
+
/**
|
|
519
|
+
* Send a chat message.
|
|
520
|
+
*/
|
|
521
|
+
chat(message) {
|
|
522
|
+
const chatPlugin = this.plugins.get('chat');
|
|
523
|
+
if (chatPlugin) {
|
|
524
|
+
chatPlugin.chat(message);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* Attack an entity.
|
|
529
|
+
*/
|
|
530
|
+
attack(entity) {
|
|
531
|
+
const combatPlugin = this.plugins.get('combat');
|
|
532
|
+
if (combatPlugin) {
|
|
533
|
+
combatPlugin.attack(entity);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Set the bot's position (sends position packet to server).
|
|
538
|
+
*/
|
|
539
|
+
setPosition(x, y, z, onGround = true) {
|
|
540
|
+
this.entity.position = new vec3_js_1.Vec3(x, y, z);
|
|
541
|
+
this.entity.onGround = onGround;
|
|
542
|
+
this.connection.sendPacket(play_js_1.PlayServerboundPackets.SET_PLAYER_POSITION, (0, play_js_1.buildSetPlayerPositionPacket)(x, y, z, onGround));
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Set position and rotation.
|
|
546
|
+
*/
|
|
547
|
+
setPositionAndRotation(x, y, z, yaw, pitch, onGround = true) {
|
|
548
|
+
this.entity.position = new vec3_js_1.Vec3(x, y, z);
|
|
549
|
+
this.entity.yaw = yaw;
|
|
550
|
+
this.entity.pitch = pitch;
|
|
551
|
+
this.entity.onGround = onGround;
|
|
552
|
+
this.connection.sendPacket(play_js_1.PlayServerboundPackets.SET_PLAYER_POSITION_AND_ROTATION, (0, play_js_1.buildSetPlayerPositionAndRotationPacket)(x, y, z, yaw, pitch, onGround));
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Look at a position.
|
|
556
|
+
*/
|
|
557
|
+
lookAt(target) {
|
|
558
|
+
const delta = target.subtract(this.entity.position);
|
|
559
|
+
const distance = Math.sqrt(delta.x * delta.x + delta.z * delta.z);
|
|
560
|
+
const yaw = -Math.atan2(delta.x, delta.z) * (180 / Math.PI);
|
|
561
|
+
const pitch = -Math.atan2(delta.y, distance) * (180 / Math.PI);
|
|
562
|
+
this.entity.yaw = yaw;
|
|
563
|
+
this.entity.pitch = pitch;
|
|
564
|
+
this.connection.sendPacket(play_js_1.PlayServerboundPackets.SET_PLAYER_POSITION_AND_ROTATION, (0, play_js_1.buildSetPlayerPositionAndRotationPacket)(this.entity.position.x, this.entity.position.y, this.entity.position.z, yaw, pitch, this.entity.onGround));
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Start digging a block.
|
|
568
|
+
*/
|
|
569
|
+
dig(x, y, z, face = 1) {
|
|
570
|
+
// Start digging
|
|
571
|
+
this.connection.sendPacket(play_js_1.PlayServerboundPackets.PLAYER_ACTION, (0, play_js_1.buildPlayerActionPacket)(play_js_1.PlayerActionStatus.STARTED_DIGGING, x, y, z, face, 0));
|
|
572
|
+
// For creative mode, finish immediately
|
|
573
|
+
if (this._gameMode === 1) {
|
|
574
|
+
this.connection.sendPacket(play_js_1.PlayServerboundPackets.PLAYER_ACTION, (0, play_js_1.buildPlayerActionPacket)(play_js_1.PlayerActionStatus.FINISHED_DIGGING, x, y, z, face, 1));
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* Select a hotbar slot (0-8).
|
|
579
|
+
*/
|
|
580
|
+
setHeldItem(slot) {
|
|
581
|
+
if (slot < 0 || slot > 8)
|
|
582
|
+
throw new Error('Slot must be 0-8');
|
|
583
|
+
this.connection.sendPacket(play_js_1.PlayServerboundPackets.SET_HELD_ITEM, (0, play_js_1.buildSetHeldItemPacket)(slot));
|
|
584
|
+
}
|
|
585
|
+
/**
|
|
586
|
+
* Disconnect from the server.
|
|
587
|
+
*/
|
|
588
|
+
disconnect() {
|
|
589
|
+
this.plugins.destroyAll();
|
|
590
|
+
this.connection.disconnect();
|
|
591
|
+
this.logger.info('Disconnected');
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
exports.Bot = Bot;
|
|
595
|
+
// ─── Factory Function ───────────────────────────────────
|
|
596
|
+
/**
|
|
597
|
+
* Create and connect a bot.
|
|
598
|
+
*
|
|
599
|
+
* @example
|
|
600
|
+
* ```ts
|
|
601
|
+
* import { createBot } from 'mcbot';
|
|
602
|
+
*
|
|
603
|
+
* const bot = await createBot({
|
|
604
|
+
* host: 'localhost',
|
|
605
|
+
* port: 25565,
|
|
606
|
+
* username: 'Bot',
|
|
607
|
+
* auth: 'offline',
|
|
608
|
+
* });
|
|
609
|
+
*
|
|
610
|
+
* bot.on('chat', (message) => {
|
|
611
|
+
* console.log('Chat:', message);
|
|
612
|
+
* });
|
|
613
|
+
*
|
|
614
|
+
* bot.on('spawn', () => {
|
|
615
|
+
* bot.chat('Hello world!');
|
|
616
|
+
* });
|
|
617
|
+
* ```
|
|
618
|
+
*/
|
|
619
|
+
async function createBot(options) {
|
|
620
|
+
const bot = new Bot(options);
|
|
621
|
+
await bot.connect();
|
|
622
|
+
return bot;
|
|
623
|
+
}
|
|
624
|
+
//# sourceMappingURL=bot.js.map
|
package/dist/bot.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"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"}
|