UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

186 lines (183 loc) • 17.4 kB
import { Vector3 } from '@jsprismarine/math'; import { EntityLike } from './entity/Entity.es.js'; import './network/packet/ActorFallPacket.es.js'; import './network/packet/AddActorPacket.es.js'; import './network/packet/AddItemActorPacket.es.js'; import './network/packet/AddPlayerPacket.es.js'; import './network/packet/AnimatePacket.es.js'; import './network/packet/AvailableActorIdentifiersPacket.es.js'; import './network/packet/AvailableCommandsPacket.es.js'; import '@jsprismarine/jsbinaryutils'; import 'zlib'; import './network/CompressionProvider.es.js'; import './network/packet/NetworkSettingsPacket.es.js'; import './network/packet/BiomeDefinitionListPacket.es.js'; import './network/packet/ChangeDimensionPacket.es.js'; import './network/packet/ChunkRadiusUpdatedPacket.es.js'; import './network/packet/CommandRequestPacket.es.js'; import './network/packet/ContainerClosePacket.es.js'; import './network/packet/ContainerOpenPacket.es.js'; import './network/packet/CreativeContentPacket.es.js'; import './network/packet/DisconnectPacket.es.js'; import './network/packet/EmoteListPacket.es.js'; import './network/packet/InteractPacket.es.js'; import './network/packet/InventoryContentPacket.es.js'; import './network/packet/InventoryTransactionPacket.es.js'; import './network/packet/ItemComponentPacket.es.js'; import './network/packet/ItemStackRequestPacket.es.js'; import './network/packet/ItemStackResponsePacket.es.js'; import './network/packet/LevelChunkPacket.es.js'; import './network/packet/LevelSoundEventPacket.es.js'; import './network/packet/LoginPacket.es.js'; import './network/packet/MobEquipmentPacket.es.js'; import './network/packet/MoveActorAbsolutePacket.es.js'; import './network/packet/MovePlayerPacket.es.js'; import './network/packet/NetworkChunkPublisherUpdatePacket.es.js'; import './network/packet/OnScreenTextureAnimationPacket.es.js'; import './network/packet/PacketViolationWarningPacket.es.js'; import './network/packet/PlaySoundPacket.es.js'; import './network/packet/PlayStatusPacket.es.js'; import './network/packet/PlayerActionPacket.es.js'; import './network/packet/PlayerListPacket.es.js'; import './network/packet/PlayerSkinPacket.es.js'; import './network/packet/RemoveActorPacket.es.js'; import './network/packet/RequestChunkRadiusPacket.es.js'; import './network/packet/RequestNetworkSettingsPacket.es.js'; import './network/packet/ResourcePackResponsePacket.es.js'; import './network/packet/ResourcePackStackPacket.es.js'; import './network/packet/ResourcePacksInfoPacket.es.js'; import './network/packet/ServerSettingsRequestPacket.es.js'; import './network/packet/SetActorDataPacket.es.js'; import './network/packet/SetDefaultGametypePacket.es.js'; import './network/packet/SetHealthPacket.es.js'; import './network/packet/SetLocalPlayerAsInitializedPacket.es.js'; import './network/packet/SetPlayerGametypePacket.es.js'; import './network/packet/SetTimePacket.es.js'; import './network/packet/ShowProfilePacket.es.js'; import './network/packet/StartGamePacket.es.js'; import './network/packet/TextPacket.es.js'; import './network/packet/TickSyncPacket.es.js'; import './network/packet/TransferPacket.es.js'; import './network/packet/UpdateAdventureSettingsPacket.es.js'; import './network/packet/UpdateAttributesPacket.es.js'; import './network/packet/UpdateBlockPacket.es.js'; import './network/packet/WorldEventPacket.es.js'; import '@jsprismarine/bedrock-data'; import './block/BlockToolType.es.js'; import process from 'node:process'; import readline from 'node:readline'; class Console extends EntityLike { cli; constructor(server, runtimeId = BigInt(-1)) { const world = server.getWorldManager().getDefaultWorld(); super({ server, runtimeId, world }); } /** * On enable hook. * @group Lifecycle */ async enable() { if (this.cli) return; if (!process.stdin.setRawMode) { return; } process.stdin.setRawMode(true); process.stdin.setNoDelay(true); process.stdin.setKeepAlive(true); process.stdin.resume(); this.cli = readline.createInterface({ input: process.stdin, output: process.stdout, terminal: true, prompt: "> ", tabSize: 4, removeHistoryDuplicates: true, completer: this.complete.bind(this) }); this.server.on("chat", async (evt) => { if (evt.isCancelled()) return; await this.sendMessage(evt.getChat().getMessage()); }); this.server.getLogger().setConsole(this); this.cli.on("keypress", async (_, key) => { switch (key.name) { case "c": { if (key.ctrl) { await this.server.shutdown(); } break; } } }); this.cli.on("line", (input) => { if (input.trim() === "") return; this.cli?.output.write(`\x1B[2D`); void this.server.getCommandManager().dispatchCommand(this, this, input); }); } /** * On disable hook. * @group Lifecycle */ async disable() { this.cli?.close(); this.cli?.removeAllListeners(); } async complete(line, callback) { const commands = Array.from(this.server.getCommandManager().getCommands().values()).map( (command) => command.name ); const completions = commands.reverse().filter((value, index, self) => self.indexOf(value) === index).reverse(); const hits = completions.filter((c) => c.startsWith(line)); return callback(null, [hits.length ? hits : completions, line]); } write(line) { this.cli?.output.write(`\x1B[${this.cli.getPrompt().length}D`); this.cli?.output.write(`\r${line} \r`); this.cli?._refreshLine?.(); this.cli?.prompt(); } getName() { return "CONSOLE"; } getFormattedUsername() { return "[CONSOLE]"; } async sendMessage(message) { this.server.getLogger().info(message); } getWorld() { return this.server.getWorldManager().getDefaultWorld(); } isPlayer() { return false; } isOp() { return true; } getX() { return 0; } getY() { return 0; } getZ() { return 0; } getPosition() { return new Vector3(0, 0, 0); } getType() { return "jsprismarine:console"; } isConsole() { return true; } } export { Console as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uc29sZS5lcy5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL0NvbnNvbGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvbWF0aCc7XG5pbXBvcnQgdHlwZSB7IFNlcnZlciwgU2VydmljZSB9IGZyb20gJy4vJztcbmltcG9ydCB7IEVudGl0eUxpa2UgfSBmcm9tICcuL2VudGl0eS8nO1xuaW1wb3J0IHR5cGUgQ2hhdEV2ZW50IGZyb20gJy4vZXZlbnRzL2NoYXQvQ2hhdEV2ZW50JztcblxuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQ29tcGxldGVyUmVzdWx0IH0gZnJvbSAnbm9kZTpyZWFkbGluZSc7XG5pbXBvcnQgcmVhZGxpbmUgZnJvbSAnbm9kZTpyZWFkbGluZSc7XG5cbi8vIEV4dGVuZCBidWlsdGluIGByZWFkbGluZS5JbnRlcmZhY2VgIHR5cGVcbmRlY2xhcmUgbW9kdWxlICdub2RlOnJlYWRsaW5lJyB7XG4gICAgaW50ZXJmYWNlIEludGVyZmFjZSB7XG4gICAgICAgIHNldFJhd01vZGU/KG1vZGU6IGJvb2xlYW4pOiB2b2lkO1xuICAgICAgICBvdXRwdXQ6IHtcbiAgICAgICAgICAgIHdyaXRlOiAoZGF0YTogc3RyaW5nKSA9PiB2b2lkO1xuICAgICAgICB9O1xuICAgICAgICBpbnB1dDogYW55O1xuICAgICAgICBfcmVmcmVzaExpbmU/KCk6IHZvaWQ7XG4gICAgfVxufVxuXG4vKipcbiAqIFNlcnZlciBjb25zb2xlLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25zb2xlIGV4dGVuZHMgRW50aXR5TGlrZSBpbXBsZW1lbnRzIFNlcnZpY2Uge1xuICAgIHByaXZhdGUgY2xpPzogcmVhZGxpbmUuSW50ZXJmYWNlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHNlcnZlcjogU2VydmVyLCBydW50aW1lSWQgPSBCaWdJbnQoLTEpKSB7XG4gICAgICAgIGNvbnN0IHdvcmxkID0gc2VydmVyLmdldFdvcmxkTWFuYWdlcigpLmdldERlZmF1bHRXb3JsZCgpITtcbiAgICAgICAgc3VwZXIoe1xuICAgICAgICAgICAgc2VydmVyLFxuICAgICAgICAgICAgcnVudGltZUlkLFxuICAgICAgICAgICAgd29ybGRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT24gZW5hYmxlIGhvb2suXG4gICAgICogQGdyb3VwIExpZmVjeWNsZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBlbmFibGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBlbmFibGUgdGhlIGNvbnNvbGUgdHdpY2UuXG4gICAgICAgIGlmICh0aGlzLmNsaSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICghcHJvY2Vzcy5zdGRpbi5zZXRSYXdNb2RlIGFzIGFueSkge1xuICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIGhlYWRsZXNzIG1vZGVzIGJldHRlciAoZWcgdW5pdCB0ZXN0aW5nKS5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb2Nlc3Muc3RkaW4uc2V0UmF3TW9kZSh0cnVlKTtcbiAgICAgICAgcHJvY2Vzcy5zdGRpbi5zZXROb0RlbGF5KHRydWUpO1xuICAgICAgICBwcm9jZXNzLnN0ZGluLnNldEtlZXBBbGl2ZSh0cnVlKTtcbiAgICAgICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcblxuICAgICAgICB0aGlzLmNsaSA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7XG4gICAgICAgICAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICAgICAgICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gICAgICAgICAgICB0ZXJtaW5hbDogdHJ1ZSxcbiAgICAgICAgICAgIHByb21wdDogJz4gJyxcbiAgICAgICAgICAgIHRhYlNpemU6IDQsXG4gICAgICAgICAgICByZW1vdmVIaXN0b3J5RHVwbGljYXRlczogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBsZXRlcjogdGhpcy5jb21wbGV0ZS5iaW5kKHRoaXMpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2VydmVyLm9uKCdjaGF0JywgYXN5bmMgKGV2dDogQ2hhdEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZ0LmlzQ2FuY2VsbGVkKCkpIHJldHVybjtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2UoZXZ0LmdldENoYXQoKS5nZXRNZXNzYWdlKCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0TG9nZ2VyKCkuc2V0Q29uc29sZSh0aGlzKTtcblxuICAgICAgICB0aGlzLmNsaS5vbigna2V5cHJlc3MnLCBhc3luYyAoXywga2V5KSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGtleS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnYyc6IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5jdHJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlcnZlci5zaHV0ZG93bigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jbGkub24oJ2xpbmUnLCAoaW5wdXQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKGlucHV0LnRyaW0oKSA9PT0gJycpIHJldHVybjtcblxuICAgICAgICAgICAgLy8gRml4IGN1cnNvciBwb3NpdGlvbmluZy5cbiAgICAgICAgICAgIHRoaXMuY2xpPy5vdXRwdXQud3JpdGUoYFxceDFiWzJEYCk7XG5cbiAgICAgICAgICAgIHZvaWQgdGhpcy5zZXJ2ZXIuZ2V0Q29tbWFuZE1hbmFnZXIoKS5kaXNwYXRjaENvbW1hbmQodGhpcyBhcyBhbnksIHRoaXMgYXMgYW55LCBpbnB1dCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9uIGRpc2FibGUgaG9vay5cbiAgICAgKiBAZ3JvdXAgTGlmZWN5Y2xlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGRpc2FibGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY2xpPy5jbG9zZSgpO1xuICAgICAgICB0aGlzLmNsaT8ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjb21wbGV0ZShsaW5lOiBzdHJpbmcsIGNhbGxiYWNrOiAoZXJyPzogbnVsbCB8IEVycm9yLCByZXN1bHQ/OiBDb21wbGV0ZXJSZXN1bHQpID0+IHZvaWQpIHtcbiAgICAgICAgY29uc3QgY29tbWFuZHMgPSBBcnJheS5mcm9tKHRoaXMuc2VydmVyLmdldENvbW1hbmRNYW5hZ2VyKCkuZ2V0Q29tbWFuZHMoKS52YWx1ZXMoKSkubWFwKFxuICAgICAgICAgICAgKGNvbW1hbmQpID0+IGNvbW1hbmQubmFtZVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIE1lcmdlIGFuZCByZW1vdmUgZHVwbGljYXRlcy5cbiAgICAgICAgY29uc3QgY29tcGxldGlvbnMgPSBjb21tYW5kc1xuICAgICAgICAgICAgLnJldmVyc2UoKSAvLyBSZXZlcnNlIHRvIHJlbW92ZSBkdXBsaWNhdGVzIGF0IHRoZSBlbmQuXG4gICAgICAgICAgICAuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+IHNlbGYuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4KVxuICAgICAgICAgICAgLnJldmVyc2UoKTsgLy8gUmVzdG9yZS5cblxuICAgICAgICAvLyBUT0RPOiBIYW5kbGUgYXJndW1lbnRzLlxuICAgICAgICBjb25zdCBoaXRzID0gY29tcGxldGlvbnMuZmlsdGVyKChjKSA9PiBjLnN0YXJ0c1dpdGgobGluZSkpO1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgW2hpdHMubGVuZ3RoID8gaGl0cyA6IGNvbXBsZXRpb25zLCBsaW5lXSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlKGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIHByb21wdCB0aGF0J3MgcHJlZml4ZWQgd2hlbiBsb2dnaW5nLlxuICAgICAgICB0aGlzLmNsaT8ub3V0cHV0LndyaXRlKGBcXHgxYlske3RoaXMuY2xpLmdldFByb21wdCgpLmxlbmd0aH1EYCk7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIGxpbmUuXG4gICAgICAgIHRoaXMuY2xpPy5vdXRwdXQud3JpdGUoYFxcciR7bGluZX1cXG5cXHJgKTtcblxuICAgICAgICB0aGlzLmNsaT8uX3JlZnJlc2hMaW5lPy4oKTtcbiAgICAgICAgdGhpcy5jbGk/LnByb21wdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnQ09OU09MRSc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1hdHRlZFVzZXJuYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnW0NPTlNPTEVdJztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZE1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuc2VydmVyLmdldExvZ2dlcigpLmluZm8obWVzc2FnZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFdvcmxkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXJ2ZXIuZ2V0V29ybGRNYW5hZ2VyKCkuZ2V0RGVmYXVsdFdvcmxkKCkhO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1BsYXllcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc09wKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0WCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcHVibGljIGdldFkoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRaKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQb3NpdGlvbigpOiBWZWN0b3IzIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKDAsIDAsIDApO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUeXBlKCkge1xuICAgICAgICByZXR1cm4gJ2pzcHJpc21hcmluZTpjb25zb2xlJztcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNDb25zb2xlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0JBLE1BQXFCLGdCQUFnQixVQUE4QixDQUFBO0FBQUEsRUFDdkQsR0FBQTtBQUFBLEVBRUQsV0FBWSxDQUFBLE1BQUEsRUFBZ0IsU0FBWSxHQUFBLE1BQUEsQ0FBTyxFQUFFLENBQUcsRUFBQTtBQUN2RCxJQUFBLE1BQU0sS0FBUSxHQUFBLE1BQUEsQ0FBTyxlQUFnQixFQUFBLENBQUUsZUFBZ0IsRUFBQTtBQUN2RCxJQUFNLEtBQUEsQ0FBQTtBQUFBLE1BQ0YsTUFBQTtBQUFBLE1BQ0EsU0FBQTtBQUFBLE1BQ0E7QUFBQSxLQUNILENBQUE7QUFBQTtBQUNMO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxNQUFhLE1BQXdCLEdBQUE7QUFFakMsSUFBQSxJQUFJLEtBQUssR0FBSyxFQUFBO0FBRWQsSUFBSSxJQUFBLENBQUMs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