UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

49 lines (46 loc) 6.94 kB
import { NBTReader, ByteOrder } from '@jsprismarine/nbt'; import * as BedrockData from '@jsprismarine/bedrock-data'; import BinaryStream from '@jsprismarine/jsbinaryutils'; import { gunzipSync } from 'zlib'; class BlockMappings { // private static readonly legacyToRuntimeId: Map<number, number> = new Map(); // private static readonly runtimeIdToLegacy: Map<number, number> = new Map(); // block name -> runtimeId (will not support states for now :(...) static nameToRuntime = /* @__PURE__ */ new Map(); static runtimeToName = /* @__PURE__ */ new Map(); static async initMappings(server) { try { const stream = new BinaryStream( gunzipSync(BedrockData.canonical_block_states) // Vanilla states ); const reader = new NBTReader(stream, ByteOrder.BIG_ENDIAN); for (const blockTag of reader.parseList()) { const name = blockTag.getString("name", "minecraft:air"); const runtimeId = blockTag.getNumber("runtimeId", 0); this.registerMapping(name, runtimeId); } } catch (error) { server.getLogger().error("Failed to load block mappings"); server.getLogger().error(error); } } static reset() { this.nameToRuntime.clear(); this.runtimeToName.clear(); } static registerMapping(name, runtimeId) { this.nameToRuntime.set(name, runtimeId); this.runtimeToName.set(runtimeId, name); } static getRuntimeId(name) { return name ? this.nameToRuntime.get(name) : 0; } static getLegacyId(runtimeId) { const name = this.runtimeToName.get(runtimeId); const legacyId = BedrockData.block_id_map[name]; return { id: legacyId & 15, meta: 0 }; } } export { BlockMappings }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvY2tNYXBwaW5ncy5lcy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jsb2NrL0Jsb2NrTWFwcGluZ3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBOQlRUYWdDb21wb3VuZCB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvbmJ0JztcbmltcG9ydCB7IEJ5dGVPcmRlciwgTkJUUmVhZGVyIH0gZnJvbSAnQGpzcHJpc21hcmluZS9uYnQnO1xuXG5pbXBvcnQgKiBhcyBCZWRyb2NrRGF0YSBmcm9tICdAanNwcmlzbWFyaW5lL2JlZHJvY2stZGF0YSc7XG5pbXBvcnQgQmluYXJ5U3RyZWFtIGZyb20gJ0Bqc3ByaXNtYXJpbmUvanNiaW5hcnl1dGlscyc7XG5pbXBvcnQgeyBndW56aXBTeW5jIH0gZnJvbSAnemxpYic7XG5pbXBvcnQgdHlwZSBTZXJ2ZXIgZnJvbSAnLi4vU2VydmVyJztcblxuZXhwb3J0IGludGVyZmFjZSBMZWdhY3lJZCB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBtZXRhOiBudW1iZXI7XG59XG5cbi8qKlxuICogQ2xhc3MgdXNlZCB0byBtYW5hZ2UgcnVudGltZSBJZHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCbG9ja01hcHBpbmdzIHtcbiAgICAvLyBwcml2YXRlIHN0YXRpYyByZWFkb25seSBsZWdhY3lUb1J1bnRpbWVJZDogTWFwPG51bWJlciwgbnVtYmVyPiA9IG5ldyBNYXAoKTtcbiAgICAvLyBwcml2YXRlIHN0YXRpYyByZWFkb25seSBydW50aW1lSWRUb0xlZ2FjeTogTWFwPG51bWJlciwgbnVtYmVyPiA9IG5ldyBNYXAoKTtcbiAgICAvLyBibG9jayBuYW1lIC0+IHJ1bnRpbWVJZCAod2lsbCBub3Qgc3VwcG9ydCBzdGF0ZXMgZm9yIG5vdyA6KC4uLilcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBuYW1lVG9SdW50aW1lOiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHJ1bnRpbWVUb05hbWU6IE1hcDxudW1iZXIsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGluaXRNYXBwaW5ncyhzZXJ2ZXI6IFNlcnZlcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShcbiAgICAgICAgICAgICAgICBndW56aXBTeW5jKEJlZHJvY2tEYXRhLmNhbm9uaWNhbF9ibG9ja19zdGF0ZXMpIC8vIFZhbmlsbGEgc3RhdGVzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcmVhZGVyOiBOQlRSZWFkZXIgPSBuZXcgTkJUUmVhZGVyKHN0cmVhbSwgQnl0ZU9yZGVyLkJJR19FTkRJQU4pO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJsb2NrVGFnIG9mIHJlYWRlci5wYXJzZUxpc3Q8TkJUVGFnQ29tcG91bmQ+KCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gYmxvY2tUYWcuZ2V0U3RyaW5nKCduYW1lJywgJ21pbmVjcmFmdDphaXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCBydW50aW1lSWQgPSBibG9ja1RhZy5nZXROdW1iZXIoJ3J1bnRpbWVJZCcsIDApOyAvLyBUT0RPOiBBaXIgcnVudGltZSBJRFxuICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJNYXBwaW5nKG5hbWUsIHJ1bnRpbWVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICBzZXJ2ZXIuZ2V0TG9nZ2VyKCkuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIGJsb2NrIG1hcHBpbmdzJyk7XG4gICAgICAgICAgICBzZXJ2ZXIuZ2V0TG9nZ2VyKCkuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZXNldCgpIHtcbiAgICAgICAgdGhpcy5uYW1lVG9SdW50aW1lLmNsZWFyKCk7XG4gICAgICAgIHRoaXMucnVudGltZVRvTmFtZS5jbGVhcigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHJlZ2lzdGVyTWFwcGluZyhuYW1lOiBzdHJpbmcsIHJ1bnRpbWVJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMubmFtZVRvUnVudGltZS5zZXQobmFtZSwgcnVudGltZUlkKTtcbiAgICAgICAgdGhpcy5ydW50aW1lVG9OYW1lLnNldChydW50aW1lSWQsIG5hbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UnVudGltZUlkKG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gbmFtZSA/IHRoaXMubmFtZVRvUnVudGltZS5nZXQobmFtZSkhIDogMDsgLy8gVE9ETzogQWlyIHJ1bnRpbWUgSURcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldExlZ2FjeUlkKHJ1bnRpbWVJZDogbnVtYmVyKTogTGVnYWN5SWQge1xuICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5ydW50aW1lVG9OYW1lLmdldChydW50aW1lSWQpITtcbiAgICAgICAgY29uc3QgbGVnYWN5SWQgPSAoQmVkcm9ja0RhdGEgYXMgYW55KS5ibG9ja19pZF9tYXBbbmFtZV0gYXMgbnVtYmVyO1xuICAgICAgICAvLyBUT0RPOiBwcm9wZXIgbWV0YVxuICAgICAgICByZXR1cm4gPExlZ2FjeUlkPnsgaWQ6IGxlZ2FjeUlkICYgMHhmLCBtZXRhOiAwIH07XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBZ0JPLE1BQU0sYUFBYyxDQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJdkIsT0FBd0IsYUFBcUMsbUJBQUEsSUFBSSxHQUFJLEVBQUE7QUFBQSxFQUNyRSxPQUF3QixhQUFxQyxtQkFBQSxJQUFJLEdBQUksRUFBQTtBQUFBLEVBRXJFLGFBQW9CLGFBQWEsTUFBZ0IsRUFBQTtBQUM3QyxJQUFJLElBQUE7QUFDQSxNQUFBLE1BQU0sU0FBUyxJQUFJLFlBQUE7QUFBQSxRQUNmLFVBQUEsQ0FBVyxZQUFZLHNCQUFzQjtBQUFBO0FBQUEsT0FDakQ7QUFDQSxNQUFBLE1BQU0sTUFBb0IsR0FBQSxJQUFJLFNBQVUsQ0FBQSxNQUFBLEVBQVEsVUFBVSxVQUFVLENBQUE7QUFFcEUsTUFBVyxLQUFBLE1BQUEsUUFBQSxJQUFZLE1BQU8sQ0FBQSxTQUFBLEVBQTZCLEVBQUE7QUFDdkQsUUFBQSxNQUFNLElBQU8sR0FBQSxRQUFBLENBQVMsU0FBVSxDQUFBLE1BQUEsRUFBUSxlQUFlLENBQUE7QUFDdkQsUUFBQSxNQUFNLFNBQVksR0FBQSxRQUFBLENBQVMsU0FBVSxDQUFBLFdBQUEsRUFBYSxDQUFDLENBQUE7QUFDbkQsUUFBSyxJQUFBLENBQUEsZUFBQSxDQUFnQixNQUFNLFNBQVMsQ0FBQTtBQUFBO0FBQ3hDLGFBQ0ssS0FBZ0IsRUFBQTtBQUNyQixNQUFPLE1BQUEsQ0FBQSxTQUFBLEVBQVksQ0FBQSxLQUFBLENBQU0sK0JBQStCLENBQUE7QUFDeEQsTUFBTyxNQUFBLENBQUEsU0FBQSxFQUFZLENBQUEsS0FBQSxDQUFNLEtBQUssQ0FBQTtBQUFBO0FBQ2xDO0FBQ0osRUFFQSxPQUFjLEtBQVEsR0FBQTtBQUNsQixJQUFBLElBQUEsQ0FBSyxjQUFjLEtBQU0sRUFBQTtBQUN6QixJQUFBLElBQUEsQ0FBSyxjQUFjLEtBQU0sRUFBQTtBQUFBO0FBQzdCLEVBRUEsT0FBZSxlQUFnQixDQUFBLElBQUEsRUFBYyxTQUF5QixFQUFBO0FBQ2xFLElBQUssSUFBQSxDQUFBLGFBQUEsQ0FBYyxHQUFJLENBQUEsSUFBQSxFQUFNLFNBQVMsQ0FBQTtBQUN0QyxJQUFLLElBQUEsQ0FBQSxhQUFBLENBQWMsR0FBSSxDQUFBLFNBQUEsRUFBVyxJQUFJLENBQUE7QUFBQTtBQUMxQyxFQUVBLE9BQWMsYUFBYSxJQUF5QyxFQUFBO0FBQ2hFLElBQUEsT0FBTyxJQUFPLEdBQUEsSUFBQSxDQUFLLGFBQWMsQ0FBQSxHQUFBLENBQUksSUFBSSxDQUFLLEdBQUEsQ0FBQTtBQUFBO0FBQ2xELEVBRUEsT0FBYyxZQUFZLFNBQTZCLEVBQUE7QUFDbkQsSUFBQSxNQUFNLElBQU8sR0FBQSxJQUFBLENBQUssYUFBYyxDQUFBLEdBQUEsQ0FBSSxTQUFTLENBQUE7QUFDN0MsSUFBTSxNQUFBLFFBQUEsR0FBWSxXQUFvQixDQUFBLFlBQUEsQ0FBYSxJQUFJLENBQUE7QUFFdkQsSUFBQSxPQUFpQixFQUFFLEVBQUEsRUFBSSxRQUFXLEdBQUEsRUFBQSxFQUFLLE1BQU0sQ0FBRSxFQUFBO0FBQUE7QUFFdkQ7Ozs7In0=