@vaitosoi/minejs 0.2.0 → 0.2.2
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/dist/base/aabb.d.ts +197 -0
- package/dist/base/aabb.d.ts.map +1 -0
- package/dist/base/aabb.js +576 -0
- package/dist/base/aabb.js.map +1 -0
- package/dist/base/bitset.d.ts +9 -0
- package/dist/base/bitset.d.ts.map +1 -0
- package/dist/base/bitset.js +46 -0
- package/dist/base/bitset.js.map +1 -0
- package/dist/base/block.d.ts +86 -0
- package/dist/base/block.d.ts.map +1 -0
- package/dist/base/block.js +232 -0
- package/dist/base/block.js.map +1 -0
- package/dist/base/direction.d.ts +153 -0
- package/dist/base/direction.d.ts.map +1 -0
- package/dist/base/direction.js +288 -0
- package/dist/base/direction.js.map +1 -0
- package/dist/base/entity.d.ts +43 -0
- package/dist/base/entity.d.ts.map +1 -0
- package/dist/base/entity.js +97 -0
- package/dist/base/entity.js.map +1 -0
- package/dist/base/error.d.ts +76 -0
- package/dist/base/error.d.ts.map +1 -0
- package/dist/base/error.js +141 -0
- package/dist/base/error.js.map +1 -0
- package/dist/base/event.d.ts +7 -0
- package/dist/base/event.d.ts.map +1 -0
- package/dist/base/event.js +3 -0
- package/dist/base/event.js.map +1 -0
- package/dist/base/math.d.ts +25 -0
- package/dist/base/math.d.ts.map +1 -0
- package/dist/base/math.js +69 -0
- package/dist/base/math.js.map +1 -0
- package/dist/base/player.d.ts +107 -0
- package/dist/base/player.d.ts.map +1 -0
- package/dist/base/player.js +543 -0
- package/dist/base/player.js.map +1 -0
- package/dist/base/registry.d.ts +50 -0
- package/dist/base/registry.d.ts.map +1 -0
- package/dist/base/registry.js +89 -0
- package/dist/base/registry.js.map +1 -0
- package/dist/base/tick.d.ts +19 -0
- package/dist/base/tick.d.ts.map +1 -0
- package/dist/base/tick.js +49 -0
- package/dist/base/tick.js.map +1 -0
- package/dist/base/typing.d.ts +3 -0
- package/dist/base/typing.d.ts.map +1 -0
- package/dist/base/typing.js +3 -0
- package/dist/base/typing.js.map +1 -0
- package/dist/client/auth.d.ts +39 -0
- package/dist/client/auth.d.ts.map +1 -0
- package/dist/client/auth.js +307 -0
- package/dist/client/auth.js.map +1 -0
- package/dist/client/client.d.ts +62 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +98 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/static.d.ts +28 -0
- package/dist/client/static.d.ts.map +1 -0
- package/dist/client/static.js +43 -0
- package/dist/client/static.js.map +1 -0
- package/dist/client/tcp.d.ts +269 -0
- package/dist/client/tcp.d.ts.map +1 -0
- package/dist/client/tcp.js +838 -0
- package/dist/client/tcp.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/translator/decoder.d.ts +293 -0
- package/dist/translator/decoder.d.ts.map +1 -0
- package/dist/translator/decoder.js +668 -0
- package/dist/translator/decoder.js.map +1 -0
- package/dist/translator/encoder.d.ts +162 -0
- package/dist/translator/encoder.d.ts.map +1 -0
- package/dist/translator/encoder.js +430 -0
- package/dist/translator/encoder.js.map +1 -0
- package/dist/translator/static.d.ts +33 -0
- package/dist/translator/static.d.ts.map +1 -0
- package/dist/translator/static.js +42 -0
- package/dist/translator/static.js.map +1 -0
- package/package.json +10 -10
- package/src/base/aabb.ts +2 -0
- package/src/base/block.ts +4 -0
- package/src/base/direction.ts +5 -0
- package/src/base/error.ts +16 -0
- package/src/base/event.ts +1 -1
- package/src/base/math.ts +10 -0
- package/src/base/typing.ts +1 -0
- package/src/client/static.ts +4 -0
- package/src/translator/encoder.ts +2 -2
- package/src/translator/static.ts +9 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Client = void 0;
|
|
4
|
+
const node_stream_1 = require("node:stream");
|
|
5
|
+
const block_1 = require("../base/block");
|
|
6
|
+
const entity_1 = require("../base/entity");
|
|
7
|
+
const player_1 = require("../base/player");
|
|
8
|
+
const tick_1 = require("../base/tick");
|
|
9
|
+
const tcp_1 = require("./tcp");
|
|
10
|
+
const registry_1 = require("../base/registry");
|
|
11
|
+
const direction_1 = require("../base/direction");
|
|
12
|
+
/**
|
|
13
|
+
* High-level client.
|
|
14
|
+
*/
|
|
15
|
+
class Client extends node_stream_1.EventEmitter {
|
|
16
|
+
tickLoop;
|
|
17
|
+
tcp;
|
|
18
|
+
blocks;
|
|
19
|
+
entities;
|
|
20
|
+
player;
|
|
21
|
+
constructor(options) {
|
|
22
|
+
super();
|
|
23
|
+
registry_1.BlockRegistry.load();
|
|
24
|
+
registry_1.EntityRegistry.load();
|
|
25
|
+
this.tcp = new tcp_1.TCPClient(options);
|
|
26
|
+
this.blocks = new block_1.BlockManager(this.tcp);
|
|
27
|
+
this.entities = new entity_1.EntitiesManager(this.tcp);
|
|
28
|
+
this.player = new player_1.Player(this.entities, this.blocks, this.tcp);
|
|
29
|
+
this.tickLoop = new tick_1.TickLoop(() => this.player.tick());
|
|
30
|
+
this.forwardEvents();
|
|
31
|
+
}
|
|
32
|
+
forwardEvent(eventName) {
|
|
33
|
+
this.tcp.on(eventName, (...args) => this.emit(eventName, ...args));
|
|
34
|
+
}
|
|
35
|
+
forwardEvents() {
|
|
36
|
+
this.forwardEvent("disconnect");
|
|
37
|
+
this.forwardEvent("disconnectRaw");
|
|
38
|
+
this.forwardEvent("loadChunk");
|
|
39
|
+
this.forwardEvent("unloadChunk");
|
|
40
|
+
this.forwardEvent("playerPosition");
|
|
41
|
+
this.forwardEvent("spawnEntity");
|
|
42
|
+
this.forwardEvent("updateEntity");
|
|
43
|
+
this.forwardEvent("removeEntity");
|
|
44
|
+
this.forwardEvent("message");
|
|
45
|
+
this.forwardEvent("systemMessage");
|
|
46
|
+
this.forwardEvent("systemMessageRaw");
|
|
47
|
+
this.forwardEvent("actionBar");
|
|
48
|
+
this.forwardEvent("actionBarRaw");
|
|
49
|
+
}
|
|
50
|
+
// Start / stop
|
|
51
|
+
/**
|
|
52
|
+
* Create a connection to the server
|
|
53
|
+
*/
|
|
54
|
+
connect() {
|
|
55
|
+
this.tcp.connect();
|
|
56
|
+
this.tcp.once("ready", () => {
|
|
57
|
+
this.emit("ready", this);
|
|
58
|
+
this.player.pruneInitialVal();
|
|
59
|
+
this.player.setInitialVal();
|
|
60
|
+
this.tickLoop.start();
|
|
61
|
+
});
|
|
62
|
+
this.tcp.once("disconnect", () => {
|
|
63
|
+
this.tickLoop.stop();
|
|
64
|
+
this.player.pruneInitialVal();
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Destroy the connection
|
|
69
|
+
*/
|
|
70
|
+
disconnect() {
|
|
71
|
+
this.tcp.disconnect();
|
|
72
|
+
}
|
|
73
|
+
// Inputs
|
|
74
|
+
/**
|
|
75
|
+
* Press and hold a key
|
|
76
|
+
*/
|
|
77
|
+
hold(direction) {
|
|
78
|
+
this.player.input(direction);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Release a key
|
|
82
|
+
*/
|
|
83
|
+
release(direction) {
|
|
84
|
+
this.player.releaseInput(direction);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Release all key
|
|
88
|
+
*/
|
|
89
|
+
stopMoving() {
|
|
90
|
+
this.player.releaseAllInputs();
|
|
91
|
+
}
|
|
92
|
+
at(a, b, c) {
|
|
93
|
+
const vec3 = direction_1.Vec3.loadArgs(a, b, c);
|
|
94
|
+
return this.blocks.at(vec3);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.Client = Client;
|
|
98
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":";;;AAAA,6CAA2C;AAC3C,yCAAyD;AACzD,2CAAiD;AACjD,2CAAuD;AACvD,uCAAwC;AACxC,+BAAoG;AAEpG,+CAAiE;AACjE,iDAAmD;AAwBnD;;GAEG;AACH,YAA0D,SAAS,0BAAqD;IAC5G,QAAQ,CAAW;IAEnB,GAAG,CAAwB;IAC3B,MAAM,CAAe;IACrB,QAAQ,CAAkB;IAC1B,MAAM,CAAS;IAEvB,YAAY,OAAwB;QAChC,KAAK,EAAE,CAAC;QACR,wBAAa,CAAC,IAAI,EAAE,CAAC;QACrB,yBAAc,CAAC,IAAI,EAAE,CAAC;QAEtB,IAAI,CAAC,GAAG,GAAG,IAAI,eAAS,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,oBAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,wBAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAEO,YAAY,CAAC,SAAqD;QACtE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACvE,CAAC;IACO,aAAa;QACjB,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;QACnC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAC/B,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;QACpC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;QAClC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;QAClC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;QACnC,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;QACtC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAC/B,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC;IAED,eAAe;IACf;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAEnB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACxB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAoB,CAAC,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;YAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAClC,CAAC,CAAC,CAAC;IACP,CAAC;IACD;;OAEG;IACI,UAAU;QACb,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED,SAAS;IACT;;OAEG;IACI,IAAI,CAAC,SAAwB;QAChC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IACD;;OAEG;IACI,OAAO,CAAC,SAAwB;QACnC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IACD;;OAEG;IACI,UAAU;QACb,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;IACnC,CAAC;IAQM,EAAE,CAAC,CAAoB,EAAE,CAAU,EAAE,CAAU;QAClD,MAAM,IAAI,GAAG,gBAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;CACJ"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** @hidden */
|
|
2
|
+
export declare const SectionsPerChunk: Record<string, number>;
|
|
3
|
+
/** @hidden */
|
|
4
|
+
export declare const LevelHeightLimit: Record<string, [min: number, max: number]>;
|
|
5
|
+
/**
|
|
6
|
+
* Packed block position within a chunk column to an integer
|
|
7
|
+
*
|
|
8
|
+
* A packed position look like this:
|
|
9
|
+
* `[9 bits of Y][4 bits of Z][4 bits of X]`
|
|
10
|
+
*
|
|
11
|
+
* @param x relative within chunk column
|
|
12
|
+
* @param y world height
|
|
13
|
+
* @param z relative within chunk column
|
|
14
|
+
* @hidden
|
|
15
|
+
*/
|
|
16
|
+
export declare const packBlockPos: (x: number, y: number, z: number) => number;
|
|
17
|
+
/**
|
|
18
|
+
* Unpacked block position within a chunk column from an integer
|
|
19
|
+
*
|
|
20
|
+
* @returns unpacked position
|
|
21
|
+
* @hidden
|
|
22
|
+
*/
|
|
23
|
+
export declare const readPackedBlockPos: (packed: number) => {
|
|
24
|
+
x: number;
|
|
25
|
+
z: number;
|
|
26
|
+
y: number;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=static.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../../src/client/static.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKnD,CAAC;AAEF,cAAc;AACd,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAKvE,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,MAAO,MAAM,KAAK,MAAM,KAAK,MAAM,WAAwB,CAAC;AAGrF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,WAAY,MAAM;IAC7C,CAAC;IACD,CAAC;IACD,CAAC;CACH,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readPackedBlockPos = exports.packBlockPos = exports.LevelHeightLimit = exports.SectionsPerChunk = void 0;
|
|
4
|
+
/** @hidden */
|
|
5
|
+
exports.SectionsPerChunk = {
|
|
6
|
+
"minecraft:overworld": 24,
|
|
7
|
+
"minecraft:overworld_caves": 24,
|
|
8
|
+
"minecraft:the_end": 16,
|
|
9
|
+
"minecraft:the_nether": 8,
|
|
10
|
+
};
|
|
11
|
+
/** @hidden */
|
|
12
|
+
exports.LevelHeightLimit = {
|
|
13
|
+
"minecraft:overworld": [-64, 320],
|
|
14
|
+
"minecraft:overworld_caves": [-64, 320],
|
|
15
|
+
"minecraft:the_end": [0, 256],
|
|
16
|
+
"minecraft:the_nether": [0, 0],
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Packed block position within a chunk column to an integer
|
|
20
|
+
*
|
|
21
|
+
* A packed position look like this:
|
|
22
|
+
* `[9 bits of Y][4 bits of Z][4 bits of X]`
|
|
23
|
+
*
|
|
24
|
+
* @param x relative within chunk column
|
|
25
|
+
* @param y world height
|
|
26
|
+
* @param z relative within chunk column
|
|
27
|
+
* @hidden
|
|
28
|
+
*/
|
|
29
|
+
const packBlockPos = (x, y, z) => y << 8 & z << 4 & x;
|
|
30
|
+
exports.packBlockPos = packBlockPos;
|
|
31
|
+
/**
|
|
32
|
+
* Unpacked block position within a chunk column from an integer
|
|
33
|
+
*
|
|
34
|
+
* @returns unpacked position
|
|
35
|
+
* @hidden
|
|
36
|
+
*/
|
|
37
|
+
const readPackedBlockPos = (packed) => ({
|
|
38
|
+
x: packed & 0xF,
|
|
39
|
+
z: (packed >> 4) & 0xF,
|
|
40
|
+
y: (packed >> 8) & 0x1FF,
|
|
41
|
+
});
|
|
42
|
+
exports.readPackedBlockPos = readPackedBlockPos;
|
|
43
|
+
//# sourceMappingURL=static.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static.js","sourceRoot":"","sources":["../../src/client/static.ts"],"names":[],"mappings":";;;AAAA,cAAc;AACD,QAAA,gBAAgB,GAA2B;IACpD,qBAAqB,EAAE,EAAE;IACzB,2BAA2B,EAAE,EAAE;IAC/B,mBAAmB,EAAE,EAAE;IACvB,sBAAsB,EAAE,CAAC;CAC5B,CAAC;AAEF,cAAc;AACD,QAAA,gBAAgB,GAA+C;IACxE,qBAAqB,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC;IACjC,2BAA2B,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC;IACvC,mBAAmB,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC;IAC7B,sBAAsB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;CACjC,CAAC;AAEF;;;;;;;;;;GAUG;AACI,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAAxE,QAAA,YAAY,GAAZ,YAAY,CAA4D;AAGrF;;;;;GAKG;AACI,MAAM,kBAAkB,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC,EAAE,MAAM,GAAG,GAAG;IACf,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,GAAG;IACtB,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,KAAK;CAC3B,CAAC,CAAC;AAJU,QAAA,kBAAkB,GAAlB,kBAAkB,CAI5B"}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { Socket, SocketConstructorOpts } from "node:net";
|
|
2
|
+
import { TypedEmmiter } from "../base/event";
|
|
3
|
+
import { If } from "../base/typing";
|
|
4
|
+
import { Angle, BaseVec3 } from "../base/direction";
|
|
5
|
+
import { AuthOption } from "./auth";
|
|
6
|
+
/**
|
|
7
|
+
* Representing a TextComponent
|
|
8
|
+
*
|
|
9
|
+
* @see https://minecraft.wiki/w/Text_component_format
|
|
10
|
+
*/
|
|
11
|
+
export type TextComponent = Record<string, any>;
|
|
12
|
+
export interface Server {
|
|
13
|
+
knownPacks?: ServerKnownPack;
|
|
14
|
+
}
|
|
15
|
+
export interface ServerKnownPack {
|
|
16
|
+
namespace: string;
|
|
17
|
+
id: string;
|
|
18
|
+
version: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Represent world information
|
|
22
|
+
*/
|
|
23
|
+
export interface ServerWorld {
|
|
24
|
+
/** Is hardcore enabled */
|
|
25
|
+
hardcore: boolean;
|
|
26
|
+
/** All dimensions */
|
|
27
|
+
dimensions: string[];
|
|
28
|
+
/** Max players allowed */
|
|
29
|
+
maxPlayers: number;
|
|
30
|
+
/** View distances */
|
|
31
|
+
viewDistance: number;
|
|
32
|
+
/** Simulation distance */
|
|
33
|
+
simulationDistance: number;
|
|
34
|
+
/**
|
|
35
|
+
* The record key is a chunk section position packed as `Player Dimension:Chunk X:Chunk Z[Section Y]`
|
|
36
|
+
*
|
|
37
|
+
* For `Section Y`, a chunk is splitted into several cubic 16x16x16 sections, or in other word, a chunk is a bund of 16x16x16 sections stacked on each other.
|
|
38
|
+
*/
|
|
39
|
+
chunks: Record<string, ChunkColumn>;
|
|
40
|
+
/**
|
|
41
|
+
* The record key is entity ID
|
|
42
|
+
*/
|
|
43
|
+
entities: Record<number, Entity>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Represent a chunk collumns, which may contains multiple chunks sections
|
|
47
|
+
*/
|
|
48
|
+
export interface ChunkColumn {
|
|
49
|
+
sections: Record<number, ChunkSection>;
|
|
50
|
+
blockEntities: Record<number, BlockEntity>;
|
|
51
|
+
}
|
|
52
|
+
export interface ChunkSection {
|
|
53
|
+
block: PaletteContainer;
|
|
54
|
+
biome: PaletteContainer;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Used for indirect mapping
|
|
58
|
+
*
|
|
59
|
+
* @see https://minecraft.wiki/w/Java_Edition_protocol/Chunk_format#Paletted_Container_structure
|
|
60
|
+
*/
|
|
61
|
+
export interface PaletteContainer {
|
|
62
|
+
bpe: number;
|
|
63
|
+
palette: number[];
|
|
64
|
+
data: BigInt64Array | null;
|
|
65
|
+
}
|
|
66
|
+
/** Represent a block entity */
|
|
67
|
+
export interface BlockEntity {
|
|
68
|
+
type: number;
|
|
69
|
+
data: Record<string, any>;
|
|
70
|
+
}
|
|
71
|
+
/** Represent an entity */
|
|
72
|
+
export interface Entity {
|
|
73
|
+
id: number;
|
|
74
|
+
type: number;
|
|
75
|
+
position: BaseVec3;
|
|
76
|
+
velocity: BaseVec3;
|
|
77
|
+
angle: Angle;
|
|
78
|
+
data: number;
|
|
79
|
+
}
|
|
80
|
+
export declare enum GameMode {
|
|
81
|
+
Survival = 0,
|
|
82
|
+
Creative = 1,
|
|
83
|
+
Adventure = 2,
|
|
84
|
+
Spectator = 3
|
|
85
|
+
}
|
|
86
|
+
export interface ClientPlayer {
|
|
87
|
+
/** Player UUID */
|
|
88
|
+
uuid: string;
|
|
89
|
+
/** Player username */
|
|
90
|
+
username: string;
|
|
91
|
+
/** Player entity ID */
|
|
92
|
+
entityId: number;
|
|
93
|
+
/** Current game mode */
|
|
94
|
+
gameMode: GameMode;
|
|
95
|
+
position: BaseVec3;
|
|
96
|
+
velocity: BaseVec3;
|
|
97
|
+
angle: Angle;
|
|
98
|
+
/** Current dimension */
|
|
99
|
+
dimension: string;
|
|
100
|
+
}
|
|
101
|
+
export interface ServerRegistryEntry {
|
|
102
|
+
id: string;
|
|
103
|
+
data: object;
|
|
104
|
+
}
|
|
105
|
+
export interface TCPClientOption {
|
|
106
|
+
/** Server host */
|
|
107
|
+
host: string;
|
|
108
|
+
/** Server port */
|
|
109
|
+
port: number;
|
|
110
|
+
/**
|
|
111
|
+
* Server protocol version.
|
|
112
|
+
*
|
|
113
|
+
* Currentlt support `776` or version `26.2`
|
|
114
|
+
*
|
|
115
|
+
* @see https://minecraft.wiki/w/Minecraft_Wiki:Projects/wiki.vg_merge/Protocol_version_numbers
|
|
116
|
+
*/
|
|
117
|
+
protocolVersion: number;
|
|
118
|
+
/** Player name */
|
|
119
|
+
playerName: string;
|
|
120
|
+
/**
|
|
121
|
+
* Set to true only if you are playing in offline server or crack server
|
|
122
|
+
*/
|
|
123
|
+
isOffline?: boolean;
|
|
124
|
+
/**
|
|
125
|
+
* Send empty `Known Packet` to let server send all Registry data, which may consume a lot of bandwith
|
|
126
|
+
*/
|
|
127
|
+
loadRegistry?: boolean;
|
|
128
|
+
debug?: {
|
|
129
|
+
/** Log the incoming packet */
|
|
130
|
+
packetLogger: boolean;
|
|
131
|
+
};
|
|
132
|
+
auth?: AuthOption;
|
|
133
|
+
}
|
|
134
|
+
export interface TCPClientEvents {
|
|
135
|
+
connect: [];
|
|
136
|
+
disconnect: [reason: string];
|
|
137
|
+
disconnectRaw: [textComponent: TextComponent];
|
|
138
|
+
raw: [buf: Buffer];
|
|
139
|
+
/** Whenever client is ready to use */
|
|
140
|
+
ready: [readyClient: TCPClient<true>];
|
|
141
|
+
/**
|
|
142
|
+
* Sync player position.
|
|
143
|
+
*
|
|
144
|
+
* Noted that this fired when recived packet from server, not from the internal movement, meaning that calling `input` function would not fire this event.
|
|
145
|
+
*/
|
|
146
|
+
playerPosition: [position: BaseVec3];
|
|
147
|
+
/** Load chunk section */
|
|
148
|
+
loadChunk: [chunkX: number, sectionY: number, chunkZ: number];
|
|
149
|
+
/** Unload chunk column */
|
|
150
|
+
unloadChunk: [chunkX: number, chunkZ: number];
|
|
151
|
+
/** Spawn an entity */
|
|
152
|
+
spawnEntity: [entity: Entity];
|
|
153
|
+
/** Update spawned entity */
|
|
154
|
+
updateEntity: [entity: Entity];
|
|
155
|
+
/** Remove entity */
|
|
156
|
+
removeEntity: [entityId: number];
|
|
157
|
+
/** Message, usually sent from player */
|
|
158
|
+
message: [message: Message];
|
|
159
|
+
/** Parsed system message, usually sent from the console, plugins, etc... */
|
|
160
|
+
systemMessage: [message: string];
|
|
161
|
+
/** Raw system messgae */
|
|
162
|
+
systemMessageRaw: [textComponent: TextComponent];
|
|
163
|
+
/** Parsed action bar message, the message appeared above your hot bar */
|
|
164
|
+
actionBar: [message: string];
|
|
165
|
+
/** Raw action bar */
|
|
166
|
+
actionBarRaw: [textComponent: TextComponent];
|
|
167
|
+
}
|
|
168
|
+
export interface Message {
|
|
169
|
+
sender: string;
|
|
170
|
+
target?: string;
|
|
171
|
+
content: string;
|
|
172
|
+
raw: {
|
|
173
|
+
sender: TextComponent;
|
|
174
|
+
target?: TextComponent;
|
|
175
|
+
content?: TextComponent;
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
export declare enum ClientStatus {
|
|
179
|
+
Disconnected = 0,
|
|
180
|
+
Connecting = 1,
|
|
181
|
+
Logining = 2,
|
|
182
|
+
Ready = 3
|
|
183
|
+
}
|
|
184
|
+
export declare enum ClientState {
|
|
185
|
+
Disconnected = 0,
|
|
186
|
+
Handshake = 1,
|
|
187
|
+
Login = 2,
|
|
188
|
+
Configure = 3,
|
|
189
|
+
Play = 4
|
|
190
|
+
}
|
|
191
|
+
declare const TCPClient_base: new () => TypedEmmiter<TCPClientEvents>;
|
|
192
|
+
/**
|
|
193
|
+
* Low-level client. You SHOULD NOT use this client unless you know what are you doing
|
|
194
|
+
*
|
|
195
|
+
* @see https://minecraft.wiki/w/Java_Edition_protocol/Packets?oldid=3445844
|
|
196
|
+
*/
|
|
197
|
+
export declare class TCPClient<IsReady extends boolean = boolean> extends TCPClient_base {
|
|
198
|
+
readonly option: TCPClientOption;
|
|
199
|
+
readonly socket: Socket;
|
|
200
|
+
server: Server | undefined;
|
|
201
|
+
/**
|
|
202
|
+
* | Value | Meaning |
|
|
203
|
+
* |-------|---------|
|
|
204
|
+
* | 0 | not set yet |
|
|
205
|
+
* | -1 | dont compress |
|
|
206
|
+
* | > 0 | compression threshold |
|
|
207
|
+
*/
|
|
208
|
+
private compressionThreshold;
|
|
209
|
+
private bufferPool;
|
|
210
|
+
status: ClientStatus;
|
|
211
|
+
private state;
|
|
212
|
+
private sharedSecret;
|
|
213
|
+
private cipher;
|
|
214
|
+
private decipher;
|
|
215
|
+
world?: If<IsReady, ServerWorld>;
|
|
216
|
+
player?: If<IsReady, ClientPlayer>;
|
|
217
|
+
registry?: If<IsReady, Record<string, ServerRegistryEntry[]>>;
|
|
218
|
+
private playerUUID?;
|
|
219
|
+
constructor(option: TCPClientOption, socketOption?: SocketConstructorOpts);
|
|
220
|
+
private wipePlayData;
|
|
221
|
+
/**
|
|
222
|
+
* Connect to server
|
|
223
|
+
*/
|
|
224
|
+
connect(): Promise<void>;
|
|
225
|
+
disconnect(): void;
|
|
226
|
+
isReady(): this is TCPClient<true>;
|
|
227
|
+
checkReady(): boolean;
|
|
228
|
+
private handlePacket;
|
|
229
|
+
private handleLoginDisconnect;
|
|
230
|
+
private handleEncryption;
|
|
231
|
+
private handleSetCompression;
|
|
232
|
+
private handleLoginSucess;
|
|
233
|
+
private handleKnownPack;
|
|
234
|
+
private handleRegistryData;
|
|
235
|
+
private handleConfiguarionPlayDisconnect;
|
|
236
|
+
private handlePlayLogin;
|
|
237
|
+
private handleSynchronizePlayerPosition;
|
|
238
|
+
private handleKeepAlive;
|
|
239
|
+
private handleChangeGameMode;
|
|
240
|
+
private handleChunkData;
|
|
241
|
+
private handleUnloadChunk;
|
|
242
|
+
private handleBlockEntityData;
|
|
243
|
+
private handleSpawnEntity;
|
|
244
|
+
private handleTeleportEntity;
|
|
245
|
+
private handleUpdateEntityPosition;
|
|
246
|
+
private handleUpdateEntityPositionRotation;
|
|
247
|
+
private handleSetEntityVelocity;
|
|
248
|
+
private handleRemoveEntity;
|
|
249
|
+
private handlePlayerChat;
|
|
250
|
+
private handleSystemMessage;
|
|
251
|
+
private handleSetActionBar;
|
|
252
|
+
private handleDisguisedChatMessage;
|
|
253
|
+
write(buf: Buffer): void;
|
|
254
|
+
sendPacket(packetId: number, content: Buffer): void;
|
|
255
|
+
private sendHandshake;
|
|
256
|
+
private sendLoginStart;
|
|
257
|
+
private sendEncryptionResponse;
|
|
258
|
+
private sendLoginAck;
|
|
259
|
+
private sendKnownPack;
|
|
260
|
+
private sendConfigureAck;
|
|
261
|
+
private sendConfirmTeleportation;
|
|
262
|
+
private sendKeepAlive;
|
|
263
|
+
sendPlayerPosRot(pos: BaseVec3, rot: Angle, onGround: boolean, pushingWall: boolean): void;
|
|
264
|
+
sendPlayerPos(pos: BaseVec3, onGround: boolean, pushingWall: boolean): void;
|
|
265
|
+
sendPlayerRot(rot: Angle, onGround: boolean, pushingWall: boolean): void;
|
|
266
|
+
sendPlayerStatus(onGround: boolean, pushingWall: boolean): void;
|
|
267
|
+
}
|
|
268
|
+
export {};
|
|
269
|
+
//# sourceMappingURL=tcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tcp.d.ts","sourceRoot":"","sources":["../../src/client/tcp.ts"],"names":[],"mappings":"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"}
|