@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.
Files changed (149) hide show
  1. package/README.md +1 -1
  2. package/assets/minecraft/26.2/packets.json +4758 -0
  3. package/dist/base/buffer.d.ts +2 -0
  4. package/dist/base/buffer.d.ts.map +1 -0
  5. package/dist/base/buffer.js +12 -0
  6. package/dist/base/buffer.js.map +1 -0
  7. package/dist/base/error.d.ts +59 -3
  8. package/dist/base/error.d.ts.map +1 -1
  9. package/dist/base/error.js +123 -7
  10. package/dist/base/error.js.map +1 -1
  11. package/dist/base/http.d.ts +2 -0
  12. package/dist/base/http.d.ts.map +1 -0
  13. package/dist/base/http.js +14 -0
  14. package/dist/base/http.js.map +1 -0
  15. package/dist/base/math.d.ts +22 -1
  16. package/dist/base/math.d.ts.map +1 -1
  17. package/dist/base/math.js +49 -2
  18. package/dist/base/math.js.map +1 -1
  19. package/dist/base/typing.d.ts +7 -1
  20. package/dist/base/typing.d.ts.map +1 -1
  21. package/dist/client/auth.d.ts +41 -7
  22. package/dist/client/auth.d.ts.map +1 -1
  23. package/dist/client/auth.js +96 -39
  24. package/dist/client/auth.js.map +1 -1
  25. package/dist/client/client.d.ts +73 -17
  26. package/dist/client/client.d.ts.map +1 -1
  27. package/dist/client/client.js +111 -44
  28. package/dist/client/client.js.map +1 -1
  29. package/dist/client/tcp.d.ts +17 -206
  30. package/dist/client/tcp.d.ts.map +1 -1
  31. package/dist/client/tcp.js +37 -715
  32. package/dist/client/tcp.js.map +1 -1
  33. package/dist/index.d.ts +12 -12
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +12 -12
  36. package/dist/index.js.map +1 -1
  37. package/dist/message/link.d.ts +10 -0
  38. package/dist/message/link.d.ts.map +1 -0
  39. package/dist/message/link.js +22 -0
  40. package/dist/message/link.js.map +1 -0
  41. package/dist/message/sigCache.d.ts +13 -0
  42. package/dist/message/sigCache.d.ts.map +1 -0
  43. package/dist/message/sigCache.js +26 -0
  44. package/dist/message/sigCache.js.map +1 -0
  45. package/dist/{translator → packet}/decoder.d.ts +14 -1
  46. package/dist/packet/decoder.d.ts.map +1 -0
  47. package/dist/{translator → packet}/decoder.js +24 -3
  48. package/dist/packet/decoder.js.map +1 -0
  49. package/dist/packet/dispatcher.d.ts +53 -0
  50. package/dist/packet/dispatcher.d.ts.map +1 -0
  51. package/dist/packet/dispatcher.js +738 -0
  52. package/dist/packet/dispatcher.js.map +1 -0
  53. package/dist/{translator → packet}/encoder.d.ts +4 -3
  54. package/dist/packet/encoder.d.ts.map +1 -0
  55. package/dist/{translator → packet}/encoder.js +18 -7
  56. package/dist/packet/encoder.js.map +1 -0
  57. package/dist/packet/static.d.ts.map +1 -0
  58. package/dist/packet/static.js.map +1 -0
  59. package/dist/{base → physics}/aabb.d.ts +2 -2
  60. package/dist/physics/aabb.d.ts.map +1 -0
  61. package/dist/{base → physics}/aabb.js +5 -5
  62. package/dist/physics/aabb.js.map +1 -0
  63. package/dist/physics/direction.d.ts.map +1 -0
  64. package/dist/physics/direction.js.map +1 -0
  65. package/dist/{base → physics}/player.d.ts +25 -28
  66. package/dist/physics/player.d.ts.map +1 -0
  67. package/dist/{base → physics}/player.js +81 -68
  68. package/dist/physics/player.js.map +1 -0
  69. package/dist/version/codec.d.ts +18 -0
  70. package/dist/version/codec.d.ts.map +1 -0
  71. package/dist/version/codec.js +235 -0
  72. package/dist/version/codec.js.map +1 -0
  73. package/dist/version/registry.d.ts +236 -0
  74. package/dist/version/registry.d.ts.map +1 -0
  75. package/dist/version/registry.js +284 -0
  76. package/dist/version/registry.js.map +1 -0
  77. package/dist/{base → world}/block.d.ts +5 -5
  78. package/dist/world/block.d.ts.map +1 -0
  79. package/dist/{base → world}/block.js +13 -13
  80. package/dist/world/block.js.map +1 -0
  81. package/dist/{base → world}/entity.d.ts +4 -4
  82. package/dist/world/entity.d.ts.map +1 -0
  83. package/dist/{base → world}/entity.js +6 -6
  84. package/dist/world/entity.js.map +1 -0
  85. package/dist/world/state.d.ts +175 -0
  86. package/dist/world/state.d.ts.map +1 -0
  87. package/dist/world/state.js +163 -0
  88. package/dist/world/state.js.map +1 -0
  89. package/dist/world/tick.d.ts.map +1 -0
  90. package/dist/world/tick.js.map +1 -0
  91. package/package.json +7 -2
  92. package/src/base/buffer.ts +12 -0
  93. package/src/base/error.ts +93 -4
  94. package/src/base/http.ts +10 -0
  95. package/src/base/math.ts +55 -3
  96. package/src/base/typing.ts +9 -1
  97. package/src/client/auth.ts +130 -52
  98. package/src/client/client.ts +182 -50
  99. package/src/client/tcp.ts +45 -967
  100. package/src/index.ts +12 -12
  101. package/src/message/link.ts +17 -0
  102. package/src/message/sigCache.ts +25 -0
  103. package/src/{translator → packet}/decoder.ts +24 -3
  104. package/src/packet/dispatcher.ts +919 -0
  105. package/src/{translator → packet}/encoder.ts +20 -9
  106. package/src/{base → physics}/aabb.ts +5 -5
  107. package/src/{base → physics}/player.ts +106 -65
  108. package/src/version/codec.ts +248 -0
  109. package/src/version/registry.ts +328 -0
  110. package/src/{base → world}/block.ts +12 -11
  111. package/src/{base → world}/entity.ts +5 -5
  112. package/src/world/state.ts +300 -0
  113. package/test/adapter/index.ts +14 -0
  114. package/test/client/index.ts +28 -21
  115. package/test/json/index.ts +3 -0
  116. package/dist/base/aabb.d.ts.map +0 -1
  117. package/dist/base/aabb.js.map +0 -1
  118. package/dist/base/block.d.ts.map +0 -1
  119. package/dist/base/block.js.map +0 -1
  120. package/dist/base/direction.d.ts.map +0 -1
  121. package/dist/base/direction.js.map +0 -1
  122. package/dist/base/entity.d.ts.map +0 -1
  123. package/dist/base/entity.js.map +0 -1
  124. package/dist/base/player.d.ts.map +0 -1
  125. package/dist/base/player.js.map +0 -1
  126. package/dist/base/registry.d.ts +0 -50
  127. package/dist/base/registry.d.ts.map +0 -1
  128. package/dist/base/registry.js +0 -89
  129. package/dist/base/registry.js.map +0 -1
  130. package/dist/base/tick.d.ts.map +0 -1
  131. package/dist/base/tick.js.map +0 -1
  132. package/dist/translator/decoder.d.ts.map +0 -1
  133. package/dist/translator/decoder.js.map +0 -1
  134. package/dist/translator/encoder.d.ts.map +0 -1
  135. package/dist/translator/encoder.js.map +0 -1
  136. package/dist/translator/static.d.ts.map +0 -1
  137. package/dist/translator/static.js.map +0 -1
  138. package/src/base/registry.ts +0 -87
  139. /package/assets/minecraft/{blocks.json → 26.2/blocks.json} +0 -0
  140. /package/assets/minecraft/{entities.json → 26.2/entities.json} +0 -0
  141. /package/dist/{translator → packet}/static.d.ts +0 -0
  142. /package/dist/{translator → packet}/static.js +0 -0
  143. /package/dist/{base → physics}/direction.d.ts +0 -0
  144. /package/dist/{base → physics}/direction.js +0 -0
  145. /package/dist/{base → world}/tick.d.ts +0 -0
  146. /package/dist/{base → world}/tick.js +0 -0
  147. /package/src/{translator → packet}/static.ts +0 -0
  148. /package/src/{base → physics}/direction.ts +0 -0
  149. /package/src/{base → world}/tick.ts +0 -0
@@ -1,115 +1,238 @@
1
- import { EventEmitter } from "node:stream";
2
- import { BlockManager, BlockState } from "../base/block";
3
- import { EntitiesManager } from "../base/entity";
4
- import { MoveDirection, Player } from "../base/player";
5
- import { TickLoop } from "../base/tick";
6
- import { Entity, Message, TCPClient, TCPClientEvents, TCPClientOption, TextComponent } from "./tcp";
7
- import { TypedEmmiter } from "../base/event";
8
- import { BlockRegistry, EntityRegistry } from "../base/registry";
9
- import { BaseVec3, Vec3 } from "../base/direction";
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
- ready: [readyClient: Client<true>],
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
- updateEntity: [entity: Entity],
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<IsTCPReady extends boolean = boolean> extends (EventEmitter as new () => TypedEmmiter<ClientEvents>) {
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
- constructor(options: TCPClientOption) {
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
- BlockRegistry.load();
47
- EntityRegistry.load();
48
-
49
- this.tcp = new TCPClient(options);
50
- this.blocks = new BlockManager(this.tcp);
51
- this.entities = new EntitiesManager(this.tcp);
52
- this.player = new Player(this.entities, this.blocks, this.tcp);
53
- this.tickLoop = new TickLoop(() => this.player.tick());
54
- this.forwardEvents();
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 forwardEvent(eventName: keyof ClientEvents & keyof TCPClientEvents) {
58
- this.tcp.on(eventName, (...args) => this.emit(eventName, ...args));
166
+ private emitEvent(event: EmittedEvent) {
167
+ this.emit(event.event, ...event.args);
59
168
  }
60
- private forwardEvents() {
61
- this.forwardEvent("disconnect");
62
- this.forwardEvent("disconnectRaw");
63
- this.forwardEvent("loadChunk");
64
- this.forwardEvent("unloadChunk");
65
- this.forwardEvent("playerPosition");
66
- this.forwardEvent("spawnEntity");
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.tcp.once("ready", () => {
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("disconnect", () => {
90
- this.tickLoop.stop();
91
- this.player.pruneInitialVal();
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(direction: MoveDirection) {
106
- this.player.input(direction);
228
+ public hold(inout: Input) {
229
+ this.player.input(inout);
107
230
  }
108
231
  /**
109
232
  * Release a key
110
233
  */
111
- public release(direction: MoveDirection) {
112
- this.player.releaseInput(direction);
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
  }