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
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Packet definitions and serialization/deserialization.
|
|
4
|
+
*
|
|
5
|
+
* Each Minecraft packet has:
|
|
6
|
+
* - Length (VarInt) — total byte size of packetId + data
|
|
7
|
+
* - Packet ID (VarInt)
|
|
8
|
+
* - Data (varies per packet)
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.PacketRegistry = exports.PacketSplitter = exports.PacketDirection = exports.ProtocolState = void 0;
|
|
12
|
+
exports.framePacket = framePacket;
|
|
13
|
+
exports.framePacketCompressed = framePacketCompressed;
|
|
14
|
+
exports.parseRawPacket = parseRawPacket;
|
|
15
|
+
const types_js_1 = require("./types.js");
|
|
16
|
+
/** Protocol states */
|
|
17
|
+
var ProtocolState;
|
|
18
|
+
(function (ProtocolState) {
|
|
19
|
+
ProtocolState[ProtocolState["HANDSHAKING"] = 0] = "HANDSHAKING";
|
|
20
|
+
ProtocolState[ProtocolState["STATUS"] = 1] = "STATUS";
|
|
21
|
+
ProtocolState[ProtocolState["LOGIN"] = 2] = "LOGIN";
|
|
22
|
+
ProtocolState[ProtocolState["CONFIGURATION"] = 3] = "CONFIGURATION";
|
|
23
|
+
ProtocolState[ProtocolState["PLAY"] = 4] = "PLAY";
|
|
24
|
+
})(ProtocolState || (exports.ProtocolState = ProtocolState = {}));
|
|
25
|
+
/** Packet direction */
|
|
26
|
+
var PacketDirection;
|
|
27
|
+
(function (PacketDirection) {
|
|
28
|
+
PacketDirection["SERVERBOUND"] = "serverbound";
|
|
29
|
+
PacketDirection["CLIENTBOUND"] = "clientbound";
|
|
30
|
+
})(PacketDirection || (exports.PacketDirection = PacketDirection = {}));
|
|
31
|
+
/**
|
|
32
|
+
* Frame a packet for sending over the wire.
|
|
33
|
+
* Format: [Length VarInt][Packet ID VarInt][Data]
|
|
34
|
+
*/
|
|
35
|
+
function framePacket(packetId, data) {
|
|
36
|
+
const idBuf = (0, types_js_1.writeVarInt)(packetId);
|
|
37
|
+
const payload = Buffer.concat([idBuf, data]);
|
|
38
|
+
const lengthBuf = (0, types_js_1.writeVarInt)(payload.length);
|
|
39
|
+
return Buffer.concat([lengthBuf, payload]);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Frame a packet with compression.
|
|
43
|
+
* Format when compressed: [Packet Length][Data Length][Compressed(Packet ID + Data)]
|
|
44
|
+
* Format when uncompressed: [Packet Length][0][Packet ID + Data]
|
|
45
|
+
*/
|
|
46
|
+
function framePacketCompressed(packetId, data, threshold, compress) {
|
|
47
|
+
const idBuf = (0, types_js_1.writeVarInt)(packetId);
|
|
48
|
+
const uncompressedPayload = Buffer.concat([idBuf, data]);
|
|
49
|
+
const uncompressedLength = uncompressedPayload.length;
|
|
50
|
+
if (uncompressedLength >= threshold) {
|
|
51
|
+
// Compress
|
|
52
|
+
const compressed = compress(uncompressedPayload);
|
|
53
|
+
const dataLengthBuf = (0, types_js_1.writeVarInt)(uncompressedLength);
|
|
54
|
+
const innerPayload = Buffer.concat([dataLengthBuf, compressed]);
|
|
55
|
+
const packetLengthBuf = (0, types_js_1.writeVarInt)(innerPayload.length);
|
|
56
|
+
return Buffer.concat([packetLengthBuf, innerPayload]);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Don't compress — data length = 0
|
|
60
|
+
const dataLengthBuf = (0, types_js_1.writeVarInt)(0);
|
|
61
|
+
const innerPayload = Buffer.concat([dataLengthBuf, uncompressedPayload]);
|
|
62
|
+
const packetLengthBuf = (0, types_js_1.writeVarInt)(innerPayload.length);
|
|
63
|
+
return Buffer.concat([packetLengthBuf, innerPayload]);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* PacketSplitter — accumulates incoming TCP data and splits into individual packet frames.
|
|
68
|
+
* Handles the length-prefixed framing used by Minecraft protocol.
|
|
69
|
+
*/
|
|
70
|
+
class PacketSplitter {
|
|
71
|
+
buffer = Buffer.alloc(0);
|
|
72
|
+
/**
|
|
73
|
+
* Feed raw TCP data into the splitter.
|
|
74
|
+
* Returns an array of complete packet buffers (each containing [Packet ID VarInt][Data]).
|
|
75
|
+
*/
|
|
76
|
+
feed(data) {
|
|
77
|
+
this.buffer = Buffer.concat([this.buffer, data]);
|
|
78
|
+
const packets = [];
|
|
79
|
+
while (this.buffer.length > 0) {
|
|
80
|
+
// Try to read the packet length
|
|
81
|
+
let packetLength;
|
|
82
|
+
let lengthBytes;
|
|
83
|
+
try {
|
|
84
|
+
const result = (0, types_js_1.readVarInt)(this.buffer, 0);
|
|
85
|
+
packetLength = result.value;
|
|
86
|
+
lengthBytes = result.bytesRead;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Not enough data for the length VarInt yet
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
const totalLength = lengthBytes + packetLength;
|
|
93
|
+
if (this.buffer.length < totalLength) {
|
|
94
|
+
// Haven't received the full packet yet
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
// Extract the packet payload (without the length prefix)
|
|
98
|
+
const packetPayload = this.buffer.subarray(lengthBytes, totalLength);
|
|
99
|
+
packets.push(Buffer.from(packetPayload));
|
|
100
|
+
// Remove processed data from buffer
|
|
101
|
+
this.buffer = Buffer.from(this.buffer.subarray(totalLength));
|
|
102
|
+
}
|
|
103
|
+
return packets;
|
|
104
|
+
}
|
|
105
|
+
/** Reset the internal buffer */
|
|
106
|
+
reset() {
|
|
107
|
+
this.buffer = Buffer.alloc(0);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
exports.PacketSplitter = PacketSplitter;
|
|
111
|
+
/**
|
|
112
|
+
* Parse a raw packet payload into id + data.
|
|
113
|
+
*/
|
|
114
|
+
function parseRawPacket(payload) {
|
|
115
|
+
const { value: id, bytesRead } = (0, types_js_1.readVarInt)(payload, 0);
|
|
116
|
+
const data = payload.subarray(bytesRead);
|
|
117
|
+
return { id, data };
|
|
118
|
+
}
|
|
119
|
+
class PacketRegistry {
|
|
120
|
+
packets = new Map();
|
|
121
|
+
makeKey(state, direction, id) {
|
|
122
|
+
return `${state}:${direction}:${id}`;
|
|
123
|
+
}
|
|
124
|
+
register(def) {
|
|
125
|
+
const key = this.makeKey(def.state, def.direction, def.id);
|
|
126
|
+
this.packets.set(key, def);
|
|
127
|
+
}
|
|
128
|
+
get(state, direction, id) {
|
|
129
|
+
return this.packets.get(this.makeKey(state, direction, id));
|
|
130
|
+
}
|
|
131
|
+
getByName(name) {
|
|
132
|
+
for (const def of this.packets.values()) {
|
|
133
|
+
if (def.name === name)
|
|
134
|
+
return def;
|
|
135
|
+
}
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
exports.PacketRegistry = PacketRegistry;
|
|
140
|
+
//# sourceMappingURL=packet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packet.js","sourceRoot":"","sources":["../../src/protocol/packet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handshake State — the first packet sent to the server.
|
|
3
|
+
*
|
|
4
|
+
* The client sends a Handshake packet to indicate whether it wants to:
|
|
5
|
+
* - Query server status (Next State = 1)
|
|
6
|
+
* - Login to play (Next State = 2)
|
|
7
|
+
*/
|
|
8
|
+
/** Minecraft protocol version for 1.21.4 */
|
|
9
|
+
export declare const PROTOCOL_VERSION = 769;
|
|
10
|
+
/** Next state values */
|
|
11
|
+
export declare enum NextState {
|
|
12
|
+
STATUS = 1,
|
|
13
|
+
LOGIN = 2
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Build a Handshake packet (Packet ID: 0x00, State: Handshaking, Serverbound)
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildHandshakePacket(protocolVersion: number, serverAddress: string, serverPort: number, nextState: NextState): Buffer;
|
|
19
|
+
//# sourceMappingURL=handshake.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handshake.d.ts","sourceRoot":"","sources":["../../../src/protocol/states/handshake.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,4CAA4C;AAC5C,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,wBAAwB;AACxB,oBAAY,SAAS;IACjB,MAAM,IAAI;IACV,KAAK,IAAI;CACZ;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAChC,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,SAAS,GACrB,MAAM,CAOR"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Handshake State — the first packet sent to the server.
|
|
4
|
+
*
|
|
5
|
+
* The client sends a Handshake packet to indicate whether it wants to:
|
|
6
|
+
* - Query server status (Next State = 1)
|
|
7
|
+
* - Login to play (Next State = 2)
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.NextState = exports.PROTOCOL_VERSION = void 0;
|
|
11
|
+
exports.buildHandshakePacket = buildHandshakePacket;
|
|
12
|
+
const types_js_1 = require("../types.js");
|
|
13
|
+
/** Minecraft protocol version for 1.21.4 */
|
|
14
|
+
exports.PROTOCOL_VERSION = 769;
|
|
15
|
+
/** Next state values */
|
|
16
|
+
var NextState;
|
|
17
|
+
(function (NextState) {
|
|
18
|
+
NextState[NextState["STATUS"] = 1] = "STATUS";
|
|
19
|
+
NextState[NextState["LOGIN"] = 2] = "LOGIN";
|
|
20
|
+
})(NextState || (exports.NextState = NextState = {}));
|
|
21
|
+
/**
|
|
22
|
+
* Build a Handshake packet (Packet ID: 0x00, State: Handshaking, Serverbound)
|
|
23
|
+
*/
|
|
24
|
+
function buildHandshakePacket(protocolVersion, serverAddress, serverPort, nextState) {
|
|
25
|
+
const writer = new types_js_1.BufferWriter();
|
|
26
|
+
writer.writeVarInt(protocolVersion); // Protocol Version
|
|
27
|
+
writer.writeString(serverAddress); // Server Address
|
|
28
|
+
writer.writeUShort(serverPort); // Server Port
|
|
29
|
+
writer.writeVarInt(nextState); // Next State
|
|
30
|
+
return writer.toBuffer();
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=handshake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handshake.js","sourceRoot":"","sources":["../../../src/protocol/states/handshake.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAgBH,oDAYC;AA1BD,0CAA2C;AAE3C,4CAA4C;AAC/B,QAAA,gBAAgB,GAAG,GAAG,CAAC;AAEpC,wBAAwB;AACxB,IAAY,SAGX;AAHD,WAAY,SAAS;IACjB,6CAAU,CAAA;IACV,2CAAS,CAAA;AACb,CAAC,EAHW,SAAS,yBAAT,SAAS,QAGpB;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAChC,eAAuB,EACvB,aAAqB,EACrB,UAAkB,EAClB,SAAoB;IAEpB,MAAM,MAAM,GAAG,IAAI,uBAAY,EAAE,CAAC;IAClC,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAG,mBAAmB;IAC1D,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAK,iBAAiB;IACxD,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAQ,cAAc;IACrD,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAS,aAAa;IACpD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Login State — handles authentication flow.
|
|
3
|
+
*
|
|
4
|
+
* Flow:
|
|
5
|
+
* 1. Client → LoginStart (username, UUID)
|
|
6
|
+
* 2. Server → EncryptionRequest (server ID, public key, verify token) [online mode]
|
|
7
|
+
* 3. Client → EncryptionResponse (encrypted shared secret, encrypted verify token)
|
|
8
|
+
* 4. Server → SetCompression (threshold) [optional]
|
|
9
|
+
* 5. Server → LoginSuccess (UUID, username)
|
|
10
|
+
* 6. Client → LoginAcknowledged
|
|
11
|
+
*/
|
|
12
|
+
/** Login Serverbound Packet IDs */
|
|
13
|
+
export declare enum LoginServerboundPackets {
|
|
14
|
+
LOGIN_START = 0,
|
|
15
|
+
ENCRYPTION_RESPONSE = 1,
|
|
16
|
+
LOGIN_PLUGIN_RESPONSE = 2,
|
|
17
|
+
LOGIN_ACKNOWLEDGED = 3
|
|
18
|
+
}
|
|
19
|
+
/** Login Clientbound Packet IDs */
|
|
20
|
+
export declare enum LoginClientboundPackets {
|
|
21
|
+
DISCONNECT = 0,
|
|
22
|
+
ENCRYPTION_REQUEST = 1,
|
|
23
|
+
LOGIN_SUCCESS = 2,
|
|
24
|
+
SET_COMPRESSION = 3,
|
|
25
|
+
LOGIN_PLUGIN_REQUEST = 4
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Build Login Start packet (0x00).
|
|
29
|
+
* Sent by client to begin the login process.
|
|
30
|
+
*/
|
|
31
|
+
export declare function buildLoginStartPacket(username: string, playerUUID: string): Buffer;
|
|
32
|
+
/**
|
|
33
|
+
* Build Encryption Response packet (0x01).
|
|
34
|
+
* Sent after receiving Encryption Request, contains encrypted shared secret and verify token.
|
|
35
|
+
*/
|
|
36
|
+
export declare function buildEncryptionResponsePacket(encryptedSharedSecret: Buffer, encryptedVerifyToken: Buffer): Buffer;
|
|
37
|
+
/**
|
|
38
|
+
* Build Login Acknowledged packet (0x03).
|
|
39
|
+
* Sent after receiving Login Success to acknowledge transition.
|
|
40
|
+
*/
|
|
41
|
+
export declare function buildLoginAcknowledgedPacket(): Buffer;
|
|
42
|
+
export interface DisconnectPacket {
|
|
43
|
+
reason: string;
|
|
44
|
+
}
|
|
45
|
+
export declare function parseDisconnectPacket(data: Buffer): DisconnectPacket;
|
|
46
|
+
export interface EncryptionRequestPacket {
|
|
47
|
+
serverId: string;
|
|
48
|
+
publicKey: Buffer;
|
|
49
|
+
verifyToken: Buffer;
|
|
50
|
+
shouldAuthenticate: boolean;
|
|
51
|
+
}
|
|
52
|
+
export declare function parseEncryptionRequestPacket(data: Buffer): EncryptionRequestPacket;
|
|
53
|
+
export interface LoginSuccessPacket {
|
|
54
|
+
uuid: string;
|
|
55
|
+
username: string;
|
|
56
|
+
properties: Array<{
|
|
57
|
+
name: string;
|
|
58
|
+
value: string;
|
|
59
|
+
signature?: string;
|
|
60
|
+
}>;
|
|
61
|
+
}
|
|
62
|
+
export declare function parseLoginSuccessPacket(data: Buffer): LoginSuccessPacket;
|
|
63
|
+
export interface SetCompressionPacket {
|
|
64
|
+
threshold: number;
|
|
65
|
+
}
|
|
66
|
+
export declare function parseSetCompressionPacket(data: Buffer): SetCompressionPacket;
|
|
67
|
+
export interface LoginPluginRequestPacket {
|
|
68
|
+
messageId: number;
|
|
69
|
+
channel: string;
|
|
70
|
+
data: Buffer;
|
|
71
|
+
}
|
|
72
|
+
export declare function parseLoginPluginRequestPacket(data: Buffer): LoginPluginRequestPacket;
|
|
73
|
+
/**
|
|
74
|
+
* Build Login Plugin Response packet (0x02).
|
|
75
|
+
*/
|
|
76
|
+
export declare function buildLoginPluginResponsePacket(messageId: number, data?: Buffer): Buffer;
|
|
77
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/protocol/states/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,mCAAmC;AACnC,oBAAY,uBAAuB;IAC/B,WAAW,IAAO;IAClB,mBAAmB,IAAO;IAC1B,qBAAqB,IAAO;IAC5B,kBAAkB,IAAO;CAC5B;AAED,mCAAmC;AACnC,oBAAY,uBAAuB;IAC/B,UAAU,IAAO;IACjB,kBAAkB,IAAO;IACzB,aAAa,IAAO;IACpB,eAAe,IAAO;IACtB,oBAAoB,IAAO;CAC9B;AAID;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAKlF;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CACzC,qBAAqB,EAAE,MAAM,EAC7B,oBAAoB,EAAE,MAAM,GAC7B,MAAM,CAKR;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,MAAM,CAErD;AAID,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAGpE;AAED,MAAM,WAAW,uBAAuB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,CAOlF;AAED,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;CACN;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAkBxE;AAED,MAAM,WAAW,oBAAoB;IACjC,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAG5E;AAED,MAAM,WAAW,wBAAwB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,wBAAwB,CAMpF;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAUvF"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Login State — handles authentication flow.
|
|
4
|
+
*
|
|
5
|
+
* Flow:
|
|
6
|
+
* 1. Client → LoginStart (username, UUID)
|
|
7
|
+
* 2. Server → EncryptionRequest (server ID, public key, verify token) [online mode]
|
|
8
|
+
* 3. Client → EncryptionResponse (encrypted shared secret, encrypted verify token)
|
|
9
|
+
* 4. Server → SetCompression (threshold) [optional]
|
|
10
|
+
* 5. Server → LoginSuccess (UUID, username)
|
|
11
|
+
* 6. Client → LoginAcknowledged
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.LoginClientboundPackets = exports.LoginServerboundPackets = void 0;
|
|
15
|
+
exports.buildLoginStartPacket = buildLoginStartPacket;
|
|
16
|
+
exports.buildEncryptionResponsePacket = buildEncryptionResponsePacket;
|
|
17
|
+
exports.buildLoginAcknowledgedPacket = buildLoginAcknowledgedPacket;
|
|
18
|
+
exports.parseDisconnectPacket = parseDisconnectPacket;
|
|
19
|
+
exports.parseEncryptionRequestPacket = parseEncryptionRequestPacket;
|
|
20
|
+
exports.parseLoginSuccessPacket = parseLoginSuccessPacket;
|
|
21
|
+
exports.parseSetCompressionPacket = parseSetCompressionPacket;
|
|
22
|
+
exports.parseLoginPluginRequestPacket = parseLoginPluginRequestPacket;
|
|
23
|
+
exports.buildLoginPluginResponsePacket = buildLoginPluginResponsePacket;
|
|
24
|
+
const types_js_1 = require("../types.js");
|
|
25
|
+
// ─── Packet IDs ─────────────────────────────────────────
|
|
26
|
+
/** Login Serverbound Packet IDs */
|
|
27
|
+
var LoginServerboundPackets;
|
|
28
|
+
(function (LoginServerboundPackets) {
|
|
29
|
+
LoginServerboundPackets[LoginServerboundPackets["LOGIN_START"] = 0] = "LOGIN_START";
|
|
30
|
+
LoginServerboundPackets[LoginServerboundPackets["ENCRYPTION_RESPONSE"] = 1] = "ENCRYPTION_RESPONSE";
|
|
31
|
+
LoginServerboundPackets[LoginServerboundPackets["LOGIN_PLUGIN_RESPONSE"] = 2] = "LOGIN_PLUGIN_RESPONSE";
|
|
32
|
+
LoginServerboundPackets[LoginServerboundPackets["LOGIN_ACKNOWLEDGED"] = 3] = "LOGIN_ACKNOWLEDGED";
|
|
33
|
+
})(LoginServerboundPackets || (exports.LoginServerboundPackets = LoginServerboundPackets = {}));
|
|
34
|
+
/** Login Clientbound Packet IDs */
|
|
35
|
+
var LoginClientboundPackets;
|
|
36
|
+
(function (LoginClientboundPackets) {
|
|
37
|
+
LoginClientboundPackets[LoginClientboundPackets["DISCONNECT"] = 0] = "DISCONNECT";
|
|
38
|
+
LoginClientboundPackets[LoginClientboundPackets["ENCRYPTION_REQUEST"] = 1] = "ENCRYPTION_REQUEST";
|
|
39
|
+
LoginClientboundPackets[LoginClientboundPackets["LOGIN_SUCCESS"] = 2] = "LOGIN_SUCCESS";
|
|
40
|
+
LoginClientboundPackets[LoginClientboundPackets["SET_COMPRESSION"] = 3] = "SET_COMPRESSION";
|
|
41
|
+
LoginClientboundPackets[LoginClientboundPackets["LOGIN_PLUGIN_REQUEST"] = 4] = "LOGIN_PLUGIN_REQUEST";
|
|
42
|
+
})(LoginClientboundPackets || (exports.LoginClientboundPackets = LoginClientboundPackets = {}));
|
|
43
|
+
// ─── Serverbound Packets ────────────────────────────────
|
|
44
|
+
/**
|
|
45
|
+
* Build Login Start packet (0x00).
|
|
46
|
+
* Sent by client to begin the login process.
|
|
47
|
+
*/
|
|
48
|
+
function buildLoginStartPacket(username, playerUUID) {
|
|
49
|
+
const writer = new types_js_1.BufferWriter();
|
|
50
|
+
writer.writeString(username); // Player Name
|
|
51
|
+
writer.writeUUID(playerUUID); // Player UUID
|
|
52
|
+
return writer.toBuffer();
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Build Encryption Response packet (0x01).
|
|
56
|
+
* Sent after receiving Encryption Request, contains encrypted shared secret and verify token.
|
|
57
|
+
*/
|
|
58
|
+
function buildEncryptionResponsePacket(encryptedSharedSecret, encryptedVerifyToken) {
|
|
59
|
+
const writer = new types_js_1.BufferWriter();
|
|
60
|
+
writer.writeByteArray(encryptedSharedSecret);
|
|
61
|
+
writer.writeByteArray(encryptedVerifyToken);
|
|
62
|
+
return writer.toBuffer();
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Build Login Acknowledged packet (0x03).
|
|
66
|
+
* Sent after receiving Login Success to acknowledge transition.
|
|
67
|
+
*/
|
|
68
|
+
function buildLoginAcknowledgedPacket() {
|
|
69
|
+
return Buffer.alloc(0); // Empty packet
|
|
70
|
+
}
|
|
71
|
+
function parseDisconnectPacket(data) {
|
|
72
|
+
const reader = new types_js_1.BufferReader(data);
|
|
73
|
+
return { reason: reader.readString() };
|
|
74
|
+
}
|
|
75
|
+
function parseEncryptionRequestPacket(data) {
|
|
76
|
+
const reader = new types_js_1.BufferReader(data);
|
|
77
|
+
const serverId = reader.readString();
|
|
78
|
+
const publicKey = reader.readByteArray();
|
|
79
|
+
const verifyToken = reader.readByteArray();
|
|
80
|
+
const shouldAuthenticate = reader.readBool();
|
|
81
|
+
return { serverId, publicKey, verifyToken, shouldAuthenticate };
|
|
82
|
+
}
|
|
83
|
+
function parseLoginSuccessPacket(data) {
|
|
84
|
+
const reader = new types_js_1.BufferReader(data);
|
|
85
|
+
const uuid = reader.readUUID();
|
|
86
|
+
const username = reader.readString();
|
|
87
|
+
// Properties array
|
|
88
|
+
const numProperties = reader.readVarInt();
|
|
89
|
+
const properties = [];
|
|
90
|
+
for (let i = 0; i < numProperties; i++) {
|
|
91
|
+
const name = reader.readString();
|
|
92
|
+
const value = reader.readString();
|
|
93
|
+
const isSigned = reader.readBool();
|
|
94
|
+
const signature = isSigned ? reader.readString() : undefined;
|
|
95
|
+
properties.push({ name, value, signature });
|
|
96
|
+
}
|
|
97
|
+
return { uuid, username, properties };
|
|
98
|
+
}
|
|
99
|
+
function parseSetCompressionPacket(data) {
|
|
100
|
+
const reader = new types_js_1.BufferReader(data);
|
|
101
|
+
return { threshold: reader.readVarInt() };
|
|
102
|
+
}
|
|
103
|
+
function parseLoginPluginRequestPacket(data) {
|
|
104
|
+
const reader = new types_js_1.BufferReader(data);
|
|
105
|
+
const messageId = reader.readVarInt();
|
|
106
|
+
const channel = reader.readString();
|
|
107
|
+
const pluginData = reader.readRestBuffer();
|
|
108
|
+
return { messageId, channel, data: pluginData };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Build Login Plugin Response packet (0x02).
|
|
112
|
+
*/
|
|
113
|
+
function buildLoginPluginResponsePacket(messageId, data) {
|
|
114
|
+
const writer = new types_js_1.BufferWriter();
|
|
115
|
+
writer.writeVarInt(messageId);
|
|
116
|
+
if (data) {
|
|
117
|
+
writer.writeBool(true);
|
|
118
|
+
writer.writeBytes(data);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
writer.writeBool(false);
|
|
122
|
+
}
|
|
123
|
+
return writer.toBuffer();
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/protocol/states/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Play State — the main game state.
|
|
3
|
+
*
|
|
4
|
+
* Contains packet definitions for the most common play-state packets.
|
|
5
|
+
* Minecraft has 900+ packet types in Play state; we implement the essential ones
|
|
6
|
+
* and provide raw packet access for the rest.
|
|
7
|
+
*/
|
|
8
|
+
export declare enum PlayServerboundPackets {
|
|
9
|
+
CONFIRM_TELEPORTATION = 0,
|
|
10
|
+
CHAT_MESSAGE = 6,
|
|
11
|
+
CLIENT_INFORMATION = 10,
|
|
12
|
+
INTERACT = 19,
|
|
13
|
+
KEEP_ALIVE = 24,
|
|
14
|
+
SET_PLAYER_POSITION = 26,
|
|
15
|
+
SET_PLAYER_POSITION_AND_ROTATION = 27,
|
|
16
|
+
SET_PLAYER_ROTATION = 28,
|
|
17
|
+
SET_PLAYER_ON_GROUND = 29,
|
|
18
|
+
PLAYER_ACTION = 36,
|
|
19
|
+
PLAYER_COMMAND = 37,
|
|
20
|
+
SET_HELD_ITEM = 47,
|
|
21
|
+
SET_CREATIVE_MODE_SLOT = 50,
|
|
22
|
+
SWING_ARM = 54,
|
|
23
|
+
USE_ITEM_ON = 56,
|
|
24
|
+
USE_ITEM = 57
|
|
25
|
+
}
|
|
26
|
+
export declare enum PlayClientboundPackets {
|
|
27
|
+
BUNDLE_DELIMITER = 0,
|
|
28
|
+
SPAWN_ENTITY = 1,
|
|
29
|
+
BLOCK_UPDATE = 9,
|
|
30
|
+
DISCONNECT = 29,
|
|
31
|
+
GAME_EVENT = 34,
|
|
32
|
+
KEEP_ALIVE = 39,
|
|
33
|
+
CHUNK_DATA = 40,
|
|
34
|
+
LOGIN = 44,
|
|
35
|
+
PLAYER_INFO_UPDATE = 64,
|
|
36
|
+
PLAYER_POSITION = 66,
|
|
37
|
+
REMOVE_ENTITIES = 68,
|
|
38
|
+
SET_DEFAULT_SPAWN_POSITION = 86,
|
|
39
|
+
SET_ENTITY_METADATA = 88,
|
|
40
|
+
SET_ENTITY_VELOCITY = 90,
|
|
41
|
+
SET_HEALTH = 91,
|
|
42
|
+
PLAYER_ABILITIES = 58,
|
|
43
|
+
UPDATE_TIME = 100,
|
|
44
|
+
SYSTEM_CHAT = 115
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Keep Alive — must respond to server keep alive within 30s or get kicked.
|
|
48
|
+
*/
|
|
49
|
+
export declare function buildKeepAlivePacket(keepAliveId: bigint): Buffer;
|
|
50
|
+
/**
|
|
51
|
+
* Chat Message (unsigned).
|
|
52
|
+
*/
|
|
53
|
+
export declare function buildChatMessagePacket(message: string): Buffer;
|
|
54
|
+
/**
|
|
55
|
+
* Confirm Teleportation — must respond to synchronize position.
|
|
56
|
+
*/
|
|
57
|
+
export declare function buildConfirmTeleportationPacket(teleportId: number): Buffer;
|
|
58
|
+
/**
|
|
59
|
+
* Set Player Position.
|
|
60
|
+
*/
|
|
61
|
+
export declare function buildSetPlayerPositionPacket(x: number, y: number, z: number, onGround: boolean): Buffer;
|
|
62
|
+
/**
|
|
63
|
+
* Set Player Position and Rotation.
|
|
64
|
+
*/
|
|
65
|
+
export declare function buildSetPlayerPositionAndRotationPacket(x: number, y: number, z: number, yaw: number, pitch: number, onGround: boolean): Buffer;
|
|
66
|
+
/**
|
|
67
|
+
* Player Action (digging, etc.)
|
|
68
|
+
*/
|
|
69
|
+
export declare enum PlayerActionStatus {
|
|
70
|
+
STARTED_DIGGING = 0,
|
|
71
|
+
CANCELLED_DIGGING = 1,
|
|
72
|
+
FINISHED_DIGGING = 2,
|
|
73
|
+
DROP_ITEM_STACK = 3,
|
|
74
|
+
DROP_ITEM = 4,
|
|
75
|
+
SHOOT_ARROW_FINISH_EATING = 5,
|
|
76
|
+
SWAP_ITEM_IN_HAND = 6
|
|
77
|
+
}
|
|
78
|
+
export declare function buildPlayerActionPacket(status: PlayerActionStatus, x: number, y: number, z: number, face: number, sequence: number): Buffer;
|
|
79
|
+
/**
|
|
80
|
+
* Swing Arm.
|
|
81
|
+
*/
|
|
82
|
+
export declare function buildSwingArmPacket(hand?: number): Buffer;
|
|
83
|
+
/**
|
|
84
|
+
* Set Held Item (hotbar slot).
|
|
85
|
+
*/
|
|
86
|
+
export declare function buildSetHeldItemPacket(slot: number): Buffer;
|
|
87
|
+
/**
|
|
88
|
+
* Client Information — sent after login/respawn.
|
|
89
|
+
*/
|
|
90
|
+
export declare function buildClientInformationPacket(locale?: string, viewDistance?: number, chatMode?: number, chatColors?: boolean, skinParts?: number, mainHand?: number): Buffer;
|
|
91
|
+
export interface KeepAliveClientbound {
|
|
92
|
+
keepAliveId: bigint;
|
|
93
|
+
}
|
|
94
|
+
export declare function parseKeepAlive(data: Buffer): KeepAliveClientbound;
|
|
95
|
+
export interface LoginPlayPacket {
|
|
96
|
+
entityId: number;
|
|
97
|
+
isHardcore: boolean;
|
|
98
|
+
dimensionCount: number;
|
|
99
|
+
dimensionNames: string[];
|
|
100
|
+
maxPlayers: number;
|
|
101
|
+
viewDistance: number;
|
|
102
|
+
simulationDistance: number;
|
|
103
|
+
reducedDebugInfo: boolean;
|
|
104
|
+
enableRespawnScreen: boolean;
|
|
105
|
+
doLimitedCrafting: boolean;
|
|
106
|
+
dimensionType: number;
|
|
107
|
+
dimensionName: string;
|
|
108
|
+
hashedSeed: bigint;
|
|
109
|
+
gameMode: number;
|
|
110
|
+
previousGameMode: number;
|
|
111
|
+
isDebug: boolean;
|
|
112
|
+
isFlat: boolean;
|
|
113
|
+
portalCooldown: number;
|
|
114
|
+
seaLevel: number;
|
|
115
|
+
}
|
|
116
|
+
export declare function parseLoginPlay(data: Buffer): LoginPlayPacket;
|
|
117
|
+
export interface PlayerPositionPacket {
|
|
118
|
+
teleportId: number;
|
|
119
|
+
x: number;
|
|
120
|
+
y: number;
|
|
121
|
+
z: number;
|
|
122
|
+
velocityX: number;
|
|
123
|
+
velocityY: number;
|
|
124
|
+
velocityZ: number;
|
|
125
|
+
yaw: number;
|
|
126
|
+
pitch: number;
|
|
127
|
+
flags: number;
|
|
128
|
+
}
|
|
129
|
+
export declare function parsePlayerPosition(data: Buffer): PlayerPositionPacket;
|
|
130
|
+
export interface SystemChatPacket {
|
|
131
|
+
content: string;
|
|
132
|
+
isOverlay: boolean;
|
|
133
|
+
}
|
|
134
|
+
export declare function parseSystemChat(data: Buffer): SystemChatPacket;
|
|
135
|
+
export interface SetHealthPacket {
|
|
136
|
+
health: number;
|
|
137
|
+
food: number;
|
|
138
|
+
saturation: number;
|
|
139
|
+
}
|
|
140
|
+
export declare function parseSetHealth(data: Buffer): SetHealthPacket;
|
|
141
|
+
export interface BlockUpdatePacket {
|
|
142
|
+
x: number;
|
|
143
|
+
y: number;
|
|
144
|
+
z: number;
|
|
145
|
+
blockId: number;
|
|
146
|
+
}
|
|
147
|
+
export declare function parseBlockUpdate(data: Buffer): BlockUpdatePacket;
|
|
148
|
+
export interface DisconnectPlayPacket {
|
|
149
|
+
reason: string;
|
|
150
|
+
}
|
|
151
|
+
export declare function parseDisconnectPlay(data: Buffer): DisconnectPlayPacket;
|
|
152
|
+
export interface PlayerAbilitiesPacket {
|
|
153
|
+
flags: number;
|
|
154
|
+
flyingSpeed: number;
|
|
155
|
+
walkingSpeed: number;
|
|
156
|
+
}
|
|
157
|
+
export declare function parsePlayerAbilities(data: Buffer): PlayerAbilitiesPacket;
|
|
158
|
+
export interface SpawnEntityPacket {
|
|
159
|
+
entityId: number;
|
|
160
|
+
entityUUID: string;
|
|
161
|
+
type: number;
|
|
162
|
+
x: number;
|
|
163
|
+
y: number;
|
|
164
|
+
z: number;
|
|
165
|
+
pitch: number;
|
|
166
|
+
yaw: number;
|
|
167
|
+
headYaw: number;
|
|
168
|
+
data: number;
|
|
169
|
+
velocityX: number;
|
|
170
|
+
velocityY: number;
|
|
171
|
+
velocityZ: number;
|
|
172
|
+
}
|
|
173
|
+
export declare function parseSpawnEntity(data: Buffer): SpawnEntityPacket;
|
|
174
|
+
/**
|
|
175
|
+
* Encode x, y, z into Minecraft's packed 64-bit position format.
|
|
176
|
+
* x: 26 bits | z: 26 bits | y: 12 bits
|
|
177
|
+
*/
|
|
178
|
+
export declare function encodePosition(x: number, y: number, z: number): bigint;
|
|
179
|
+
/**
|
|
180
|
+
* Decode Minecraft's packed 64-bit position format.
|
|
181
|
+
*/
|
|
182
|
+
export declare function decodePosition(val: bigint): {
|
|
183
|
+
x: number;
|
|
184
|
+
y: number;
|
|
185
|
+
z: number;
|
|
186
|
+
};
|
|
187
|
+
//# sourceMappingURL=play.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"play.d.ts","sourceRoot":"","sources":["../../../src/protocol/states/play.ts"],"names":[],"mappings":"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"}
|