@vaitosoi/minejs 0.2.2 → 0.4.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/README.md +1 -1
- package/assets/minecraft/26.2/packets.json +4758 -0
- package/dist/base/buffer.d.ts +2 -0
- package/dist/base/buffer.d.ts.map +1 -0
- package/dist/base/buffer.js +12 -0
- package/dist/base/buffer.js.map +1 -0
- package/dist/base/error.d.ts +59 -3
- package/dist/base/error.d.ts.map +1 -1
- package/dist/base/error.js +123 -7
- package/dist/base/error.js.map +1 -1
- package/dist/base/http.d.ts +2 -0
- package/dist/base/http.d.ts.map +1 -0
- package/dist/base/http.js +14 -0
- package/dist/base/http.js.map +1 -0
- package/dist/base/math.d.ts +22 -1
- package/dist/base/math.d.ts.map +1 -1
- package/dist/base/math.js +49 -2
- package/dist/base/math.js.map +1 -1
- package/dist/base/typing.d.ts +7 -1
- package/dist/base/typing.d.ts.map +1 -1
- package/dist/client/auth.d.ts +41 -7
- package/dist/client/auth.d.ts.map +1 -1
- package/dist/client/auth.js +96 -39
- package/dist/client/auth.js.map +1 -1
- package/dist/client/client.d.ts +73 -17
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +111 -44
- package/dist/client/client.js.map +1 -1
- package/dist/client/tcp.d.ts +17 -206
- package/dist/client/tcp.d.ts.map +1 -1
- package/dist/client/tcp.js +37 -715
- package/dist/client/tcp.js.map +1 -1
- package/dist/index.d.ts +12 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -12
- package/dist/index.js.map +1 -1
- package/dist/message/link.d.ts +10 -0
- package/dist/message/link.d.ts.map +1 -0
- package/dist/message/link.js +22 -0
- package/dist/message/link.js.map +1 -0
- package/dist/message/sigCache.d.ts +13 -0
- package/dist/message/sigCache.d.ts.map +1 -0
- package/dist/message/sigCache.js +26 -0
- package/dist/message/sigCache.js.map +1 -0
- package/dist/{translator → packet}/decoder.d.ts +14 -1
- package/dist/packet/decoder.d.ts.map +1 -0
- package/dist/{translator → packet}/decoder.js +24 -3
- package/dist/packet/decoder.js.map +1 -0
- package/dist/packet/dispatcher.d.ts +53 -0
- package/dist/packet/dispatcher.d.ts.map +1 -0
- package/dist/packet/dispatcher.js +738 -0
- package/dist/packet/dispatcher.js.map +1 -0
- package/dist/{translator → packet}/encoder.d.ts +4 -3
- package/dist/packet/encoder.d.ts.map +1 -0
- package/dist/{translator → packet}/encoder.js +18 -7
- package/dist/packet/encoder.js.map +1 -0
- package/dist/packet/static.d.ts.map +1 -0
- package/dist/packet/static.js.map +1 -0
- package/dist/{base → physics}/aabb.d.ts +2 -2
- package/dist/physics/aabb.d.ts.map +1 -0
- package/dist/{base → physics}/aabb.js +5 -5
- package/dist/physics/aabb.js.map +1 -0
- package/dist/physics/direction.d.ts.map +1 -0
- package/dist/physics/direction.js.map +1 -0
- package/dist/{base → physics}/player.d.ts +25 -28
- package/dist/physics/player.d.ts.map +1 -0
- package/dist/{base → physics}/player.js +81 -68
- package/dist/physics/player.js.map +1 -0
- package/dist/version/codec.d.ts +18 -0
- package/dist/version/codec.d.ts.map +1 -0
- package/dist/version/codec.js +235 -0
- package/dist/version/codec.js.map +1 -0
- package/dist/version/registry.d.ts +236 -0
- package/dist/version/registry.d.ts.map +1 -0
- package/dist/version/registry.js +284 -0
- package/dist/version/registry.js.map +1 -0
- package/dist/{base → world}/block.d.ts +5 -5
- package/dist/world/block.d.ts.map +1 -0
- package/dist/{base → world}/block.js +13 -13
- package/dist/world/block.js.map +1 -0
- package/dist/{base → world}/entity.d.ts +4 -4
- package/dist/world/entity.d.ts.map +1 -0
- package/dist/{base → world}/entity.js +6 -6
- package/dist/world/entity.js.map +1 -0
- package/dist/world/state.d.ts +175 -0
- package/dist/world/state.d.ts.map +1 -0
- package/dist/world/state.js +163 -0
- package/dist/world/state.js.map +1 -0
- package/dist/world/tick.d.ts.map +1 -0
- package/dist/world/tick.js.map +1 -0
- package/package.json +7 -2
- package/src/base/buffer.ts +12 -0
- package/src/base/error.ts +93 -4
- package/src/base/http.ts +10 -0
- package/src/base/math.ts +55 -3
- package/src/base/typing.ts +9 -1
- package/src/client/auth.ts +130 -52
- package/src/client/client.ts +182 -50
- package/src/client/tcp.ts +45 -967
- package/src/index.ts +12 -12
- package/src/message/link.ts +17 -0
- package/src/message/sigCache.ts +25 -0
- package/src/{translator → packet}/decoder.ts +24 -3
- package/src/packet/dispatcher.ts +919 -0
- package/src/{translator → packet}/encoder.ts +20 -9
- package/src/{base → physics}/aabb.ts +5 -5
- package/src/{base → physics}/player.ts +106 -65
- package/src/version/codec.ts +248 -0
- package/src/version/registry.ts +328 -0
- package/src/{base → world}/block.ts +12 -11
- package/src/{base → world}/entity.ts +5 -5
- package/src/world/state.ts +300 -0
- package/test/adapter/index.ts +14 -0
- package/test/client/index.ts +28 -21
- package/test/json/index.ts +3 -0
- package/dist/base/aabb.d.ts.map +0 -1
- package/dist/base/aabb.js.map +0 -1
- package/dist/base/block.d.ts.map +0 -1
- package/dist/base/block.js.map +0 -1
- package/dist/base/direction.d.ts.map +0 -1
- package/dist/base/direction.js.map +0 -1
- package/dist/base/entity.d.ts.map +0 -1
- package/dist/base/entity.js.map +0 -1
- package/dist/base/player.d.ts.map +0 -1
- package/dist/base/player.js.map +0 -1
- package/dist/base/registry.d.ts +0 -50
- package/dist/base/registry.d.ts.map +0 -1
- package/dist/base/registry.js +0 -89
- package/dist/base/registry.js.map +0 -1
- package/dist/base/tick.d.ts.map +0 -1
- package/dist/base/tick.js.map +0 -1
- package/dist/translator/decoder.d.ts.map +0 -1
- package/dist/translator/decoder.js.map +0 -1
- package/dist/translator/encoder.d.ts.map +0 -1
- package/dist/translator/encoder.js.map +0 -1
- package/dist/translator/static.d.ts.map +0 -1
- package/dist/translator/static.js.map +0 -1
- package/src/base/registry.ts +0 -87
- /package/assets/minecraft/{blocks.json → 26.2/blocks.json} +0 -0
- /package/assets/minecraft/{entities.json → 26.2/entities.json} +0 -0
- /package/dist/{translator → packet}/static.d.ts +0 -0
- /package/dist/{translator → packet}/static.js +0 -0
- /package/dist/{base → physics}/direction.d.ts +0 -0
- /package/dist/{base → physics}/direction.js +0 -0
- /package/dist/{base → world}/tick.d.ts +0 -0
- /package/dist/{base → world}/tick.js +0 -0
- /package/src/{translator → packet}/static.ts +0 -0
- /package/src/{base → physics}/direction.ts +0 -0
- /package/src/{base → world}/tick.ts +0 -0
package/dist/client/client.js
CHANGED
|
@@ -1,87 +1,146 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Client = void 0;
|
|
4
|
-
const
|
|
5
|
-
const block_1 = require("../
|
|
6
|
-
const entity_1 = require("../
|
|
7
|
-
const player_1 = require("../
|
|
8
|
-
const tick_1 = require("../
|
|
4
|
+
const node_events_1 = require("node:events");
|
|
5
|
+
const block_1 = require("../world/block");
|
|
6
|
+
const entity_1 = require("../world/entity");
|
|
7
|
+
const player_1 = require("../physics/player");
|
|
8
|
+
const tick_1 = require("../world/tick");
|
|
9
9
|
const tcp_1 = require("./tcp");
|
|
10
|
-
const registry_1 = require("../
|
|
11
|
-
const direction_1 = require("../
|
|
10
|
+
const registry_1 = require("../version/registry");
|
|
11
|
+
const direction_1 = require("../physics/direction");
|
|
12
|
+
const state_1 = require("../world/state");
|
|
13
|
+
const dispatcher_1 = require("../packet/dispatcher");
|
|
14
|
+
const codec_1 = require("../version/codec");
|
|
15
|
+
const auth_1 = require("./auth");
|
|
16
|
+
const math_1 = require("../base/math");
|
|
17
|
+
const error_1 = require("../base/error");
|
|
12
18
|
/**
|
|
13
19
|
* High-level client.
|
|
14
20
|
*/
|
|
15
|
-
class Client extends
|
|
21
|
+
class Client extends node_events_1.EventEmitter {
|
|
22
|
+
options;
|
|
23
|
+
static loadRegistry = false;
|
|
16
24
|
tickLoop;
|
|
17
|
-
tcp;
|
|
18
25
|
blocks;
|
|
19
26
|
entities;
|
|
20
27
|
player;
|
|
28
|
+
tcp;
|
|
29
|
+
state;
|
|
21
30
|
constructor(options) {
|
|
31
|
+
if (options.shouldVerifyMessageSignature === true && options.shouldVerifyMessageOrder !== true)
|
|
32
|
+
throw new error_1.HaveSignatureButNotIndex();
|
|
22
33
|
super();
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
this.
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
34
|
+
this.options = options;
|
|
35
|
+
// For managing shared data
|
|
36
|
+
this.state = new state_1.SharedState(options);
|
|
37
|
+
// For handling packet
|
|
38
|
+
const dispatcher = new dispatcher_1.Dispatcher(this.state, this.emit.bind(this));
|
|
39
|
+
// For reading packet
|
|
40
|
+
const versionCodec = new codec_1.VersionCodec(this.state);
|
|
41
|
+
// For throwing packet through internet
|
|
42
|
+
this.tcp = new tcp_1.TCPClient(this.state, {
|
|
43
|
+
...options,
|
|
44
|
+
protocolVersion: registry_1.ProtocolVersionMapping[options.version]
|
|
45
|
+
});
|
|
46
|
+
this.tcp.forwardPacket = versionCodec.handlePacket.bind(versionCodec);
|
|
47
|
+
this.tcp.parsePacket = versionCodec.encodePacket.bind(versionCodec);
|
|
48
|
+
this.tcp.sendInitPacket = () => {
|
|
49
|
+
dispatcher.sendHandshake();
|
|
50
|
+
dispatcher.sendLoginStart();
|
|
51
|
+
};
|
|
52
|
+
dispatcher.sendPacket = this.tcp.sendPacket.bind(this.tcp);
|
|
53
|
+
dispatcher.disconnect = this.disconnect.bind(this);
|
|
54
|
+
versionCodec.consumePacket = dispatcher.handlePacket.bind(dispatcher);
|
|
55
|
+
// For querying data
|
|
56
|
+
this.blocks = new block_1.BlockManager(this.state);
|
|
57
|
+
this.entities = new entity_1.EntitiesManager(this.state);
|
|
58
|
+
// For physics things
|
|
59
|
+
this.player = new player_1.Player(this.state, this.on, this.entities, this.blocks);
|
|
60
|
+
this.player.sendPlayerPos = dispatcher.sendPlayerPos;
|
|
61
|
+
this.player.sendPlayerPosRot = dispatcher.sendPlayerPosRot;
|
|
62
|
+
this.player.sendPlayerRot = dispatcher.sendPlayerRot;
|
|
63
|
+
this.player.sendPlayerStatus = dispatcher.sendPlayerStatus;
|
|
64
|
+
// For tick-tock tick-tock
|
|
65
|
+
this.tickLoop = new tick_1.TickLoop(() => {
|
|
66
|
+
this.state.drainMutation();
|
|
67
|
+
this.state.drainEvent()
|
|
68
|
+
.forEach(event => this.emitEvent(event));
|
|
69
|
+
this.state.drainPacket()
|
|
70
|
+
.forEach((packet) => this.tcp.sendPacket(packet.id, packet.data));
|
|
71
|
+
this.player.tick();
|
|
72
|
+
});
|
|
73
|
+
// Forward TCP events
|
|
74
|
+
this.tcp.on("connect", () => this.emit("connect"));
|
|
75
|
+
this.tcp.on("destroy", () => this.emit("destroy"));
|
|
31
76
|
}
|
|
32
|
-
|
|
33
|
-
this.
|
|
77
|
+
emitEvent(event) {
|
|
78
|
+
this.emit(event.event, ...event.args);
|
|
34
79
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
this.
|
|
40
|
-
this.
|
|
41
|
-
this.
|
|
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");
|
|
80
|
+
async loadRegistries() {
|
|
81
|
+
if (Client.loadRegistry)
|
|
82
|
+
return;
|
|
83
|
+
Client.loadRegistry = true;
|
|
84
|
+
await registry_1.BlockRegistry.load(this.options.version);
|
|
85
|
+
await registry_1.EntityRegistry.load(this.options.version);
|
|
86
|
+
await registry_1.PacketRegistry.load(this.options.version);
|
|
49
87
|
}
|
|
50
88
|
// Start / stop
|
|
51
89
|
/**
|
|
52
90
|
* Create a connection to the server
|
|
53
91
|
*/
|
|
54
|
-
connect() {
|
|
92
|
+
async connect() {
|
|
93
|
+
await this.loadRegistries();
|
|
94
|
+
if (!this.state.playerUUID) {
|
|
95
|
+
if (this.options.auth) {
|
|
96
|
+
this.state.authClient = new auth_1.AuthClient(this.options.auth);
|
|
97
|
+
const { uuid } = await this.state.authClient.getUUID();
|
|
98
|
+
this.state.playerUUID = uuid.replaceAll("-", "");
|
|
99
|
+
await this.state.startSignatureLoop();
|
|
100
|
+
}
|
|
101
|
+
else
|
|
102
|
+
this.state.playerUUID = (0, math_1.computeUUID)(this.options.playerName);
|
|
103
|
+
}
|
|
55
104
|
this.tcp.connect();
|
|
56
|
-
this.
|
|
57
|
-
this.emit("ready", this);
|
|
105
|
+
this.once("ready", () => {
|
|
58
106
|
this.player.pruneInitialVal();
|
|
59
107
|
this.player.setInitialVal();
|
|
60
108
|
this.tickLoop.start();
|
|
61
109
|
});
|
|
62
|
-
this.tcp.once("
|
|
63
|
-
this.
|
|
64
|
-
|
|
110
|
+
this.tcp.once("destroy", () => {
|
|
111
|
+
if (this.state.state === state_1.ConnectionState.Disconnected)
|
|
112
|
+
return;
|
|
113
|
+
this.disconnect("socket close");
|
|
65
114
|
});
|
|
66
115
|
}
|
|
67
116
|
/**
|
|
68
117
|
* Destroy the connection
|
|
69
118
|
*/
|
|
70
|
-
disconnect() {
|
|
119
|
+
disconnect(reason = "Disconnect", raw) {
|
|
120
|
+
this.state.state = state_1.ConnectionState.Disconnected;
|
|
121
|
+
this.state.status = state_1.ClientStatus.Disconnected;
|
|
122
|
+
this.tickLoop.stop();
|
|
123
|
+
this.player.pruneInitialVal();
|
|
124
|
+
this.state.pruneStates();
|
|
125
|
+
this.emit("disconnect", reason);
|
|
126
|
+
if (raw)
|
|
127
|
+
this.emit("disconnectRaw", raw);
|
|
71
128
|
this.tcp.disconnect();
|
|
129
|
+
if (this.options.auth)
|
|
130
|
+
this.state.stopSignatureLoop();
|
|
72
131
|
}
|
|
73
132
|
// Inputs
|
|
74
133
|
/**
|
|
75
134
|
* Press and hold a key
|
|
76
135
|
*/
|
|
77
|
-
hold(
|
|
78
|
-
this.player.input(
|
|
136
|
+
hold(inout) {
|
|
137
|
+
this.player.input(inout);
|
|
79
138
|
}
|
|
80
139
|
/**
|
|
81
140
|
* Release a key
|
|
82
141
|
*/
|
|
83
|
-
release(
|
|
84
|
-
this.player.releaseInput(
|
|
142
|
+
release(input) {
|
|
143
|
+
this.player.releaseInput(input);
|
|
85
144
|
}
|
|
86
145
|
/**
|
|
87
146
|
* Release all key
|
|
@@ -93,6 +152,14 @@ class Client extends node_stream_1.EventEmitter {
|
|
|
93
152
|
const vec3 = direction_1.Vec3.loadArgs(a, b, c);
|
|
94
153
|
return this.blocks.at(vec3);
|
|
95
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* Rotate your face
|
|
157
|
+
* @param yaw In degree
|
|
158
|
+
* @param pitch In degree
|
|
159
|
+
*/
|
|
160
|
+
lookAt(yaw, pitch) {
|
|
161
|
+
this.player.setAngle(yaw, pitch);
|
|
162
|
+
}
|
|
96
163
|
}
|
|
97
164
|
exports.Client = Client;
|
|
98
165
|
//# sourceMappingURL=client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":";;;AAAA,6CAA2C;AAC3C,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client/tcp.d.ts
CHANGED
|
@@ -1,107 +1,10 @@
|
|
|
1
1
|
import { Socket, SocketConstructorOpts } from "node:net";
|
|
2
2
|
import { TypedEmmiter } from "../base/event";
|
|
3
|
-
import {
|
|
4
|
-
import { Angle, BaseVec3 } from "../base/direction";
|
|
3
|
+
import { BinaryDecoder } from "../packet/decoder";
|
|
5
4
|
import { AuthOption } from "./auth";
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
}
|
|
5
|
+
import { SharedState } from "../world/state";
|
|
6
|
+
import { EncodeResult } from "../version/codec";
|
|
7
|
+
import { TextComponent } from "../base/typing";
|
|
105
8
|
export interface TCPClientOption {
|
|
106
9
|
/** Server host */
|
|
107
10
|
host: string;
|
|
@@ -117,10 +20,6 @@ export interface TCPClientOption {
|
|
|
117
20
|
protocolVersion: number;
|
|
118
21
|
/** Player name */
|
|
119
22
|
playerName: string;
|
|
120
|
-
/**
|
|
121
|
-
* Set to true only if you are playing in offline server or crack server
|
|
122
|
-
*/
|
|
123
|
-
isOffline?: boolean;
|
|
124
23
|
/**
|
|
125
24
|
* Send empty `Known Packet` to let server send all Registry data, which may consume a lot of bandwith
|
|
126
25
|
*/
|
|
@@ -133,71 +32,29 @@ export interface TCPClientOption {
|
|
|
133
32
|
}
|
|
134
33
|
export interface TCPClientEvents {
|
|
135
34
|
connect: [];
|
|
136
|
-
|
|
137
|
-
|
|
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];
|
|
35
|
+
raw: [buffer: Buffer];
|
|
36
|
+
destroy: [];
|
|
167
37
|
}
|
|
168
38
|
export interface Message {
|
|
169
39
|
sender: string;
|
|
170
|
-
target
|
|
40
|
+
target: string | undefined;
|
|
171
41
|
content: string;
|
|
172
42
|
raw: {
|
|
173
43
|
sender: TextComponent;
|
|
174
|
-
target
|
|
175
|
-
content
|
|
44
|
+
target: TextComponent | undefined;
|
|
45
|
+
content: TextComponent | undefined;
|
|
176
46
|
};
|
|
177
47
|
}
|
|
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
48
|
declare const TCPClient_base: new () => TypedEmmiter<TCPClientEvents>;
|
|
192
49
|
/**
|
|
193
50
|
* Low-level client. You SHOULD NOT use this client unless you know what are you doing
|
|
194
51
|
*
|
|
195
52
|
* @see https://minecraft.wiki/w/Java_Edition_protocol/Packets?oldid=3445844
|
|
196
53
|
*/
|
|
197
|
-
export declare class TCPClient
|
|
54
|
+
export declare class TCPClient extends TCPClient_base {
|
|
55
|
+
private state;
|
|
198
56
|
readonly option: TCPClientOption;
|
|
199
57
|
readonly socket: Socket;
|
|
200
|
-
server: Server | undefined;
|
|
201
58
|
/**
|
|
202
59
|
* | Value | Meaning |
|
|
203
60
|
* |-------|---------|
|
|
@@ -205,65 +62,19 @@ export declare class TCPClient<IsReady extends boolean = boolean> extends TCPCli
|
|
|
205
62
|
* | -1 | dont compress |
|
|
206
63
|
* | > 0 | compression threshold |
|
|
207
64
|
*/
|
|
208
|
-
private compressionThreshold;
|
|
209
65
|
private bufferPool;
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
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;
|
|
66
|
+
constructor(state: SharedState, option: TCPClientOption, socketOption?: SocketConstructorOpts);
|
|
67
|
+
sendInitPacket: () => void;
|
|
68
|
+
forwardPacket: (packetId: number, decoder: BinaryDecoder) => void;
|
|
69
|
+
parsePacket: (packetId: string | number, data: object) => EncodeResult;
|
|
221
70
|
/**
|
|
222
71
|
* Connect to server
|
|
223
72
|
*/
|
|
224
|
-
connect():
|
|
73
|
+
connect(): void;
|
|
225
74
|
disconnect(): void;
|
|
226
|
-
isReady(): this is TCPClient<true>;
|
|
227
|
-
checkReady(): boolean;
|
|
228
75
|
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
76
|
write(buf: Buffer): void;
|
|
254
|
-
sendPacket(packetId: number,
|
|
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;
|
|
77
|
+
sendPacket(packetId: number | string, data: Record<string, any>): void;
|
|
267
78
|
}
|
|
268
79
|
export {};
|
|
269
80
|
//# sourceMappingURL=tcp.d.ts.map
|
package/dist/client/tcp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tcp.d.ts","sourceRoot":"","sources":["../../src/client/tcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"tcp.d.ts","sourceRoot":"","sources":["../../src/client/tcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAIzD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAgB,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAQ/C,MAAM,WAAW,eAAe;IAC5B,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,KAAK,CAAC,EAAE;QACJ,8BAA8B;QAC9B,YAAY,EAAE,OAAO,CAAA;KACxB,CAAC;IAGF,IAAI,CAAC,EAAE,UAAU,CAAA;CACpB;AAED,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,EAAE,CAAC;IACZ,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrB,OAAO,EAAE,EAAE,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE;QACD,MAAM,EAAE,aAAa,CAAC;QACtB,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC;QAClC,OAAO,EAAE,aAAa,GAAG,SAAS,CAAA;KACrC,CAAA;CACJ;wCAcyD,YAAY,CAAC,eAAe,CAAC;AALvF;;;;GAIG;AACH,qBAAa,SAAU,SAAQ,cAAyD;IAchF,OAAO,CAAC,KAAK;aACG,MAAM,EAAE,eAAe;IAd3C,SAAgB,MAAM,EAAE,MAAM,CAAC;IAG/B;;;;;;OAMG;IACH,OAAO,CAAC,UAAU,CAA2B;IAE7C,YACY,KAAK,EAAE,WAAW,EACV,MAAM,EAAE,eAAe,EACvC,YAAY,CAAC,EAAE,qBAAqB,EAIvC;IAEM,cAAc,EAAE,MAAM,IAAI,CAAyC;IACnE,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,KAAK,IAAI,CAAyC;IAC1G,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,YAAY,CAAyC;IAEtH;;OAEG;IACI,OAAO,SAyBb;IAEM,UAAU,SAGhB;IAMD,OAAO,CAAC,YAAY;IAyCb,KAAK,CAAC,GAAG,EAAE,MAAM,QASvB;IAEM,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAiCrE;CAEJ"}
|