@vaitosoi/minejs 0.2.2 → 0.3.1

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 (118) hide show
  1. package/assets/minecraft/26.2/packets.json +4741 -0
  2. package/dist/base/error.d.ts +29 -0
  3. package/dist/base/error.d.ts.map +1 -1
  4. package/dist/base/error.js +54 -1
  5. package/dist/base/error.js.map +1 -1
  6. package/dist/base/typing.d.ts +7 -1
  7. package/dist/base/typing.d.ts.map +1 -1
  8. package/dist/client/client.d.ts +25 -14
  9. package/dist/client/client.d.ts.map +1 -1
  10. package/dist/client/client.js +73 -35
  11. package/dist/client/client.js.map +1 -1
  12. package/dist/client/tcp.d.ts +16 -201
  13. package/dist/client/tcp.d.ts.map +1 -1
  14. package/dist/client/tcp.js +41 -706
  15. package/dist/client/tcp.js.map +1 -1
  16. package/dist/index.d.ts +12 -12
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +12 -12
  19. package/dist/index.js.map +1 -1
  20. package/dist/{translator → packet}/decoder.d.ts +1 -1
  21. package/dist/packet/decoder.d.ts.map +1 -0
  22. package/dist/{translator → packet}/decoder.js +3 -3
  23. package/dist/packet/decoder.js.map +1 -0
  24. package/dist/packet/dispatcher.d.ts +46 -0
  25. package/dist/packet/dispatcher.d.ts.map +1 -0
  26. package/dist/packet/dispatcher.js +626 -0
  27. package/dist/packet/dispatcher.js.map +1 -0
  28. package/dist/{translator → packet}/encoder.d.ts +4 -3
  29. package/dist/packet/encoder.d.ts.map +1 -0
  30. package/dist/{translator → packet}/encoder.js +18 -7
  31. package/dist/packet/encoder.js.map +1 -0
  32. package/dist/packet/static.d.ts.map +1 -0
  33. package/dist/packet/static.js.map +1 -0
  34. package/dist/{base → physics}/aabb.d.ts +2 -2
  35. package/dist/physics/aabb.d.ts.map +1 -0
  36. package/dist/{base → physics}/aabb.js +5 -5
  37. package/dist/physics/aabb.js.map +1 -0
  38. package/dist/physics/direction.d.ts.map +1 -0
  39. package/dist/physics/direction.js.map +1 -0
  40. package/dist/{base → physics}/player.d.ts +8 -5
  41. package/dist/physics/player.d.ts.map +1 -0
  42. package/dist/{base → physics}/player.js +40 -25
  43. package/dist/physics/player.js.map +1 -0
  44. package/dist/version/codec.d.ts +18 -0
  45. package/dist/version/codec.d.ts.map +1 -0
  46. package/dist/version/codec.js +214 -0
  47. package/dist/version/codec.js.map +1 -0
  48. package/dist/version/registry.d.ts +236 -0
  49. package/dist/version/registry.d.ts.map +1 -0
  50. package/dist/version/registry.js +289 -0
  51. package/dist/version/registry.js.map +1 -0
  52. package/dist/{base → world}/block.d.ts +5 -5
  53. package/dist/world/block.d.ts.map +1 -0
  54. package/dist/{base → world}/block.js +13 -13
  55. package/dist/world/block.js.map +1 -0
  56. package/dist/{base → world}/entity.d.ts +4 -4
  57. package/dist/world/entity.d.ts.map +1 -0
  58. package/dist/{base → world}/entity.js +6 -6
  59. package/dist/world/entity.js.map +1 -0
  60. package/dist/world/state.d.ts +151 -0
  61. package/dist/world/state.d.ts.map +1 -0
  62. package/dist/world/state.js +108 -0
  63. package/dist/world/state.js.map +1 -0
  64. package/dist/world/tick.d.ts.map +1 -0
  65. package/dist/world/tick.js.map +1 -0
  66. package/package.json +7 -2
  67. package/src/base/error.ts +36 -0
  68. package/src/base/typing.ts +9 -1
  69. package/src/client/client.ts +99 -42
  70. package/src/client/tcp.ts +49 -954
  71. package/src/index.ts +12 -12
  72. package/src/{translator → packet}/decoder.ts +3 -3
  73. package/src/packet/dispatcher.ts +785 -0
  74. package/src/{translator → packet}/encoder.ts +20 -9
  75. package/src/{base → physics}/aabb.ts +5 -5
  76. package/src/{base → physics}/player.ts +41 -25
  77. package/src/version/codec.ts +227 -0
  78. package/src/version/registry.ts +333 -0
  79. package/src/{base → world}/block.ts +12 -11
  80. package/src/{base → world}/entity.ts +5 -5
  81. package/src/world/state.ts +232 -0
  82. package/test/adapter/index.ts +14 -0
  83. package/test/client/index.ts +1 -1
  84. package/test/json/index.ts +3 -0
  85. package/dist/base/aabb.d.ts.map +0 -1
  86. package/dist/base/aabb.js.map +0 -1
  87. package/dist/base/block.d.ts.map +0 -1
  88. package/dist/base/block.js.map +0 -1
  89. package/dist/base/direction.d.ts.map +0 -1
  90. package/dist/base/direction.js.map +0 -1
  91. package/dist/base/entity.d.ts.map +0 -1
  92. package/dist/base/entity.js.map +0 -1
  93. package/dist/base/player.d.ts.map +0 -1
  94. package/dist/base/player.js.map +0 -1
  95. package/dist/base/registry.d.ts +0 -50
  96. package/dist/base/registry.d.ts.map +0 -1
  97. package/dist/base/registry.js +0 -89
  98. package/dist/base/registry.js.map +0 -1
  99. package/dist/base/tick.d.ts.map +0 -1
  100. package/dist/base/tick.js.map +0 -1
  101. package/dist/translator/decoder.d.ts.map +0 -1
  102. package/dist/translator/decoder.js.map +0 -1
  103. package/dist/translator/encoder.d.ts.map +0 -1
  104. package/dist/translator/encoder.js.map +0 -1
  105. package/dist/translator/static.d.ts.map +0 -1
  106. package/dist/translator/static.js.map +0 -1
  107. package/src/base/registry.ts +0 -87
  108. /package/assets/minecraft/{blocks.json → 26.2/blocks.json} +0 -0
  109. /package/assets/minecraft/{entities.json → 26.2/entities.json} +0 -0
  110. /package/dist/{translator → packet}/static.d.ts +0 -0
  111. /package/dist/{translator → packet}/static.js +0 -0
  112. /package/dist/{base → physics}/direction.d.ts +0 -0
  113. /package/dist/{base → physics}/direction.js +0 -0
  114. /package/dist/{base → world}/tick.d.ts +0 -0
  115. /package/dist/{base → world}/tick.js +0 -0
  116. /package/src/{translator → packet}/static.ts +0 -0
  117. /package/src/{base → physics}/direction.ts +0 -0
  118. /package/src/{base → world}/tick.ts +0 -0
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SharedState = exports.ConnectionState = exports.ClientStatus = exports.GameMode = void 0;
4
+ const error_1 = require("../base/error");
5
+ var GameMode;
6
+ (function (GameMode) {
7
+ GameMode[GameMode["Survival"] = 0] = "Survival";
8
+ GameMode[GameMode["Creative"] = 1] = "Creative";
9
+ GameMode[GameMode["Adventure"] = 2] = "Adventure";
10
+ GameMode[GameMode["Spectator"] = 3] = "Spectator";
11
+ })(GameMode || (exports.GameMode = GameMode = {}));
12
+ var ClientStatus;
13
+ (function (ClientStatus) {
14
+ ClientStatus[ClientStatus["Disconnected"] = 0] = "Disconnected";
15
+ ClientStatus[ClientStatus["Connecting"] = 1] = "Connecting";
16
+ ClientStatus[ClientStatus["Logining"] = 2] = "Logining";
17
+ ClientStatus[ClientStatus["Ready"] = 3] = "Ready";
18
+ })(ClientStatus || (exports.ClientStatus = ClientStatus = {}));
19
+ var ConnectionState;
20
+ (function (ConnectionState) {
21
+ ConnectionState[ConnectionState["Disconnected"] = 0] = "Disconnected";
22
+ ConnectionState[ConnectionState["Handshake"] = 1] = "Handshake";
23
+ ConnectionState[ConnectionState["Login"] = 2] = "Login";
24
+ ConnectionState[ConnectionState["Configure"] = 3] = "Configure";
25
+ ConnectionState[ConnectionState["Play"] = 4] = "Play";
26
+ })(ConnectionState || (exports.ConnectionState = ConnectionState = {}));
27
+ class SharedState {
28
+ clientOptions;
29
+ getUuid;
30
+ mutationQueue = [];
31
+ eventQueue = [];
32
+ sendQueue = [];
33
+ state = ConnectionState.Disconnected;
34
+ status = ClientStatus.Disconnected;
35
+ compressionThreshold = 0;
36
+ sharedSecret = undefined;
37
+ cipher = undefined;
38
+ decipher = undefined;
39
+ server = undefined;
40
+ registry = undefined;
41
+ world = null;
42
+ player = null;
43
+ constructor(clientOptions, getUuid) {
44
+ this.clientOptions = clientOptions;
45
+ this.getUuid = getUuid;
46
+ }
47
+ isReady() {
48
+ return this.status === ClientStatus.Ready;
49
+ }
50
+ checkReady() {
51
+ if (!this.isReady())
52
+ throw new error_1.ClientNotReady();
53
+ }
54
+ pruneStates() {
55
+ this.mutationQueue = [];
56
+ this.eventQueue = [];
57
+ this.sendQueue = [];
58
+ this.state = ConnectionState.Disconnected;
59
+ this.compressionThreshold = 0;
60
+ this.sharedSecret = undefined;
61
+ this.cipher = undefined;
62
+ this.decipher = undefined;
63
+ this.server = undefined;
64
+ this.registry = undefined;
65
+ this.world = undefined;
66
+ this.player = undefined;
67
+ }
68
+ enqueueMutation(mutation) { this.mutationQueue.push(mutation); }
69
+ enqueuePacket(packet, data) {
70
+ if (typeof packet === "string")
71
+ this.sendQueue.push({
72
+ id: packet,
73
+ data: data
74
+ });
75
+ else
76
+ this.sendQueue.push(packet);
77
+ }
78
+ enqueueEvent(event, ...args) {
79
+ if (typeof event === "string")
80
+ this.eventQueue.push({
81
+ event,
82
+ args: args
83
+ });
84
+ else
85
+ this.eventQueue.push(event);
86
+ }
87
+ drainMutation() {
88
+ while (true) {
89
+ const mutation = this.mutationQueue.shift();
90
+ if (mutation)
91
+ mutation(this);
92
+ else
93
+ break;
94
+ }
95
+ }
96
+ drainEvent() {
97
+ const events = structuredClone(this.eventQueue);
98
+ this.eventQueue = [];
99
+ return events;
100
+ }
101
+ drainPacket() {
102
+ const packets = structuredClone(this.sendQueue);
103
+ this.sendQueue = [];
104
+ return packets;
105
+ }
106
+ }
107
+ exports.SharedState = SharedState;
108
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/world/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tick.d.ts","sourceRoot":"","sources":["../../src/world/tick.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,QAAQ;IAUb,OAAO,CAAC,MAAM;IATlB,gBAAuB,OAAO,MAAM;IACpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAqC;IACpE,gBAAuB,iBAAiB,MAAM;IAE9C,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,KAAK,CAAa;IAE1B,YACY,MAAM,EAAE,MAAM,GAAG,EAI5B;IAEM,KAAK,SAIX;IAEM,IAAI,SAIV;IAED,OAAO,CAAC,IAAI;CAiBf"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tick.js","sourceRoot":"","sources":["../../src/world/tick.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACH;IAUgB,MAAM;IATX,MAAM,CAAU,OAAO,GAAG,EAAE,CAAC;IAC5B,MAAM,CAAU,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,QAAU,CAAC;IAC7D,MAAM,CAAU,iBAAiB,GAAG,EAAE,CAAC;IAEtC,OAAO,CAAU;IACjB,YAAY,CAAS;IACrB,KAAK,GAAQ,IAAI,CAAC;IAE1B,YACY,MAAiB;sBAAjB,MAAM;QAEd,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAEM,KAAK;QACR,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,EAAE,CAAC;IAChB,CAAC;IAEM,IAAI;QACP,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAEO,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAE/B,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACpC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC,YAAY,GAAG,GAAG,IAAI,QAAQ,GAAG,QAAQ,CAAC,iBAAiB,EAAE,CAAC;YACtE,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,YAAY,IAAI,QAAQ,CAAC,OAAO,CAAC;YACtC,QAAQ,EAAE,CAAC;QACf,CAAC;QAED,IAAI,QAAQ,IAAI,QAAQ,CAAC,iBAAiB;YACtC,IAAI,CAAC,YAAY,GAAG,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC;QAE/C,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;QAClF,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACrE,CAAC;CACJ"}
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@vaitosoi/minejs",
3
- "version": "0.2.2",
3
+ "version": "0.3.1",
4
4
  "description": "A Minecraft client package",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "url": "git+https://github.com/VaitoSoi/minejs"
8
8
  },
9
+ "homepage": "https://minejs.vaito.dev/",
9
10
  "publishConfig": {
10
11
  "registry": "https://registry.npmjs.org/",
11
12
  "access": "public"
@@ -23,6 +24,9 @@
23
24
  "engines": {
24
25
  "node": ">=22"
25
26
  },
27
+ "scripts": {
28
+ "prepare": "eslint . --fix && tsc --noEmit"
29
+ },
26
30
  "devDependencies": {
27
31
  "@clean-jsdoc-theme/typedoc": "5.0.5",
28
32
  "@eslint/js": "^10.0.1",
@@ -38,7 +42,8 @@
38
42
  "typescript-eslint": "^8.60.1"
39
43
  },
40
44
  "dependencies": {
41
- "bitset": "^5.2.3"
45
+ "bitset": "^5.2.3",
46
+ "zod": "^4.4.3"
42
47
  },
43
48
  "packageManager": "pnpm@11.15.1+sha512.81350b07e53c9538a02f1f2303b4290fa2d7be04e56e2a970c4cc4b417dc761de196edabd49d55c7dc9580db81007c44143e4e3d7e462b3000d23c255122d065"
44
49
  }
package/src/base/error.ts CHANGED
@@ -115,4 +115,40 @@ export class ClientNotReady extends Error {
115
115
  constructor() {
116
116
  super(`client is not ready`);
117
117
  }
118
+ }
119
+
120
+ /** @hidden */
121
+ export class VersionNotSupport extends Error {
122
+ constructor(public version: string) {
123
+ super(`version ${version} is not supported`);
124
+ }
125
+ }
126
+
127
+ /** @hidden */
128
+ export class CantReadFile extends Error {
129
+ constructor(public path: string) {
130
+ super(`can't read file at "${path}"`);
131
+ }
132
+ }
133
+
134
+ /** @hidden */
135
+ export class InvalidPacketStructure extends Error {
136
+ constructor(public path: string, public zodIssue?: any[]) {
137
+ super(`packet structure in file "${path}" is invalid` + (zodIssue?.length ? ", zod issue: " + JSON.stringify(zodIssue, null, 4) : ""));
138
+ }
139
+ }
140
+
141
+
142
+ /** @hidden */
143
+ export class MissingPacketField extends Error {
144
+ constructor(public packetId: number, public field: string, public need: string) {
145
+ super(`${packetId}: ${field} need ${need}, but not found`);
146
+ }
147
+ }
148
+
149
+ /** @hidden */
150
+ export class MissingField extends Error {
151
+ constructor(public field: string, public where: string) {
152
+ super(`missing ${field} in ${where}`);
153
+ }
118
154
  }
@@ -1,2 +1,10 @@
1
1
  /** @hidden */
2
- export type If<Condition extends boolean, True, False = null> = Condition extends true ? True : False;
2
+ export type If<Condition extends boolean, True, False = null> = Condition extends true ? True : Condition extends false ? False : True | False;
3
+
4
+
5
+ /**
6
+ * Representing a TextComponent
7
+ *
8
+ * @see https://minecraft.wiki/w/Text_component_format
9
+ */
10
+ export type TextComponent = Record<string, any>;
@@ -1,15 +1,26 @@
1
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";
2
+ import { BlockManager, BlockState } from "../world/block";
3
+ import { EntitiesManager } from "../world/entity";
4
+ import { MoveDirection, 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 { 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
+
17
+ export type ClientOption = Omit<TCPClientOption, "protocolVersion"> & { version: string }
10
18
 
11
19
  export interface ClientEvents {
12
- ready: [readyClient: Client<true>],
20
+ connect: [],
21
+ destroy: [],
22
+
23
+ ready: [],
13
24
  disconnect: [reason: string],
14
25
  disconnectRaw: [textComponent: TextComponent],
15
26
 
@@ -19,7 +30,7 @@ export interface ClientEvents {
19
30
  unloadChunk: [chunkX: number, chunkZ: number],
20
31
 
21
32
  spawnEntity: [entity: Entity],
22
- updateEntity: [entity: Entity],
33
+ updateEntity: [entityId: number],
23
34
  removeEntity: [entityId: number],
24
35
 
25
36
  // Chat
@@ -33,60 +44,106 @@ export interface ClientEvents {
33
44
  /**
34
45
  * High-level client.
35
46
  */
36
- export class Client<IsTCPReady extends boolean = boolean> extends (EventEmitter as new () => TypedEmmiter<ClientEvents>) {
47
+ export class Client<IsReady extends boolean = boolean> extends (EventEmitter as new () => TypedEmitter<ClientEvents>) {
48
+ private static loadRegistry: boolean = false;
49
+
37
50
  private tickLoop: TickLoop;
38
51
 
39
- private tcp: TCPClient<IsTCPReady>;
40
52
  private blocks: BlockManager;
41
53
  private entities: EntitiesManager;
42
54
  private player: Player;
55
+ private uuid: Buffer = Buffer.alloc(0);
56
+
57
+ private tcp: TCPClient;
58
+ private state: SharedState<IsReady>;
43
59
 
44
- constructor(options: TCPClientOption) {
60
+ constructor(private options: ClientOption) {
45
61
  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();
62
+
63
+ // For managing shared data
64
+ this.state = new SharedState(options, () => this.uuid);
65
+ // For handling packet
66
+ const dispatcher = new Dispatcher(this.state, this.emit.bind(this));
67
+ // For reading packet
68
+ const versionCodec = new VersionCodec(this.state);
69
+ // For throwing packet through internet
70
+ this.tcp = new TCPClient(
71
+ this.state,
72
+ {
73
+ ...options,
74
+ protocolVersion: ProtocolVersionMapping[options.version]!
75
+ }
76
+ );
77
+
78
+ this.tcp.forwardPacket = versionCodec.handlePacket.bind(versionCodec);
79
+ this.tcp.parsePacket = versionCodec.encodePacket.bind(versionCodec);
80
+ this.tcp.sendInitPacket = () => {
81
+ dispatcher.sendHandshake();
82
+ dispatcher.sendLoginStart();
83
+ };
84
+ dispatcher.sendPacket = this.tcp.sendPacket.bind(this.tcp);
85
+ dispatcher.tcpDisconnect = this.tcp.disconnect.bind(this.tcp);
86
+ versionCodec.consumePacket = dispatcher.handlePacket.bind(dispatcher);
87
+
88
+ // For querying data
89
+ this.blocks = new BlockManager(this.state);
90
+ this.entities = new EntitiesManager(this.state);
91
+ // For physics things
92
+ this.player = new Player(
93
+ this.state,
94
+ this.on,
95
+ this.entities,
96
+ this.blocks,
97
+ );
98
+
99
+ // For tick-tock tick-tock
100
+ this.tickLoop = new TickLoop(() => {
101
+ this.state.drainMutation();
102
+ this.state.drainEvent()
103
+ .forEach(event => this.emitEvent(event));
104
+ this.state.drainPacket()
105
+ .forEach((packet) => this.tcp.sendPacket(packet.id, packet.data));
106
+ this.player.tick();
107
+ });
55
108
  }
56
109
 
57
- private forwardEvent(eventName: keyof ClientEvents & keyof TCPClientEvents) {
58
- this.tcp.on(eventName, (...args) => this.emit(eventName, ...args));
110
+ private emitEvent(event: EmittedEvent) {
111
+ this.emit(event.event, ...event.args);
59
112
  }
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");
113
+
114
+ private async loadRegistries() {
115
+ if (Client.loadRegistry) return;
116
+ Client.loadRegistry = true;
117
+ await BlockRegistry.load(this.options.version);
118
+ await EntityRegistry.load(this.options.version);
119
+ await PacketRegistry.load(this.options.version);
74
120
  }
75
121
 
76
122
  // Start / stop
123
+
77
124
  /**
78
125
  * Create a connection to the server
79
126
  */
80
- public connect() {
127
+ public async connect() {
128
+ await this.loadRegistries();
129
+
130
+ if (!this.uuid.length) {
131
+ if (this.options.auth) {
132
+ const authClient = new AuthClient(this.options.auth);
133
+ const { uuid } = await authClient.auth();
134
+ this.uuid = Buffer.from(uuid);
135
+ } else
136
+ this.uuid = computeUUID(this.options.playerName);
137
+ }
138
+
81
139
  this.tcp.connect();
82
140
 
83
- this.tcp.once("ready", () => {
84
- this.emit("ready", this as Client<true>);
141
+ this.once("ready", () => {
85
142
  this.player.pruneInitialVal();
86
143
  this.player.setInitialVal();
87
144
  this.tickLoop.start();
88
145
  });
89
- this.tcp.once("disconnect", () => {
146
+ this.once("disconnect", () => {
90
147
  this.tickLoop.stop();
91
148
  this.player.pruneInitialVal();
92
149
  });