UNPKG

pw-js-world

Version:

An optional package for PW-JS-Api, aims to serve world purposes.

569 lines 51.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const pw_js_api_1 = require("pw-js-api"); const Block_js_1 = tslib_1.__importDefault(require("./Block.js")); const Player_js_1 = tslib_1.__importStar(require("./Player.js")); const Constants_js_1 = require("./Constants.js"); const Structure_js_1 = require("./Structure.js"); const Error_js_1 = require("./util/Error.js"); const Misc_js_1 = require("./util/Misc.js"); /** * To use this helper, you must first create an instance of this, * * then: <PWGameClient>.addCallback("raw", helper.onRawPacketRecv) */ class PWGameWorldHelper { constructor() { /** * Arrays of blocks (by layer, x, y) */ this.blocks = [[], [], []]; //Block[][][] = []; this.players = new Map(); this.globalSwitches = []; this._width = 0; this._height = 0; this._init = false; this._selfPlayerId = -1; /** * This must go in .use() of the main PW-JS-API Game Client class. * * <PWGameClient>.use(<PWGameWorldHelper>.receiveHook) * * DO NOT PUT () AFTER RECEIVEHOOK */ this.receiveHook = (data) => { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t; const { packet } = data; switch (packet.case) { //#region World case "playerInitPacket": { this._height = packet.value.worldHeight; this._width = packet.value.worldWidth; this._meta = (_a = packet.value.worldMeta) !== null && _a !== void 0 ? _a : null; this.initialise(packet.value); const props = packet.value.playerProperties; this.globalSwitches = this.convertSwitchState(packet.value.globalSwitchState); if (props) { this.players.set(props.playerId, new Player_js_1.default(props, true)); this._selfPlayerId = props.playerId; return { player: this.players.get(props.playerId) }; } //packet.value..playerProperties?.) return; } case "worldMetaUpdatePacket": this._meta = (_b = packet.value.meta) !== null && _b !== void 0 ? _b : null; return; case "worldReloadedPacket": this.initialise(packet.value); return; case "worldClearedPacket": this.clear(); return; case "worldBlockPlacedPacket": { if (!this._init) return; const { positions, layer, blockId, fields, playerId } = packet.value; const player = this.players.get(playerId); const oldBlocks = []; const newBlocks = []; for (let i = 0, len = positions.length; i < len; i++) { const { x, y } = positions[i]; oldBlocks[i] = this.blocks[layer][x][y].clone(); newBlocks[i] = this.blocks[layer][x][y] = new Block_js_1.default(blockId, packet.value.fields); } // console.log(`Block has been placed: ${blockId}, args:`, newBlocks[0].args); if (!player) return; return { player, oldBlocks, newBlocks }; } // return; //#endregion //#region Player case "playerJoinedPacket": { const { properties, worldState } = packet.value; let player; if (properties && worldState) { 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) }))); return { player }; } } return; case "playerLeftPacket": { const player = this.players.get(packet.value.playerId); if (player) { this.players.delete(packet.value.playerId); return { player: player }; } } return; case "playerFacePacket": { const player = this.players.get((_c = packet.value) === null || _c === void 0 ? void 0 : _c.playerId); if (player) { const oldie = player.face; player.face = packet.value.faceId; return { player, oldFace: oldie }; //changes: { type: "face", oldValue: oldFace, newValue: player.face } }; } } return; case "playerModModePacket": case "playerGodModePacket": { const player = this.players.get((_d = packet.value) === null || _d === void 0 ? void 0 : _d.playerId); if (player) { const state = packet.case === "playerGodModePacket" ? "godmode" : "modmode"; const oldie = player.states[state]; player.states[state] = packet.value.enabled; return { player, oldState: oldie }; //changes: { type: "face", oldValue: oldFace, newValue: player.face } }; } } return; case "playerAddEffectPacket": { const player = this.players.get((_e = packet.value) === null || _e === void 0 ? void 0 : _e.playerId); if (player === undefined) return; const eff = new Player_js_1.PlayerEffect({ effectId: packet.value.effectId, duration: packet.value.duration, strength: packet.value.strength, }); // const prevEff = player.effects.get(eff.effectId); // if (prevEff) { // // Cos mutability. // prevEff._update(eff); // return { player, effect: prevEff }; // } if (eff.effectId === Constants_js_1.EffectId.Invulnerability) { // maybe a better way to do this? // TODO: return the affected effects? player.effects.delete(Constants_js_1.EffectId.Curse); player.effects.delete(Constants_js_1.EffectId.Zombie); player.effects.delete(Constants_js_1.EffectId.Poison); } return { player, effect: eff }; } case "playerRemoveEffectPacket": { const player = this.players.get((_f = packet.value) === null || _f === void 0 ? void 0 : _f.playerId); if (player === undefined) return; const eff = player.effects.get(packet.value.effectId); if (eff !== undefined) { player.effects.delete(packet.value.effectId); return { player, effect: eff }; } } return; case "playerResetEffectsPacket": { const player = this.players.get((_g = packet.value) === null || _g === void 0 ? void 0 : _g.playerId); if (player === undefined) return; // const state = //packet.case === "playerGodModePacket" ? "godmode" : "modmode"; let effects = []; const currEffects = Array.from(player.effects.values()); for (let i = 0; i < currEffects.length; i++) { // for now its just curse/poison/zombie (all timed). if (currEffects[i].duration !== undefined) continue; effects.push(currEffects[i]); player.effects.delete(currEffects[i].effectId); } return { player, effects: effects }; } case "playerMovedPacket": { const player = this.players.get((_h = packet.value) === null || _h === void 0 ? void 0 : _h.playerId); if (player) { if (packet.value.position) { player.position = { x: packet.value.position.x, y: packet.value.position.y, }; } return { player }; //changes: { type: "face", oldValue: oldFace, newValue: player.face } }; } } return; case "playerResetPacket": { const player = this.players.get((_j = packet.value) === null || _j === void 0 ? void 0 : _j.playerId); if (player) { player.resetState(); if (packet.value.position) { player.position = { x: packet.value.position.x, y: packet.value.position.y, }; } return { player }; } } return; case "playerRespawnPacket": { const player = this.players.get((_k = packet.value) === null || _k === void 0 ? void 0 : _k.playerId); if (player) { // deaths also reflect in counters update packet if (packet.value.position) { player.position = { x: packet.value.position.x, y: packet.value.position.y, }; } return { player }; } } return; case "playerUpdateRightsPacket": { const player = this.players.get((_l = packet.value) === null || _l === void 0 ? void 0 : _l.playerId); if (player) { if (packet.value.rights) { player.rights = { availableCommands: packet.value.rights.availableCommands, canChangeWorldSettings: packet.value.rights.canChangeWorldSettings, canEdit: packet.value.rights.canEdit, canGod: packet.value.rights.canGod, canToggleMinimap: packet.value.rights.canToggleMinimap, }; } else player.resetRights(); return { player, rights: player.rights }; } } return; case "playerTeamUpdatePacket": { const player = this.players.get((_m = packet.value) === null || _m === void 0 ? void 0 : _m.playerId); if (player) { const oldTeam = player.states.teamId; player.states.teamId = packet.value.teamId; return { player, oldTeam }; } } return; case "playerCountersUpdatePacket": { const player = this.players.get((_o = packet.value) === null || _o === void 0 ? void 0 : _o.playerId); if (player) { const oldState = { coins: { blue: player.states.coins.blue, gold: player.states.coins.gold, }, deaths: player.states.deaths, }; player.states.coins.blue = packet.value.blueCoins; player.states.coins.gold = packet.value.coins; player.states.deaths = packet.value.deaths; return { player, oldState }; } } return; case "playerTeleportedPacket": { const player = this.players.get((_p = packet.value) === null || _p === void 0 ? void 0 : _p.playerId); if (player) { if (packet.value.position) player.position = { x: packet.value.position.x, y: packet.value.position.y, }; return { player }; } } return; case "globalSwitchChangedPacket": case "playerLocalSwitchChangedPacket": { const player = this.players.get((_q = packet.value) === null || _q === void 0 ? void 0 : _q.playerId); if (packet.case === "globalSwitchChangedPacket") { this.globalSwitches[packet.value.switchId] = packet.value.switchEnabled; } if (player) { if (packet.case === "playerLocalSwitchChangedPacket") { player.states.switches[packet.value.switchId] = packet.value.switchEnabled; } return { player }; } } return; case "globalSwitchResetPacket": case "playerLocalSwitchResetPacket": { const player = this.players.get((_r = packet.value) === null || _r === void 0 ? void 0 : _r.playerId); if (packet.case === "globalSwitchResetPacket") { this.globalSwitches = this.globalSwitches.fill(false); } if (player) { if (packet.case === "playerLocalSwitchResetPacket") { player.states.switches.fill(packet.value.switchEnabled); } return { player }; } } return; case "playerChatPacket": case "playerDirectMessagePacket": // case "playerDirectMessagePacket": { const player = this.players.get(packet.case === "playerChatPacket" ? (_s = packet.value) === null || _s === void 0 ? void 0 : _s.playerId : (packet.value.fromPlayerId === this._selfPlayerId ? packet.value.fromPlayerId : packet.value.targetPlayerId)); if (player) { return { player }; } } return; case "playerTouchBlockPacket": { const player = this.players.get(packet.value.playerId); if (player && packet.value.position) { const blockName = (_t = pw_js_api_1.PWApiClient.listBlocks) === null || _t === void 0 ? void 0 : _t[packet.value.blockId]; if (blockName === undefined) throw new Error_js_1.MissingBlockError("Current block data might be outdated, restart application?", packet.value.blockId); if (blockName.PaletteId === "COIN_GOLD" || blockName.PaletteId === "COIN_BLUE") { player.states.collectedItems.push({ x: packet.value.position.x, y: packet.value.position.y, }); } } return player ? { player } : {}; } case "playerCounterTransactionPacket": { const player = this.players.get(packet.value.playerId); if (player) { const oldScore = player.states.counters.scores[packet.value.counterId]; player.states.counters.scores[packet.value.counterId] = packet.value.count; return { oldScore, diff: packet.value.count - oldScore, player }; } return {}; } case "playerSetCollectiblesPacket": { const player = this.players.get(packet.value.playerId); if (!player) return {}; // not sure what to do? // packet.value.collected // console.log(packet.value.collected); } //#endregion } return; }; } /** * The current world's width. * * If you didn't put the hook before init, this may throw error. */ get width() { if (this._width === -1) throw Error("World not initialised, or was applied too late."); return this._width; } /** * The current world's height. * * If you didn't put the hook before init, this may throw error. */ get height() { if (this._height === -1) throw Error("World not initialised, or was applied too late."); return this._height; } /** * The current world's metadata. * * If you didn't put the hook before init, this may throw error. */ get meta() { if (this._meta === undefined) throw Error("World not initialised, or was applied too late."); return this._meta; } /** * If this helper is ready. When it's false, the helper will not return anything for any of the packets. */ get initialised() { return this._init; } /** * The bot's player object. * * If you didn't put the hook before init, this may throw error. */ get botPlayer() { let player = this.players.get(this._selfPlayerId); if (!player) throw Error("Player not stored, hook may have been applied too late?"); return player; } /** * The bot's player id in the world. * * If you didn't put the hook before init, this may throw error. */ get botPlayerId() { if (this._selfPlayerId === -1) throw Error("Player not stored, hook may have been applied too late."); return this._selfPlayerId; } /** * Internal function. * * Yes th typing is cursed, I don't care as this is private. */ initialise(bytes, width, height) { if (width === undefined) width = this.width; if (height === undefined) height = this.height; this.blocks.splice(0); for (let l = 0; l < 3; l++) { this.blocks[l] = []; for (let x = 0; x < width; x++) { this.blocks[l][x] = []; for (let y = 0; y < height; y++) { this.blocks[l][x][y] = new Block_js_1.default(0); } } } this.deserialize(bytes); } /** * Internal function. */ deserialize(bytes) { /** * Index based on the layer. * For now since there's only 3 layers. */ const data = [ Buffer.isBuffer(bytes.backgroundLayerData) ? bytes.backgroundLayerData : Buffer.from(bytes.backgroundLayerData), Buffer.isBuffer(bytes.foregroundLayerData) ? bytes.foregroundLayerData : Buffer.from(bytes.foregroundLayerData), Buffer.isBuffer(bytes.overlayLayerData) ? bytes.overlayLayerData : Buffer.from(bytes.overlayLayerData) ]; let palette; let runLength; let offset = { val: 0 }; for (let i = 0, l = 0; l < data.length; l++, i = 0) { offset.val = 0; while (data[l].byteLength - offset.val > 0) { palette = bytes.blockDataPalette[(0, Misc_js_1.read7BitEncodedInt)(data[l], offset)]; runLength = ((0, Misc_js_1.read7BitEncodedInt)(data[l], offset)); ; const b = new Block_js_1.default(palette.blockId, palette.fields); while (runLength-- > 0) { let x = Math.floor(i / this._height); let y = i % this._height; if (x < this._width && y < this._height) { this.blocks[l][x][y] = b.clone(); } i++; } } } this._init = true; } convertSwitchState(arr) { const list = new Array(1000); for (let i = 0; i < 1000; i++) { list[i] = arr[i] === 1; } return list; } /** * Internal function, this triggers when the world gets cleared. * * Clears the blocks map and promptly fill it with empty except the border which becomes basci gray. */ clear() { this.blocks.splice(0); // To prevent subtracting every single time, can be costly computation wise. const lastWidth = this.width - 1; const lastHeight = this.width - 1; for (let l = 0; l < 3; l++) { this.blocks[l] = []; for (let x = 0; x < this.width; x++) { this.blocks[l][x] = []; for (let y = 0; y < this.height; y++) { this.blocks[l][x][y] = new Block_js_1.default(l === 1 && (x === 0 || x === lastWidth || y === 0 || y === lastHeight) ? "BASIC_GRAY" : "EMPTY"); } } } } getBlockAt(x, y, l) { if (typeof x !== "number") { l = y; y = x.y; x = x.x; } if (l === undefined || l < 0 || l > 2) throw Error("Unknown layer"); if (x < 0 || x >= this.width) throw Error("X is outside the bound of the world."); if (y < 0 || y >= this.height) throw Error("Y is outside the bound of the world."); return this.blocks[l][x][y]; } getPlayer(id, isAccount) { if (typeof id === "string") { const players = this.getPlayers(); // all names are upper case if (!isAccount) id = id.toUpperCase(); for (let i = 0, len = players.length; i < len; i++) { if (isAccount) { if (players[i].accountId === id) return players[i]; } else if (players[i].username === id) return players[i]; } return undefined; } return this.players.get(id); } /** * Returns the list of current players in the world. */ getPlayers() { return Array.from(this.players.values()); } /** * This will return a DeserialisedStructure which will allow you to easily save to a file if you wish. * * 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. * * NOTE: endX and endY are also included! */ sectionBlocks(startX, startY, endX, endY) { const blocks = [[], [], []]; if (startX > endX) throw Error("Starting X is greater than ending X"); if (startY > endY) throw Error("Starting Y is greater than ending Y"); for (let l = 0; l < 3; l++) { for (let x = startX, width = Math.min(endX, this.width); x <= width; x++) { blocks[l][x - startX] = []; for (let y = startY, height = Math.min(endY, this.height); y <= height; y++) { blocks[l][x - startX][y - startY] = this.blocks[l][x][y].clone(); } } } return new Structure_js_1.DeserialisedStructure(blocks, { width: endX - startX + 1, height: endY - startY + 1 }); } } exports.default = PWGameWorldHelper; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL0hlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBeUU7QUFHekUsa0VBQStCO0FBRS9CLGlFQUFtRTtBQUNuRSxpREFBcUQ7QUFFckQsaURBQXVEO0FBQ3ZELDhDQUFvRDtBQUNwRCw0Q0FBb0Q7QUFFcEQ7Ozs7R0FJRztBQUNILE1BQXFCLGlCQUFpQjtJQUF0QztRQUNJOztXQUVHO1FBQ0gsV0FBTSxHQUFzQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQSxtQkFBbUI7UUFFNUUsWUFBTyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBRXBDLG1CQUFjLEdBQWEsRUFBRSxDQUFDO1FBR3RCLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFDWCxZQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ1osVUFBSyxHQUFHLEtBQUssQ0FBQztRQUNkLGtCQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUE4RDNCOzs7Ozs7V0FNRztRQUNILGdCQUFXLEdBQ1AsQ0FBQyxJQUE0QixFQUFFLEVBQUU7O1lBRWpDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFFeEIsUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2xCLGVBQWU7Z0JBQ2YsS0FBSyxrQkFBa0I7b0JBQ25CLENBQUM7d0JBQ0csSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQzt3QkFDeEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQzt3QkFDdEMsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFBLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxtQ0FBSSxJQUFJLENBQUM7d0JBRTVDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUU5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