pw-js-world 0.3.5 → 0.3.6-dev.3de8e56

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/cm/Helper.d.ts ADDED
@@ -0,0 +1,119 @@
1
+ import { type Hook } from "pw-js-api";
2
+ import type { ProtoGen } from "pw-js-api";
3
+ import Block from "./Block.js";
4
+ import Player from "./Player.js";
5
+ import { LayerType } from "./Constants.js";
6
+ import type { Point, PWGameHook } from "./types/index.js";
7
+ import { DeserialisedStructure } from "./Structure.js";
8
+ /**
9
+ * To use this helper, you must first create an instance of this,
10
+ *
11
+ * then: <PWGameClient>.addCallback("raw", helper.onRawPacketRecv)
12
+ */
13
+ export default class PWGameWorldHelper {
14
+ /**
15
+ * Arrays of blocks (by layer, x, y)
16
+ */
17
+ blocks: [Block[][], Block[][]];
18
+ players: Map<number, Player>;
19
+ globalSwitches: boolean[];
20
+ private _meta?;
21
+ private _width;
22
+ private _height;
23
+ private _init;
24
+ private _selfPlayerId;
25
+ /**
26
+ * The current world's width.
27
+ *
28
+ * If you didn't put the hook before init, this may throw error.
29
+ */
30
+ get width(): number;
31
+ /**
32
+ * The current world's height.
33
+ *
34
+ * If you didn't put the hook before init, this may throw error.
35
+ */
36
+ get height(): number;
37
+ /**
38
+ * The current world's metadata.
39
+ *
40
+ * If you didn't put the hook before init, this may throw error.
41
+ */
42
+ get meta(): ProtoGen.WorldMeta | null;
43
+ /**
44
+ * If this helper is ready. When it's false, the helper will not return anything for any of the packets.
45
+ */
46
+ get initialised(): boolean;
47
+ /**
48
+ * The bot's player object.
49
+ *
50
+ * If you didn't put the hook before init, this may throw error.
51
+ */
52
+ get botPlayer(): Player;
53
+ /**
54
+ * The bot's player id in the world.
55
+ *
56
+ * If you didn't put the hook before init, this may throw error.
57
+ */
58
+ get botPlayerId(): number;
59
+ /**
60
+ * This must go in .use() of the main PW-JS-API Game Client class.
61
+ *
62
+ * <PWGameClient>.use(<PWGameWorldHelper>.receiveHook)
63
+ *
64
+ * DO NOT PUT () AFTER RECEIVEHOOK
65
+ */
66
+ receiveHook: Hook<PWGameHook>;
67
+ /**
68
+ * Internal function.
69
+ */
70
+ private initialise;
71
+ /**
72
+ * Internal function.
73
+ */
74
+ private deserialize;
75
+ private convertSwitchState;
76
+ /**
77
+ * Internal function, this triggers when the world gets cleared.
78
+ *
79
+ * Clears the blocks map and promptly fill it with empty except the border which becomes basci gray.
80
+ */
81
+ private clear;
82
+ /**
83
+ * Gets the block at the position.
84
+ *
85
+ * Difference between this and using this.blocks directly is that this function will validate the positions and the layer.
86
+ */
87
+ getBlockAt(pos: Point, l: LayerType): Block;
88
+ getBlockAt(x: number | Point, y: number, l: LayerType): Block;
89
+ /**
90
+ * Player ID.
91
+ *
92
+ * The main bot player is excluded from the criteria.
93
+ */
94
+ getPlayer(id: number, isAccount?: false): Player | undefined;
95
+ /**
96
+ * Username is case insensitive.
97
+ *
98
+ * The main bot player is excluded from the criteria.
99
+ */
100
+ getPlayer(username: string, isAccount?: false): Player | undefined;
101
+ /**
102
+ * The ID of the account (must have second parameter set to true)
103
+ *
104
+ * The main bot player is excluded from the criteria.
105
+ */
106
+ getPlayer(accountId: string, isAccount: true): Player | undefined;
107
+ /**
108
+ * Returns the list of current players in the world.
109
+ */
110
+ getPlayers(): Player[];
111
+ /**
112
+ * This will return a DeserialisedStructure which will allow you to easily save to a file if you wish.
113
+ *
114
+ * The blocks are cloned and thus you're free to modify the blocks in the structure without the risk of it affecting this helper's blocks.
115
+ *
116
+ * NOTE: endX and endY are also included!
117
+ */
118
+ sectionBlocks(startX: number, startY: number, endX: number, endY: number): DeserialisedStructure;
119
+ }
package/cm/Helper.js ADDED
@@ -0,0 +1,510 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const pw_js_api_1 = require("pw-js-api");
5
+ const Block_js_1 = tslib_1.__importDefault(require("./Block.js"));
6
+ const BufferReader_js_1 = tslib_1.__importDefault(require("./BufferReader.js"));
7
+ const Player_js_1 = tslib_1.__importStar(require("./Player.js"));
8
+ const Structure_js_1 = require("./Structure.js");
9
+ const Error_js_1 = require("./util/Error.js");
10
+ /**
11
+ * To use this helper, you must first create an instance of this,
12
+ *
13
+ * then: <PWGameClient>.addCallback("raw", helper.onRawPacketRecv)
14
+ */
15
+ class PWGameWorldHelper {
16
+ constructor() {
17
+ /**
18
+ * Arrays of blocks (by layer, x, y)
19
+ */
20
+ this.blocks = [[], []]; //Block[][][] = [];
21
+ this.players = new Map();
22
+ this.globalSwitches = [];
23
+ this._width = 0;
24
+ this._height = 0;
25
+ this._init = false;
26
+ this._selfPlayerId = -1;
27
+ /**
28
+ * This must go in .use() of the main PW-JS-API Game Client class.
29
+ *
30
+ * <PWGameClient>.use(<PWGameWorldHelper>.receiveHook)
31
+ *
32
+ * DO NOT PUT () AFTER RECEIVEHOOK
33
+ */
34
+ this.receiveHook = (data) => {
35
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
36
+ const { packet } = data;
37
+ switch (packet.case) {
38
+ //#region World
39
+ case "playerInitPacket":
40
+ {
41
+ this._height = packet.value.worldHeight;
42
+ this._width = packet.value.worldWidth;
43
+ this._meta = (_a = packet.value.worldMeta) !== null && _a !== void 0 ? _a : null;
44
+ this.initialise(packet.value.worldData);
45
+ const props = packet.value.playerProperties;
46
+ this.globalSwitches = this.convertSwitchState(packet.value.globalSwitchState);
47
+ if (props) {
48
+ this.players.set(props.playerId, new Player_js_1.default(props, true));
49
+ this._selfPlayerId = props.playerId;
50
+ return { player: this.players.get(props.playerId) };
51
+ } //packet.value..playerProperties?.)
52
+ return;
53
+ }
54
+ case "worldMetaUpdatePacket":
55
+ this._meta = (_b = packet.value.meta) !== null && _b !== void 0 ? _b : null;
56
+ return;
57
+ case "worldReloadedPacket":
58
+ this.initialise(packet.value.worldData);
59
+ return;
60
+ case "worldClearedPacket":
61
+ this.clear();
62
+ return;
63
+ case "worldBlockPlacedPacket":
64
+ {
65
+ if (!this._init)
66
+ return;
67
+ const { positions, layer, blockId, extraFields, playerId } = packet.value;
68
+ const player = this.players.get(playerId);
69
+ const oldBlocks = [];
70
+ const newBlocks = [];
71
+ const args = Block_js_1.default.deserializeArgs(BufferReader_js_1.default.from(extraFields)); //(blockId, BufferReader.from(extraFields), true);
72
+ for (let i = 0, len = positions.length; i < len; i++) {
73
+ const { x, y } = positions[i];
74
+ oldBlocks[i] = this.blocks[layer][x][y].clone();
75
+ newBlocks[i] = this.blocks[layer][x][y] = new Block_js_1.default(blockId, args);
76
+ }
77
+ if (!player)
78
+ return;
79
+ return { player, oldBlocks, newBlocks };
80
+ }
81
+ //#endregion
82
+ //#region Player
83
+ case "playerJoinedPacket":
84
+ {
85
+ const { properties, worldState } = packet.value;
86
+ let player;
87
+ if (properties && worldState) {
88
+ this.players.set(properties.playerId, player = new Player_js_1.default(properties, Object.assign(Object.assign({}, worldState), { switches: this.convertSwitchState(worldState.switches), counters: new Player_js_1.PlayerCounters(worldState.counters) })));
89
+ return { player };
90
+ }
91
+ }
92
+ return;
93
+ case "playerLeftPacket":
94
+ {
95
+ const player = this.players.get(packet.value.playerId);
96
+ if (player) {
97
+ this.players.delete(packet.value.playerId);
98
+ return { player: player };
99
+ }
100
+ }
101
+ return;
102
+ case "playerFacePacket":
103
+ {
104
+ const player = this.players.get((_c = packet.value) === null || _c === void 0 ? void 0 : _c.playerId);
105
+ if (player) {
106
+ const oldie = player.face;
107
+ player.face = packet.value.faceId;
108
+ return { player, oldFace: oldie }; //changes: { type: "face", oldValue: oldFace, newValue: player.face } };
109
+ }
110
+ }
111
+ return;
112
+ case "playerModModePacket":
113
+ case "playerGodModePacket":
114
+ {
115
+ const player = this.players.get((_d = packet.value) === null || _d === void 0 ? void 0 : _d.playerId);
116
+ if (player) {
117
+ const state = packet.case === "playerGodModePacket" ? "godmode" : "modmode";
118
+ const oldie = player.states[state];
119
+ player.states[state] = packet.value.enabled;
120
+ return { player, oldState: oldie }; //changes: { type: "face", oldValue: oldFace, newValue: player.face } };
121
+ }
122
+ }
123
+ return;
124
+ case "playerAddEffectPacket":
125
+ case "playerRemoveEffectPacket":
126
+ case "playerResetEffectsPacket":
127
+ {
128
+ const player = this.players.get((_e = packet.value) === null || _e === void 0 ? void 0 : _e.playerId);
129
+ if (player) {
130
+ // const state = //packet.case === "playerGodModePacket" ? "godmode" : "modmode";
131
+ let effects = [];
132
+ if (packet.case === "playerAddEffectPacket") {
133
+ const eff = {
134
+ effectId: packet.value.effectId,
135
+ duration: packet.value.duration,
136
+ strength: packet.value.strength,
137
+ };
138
+ player.effects.push(new Player_js_1.PlayerEffect(eff));
139
+ return { player, effect: eff };
140
+ }
141
+ else if (packet.case === "playerRemoveEffectPacket") {
142
+ const eff = player.effects.findIndex(v => v.effectId === packet.value.effectId);
143
+ if (eff) {
144
+ effects = player.effects.splice(eff, 1);
145
+ return { player, effect: effects[0] };
146
+ }
147
+ }
148
+ else {
149
+ return { player, effects: player.effects.splice(0) };
150
+ }
151
+ }
152
+ }
153
+ return;
154
+ case "playerMovedPacket":
155
+ {
156
+ const player = this.players.get((_f = packet.value) === null || _f === void 0 ? void 0 : _f.playerId);
157
+ if (player) {
158
+ if (packet.value.position) {
159
+ player.position = {
160
+ x: packet.value.position.x,
161
+ y: packet.value.position.y,
162
+ };
163
+ }
164
+ return { player }; //changes: { type: "face", oldValue: oldFace, newValue: player.face } };
165
+ }
166
+ }
167
+ return;
168
+ case "playerResetPacket":
169
+ {
170
+ const player = this.players.get((_g = packet.value) === null || _g === void 0 ? void 0 : _g.playerId);
171
+ if (player) {
172
+ player.resetState();
173
+ if (packet.value.position) {
174
+ player.position = {
175
+ x: packet.value.position.x,
176
+ y: packet.value.position.y,
177
+ };
178
+ }
179
+ return { player };
180
+ }
181
+ }
182
+ return;
183
+ case "playerRespawnPacket":
184
+ {
185
+ const player = this.players.get((_h = packet.value) === null || _h === void 0 ? void 0 : _h.playerId);
186
+ if (player) { // deaths also reflect in counters update packet
187
+ if (packet.value.position) {
188
+ player.position = {
189
+ x: packet.value.position.x,
190
+ y: packet.value.position.y,
191
+ };
192
+ }
193
+ return { player };
194
+ }
195
+ }
196
+ return;
197
+ case "playerUpdateRightsPacket":
198
+ {
199
+ const player = this.players.get((_j = packet.value) === null || _j === void 0 ? void 0 : _j.playerId);
200
+ if (player) {
201
+ if (packet.value.rights) {
202
+ player.rights = {
203
+ availableCommands: packet.value.rights.availableCommands,
204
+ canChangeWorldSettings: packet.value.rights.canChangeWorldSettings,
205
+ canEdit: packet.value.rights.canEdit,
206
+ canGod: packet.value.rights.canGod,
207
+ canToggleMinimap: packet.value.rights.canToggleMinimap,
208
+ };
209
+ }
210
+ else
211
+ player.resetRights();
212
+ return { player, rights: player.rights };
213
+ }
214
+ }
215
+ return;
216
+ case "playerTeamUpdatePacket":
217
+ {
218
+ const player = this.players.get((_k = packet.value) === null || _k === void 0 ? void 0 : _k.playerId);
219
+ if (player) {
220
+ const oldTeam = player.states.teamId;
221
+ player.states.teamId = packet.value.teamId;
222
+ return { player, oldTeam };
223
+ }
224
+ }
225
+ return;
226
+ case "playerCountersUpdatePacket":
227
+ {
228
+ const player = this.players.get((_l = packet.value) === null || _l === void 0 ? void 0 : _l.playerId);
229
+ if (player) {
230
+ const oldState = {
231
+ coinsBlue: player.states.coinsBlue,
232
+ coinsGold: player.states.coinsGold,
233
+ deaths: player.states.deaths,
234
+ };
235
+ player.states.coinsBlue = packet.value.blueCoins;
236
+ player.states.coinsGold = packet.value.coins;
237
+ player.states.deaths = packet.value.deaths;
238
+ return { player, oldState };
239
+ }
240
+ }
241
+ return;
242
+ case "playerTeleportedPacket":
243
+ {
244
+ const player = this.players.get((_m = packet.value) === null || _m === void 0 ? void 0 : _m.playerId);
245
+ if (player) {
246
+ if (packet.value.position)
247
+ player.position = {
248
+ x: packet.value.position.x,
249
+ y: packet.value.position.y,
250
+ };
251
+ return { player };
252
+ }
253
+ }
254
+ return;
255
+ case "globalSwitchChangedPacket":
256
+ case "playerLocalSwitchChangedPacket":
257
+ {
258
+ const player = this.players.get((_o = packet.value) === null || _o === void 0 ? void 0 : _o.playerId);
259
+ if (packet.case === "globalSwitchChangedPacket") {
260
+ this.globalSwitches[packet.value.switchId] = packet.value.enabled;
261
+ }
262
+ if (player) {
263
+ if (packet.case === "playerLocalSwitchChangedPacket") {
264
+ player.states.switches[packet.value.switchId] = packet.value.switchEnabled;
265
+ }
266
+ return { player };
267
+ }
268
+ }
269
+ return;
270
+ case "globalSwitchResetPacket":
271
+ case "playerLocalSwitchResetPacket":
272
+ {
273
+ const player = this.players.get((_p = packet.value) === null || _p === void 0 ? void 0 : _p.playerId);
274
+ if (packet.case === "globalSwitchResetPacket") {
275
+ this.globalSwitches = this.globalSwitches.fill(false);
276
+ }
277
+ if (player) {
278
+ if (packet.case === "playerLocalSwitchResetPacket") {
279
+ if (packet.value.switchId === undefined)
280
+ player.states.switches.fill(false);
281
+ else
282
+ player.states.switches[packet.value.switchId] = packet.value.switchEnabled;
283
+ }
284
+ return { player };
285
+ }
286
+ }
287
+ return;
288
+ case "playerChatPacket":
289
+ case "playerDirectMessagePacket":
290
+ // case "playerDirectMessagePacket":
291
+ {
292
+ const player = this.players.get(packet.case === "playerChatPacket" ? (_q = packet.value) === null || _q === void 0 ? void 0 : _q.playerId : (packet.value.fromPlayerId === this._selfPlayerId ? packet.value.fromPlayerId : packet.value.targetPlayerId));
293
+ if (player) {
294
+ return { player };
295
+ }
296
+ }
297
+ return;
298
+ case "playerTouchBlockPacket":
299
+ {
300
+ const player = this.players.get(packet.value.playerId);
301
+ if (player && packet.value.position) {
302
+ const blockName = (_r = pw_js_api_1.PWApiClient.listBlocks) === null || _r === void 0 ? void 0 : _r[packet.value.blockId];
303
+ if (blockName === undefined)
304
+ throw new Error_js_1.MissingBlockError("Current block data might be outdated, restart application?", packet.value.blockId);
305
+ if (blockName.PaletteId === "COIN_GOLD" || blockName.PaletteId === "COIN_BLUE") {
306
+ player.states.collectedItems.push({
307
+ x: packet.value.position.x,
308
+ y: packet.value.position.y,
309
+ });
310
+ }
311
+ }
312
+ return player ? { player } : {};
313
+ }
314
+ case "playerCounterTransactionPacket":
315
+ {
316
+ const player = this.players.get(packet.value.playerId);
317
+ if (player) {
318
+ const oldScore = player.states.counters.scores[packet.value.counterId];
319
+ player.states.counters.scores[packet.value.counterId] = packet.value.count;
320
+ return { oldScore, diff: packet.value.count - oldScore, player };
321
+ }
322
+ return {};
323
+ }
324
+ //#endregion
325
+ }
326
+ return;
327
+ };
328
+ }
329
+ /**
330
+ * The current world's width.
331
+ *
332
+ * If you didn't put the hook before init, this may throw error.
333
+ */
334
+ get width() {
335
+ if (this._width === -1)
336
+ throw Error("World not initialised, or was applied too late.");
337
+ return this._width;
338
+ }
339
+ /**
340
+ * The current world's height.
341
+ *
342
+ * If you didn't put the hook before init, this may throw error.
343
+ */
344
+ get height() {
345
+ if (this._height === -1)
346
+ throw Error("World not initialised, or was applied too late.");
347
+ return this._height;
348
+ }
349
+ /**
350
+ * The current world's metadata.
351
+ *
352
+ * If you didn't put the hook before init, this may throw error.
353
+ */
354
+ get meta() {
355
+ if (this._meta === undefined)
356
+ throw Error("World not initialised, or was applied too late.");
357
+ return this._meta;
358
+ }
359
+ /**
360
+ * If this helper is ready. When it's false, the helper will not return anything for any of the packets.
361
+ */
362
+ get initialised() {
363
+ return this._init;
364
+ }
365
+ /**
366
+ * The bot's player object.
367
+ *
368
+ * If you didn't put the hook before init, this may throw error.
369
+ */
370
+ get botPlayer() {
371
+ let player = this.players.get(this._selfPlayerId);
372
+ if (!player)
373
+ throw Error("Player not stored, hook may have been applied too late?");
374
+ return player;
375
+ }
376
+ /**
377
+ * The bot's player id in the world.
378
+ *
379
+ * If you didn't put the hook before init, this may throw error.
380
+ */
381
+ get botPlayerId() {
382
+ if (this._selfPlayerId === -1)
383
+ throw Error("Player not stored, hook may have been applied too late.");
384
+ return this._selfPlayerId;
385
+ }
386
+ /**
387
+ * Internal function.
388
+ */
389
+ initialise(bytes, width, height) {
390
+ if (width === undefined)
391
+ width = this.width;
392
+ if (height === undefined)
393
+ height = this.height;
394
+ this.blocks.splice(0);
395
+ for (let l = 0; l < 2; l++) {
396
+ this.blocks[l] = [];
397
+ for (let x = 0; x < width; x++) {
398
+ this.blocks[l][x] = [];
399
+ for (let y = 0; y < height; y++) {
400
+ this.blocks[l][x][y] = new Block_js_1.default(0);
401
+ }
402
+ }
403
+ }
404
+ this.deserialize(bytes);
405
+ }
406
+ /**
407
+ * Internal function.
408
+ */
409
+ deserialize(bytes) {
410
+ const reader = bytes instanceof BufferReader_js_1.default ? bytes : BufferReader_js_1.default.from(bytes);
411
+ for (let l = 0; l < 2; l++) {
412
+ for (let x = 0; x < this.width; x++) {
413
+ for (let y = 0; y < this.height; y++) {
414
+ this.blocks[l][x][y] = Block_js_1.default.deserialize(reader);
415
+ }
416
+ }
417
+ }
418
+ this._init = true;
419
+ }
420
+ convertSwitchState(arr) {
421
+ const list = new Array(1000);
422
+ for (let i = 0; i < 1000; i++) {
423
+ list[i] = arr[i] === 1;
424
+ }
425
+ return list;
426
+ }
427
+ /**
428
+ * Internal function, this triggers when the world gets cleared.
429
+ *
430
+ * Clears the blocks map and promptly fill it with empty except the border which becomes basci gray.
431
+ */
432
+ clear() {
433
+ this.blocks.splice(0);
434
+ // To prevent subtracting every single time, can be costly computation wise.
435
+ const lastWidth = this.width - 1;
436
+ const lastHeight = this.width - 1;
437
+ for (let l = 0; l < 2; l++) {
438
+ this.blocks[l] = [];
439
+ for (let x = 0; x < this.width; x++) {
440
+ this.blocks[l][x] = [];
441
+ for (let y = 0; y < this.height; y++) {
442
+ this.blocks[l][x][y] = new Block_js_1.default(l === 1 && (x === 0 || x === lastWidth || y === 0 || y === lastHeight) ? "BASIC_GRAY" : "EMPTY");
443
+ }
444
+ }
445
+ }
446
+ }
447
+ getBlockAt(x, y, l) {
448
+ if (typeof x !== "number") {
449
+ l = y;
450
+ y = x.y;
451
+ x = x.x;
452
+ }
453
+ if (l === undefined || l < 0 || l > 1)
454
+ throw Error("Unknown layer");
455
+ if (x < 0 || x >= this.width)
456
+ throw Error("X is outside the bound of the world.");
457
+ if (y < 0 || y >= this.height)
458
+ throw Error("Y is outside the bound of the world.");
459
+ return this.blocks[l][x][y];
460
+ }
461
+ getPlayer(id, isAccount) {
462
+ if (typeof id === "string") {
463
+ const players = this.getPlayers();
464
+ // all names are upper case
465
+ if (!isAccount)
466
+ id = id.toUpperCase();
467
+ for (let i = 0, len = players.length; i < len; i++) {
468
+ if (isAccount) {
469
+ if (players[i].accountId === id)
470
+ return players[i];
471
+ }
472
+ else if (players[i].username === id)
473
+ return players[i];
474
+ }
475
+ return undefined;
476
+ }
477
+ return this.players.get(id);
478
+ }
479
+ /**
480
+ * Returns the list of current players in the world.
481
+ */
482
+ getPlayers() {
483
+ return Array.from(this.players.values());
484
+ }
485
+ /**
486
+ * This will return a DeserialisedStructure which will allow you to easily save to a file if you wish.
487
+ *
488
+ * The blocks are cloned and thus you're free to modify the blocks in the structure without the risk of it affecting this helper's blocks.
489
+ *
490
+ * NOTE: endX and endY are also included!
491
+ */
492
+ sectionBlocks(startX, startY, endX, endY) {
493
+ const blocks = [[], []];
494
+ if (startX > endX)
495
+ throw Error("Starting X is greater than ending X");
496
+ if (startY > endY)
497
+ throw Error("Starting Y is greater than ending Y");
498
+ for (let l = 0; l < 2; l++) {
499
+ for (let x = startX, width = Math.min(endX, this.width); x <= width; x++) {
500
+ blocks[l][x - startX] = [];
501
+ for (let y = startY, height = Math.min(endY, this.height); y <= height; y++) {
502
+ blocks[l][x - startX][y - startY] = this.blocks[l][x][y].clone();
503
+ }
504
+ }
505
+ }
506
+ return new Structure_js_1.DeserialisedStructure(blocks, { width: endX - startX + 1, height: endY - startY + 1 });
507
+ }
508
+ }
509
+ exports.default = PWGameWorldHelper;
510
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL0hlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBeUU7QUFHekUsa0VBQStCO0FBQy9CLGdGQUE2QztBQUM3QyxpRUFBbUU7QUFHbkUsaURBQXVEO0FBQ3ZELDhDQUFvRDtBQUVwRDs7OztHQUlHO0FBQ0gsTUFBcUIsaUJBQWlCO0lBQXRDO1FBQ0k7O1dBRUc7UUFDSCxXQUFNLEdBQTJCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUEsbUJBQW1CO1FBRTdELFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUVwQyxtQkFBYyxHQUFhLEVBQUUsQ0FBQztRQUd0QixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLFVBQUssR0FBRyxLQUFLLENBQUM7UUFDZCxrQkFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBOEQzQjs7Ozs7O1dBTUc7UUFDSCxnQkFBVyxHQUNQLENBQUMsSUFBNEIsRUFBRSxFQUFFOztZQUVqQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDO1lBRXhCLFFBQVEsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNsQixlQUFlO2dCQUNmLEtBQUssa0JBQWtCO29CQUNuQixDQUFDO3dCQUNHLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7d0JBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7d0JBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBQSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsbUNBQUksSUFBSSxDQUFDO3dCQUU1QyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7d0JBRXhDLE1BQU0sS0FBSyxH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
package/cm/index.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ export type * from "./types/index.d.ts";
2
+ export { default as PWGameWorldHelper } from "./Helper.js";
3
+ export { ComponentTypeHeader, default as BufferReader } from "./BufferReader.js";
4
+ export { default as Block } from "./Block.js";
5
+ export { default as Player, PlayerEffect, PlayerCounters, type IPlayer, type IPlayerEffect, type IPlayerRights, type IPlayerWorldState } from "./Player.js";
6
+ export { createBlockPacket, createBlockPackets } from "./util/Misc.js";
7
+ export * as Util from "./util/Misc.js";
8
+ export { default as StructureHelper, DeserialisedStructure, type IStructure, type IStructureBlocks } from "./Structure.js";
9
+ export { LayerType } from "./Constants.js";
package/cm/index.js ADDED
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LayerType = exports.DeserialisedStructure = exports.StructureHelper = exports.Util = exports.createBlockPackets = exports.createBlockPacket = exports.PlayerCounters = exports.PlayerEffect = exports.Player = exports.Block = exports.BufferReader = exports.ComponentTypeHeader = exports.PWGameWorldHelper = void 0;
4
+ const tslib_1 = require("tslib");
5
+ var Helper_js_1 = require("./Helper.js");
6
+ Object.defineProperty(exports, "PWGameWorldHelper", { enumerable: true, get: function () { return tslib_1.__importDefault(Helper_js_1).default; } });
7
+ var BufferReader_js_1 = require("./BufferReader.js");
8
+ Object.defineProperty(exports, "ComponentTypeHeader", { enumerable: true, get: function () { return BufferReader_js_1.ComponentTypeHeader; } });
9
+ Object.defineProperty(exports, "BufferReader", { enumerable: true, get: function () { return tslib_1.__importDefault(BufferReader_js_1).default; } });
10
+ var Block_js_1 = require("./Block.js");
11
+ Object.defineProperty(exports, "Block", { enumerable: true, get: function () { return tslib_1.__importDefault(Block_js_1).default; } });
12
+ var Player_js_1 = require("./Player.js");
13
+ Object.defineProperty(exports, "Player", { enumerable: true, get: function () { return tslib_1.__importDefault(Player_js_1).default; } });
14
+ Object.defineProperty(exports, "PlayerEffect", { enumerable: true, get: function () { return Player_js_1.PlayerEffect; } });
15
+ Object.defineProperty(exports, "PlayerCounters", { enumerable: true, get: function () { return Player_js_1.PlayerCounters; } });
16
+ var Misc_js_1 = require("./util/Misc.js");
17
+ Object.defineProperty(exports, "createBlockPacket", { enumerable: true, get: function () { return Misc_js_1.createBlockPacket; } });
18
+ Object.defineProperty(exports, "createBlockPackets", { enumerable: true, get: function () { return Misc_js_1.createBlockPackets; } });
19
+ exports.Util = tslib_1.__importStar(require("./util/Misc.js"));
20
+ var Structure_js_1 = require("./Structure.js");
21
+ Object.defineProperty(exports, "StructureHelper", { enumerable: true, get: function () { return tslib_1.__importDefault(Structure_js_1).default; } });
22
+ Object.defineProperty(exports, "DeserialisedStructure", { enumerable: true, get: function () { return Structure_js_1.DeserialisedStructure; } });
23
+ var Constants_js_1 = require("./Constants.js");
24
+ Object.defineProperty(exports, "LayerType", { enumerable: true, get: function () { return Constants_js_1.LayerType; } });
25
+ // import * from "./Helper";
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUNBLHlDQUEyRDtBQUFsRCx1SUFBQSxPQUFPLE9BQXFCO0FBRXJDLHFEQUFpRjtBQUF4RSxzSEFBQSxtQkFBbUIsT0FBQTtBQUFFLHdJQUFBLE9BQU8sT0FBZ0I7QUFFckQsdUNBQThDO0FBQXJDLDBIQUFBLE9BQU8sT0FBUztBQUV6Qix5Q0FBNEo7QUFBbkosNEhBQUEsT0FBTyxPQUFVO0FBQUUseUdBQUEsWUFBWSxPQUFBO0FBQUUsMkdBQUEsY0FBYyxPQUFBO0FBRXhELDBDQUF1RTtBQUE5RCw0R0FBQSxpQkFBaUIsT0FBQTtBQUFFLDZHQUFBLGtCQUFrQixPQUFBO0FBQzlDLCtEQUF1QztBQUV2QywrQ0FBMkg7QUFBbEgsd0lBQUEsT0FBTyxPQUFtQjtBQUFFLHFIQUFBLHFCQUFxQixPQUFBO0FBRTFELCtDQUEyQztBQUFsQyx5R0FBQSxTQUFTLE9BQUE7QUFFbEIsNEJBQTRCIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pw-js-world",
3
- "version": "0.3.5",
3
+ "version": "0.3.6-dev.3de8e56",
4
4
  "description": "An optional package for PW-JS-Api, aims to serve world purposes.",
5
5
  "exports": {
6
6
  "types": "./esm/index.js",