@vaitosoi/minejs 0.2.1 → 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/bitset.d.ts +9 -0
  3. package/dist/base/bitset.d.ts.map +1 -0
  4. package/dist/base/bitset.js +46 -0
  5. package/dist/base/bitset.js.map +1 -0
  6. package/dist/base/error.d.ts +105 -0
  7. package/dist/base/error.d.ts.map +1 -0
  8. package/dist/base/error.js +194 -0
  9. package/dist/base/error.js.map +1 -0
  10. package/dist/base/event.d.ts +7 -0
  11. package/dist/base/event.d.ts.map +1 -0
  12. package/dist/base/event.js +3 -0
  13. package/dist/base/event.js.map +1 -0
  14. package/dist/base/math.d.ts +25 -0
  15. package/dist/base/math.d.ts.map +1 -0
  16. package/dist/base/math.js +69 -0
  17. package/dist/base/math.js.map +1 -0
  18. package/dist/base/typing.d.ts +9 -0
  19. package/dist/base/typing.d.ts.map +1 -0
  20. package/dist/base/typing.js +3 -0
  21. package/dist/base/typing.js.map +1 -0
  22. package/dist/client/auth.d.ts +39 -0
  23. package/dist/client/auth.d.ts.map +1 -0
  24. package/dist/client/auth.js +307 -0
  25. package/dist/client/auth.js.map +1 -0
  26. package/dist/client/client.d.ts +73 -0
  27. package/dist/client/client.d.ts.map +1 -0
  28. package/dist/client/client.js +136 -0
  29. package/dist/client/client.js.map +1 -0
  30. package/dist/client/static.d.ts +28 -0
  31. package/dist/client/static.d.ts.map +1 -0
  32. package/dist/client/static.js +43 -0
  33. package/dist/client/static.js.map +1 -0
  34. package/dist/client/tcp.d.ts +84 -0
  35. package/dist/client/tcp.d.ts.map +1 -0
  36. package/dist/client/tcp.js +173 -0
  37. package/dist/client/tcp.js.map +1 -0
  38. package/dist/index.d.ts +21 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +12 -12
  41. package/dist/index.js.map +1 -0
  42. package/dist/packet/decoder.d.ts +293 -0
  43. package/dist/packet/decoder.d.ts.map +1 -0
  44. package/dist/packet/decoder.js +668 -0
  45. package/dist/packet/decoder.js.map +1 -0
  46. package/dist/packet/dispatcher.d.ts +46 -0
  47. package/dist/packet/dispatcher.d.ts.map +1 -0
  48. package/dist/packet/dispatcher.js +626 -0
  49. package/dist/packet/dispatcher.js.map +1 -0
  50. package/dist/packet/encoder.d.ts +163 -0
  51. package/dist/packet/encoder.d.ts.map +1 -0
  52. package/dist/packet/encoder.js +441 -0
  53. package/dist/packet/encoder.js.map +1 -0
  54. package/dist/packet/static.d.ts +33 -0
  55. package/dist/packet/static.d.ts.map +1 -0
  56. package/dist/packet/static.js +42 -0
  57. package/dist/packet/static.js.map +1 -0
  58. package/dist/physics/aabb.d.ts +197 -0
  59. package/dist/physics/aabb.d.ts.map +1 -0
  60. package/dist/physics/aabb.js +576 -0
  61. package/dist/physics/aabb.js.map +1 -0
  62. package/dist/physics/direction.d.ts +153 -0
  63. package/dist/physics/direction.d.ts.map +1 -0
  64. package/dist/physics/direction.js +288 -0
  65. package/dist/physics/direction.js.map +1 -0
  66. package/dist/physics/player.d.ts +110 -0
  67. package/dist/physics/player.d.ts.map +1 -0
  68. package/dist/physics/player.js +558 -0
  69. package/dist/physics/player.js.map +1 -0
  70. package/dist/version/codec.d.ts +18 -0
  71. package/dist/version/codec.d.ts.map +1 -0
  72. package/dist/version/codec.js +214 -0
  73. package/dist/version/codec.js.map +1 -0
  74. package/dist/version/registry.d.ts +236 -0
  75. package/dist/version/registry.d.ts.map +1 -0
  76. package/dist/version/registry.js +289 -0
  77. package/dist/version/registry.js.map +1 -0
  78. package/dist/world/block.d.ts +86 -0
  79. package/dist/world/block.d.ts.map +1 -0
  80. package/dist/world/block.js +232 -0
  81. package/dist/world/block.js.map +1 -0
  82. package/dist/world/entity.d.ts +43 -0
  83. package/dist/world/entity.d.ts.map +1 -0
  84. package/dist/world/entity.js +97 -0
  85. package/dist/world/entity.js.map +1 -0
  86. package/dist/world/state.d.ts +151 -0
  87. package/dist/world/state.d.ts.map +1 -0
  88. package/dist/world/state.js +108 -0
  89. package/dist/world/state.js.map +1 -0
  90. package/dist/world/tick.d.ts +19 -0
  91. package/dist/world/tick.d.ts.map +1 -0
  92. package/dist/world/tick.js +49 -0
  93. package/dist/world/tick.js.map +1 -0
  94. package/package.json +7 -2
  95. package/src/base/error.ts +36 -0
  96. package/src/base/typing.ts +9 -1
  97. package/src/client/client.ts +99 -42
  98. package/src/client/tcp.ts +49 -954
  99. package/src/index.ts +12 -12
  100. package/src/{translator → packet}/decoder.ts +3 -3
  101. package/src/packet/dispatcher.ts +785 -0
  102. package/src/{translator → packet}/encoder.ts +20 -9
  103. package/src/{base → physics}/aabb.ts +5 -5
  104. package/src/{base → physics}/player.ts +41 -25
  105. package/src/version/codec.ts +227 -0
  106. package/src/version/registry.ts +333 -0
  107. package/src/{base → world}/block.ts +12 -11
  108. package/src/{base → world}/entity.ts +5 -5
  109. package/src/world/state.ts +232 -0
  110. package/test/adapter/index.ts +14 -0
  111. package/test/client/index.ts +1 -1
  112. package/test/json/index.ts +3 -0
  113. package/src/base/registry.ts +0 -87
  114. /package/assets/minecraft/{blocks.json → 26.2/blocks.json} +0 -0
  115. /package/assets/minecraft/{entities.json → 26.2/entities.json} +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,43 @@
1
+ import { AABB } from "../physics/aabb";
2
+ import { SharedState } from "./state";
3
+ export declare class EntitiesManager {
4
+ private state;
5
+ /**
6
+ * Split chunks into 16x16x16 sections, so each chunk sections will contain a set of entities
7
+ *
8
+ * A key is `{chunkSectionX}:{chunkSectionY}:{chunkSectionZ}`
9
+ */
10
+ sections: Map<string, Set<number>>;
11
+ /**
12
+ * A map mapping entity ID to section key.
13
+ */
14
+ entityToSection: Map<number, string>;
15
+ constructor(state: SharedState);
16
+ /**
17
+ * Clear data
18
+ */
19
+ wipe(): void;
20
+ /**
21
+ * Convert real-world position into section key
22
+ */
23
+ static getSectionKey(x: number, y: number, z: number): string;
24
+ /**
25
+ * Add an entity (represented by ID)
26
+ */
27
+ add(entityId: number, x: number, y: number, z: number): void;
28
+ /**
29
+ * Remove entity
30
+ */
31
+ remove(entityId: number): void;
32
+ /**
33
+ * Update entity position
34
+ */
35
+ update(entityId: number, x: number, y: number, z: number): void;
36
+ /**
37
+ * Query the entity in the section that intersec with BB
38
+ * @param queryBB The querying bounding box
39
+ * @returns
40
+ */
41
+ queryAABB(queryBB: AABB, exclude?: number[]): AABB[];
42
+ }
43
+ //# sourceMappingURL=entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/world/entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,qBAAa,eAAe;IAYZ,OAAO,CAAC,KAAK;IAXzB;;;;OAIG;IACI,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAa;IACtD;;OAEG;IACI,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;IAExD,YAAoB,KAAK,EAAE,WAAW,EAAK;IAE3C;;OAEG;IACI,IAAI,SAGV;IAED;;OAEG;IACH,OAAc,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,UAI1D;IAED;;OAEG;IACI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,QAK3D;IAED;;OAEG;IACI,MAAM,CAAC,QAAQ,EAAE,MAAM,QAM7B;IAED;;OAEG;IACI,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,QAM9D;IAED;;;;OAIG;IACI,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,GAAE,MAAM,EAAO,UAyBrD;CACJ"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EntitiesManager = void 0;
4
+ const aabb_1 = require("../physics/aabb");
5
+ class EntitiesManager {
6
+ state;
7
+ /**
8
+ * Split chunks into 16x16x16 sections, so each chunk sections will contain a set of entities
9
+ *
10
+ * A key is `{chunkSectionX}:{chunkSectionY}:{chunkSectionZ}`
11
+ */
12
+ sections = new Map();
13
+ /**
14
+ * A map mapping entity ID to section key.
15
+ */
16
+ entityToSection = new Map();
17
+ constructor(state) {
18
+ this.state = state;
19
+ }
20
+ /**
21
+ * Clear data
22
+ */
23
+ wipe() {
24
+ this.sections = new Map();
25
+ this.entityToSection = new Map();
26
+ }
27
+ /**
28
+ * Convert real-world position into section key
29
+ */
30
+ static getSectionKey(x, y, z) {
31
+ // Divide 2^4 = 16
32
+ const sx = x >> 4, sy = y >> 4, sz = z >> 4;
33
+ return `${sx}:${sy}:${sz}`;
34
+ }
35
+ /**
36
+ * Add an entity (represented by ID)
37
+ */
38
+ add(entityId, x, y, z) {
39
+ const key = EntitiesManager.getSectionKey(x, y, z);
40
+ if (!this.sections.has(key))
41
+ this.sections.set(key, new Set());
42
+ this.sections.get(key).add(entityId);
43
+ this.entityToSection.set(entityId, key);
44
+ }
45
+ /**
46
+ * Remove entity
47
+ */
48
+ remove(entityId) {
49
+ const key = this.entityToSection.get(entityId);
50
+ if (key) {
51
+ this.sections.get(key)?.delete(entityId);
52
+ this.entityToSection.delete(entityId);
53
+ }
54
+ }
55
+ /**
56
+ * Update entity position
57
+ */
58
+ update(entityId, x, y, z) {
59
+ const newKey = EntitiesManager.getSectionKey(x, y, z);
60
+ if (this.entityToSection.get(entityId) !== newKey) {
61
+ this.remove(entityId);
62
+ this.add(entityId, x, y, z);
63
+ }
64
+ }
65
+ /**
66
+ * Query the entity in the section that intersec with BB
67
+ * @param queryBB The querying bounding box
68
+ * @returns
69
+ */
70
+ queryAABB(queryBB, exclude = []) {
71
+ this.state.checkReady();
72
+ const { minX, minY, minZ, maxX, maxY, maxZ } = queryBB;
73
+ const results = [];
74
+ const sx0 = minX >> 4, sx1 = maxX >> 4;
75
+ const sy0 = minY >> 4, sy1 = maxY >> 4;
76
+ const sz0 = minZ >> 4, sz1 = maxZ >> 4;
77
+ for (let sx = sx0; sx <= sx1; sx++) {
78
+ for (let sy = sy0; sy <= sy1; sy++) {
79
+ for (let sz = sz0; sz <= sz1; sz++) {
80
+ const bucket = this.sections.get(`${sx},${sy},${sz}`);
81
+ if (bucket)
82
+ for (const id of bucket) {
83
+ if (exclude.includes(id))
84
+ continue;
85
+ const entity = this.state.world.entities[id];
86
+ const entityBB = aabb_1.AABB.fromEntityType(entity.type);
87
+ if (queryBB.isIntersect(entityBB))
88
+ results.push(entityBB);
89
+ }
90
+ }
91
+ }
92
+ }
93
+ return results;
94
+ }
95
+ }
96
+ exports.EntitiesManager = EntitiesManager;
97
+ //# sourceMappingURL=entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity.js","sourceRoot":"","sources":["../../src/world/entity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,151 @@
1
+ import { Cipheriv, Decipheriv } from "node:crypto";
2
+ import { If } from "../base/typing";
3
+ import { Angle, BaseVec3 } from "../physics/direction";
4
+ import { ClientEvents, ClientOption } from "../client/client";
5
+ export interface Server {
6
+ knownPacks?: ServerKnownPack;
7
+ }
8
+ export interface ServerKnownPack {
9
+ namespace: string;
10
+ id: string;
11
+ version: string;
12
+ }
13
+ /**
14
+ * Represent world information
15
+ */
16
+ export interface ServerWorld {
17
+ /** Is hardcore enabled */
18
+ hardcore: boolean;
19
+ /** All dimensions */
20
+ dimensions: string[];
21
+ /** Max players allowed */
22
+ maxPlayers: number;
23
+ /** View distances */
24
+ viewDistance: number;
25
+ /** Simulation distance */
26
+ simulationDistance: number;
27
+ /**
28
+ * The record key is a chunk section position packed as `Player Dimension:Chunk X:Chunk Z[Section Y]`
29
+ *
30
+ * 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.
31
+ */
32
+ chunks: Record<string, ChunkColumn>;
33
+ /**
34
+ * The record key is entity ID
35
+ */
36
+ entities: Record<number, Entity>;
37
+ }
38
+ /**
39
+ * Represent a chunk collumns, which may contains multiple chunks sections
40
+ */
41
+ export interface ChunkColumn {
42
+ sections: Record<number, ChunkSection>;
43
+ blockEntities: Record<number, BlockEntity>;
44
+ }
45
+ export interface ChunkSection {
46
+ block: PaletteContainer;
47
+ biome: PaletteContainer;
48
+ }
49
+ /**
50
+ * Used for indirect mapping
51
+ *
52
+ * @see https://minecraft.wiki/w/Java_Edition_protocol/Chunk_format#Paletted_Container_structure
53
+ */
54
+ export interface PaletteContainer {
55
+ bpe: number;
56
+ palette: number[];
57
+ data: BigInt64Array | null;
58
+ }
59
+ /** Represent a block entity */
60
+ export interface BlockEntity {
61
+ type: number;
62
+ data: Record<string, any>;
63
+ }
64
+ /** Represent an entity */
65
+ export interface Entity {
66
+ id: number;
67
+ type: number;
68
+ position: BaseVec3;
69
+ velocity: BaseVec3;
70
+ angle: Angle;
71
+ data: number;
72
+ }
73
+ export declare enum GameMode {
74
+ Survival = 0,
75
+ Creative = 1,
76
+ Adventure = 2,
77
+ Spectator = 3
78
+ }
79
+ export interface ClientPlayer {
80
+ /** Player UUID */
81
+ uuid: string;
82
+ /** Player username */
83
+ username: string;
84
+ /** Player entity ID */
85
+ entityId: number;
86
+ /** Current game mode */
87
+ gameMode: GameMode;
88
+ position: BaseVec3;
89
+ velocity: BaseVec3;
90
+ angle: Angle;
91
+ /** Current dimension */
92
+ dimension: string;
93
+ }
94
+ export declare enum ClientStatus {
95
+ Disconnected = 0,
96
+ Connecting = 1,
97
+ Logining = 2,
98
+ Ready = 3
99
+ }
100
+ export declare enum ConnectionState {
101
+ Disconnected = 0,
102
+ Handshake = 1,
103
+ Login = 2,
104
+ Configure = 3,
105
+ Play = 4
106
+ }
107
+ export interface ServerRegistryEntry {
108
+ id: string;
109
+ data: object;
110
+ }
111
+ export type MutateState = (state: SharedState) => void;
112
+ export type EmittedEvent = {
113
+ [K in keyof ClientEvents]: {
114
+ event: K;
115
+ args: ClientEvents[K];
116
+ };
117
+ }[keyof ClientEvents];
118
+ export type SendingPacket = {
119
+ id: string | number;
120
+ data: Record<string, any>;
121
+ };
122
+ export declare class SharedState<IsReady extends boolean = boolean> {
123
+ clientOptions: ClientOption;
124
+ getUuid: () => Buffer;
125
+ private mutationQueue;
126
+ private eventQueue;
127
+ private sendQueue;
128
+ state: ConnectionState;
129
+ status: ClientStatus;
130
+ compressionThreshold: number;
131
+ sharedSecret: Buffer | undefined;
132
+ cipher: Cipheriv | undefined;
133
+ decipher: Decipheriv | undefined;
134
+ server: Server | undefined;
135
+ registry: Record<string, ServerRegistryEntry[]> | undefined;
136
+ world: If<IsReady, ServerWorld>;
137
+ player: If<IsReady, ClientPlayer>;
138
+ constructor(clientOptions: ClientOption, getUuid: () => Buffer);
139
+ isReady(): this is SharedState<true>;
140
+ checkReady(): void;
141
+ pruneStates(): void;
142
+ enqueueMutation(mutation: MutateState): void;
143
+ enqueuePacket(packet: string, data: object): void;
144
+ enqueuePacket(packet: SendingPacket): void;
145
+ enqueueEvent<K extends keyof ClientEvents>(event: K, ...args: ClientEvents[K]): void;
146
+ enqueueEvent(event: EmittedEvent): void;
147
+ drainMutation(): void;
148
+ drainEvent(): EmittedEvent[];
149
+ drainPacket(): SendingPacket[];
150
+ }
151
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/world/state.ts"],"names":[],"mappings":"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"}
@@ -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,19 @@
1
+ /**
2
+ * Tick manager.
3
+ *
4
+ * Maintaining 20Hz tick like what vanilla does
5
+ */
6
+ export declare class TickLoop {
7
+ private onTick;
8
+ static readonly TICK_MS = 50;
9
+ private static readonly TICK_NS;
10
+ static readonly MAX_CATCHUP_TICKS = 10;
11
+ private running;
12
+ private nextTickTime;
13
+ private timer;
14
+ constructor(onTick: () => any);
15
+ start(): void;
16
+ stop(): void;
17
+ private next;
18
+ }
19
+ //# sourceMappingURL=tick.d.ts.map
@@ -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,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TickLoop = void 0;
4
+ /**
5
+ * Tick manager.
6
+ *
7
+ * Maintaining 20Hz tick like what vanilla does
8
+ */
9
+ class TickLoop {
10
+ onTick;
11
+ static TICK_MS = 50;
12
+ static TICK_NS = BigInt(this.TICK_MS) * 1000000n;
13
+ static MAX_CATCHUP_TICKS = 10;
14
+ running;
15
+ nextTickTime;
16
+ timer = null;
17
+ constructor(onTick) {
18
+ this.onTick = onTick;
19
+ this.running = false;
20
+ this.nextTickTime = BigInt(0);
21
+ }
22
+ start() {
23
+ this.running = true;
24
+ this.nextTickTime = process.hrtime.bigint();
25
+ this.next();
26
+ }
27
+ stop() {
28
+ this.running = false;
29
+ clearInterval(this.timer);
30
+ this.nextTickTime = BigInt(0);
31
+ }
32
+ next() {
33
+ if (!this.running)
34
+ this.stop();
35
+ const now = process.hrtime.bigint();
36
+ let tickRuns = 0;
37
+ while (this.nextTickTime < now && tickRuns < TickLoop.MAX_CATCHUP_TICKS) {
38
+ this.onTick();
39
+ this.nextTickTime += TickLoop.TICK_NS;
40
+ tickRuns++;
41
+ }
42
+ if (tickRuns >= TickLoop.MAX_CATCHUP_TICKS)
43
+ this.nextTickTime = now + TickLoop.TICK_NS;
44
+ const delayMs = Number((this.nextTickTime - process.hrtime.bigint())) / 1_000_000;
45
+ this.timer = setTimeout(() => this.next(), Math.max(0, delayMs));
46
+ }
47
+ }
48
+ exports.TickLoop = TickLoop;
49
+ //# sourceMappingURL=tick.js.map
@@ -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.1",
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>;