@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/src/client/client.ts
CHANGED
|
@@ -1,115 +1,238 @@
|
|
|
1
|
-
import { EventEmitter } from "node:
|
|
2
|
-
import { BlockManager, BlockState } from "../
|
|
3
|
-
import { EntitiesManager } from "../
|
|
4
|
-
import {
|
|
5
|
-
import { TickLoop } from "../
|
|
6
|
-
import {
|
|
7
|
-
import { TypedEmmiter } from "../base/event";
|
|
8
|
-
import { BlockRegistry, EntityRegistry } from "../
|
|
9
|
-
import { BaseVec3, Vec3 } from "../
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import { BlockManager, BlockState } from "../world/block";
|
|
3
|
+
import { EntitiesManager } from "../world/entity";
|
|
4
|
+
import { Input, Player } from "../physics/player";
|
|
5
|
+
import { TickLoop } from "../world/tick";
|
|
6
|
+
import { Message, TCPClient, TCPClientOption } from "./tcp";
|
|
7
|
+
import { TypedEmmiter as TypedEmitter } from "../base/event";
|
|
8
|
+
import { BlockRegistry, EntityRegistry, PacketRegistry, ProtocolVersionMapping } from "../version/registry";
|
|
9
|
+
import { BaseVec3, Vec3 } from "../physics/direction";
|
|
10
|
+
import { TextComponent } from "../base/typing";
|
|
11
|
+
import { ClientStatus, ConnectionState, EmittedEvent as EmittedEvent, Entity, SharedState } from "../world/state";
|
|
12
|
+
import { Dispatcher } from "../packet/dispatcher";
|
|
13
|
+
import { VersionCodec } from "../version/codec";
|
|
14
|
+
import { AuthClient } from "./auth";
|
|
15
|
+
import { computeUUID } from "../base/math";
|
|
16
|
+
import { HaveSignatureButNotIndex } from "../base/error";
|
|
17
|
+
|
|
18
|
+
export type ClientOption = Omit<TCPClientOption, "protocolVersion"> & {
|
|
19
|
+
version: string,
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Whenever should the client verify the message against the signature, if any
|
|
23
|
+
*
|
|
24
|
+
* When set this option to true, you HAVE TO set `shouldVerifyMessageOrder` to true
|
|
25
|
+
*/
|
|
26
|
+
shouldVerifyMessageSignature?: boolean
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Should verify the message orders to keep the sync with server.
|
|
30
|
+
*/
|
|
31
|
+
shouldVerifyMessageOrder?: boolean
|
|
32
|
+
}
|
|
10
33
|
|
|
11
34
|
export interface ClientEvents {
|
|
12
|
-
|
|
35
|
+
// TCP Events
|
|
36
|
+
/** When the TCP socket connect is initted sucessfully */
|
|
37
|
+
connect: [],
|
|
38
|
+
/** When the TCP socket connection is destroyed */
|
|
39
|
+
destroy: [],
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* When the client is ready.
|
|
43
|
+
*
|
|
44
|
+
* Specifically, when the packet `Login (play)` is received
|
|
45
|
+
*/
|
|
46
|
+
ready: [],
|
|
47
|
+
/**
|
|
48
|
+
* When the client got disconnected from sevrer
|
|
49
|
+
*/
|
|
13
50
|
disconnect: [reason: string],
|
|
51
|
+
/**
|
|
52
|
+
* When the disconection come with the raw Text Component
|
|
53
|
+
*/
|
|
14
54
|
disconnectRaw: [textComponent: TextComponent],
|
|
15
55
|
|
|
56
|
+
/**
|
|
57
|
+
* When server send `Player Position Synchronization` packet
|
|
58
|
+
*
|
|
59
|
+
* Note: this event is not fired when the client is moved by holding the input
|
|
60
|
+
*/
|
|
16
61
|
playerPosition: [position: BaseVec3],
|
|
17
62
|
|
|
63
|
+
/** When the chunk is loaded */
|
|
18
64
|
loadChunk: [chunkX: number, sectionY: number, chunkZ: number],
|
|
65
|
+
/** When the chunk got deleted by the server */
|
|
19
66
|
unloadChunk: [chunkX: number, chunkZ: number],
|
|
20
67
|
|
|
68
|
+
/** When an entity is spawned or appeared in the client view distance */
|
|
21
69
|
spawnEntity: [entity: Entity],
|
|
22
|
-
|
|
70
|
+
/** When an entity is updated, including position, rotation, etc... */
|
|
71
|
+
updateEntity: [entityId: number],
|
|
72
|
+
/** When an entity go out of client view distance or despawned */
|
|
23
73
|
removeEntity: [entityId: number],
|
|
24
74
|
|
|
25
75
|
// Chat
|
|
76
|
+
/** When a chat message got broadcasted */
|
|
26
77
|
message: [message: Message],
|
|
78
|
+
/** When a message is failed to be verified against the signature sent with it */
|
|
79
|
+
failedMessage: [message: Message],
|
|
80
|
+
/** The system message */
|
|
27
81
|
systemMessage: [message: string],
|
|
82
|
+
/** The raw system message */
|
|
28
83
|
systemMessageRaw: [textComponent: TextComponent],
|
|
84
|
+
/** The action bar */
|
|
29
85
|
actionBar: [message: string],
|
|
86
|
+
/** The raw action bar */
|
|
30
87
|
actionBarRaw: [textComponent: TextComponent],
|
|
31
88
|
}
|
|
32
89
|
|
|
33
90
|
/**
|
|
34
91
|
* High-level client.
|
|
35
92
|
*/
|
|
36
|
-
export class Client<
|
|
93
|
+
export class Client<IsReady extends boolean = boolean> extends (EventEmitter as new () => TypedEmitter<ClientEvents>) {
|
|
94
|
+
private static loadRegistry: boolean = false;
|
|
95
|
+
|
|
37
96
|
private tickLoop: TickLoop;
|
|
38
97
|
|
|
39
|
-
private tcp: TCPClient<IsTCPReady>;
|
|
40
98
|
private blocks: BlockManager;
|
|
41
99
|
private entities: EntitiesManager;
|
|
42
100
|
private player: Player;
|
|
43
101
|
|
|
44
|
-
|
|
102
|
+
private tcp: TCPClient;
|
|
103
|
+
private state: SharedState<IsReady>;
|
|
104
|
+
|
|
105
|
+
constructor(private options: ClientOption) {
|
|
106
|
+
if (options.shouldVerifyMessageSignature === true && options.shouldVerifyMessageOrder !== true)
|
|
107
|
+
throw new HaveSignatureButNotIndex();
|
|
108
|
+
|
|
45
109
|
super();
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
this.
|
|
110
|
+
|
|
111
|
+
// For managing shared data
|
|
112
|
+
this.state = new SharedState(options);
|
|
113
|
+
// For handling packet
|
|
114
|
+
const dispatcher = new Dispatcher(this.state, this.emit.bind(this));
|
|
115
|
+
// For reading packet
|
|
116
|
+
const versionCodec = new VersionCodec(this.state);
|
|
117
|
+
// For throwing packet through internet
|
|
118
|
+
this.tcp = new TCPClient(
|
|
119
|
+
this.state,
|
|
120
|
+
{
|
|
121
|
+
...options,
|
|
122
|
+
protocolVersion: ProtocolVersionMapping[options.version]!
|
|
123
|
+
}
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
this.tcp.forwardPacket = versionCodec.handlePacket.bind(versionCodec);
|
|
127
|
+
this.tcp.parsePacket = versionCodec.encodePacket.bind(versionCodec);
|
|
128
|
+
this.tcp.sendInitPacket = () => {
|
|
129
|
+
dispatcher.sendHandshake();
|
|
130
|
+
dispatcher.sendLoginStart();
|
|
131
|
+
};
|
|
132
|
+
dispatcher.sendPacket = this.tcp.sendPacket.bind(this.tcp);
|
|
133
|
+
dispatcher.disconnect = this.disconnect.bind(this);
|
|
134
|
+
versionCodec.consumePacket = dispatcher.handlePacket.bind(dispatcher);
|
|
135
|
+
|
|
136
|
+
// For querying data
|
|
137
|
+
this.blocks = new BlockManager(this.state);
|
|
138
|
+
this.entities = new EntitiesManager(this.state);
|
|
139
|
+
// For physics things
|
|
140
|
+
this.player = new Player(
|
|
141
|
+
this.state,
|
|
142
|
+
this.on,
|
|
143
|
+
this.entities,
|
|
144
|
+
this.blocks,
|
|
145
|
+
);
|
|
146
|
+
this.player.sendPlayerPos = dispatcher.sendPlayerPos;
|
|
147
|
+
this.player.sendPlayerPosRot = dispatcher.sendPlayerPosRot;
|
|
148
|
+
this.player.sendPlayerRot = dispatcher.sendPlayerRot;
|
|
149
|
+
this.player.sendPlayerStatus = dispatcher.sendPlayerStatus;
|
|
150
|
+
|
|
151
|
+
// For tick-tock tick-tock
|
|
152
|
+
this.tickLoop = new TickLoop(() => {
|
|
153
|
+
this.state.drainMutation();
|
|
154
|
+
this.state.drainEvent()
|
|
155
|
+
.forEach(event => this.emitEvent(event));
|
|
156
|
+
this.state.drainPacket()
|
|
157
|
+
.forEach((packet) => this.tcp.sendPacket(packet.id, packet.data));
|
|
158
|
+
this.player.tick();
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
// Forward TCP events
|
|
162
|
+
this.tcp.on("connect", () => this.emit("connect"));
|
|
163
|
+
this.tcp.on("destroy", () => this.emit("destroy"));
|
|
55
164
|
}
|
|
56
165
|
|
|
57
|
-
private
|
|
58
|
-
this.
|
|
166
|
+
private emitEvent(event: EmittedEvent) {
|
|
167
|
+
this.emit(event.event, ...event.args);
|
|
59
168
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
this.
|
|
65
|
-
this.
|
|
66
|
-
this.
|
|
67
|
-
this.forwardEvent("updateEntity");
|
|
68
|
-
this.forwardEvent("removeEntity");
|
|
69
|
-
this.forwardEvent("message");
|
|
70
|
-
this.forwardEvent("systemMessage");
|
|
71
|
-
this.forwardEvent("systemMessageRaw");
|
|
72
|
-
this.forwardEvent("actionBar");
|
|
73
|
-
this.forwardEvent("actionBarRaw");
|
|
169
|
+
|
|
170
|
+
private async loadRegistries() {
|
|
171
|
+
if (Client.loadRegistry) return;
|
|
172
|
+
Client.loadRegistry = true;
|
|
173
|
+
await BlockRegistry.load(this.options.version);
|
|
174
|
+
await EntityRegistry.load(this.options.version);
|
|
175
|
+
await PacketRegistry.load(this.options.version);
|
|
74
176
|
}
|
|
75
177
|
|
|
76
178
|
// Start / stop
|
|
179
|
+
|
|
77
180
|
/**
|
|
78
181
|
* Create a connection to the server
|
|
79
182
|
*/
|
|
80
|
-
public connect() {
|
|
183
|
+
public async connect() {
|
|
184
|
+
await this.loadRegistries();
|
|
185
|
+
if (!this.state.playerUUID) {
|
|
186
|
+
if (this.options.auth) {
|
|
187
|
+
this.state.authClient = new AuthClient(this.options.auth);
|
|
188
|
+
const { uuid } = await this.state.authClient.getUUID();
|
|
189
|
+
this.state.playerUUID = uuid.replaceAll("-", "");
|
|
190
|
+
await this.state.startSignatureLoop();
|
|
191
|
+
} else
|
|
192
|
+
this.state.playerUUID = computeUUID(this.options.playerName);
|
|
193
|
+
}
|
|
194
|
+
|
|
81
195
|
this.tcp.connect();
|
|
82
196
|
|
|
83
|
-
this.
|
|
84
|
-
this.emit("ready", this as Client<true>);
|
|
197
|
+
this.once("ready", () => {
|
|
85
198
|
this.player.pruneInitialVal();
|
|
86
199
|
this.player.setInitialVal();
|
|
87
200
|
this.tickLoop.start();
|
|
88
201
|
});
|
|
89
|
-
this.tcp.once("
|
|
90
|
-
this.
|
|
91
|
-
this.
|
|
202
|
+
this.tcp.once("destroy", () => {
|
|
203
|
+
if (this.state.state === ConnectionState.Disconnected) return;
|
|
204
|
+
this.disconnect("socket close");
|
|
92
205
|
});
|
|
93
206
|
}
|
|
94
207
|
/**
|
|
95
208
|
* Destroy the connection
|
|
96
209
|
*/
|
|
97
|
-
public disconnect() {
|
|
210
|
+
public disconnect(reason: string = "Disconnect", raw?: TextComponent) {
|
|
211
|
+
this.state.state = ConnectionState.Disconnected;
|
|
212
|
+
this.state.status = ClientStatus.Disconnected;
|
|
213
|
+
this.tickLoop.stop();
|
|
214
|
+
this.player.pruneInitialVal();
|
|
215
|
+
this.state.pruneStates();
|
|
216
|
+
this.emit("disconnect", reason);
|
|
217
|
+
if (raw)
|
|
218
|
+
this.emit("disconnectRaw", raw);
|
|
98
219
|
this.tcp.disconnect();
|
|
220
|
+
if (this.options.auth)
|
|
221
|
+
this.state.stopSignatureLoop();
|
|
99
222
|
}
|
|
100
223
|
|
|
101
224
|
// Inputs
|
|
102
225
|
/**
|
|
103
226
|
* Press and hold a key
|
|
104
227
|
*/
|
|
105
|
-
public hold(
|
|
106
|
-
this.player.input(
|
|
228
|
+
public hold(inout: Input) {
|
|
229
|
+
this.player.input(inout);
|
|
107
230
|
}
|
|
108
231
|
/**
|
|
109
232
|
* Release a key
|
|
110
233
|
*/
|
|
111
|
-
public release(
|
|
112
|
-
this.player.releaseInput(
|
|
234
|
+
public release(input: Input) {
|
|
235
|
+
this.player.releaseInput(input);
|
|
113
236
|
}
|
|
114
237
|
/**
|
|
115
238
|
* Release all key
|
|
@@ -128,4 +251,13 @@ export class Client<IsTCPReady extends boolean = boolean> extends (EventEmitter
|
|
|
128
251
|
const vec3 = Vec3.loadArgs(a, b, c);
|
|
129
252
|
return this.blocks.at(vec3);
|
|
130
253
|
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Rotate your face
|
|
257
|
+
* @param yaw In degree
|
|
258
|
+
* @param pitch In degree
|
|
259
|
+
*/
|
|
260
|
+
public lookAt(yaw: number, pitch: number) {
|
|
261
|
+
this.player.setAngle(yaw, pitch);
|
|
262
|
+
}
|
|
131
263
|
}
|