pw-js-world
Version:
An optional package for PW-JS-Api, aims to serve world purposes.
569 lines • 51.4 kB
JavaScript
"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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