pw-js-world
Version:
An optional package for PW-JS-Api, aims to serve world purposes.
507 lines • 45.8 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 BufferReader_js_1 = tslib_1.__importDefault(require("./BufferReader.js"));
const Player_js_1 = tslib_1.__importStar(require("./Player.js"));
const Structure_js_1 = require("./Structure.js");
const Error_js_1 = require("./util/Error.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;
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.worldData);
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.worldData);
return;
case "worldClearedPacket":
this.clear();
return;
case "worldBlockPlacedPacket":
{
if (!this._init)
return;
const { positions, layer, blockId, extraFields, playerId } = packet.value;
const player = this.players.get(playerId);
const oldBlocks = [];
const newBlocks = [];
const args = Block_js_1.default.deserializeArgs(BufferReader_js_1.default.from(extraFields)); //(blockId, BufferReader.from(extraFields), true);
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, args);
}
if (!player)
return;
return { player, oldBlocks, newBlocks };
}
//#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":
case "playerRemoveEffectPacket":
case "playerResetEffectsPacket":
{
const player = this.players.get((_e = packet.value) === null || _e === void 0 ? void 0 : _e.playerId);
if (player) {
// const state = //packet.case === "playerGodModePacket" ? "godmode" : "modmode";
let effects = [];
if (packet.case === "playerAddEffectPacket") {
const eff = {
effectId: packet.value.effectId,
duration: packet.value.duration,
strength: packet.value.strength,
};
player.effects.push(new Player_js_1.PlayerEffect(eff));
return { player, effect: eff };
}
else if (packet.case === "playerRemoveEffectPacket") {
const eff = player.effects.findIndex(v => v.effectId === packet.value.effectId);
if (eff) {
effects = player.effects.splice(eff, 1);
return { player, effect: effects[0] };
}
}
else {
return { player, effects: player.effects.splice(0) };
}
}
}
return;
case "playerMovedPacket":
{
const player = this.players.get((_f = packet.value) === null || _f === void 0 ? void 0 : _f.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((_g = packet.value) === null || _g === void 0 ? void 0 : _g.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((_h = packet.value) === null || _h === void 0 ? void 0 : _h.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((_j = packet.value) === null || _j === void 0 ? void 0 : _j.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((_k = packet.value) === null || _k === void 0 ? void 0 : _k.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((_l = packet.value) === null || _l === void 0 ? void 0 : _l.playerId);
if (player) {
const oldState = {
coinsBlue: player.states.coinsBlue,
coinsGold: player.states.coinsGold,
deaths: player.states.deaths,
};
player.states.coinsBlue = packet.value.blueCoins;
player.states.coinsGold = packet.value.coins;
player.states.deaths = packet.value.deaths;
return { player, oldState };
}
}
return;
case "playerTeleportedPacket":
{
const player = this.players.get((_m = packet.value) === null || _m === void 0 ? void 0 : _m.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((_o = packet.value) === null || _o === void 0 ? void 0 : _o.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((_p = packet.value) === null || _p === void 0 ? void 0 : _p.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" ? (_q = packet.value) === null || _q === void 0 ? void 0 : _q.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 = (_r = pw_js_api_1.PWApiClient.listBlocks) === null || _r === void 0 ? void 0 : _r[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 {};
}
//#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.
*/
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) {
const reader = bytes instanceof BufferReader_js_1.default ? bytes : BufferReader_js_1.default.from(bytes);
for (let l = 0; l < 3; l++) {
for (let x = 0; x < this.width; x++) {
for (let y = 0; y < this.height; y++) {
this.blocks[l][x][y] = Block_js_1.default.deserialize(reader);
}
}
}
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL0hlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBeUU7QUFHekUsa0VBQStCO0FBQy9CLGdGQUE2QztBQUM3QyxpRUFBbUU7QUFHbkUsaURBQXVEO0FBQ3ZELDhDQUFvRDtBQUVwRDs7OztHQUlHO0FBQ0gsTUFBcUIsaUJBQWlCO0lBQXRDO1FBQ0k7O1dBRUc7UUFDSCxXQUFNLEdBQXNDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBLG1CQUFtQjtRQUU1RSxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFFcEMsbUJBQWMsR0FBYSxFQUFFLENBQUM7UUFHdEIsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUNYLFlBQU8sR0FBRyxDQUFDLENBQUM7UUFDWixVQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2Qsa0JBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztRQThEM0I7Ozs7OztXQU1HO1FBQ0gsZ0JBQVcsR0FDUCxDQUFDLElBQTRCLEVBQUUsRUFBRTs7WUFFakMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQztZQUV4QixRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbEIsZUFBZTtnQkFDZixLQUFLLGtCQUFrQjtvQkFDbkIsQ0FBQzt3QkFDRyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO3dCQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO3dCQUN0QyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQUEsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLG1DQUFJLElBQUksQ0FBQzt3QkFFNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUV4QyxN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