UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

176 lines (173 loc) • 17.7 kB
import { SeedGenerator } from '../utils/Seed.es.js'; import { withCwd } from '../utils/cwd.es.js'; import { ConfigBuilder } from './ConfigBuilder.es.js'; import { getGametypeName } from '@jsprismarine/minecraft'; const isDev = process.env.NODE_ENV === "development"; const FILE_NAME = "config.yaml"; class Config { configBuilder; logLevel; port; serverIp; levelName; worlds; maxPlayers; gamemode; motd; viewDistance; onlineMode; packetCompressionLevel; /** * Controls if the minecraft/source query response should be enabled. */ enableQuery = true; /** * Controls if the process title should be updated. * @remarks this can cause performance issues in some terminals. */ enableProcessTitle = true; /** * Controls if the ticking should be enabled. */ enableTicking = true; constructor() { this.configBuilder = new ConfigBuilder(withCwd(FILE_NAME)); this.logLevel = this.configBuilder.get("log-level", isDev ? "verbose" : "info"); } /** * On enable hook. * @group Lifecycle */ async enable() { this.configBuilder = new ConfigBuilder(withCwd(FILE_NAME)); this.logLevel = this.configBuilder.get("log-level", isDev ? "verbose" : "info"); this.port = this.configBuilder.get("port", 19132); this.serverIp = this.configBuilder.get("server-ip", "0.0.0.0"); this.levelName = this.configBuilder.get("level-name", "world"); this.worlds = this.configBuilder.get("worlds", { world: { generator: "Flat", provider: "Filesystem", seed: SeedGenerator() } }); this.maxPlayers = this.configBuilder.get("max-players", 20); this.gamemode = this.configBuilder.get("gamemode", "survival"); this.motd = this.configBuilder.get("motd", "Another JSPrismarine server!"); this.viewDistance = this.configBuilder.get("view-distance", 10); this.onlineMode = this.configBuilder.get("online-mode", false); this.packetCompressionLevel = this.configBuilder.get("packet-compression-level", 7); this.enableQuery = this.configBuilder.get("enable-query", this.enableQuery); this.enableProcessTitle = this.configBuilder.get( "enable-process-title", this.enableProcessTitle ); this.enableTicking = this.configBuilder.get("enable-ticking", this.enableTicking); } /** * On disable hook. * @group Lifecycle */ async disable() { } getLogLevel() { return this.logLevel; } /** * Get the server's port. * @returns {number} The server's port * @remarks The default port is `19132`. */ getServerPort() { return this.port; } /** * Get the server's IP address. * @remarks The default IP address is `0.0.0.0` * @returns {string} The server's IP address */ getServerIp() { return this.serverIp; } /** * Returns the default world's name (`id`). * @returns The world's name as a `string` * @remarks * If the world doesn't exist as a part of the `worlds` array the `worldManager` will * fail to initialize. */ getLevelName() { return this.levelName; } getWorlds() { return this.worlds; } /** * * @returns The max amount of players allowed onto the server at the same time. */ getMaxPlayers() { return this.maxPlayers; } getGamemode() { return this.gamemode; } /** * Set the default gamemode. * * @param gamemode - the gamemode * @param commit - if the value should be written to the `config.yml` file */ setGamemode(gamemode, commit = false) { this.gamemode = getGametypeName(gamemode); if (commit) this.configBuilder.set("gamemode", this.gamemode); } /** * Returns true or false depending on if online mode is enabled. * * @returns The message of the day as a `string` */ getMotd() { return this.motd; } /** * Set the motd. * * @param motd - the gamemode * @param commit - if the value should be written to the `config.yml` file */ setMotd(motd, commit = false) { this.motd = motd; if (commit) this.configBuilder.set("motd", this.motd); } /** * Returns the view distance. * * @returns The view distance as an `integer` */ getViewDistance() { return Math.round(this.viewDistance); } /** * Returns true or false depending on if online mode is enabled. * * @returns `true` if enabled, `false` otherwise */ getOnlineMode() { return this.onlineMode; } getPacketCompressionLevel() { return this.packetCompressionLevel; } getEnableQuery() { return this.enableQuery; } getEnableProcessTitle() { return this.enableProcessTitle; } getEnableTicking() { return this.enableTicking; } } export { Config }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnLmVzLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL0NvbmZpZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IExvZ0xldmVsIH0gZnJvbSAnQGpzcHJpc21hcmluZS9sb2dnZXInO1xuaW1wb3J0IHsgU2VlZEdlbmVyYXRvciB9IGZyb20gJy4uL3V0aWxzL1NlZWQnO1xuaW1wb3J0IHsgd2l0aEN3ZCB9IGZyb20gJy4uL3V0aWxzL2N3ZCc7XG5pbXBvcnQgeyBDb25maWdCdWlsZGVyIH0gZnJvbSAnLi9Db25maWdCdWlsZGVyJztcblxuaW1wb3J0IHsgZ2V0R2FtZXR5cGVOYW1lIH0gZnJvbSAnQGpzcHJpc21hcmluZS9taW5lY3JhZnQnO1xuXG5jb25zdCBpc0RldiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnO1xuXG5jb25zdCBGSUxFX05BTUUgPSAnY29uZmlnLnlhbWwnO1xuXG5leHBvcnQgY2xhc3MgQ29uZmlnIHtcbiAgICBwcml2YXRlIGNvbmZpZ0J1aWxkZXIhOiBDb25maWdCdWlsZGVyO1xuXG4gICAgcHJpdmF0ZSBsb2dMZXZlbCE6IExvZ0xldmVsO1xuXG4gICAgcHJpdmF0ZSBwb3J0ITogbnVtYmVyO1xuICAgIHByaXZhdGUgc2VydmVySXAhOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBsZXZlbE5hbWUhOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSB3b3JsZHMhOiBhbnk7XG4gICAgcHJpdmF0ZSBtYXhQbGF5ZXJzITogbnVtYmVyO1xuICAgIHByaXZhdGUgZ2FtZW1vZGUhOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBtb3RkITogc3RyaW5nO1xuICAgIHByaXZhdGUgdmlld0Rpc3RhbmNlITogbnVtYmVyO1xuICAgIHByaXZhdGUgb25saW5lTW9kZSE6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBwYWNrZXRDb21wcmVzc2lvbkxldmVsITogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgaWYgdGhlIG1pbmVjcmFmdC9zb3VyY2UgcXVlcnkgcmVzcG9uc2Ugc2hvdWxkIGJlIGVuYWJsZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBlbmFibGVRdWVyeTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyBpZiB0aGUgcHJvY2VzcyB0aXRsZSBzaG91bGQgYmUgdXBkYXRlZC5cbiAgICAgKiBAcmVtYXJrcyB0aGlzIGNhbiBjYXVzZSBwZXJmb3JtYW5jZSBpc3N1ZXMgaW4gc29tZSB0ZXJtaW5hbHMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBlbmFibGVQcm9jZXNzVGl0bGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgaWYgdGhlIHRpY2tpbmcgc2hvdWxkIGJlIGVuYWJsZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBlbmFibGVUaWNraW5nOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jb25maWdCdWlsZGVyID0gbmV3IENvbmZpZ0J1aWxkZXIod2l0aEN3ZChGSUxFX05BTUUpKTtcbiAgICAgICAgdGhpcy5sb2dMZXZlbCA9IHRoaXMuY29uZmlnQnVpbGRlci5nZXQoJ2xvZy1sZXZlbCcsIGlzRGV2ID8gJ3ZlcmJvc2UnIDogJ2luZm8nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiBlbmFibGUgaG9vay5cbiAgICAgKiBAZ3JvdXAgTGlmZWN5Y2xlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGVuYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jb25maWdCdWlsZGVyID0gbmV3IENvbmZpZ0J1aWxkZXIod2l0aEN3ZChGSUxFX05BTUUpKTtcbiAgICAgICAgdGhpcy5sb2dMZXZlbCA9IHRoaXMuY29uZmlnQnVpbGRlci5nZXQoJ2xvZy1sZXZlbCcsIGlzRGV2ID8gJ3ZlcmJvc2UnIDogJ2luZm8nKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgncG9ydCcsIDE5MTMyKSBhcyBudW1iZXI7XG4gICAgICAgIHRoaXMuc2VydmVySXAgPSB0aGlzLmNvbmZpZ0J1aWxkZXIuZ2V0KCdzZXJ2ZXItaXAnLCAnMC4wLjAuMCcpIGFzIHN0cmluZztcbiAgICAgICAgdGhpcy5sZXZlbE5hbWUgPSB0aGlzLmNvbmZpZ0J1aWxkZXIuZ2V0KCdsZXZlbC1uYW1lJywgJ3dvcmxkJykgYXMgc3RyaW5nO1xuICAgICAgICB0aGlzLndvcmxkcyA9IHRoaXMuY29uZmlnQnVpbGRlci5nZXQoJ3dvcmxkcycsIHtcbiAgICAgICAgICAgIHdvcmxkOiB7XG4gICAgICAgICAgICAgICAgZ2VuZXJhdG9yOiAnRmxhdCcsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXI6ICdGaWxlc3lzdGVtJyxcbiAgICAgICAgICAgICAgICBzZWVkOiBTZWVkR2VuZXJhdG9yKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWF4UGxheWVycyA9IHRoaXMuY29uZmlnQnVpbGRlci5nZXQoJ21heC1wbGF5ZXJzJywgMjApIGFzIG51bWJlcjtcbiAgICAgICAgdGhpcy5nYW1lbW9kZSA9IHRoaXMuY29uZmlnQnVpbGRlci5nZXQoJ2dhbWVtb2RlJywgJ3N1cnZpdmFsJykgYXMgc3RyaW5nO1xuICAgICAgICB0aGlzLm1vdGQgPSB0aGlzLmNvbmZpZ0J1aWxkZXIuZ2V0KCdtb3RkJywgJ0Fub3RoZXIgSlNQcmlzbWFyaW5lIHNlcnZlciEnKSBhcyBzdHJpbmc7XG4gICAgICAgIHRoaXMudmlld0Rpc3RhbmNlID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgndmlldy1kaXN0YW5jZScsIDEwKSBhcyBudW1iZXI7XG4gICAgICAgIHRoaXMub25saW5lTW9kZSA9IHRoaXMuY29uZmlnQnVpbGRlci5nZXQoJ29ubGluZS1tb2RlJywgZmFsc2UpIGFzIGJvb2xlYW47XG4gICAgICAgIHRoaXMucGFja2V0Q29tcHJlc3Npb25MZXZlbCA9IHRoaXMuY29uZmlnQnVpbGRlci5nZXQoJ3BhY2tldC1jb21wcmVzc2lvbi1sZXZlbCcsIDcpIGFzIG51bWJlcjtcbiAgICAgICAgdGhpcy5lbmFibGVRdWVyeSA9IHRoaXMuY29uZmlnQnVpbGRlci5nZXQoJ2VuYWJsZS1xdWVyeScsIHRoaXMuZW5hYmxlUXVlcnkpIGFzIHR5cGVvZiB0aGlzLmVuYWJsZVF1ZXJ5O1xuICAgICAgICB0aGlzLmVuYWJsZVByb2Nlc3NUaXRsZSA9IHRoaXMuY29uZmlnQnVpbGRlci5nZXQoXG4gICAgICAgICAgICAnZW5hYmxlLXByb2Nlc3MtdGl0bGUnLFxuICAgICAgICAgICAgdGhpcy5lbmFibGVQcm9jZXNzVGl0bGVcbiAgICAgICAgKSBhcyB0eXBlb2YgdGhpcy5lbmFibGVQcm9jZXNzVGl0bGU7XG4gICAgICAgIHRoaXMuZW5hYmxlVGlja2luZyA9IHRoaXMuY29uZmlnQnVpbGRlci5nZXQoJ2VuYWJsZS10aWNraW5nJywgdGhpcy5lbmFibGVUaWNraW5nKSBhcyB0eXBlb2YgdGhpcy5lbmFibGVUaWNraW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9uIGRpc2FibGUgaG9vay5cbiAgICAgKiBAZ3JvdXAgTGlmZWN5Y2xlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGRpc2FibGUoKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gICAgcHVibGljIGdldExvZ0xldmVsKCk6IExvZ0xldmVsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9nTGV2ZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzZXJ2ZXIncyBwb3J0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBzZXJ2ZXIncyBwb3J0XG4gICAgICogQHJlbWFya3MgVGhlIGRlZmF1bHQgcG9ydCBpcyBgMTkxMzJgLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTZXJ2ZXJQb3J0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzZXJ2ZXIncyBJUCBhZGRyZXNzLlxuICAgICAqIEByZW1hcmtzIFRoZSBkZWZhdWx0IElQIGFkZHJlc3MgaXMgYDAuMC4wLjBgXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlcnZlcidzIElQIGFkZHJlc3NcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2VydmVySXAoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VydmVySXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB3b3JsZCdzIG5hbWUgKGBpZGApLlxuICAgICAqIEByZXR1cm5zIFRoZSB3b3JsZCdzIG5hbWUgYXMgYSBgc3RyaW5nYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgdGhlIHdvcmxkIGRvZXNuJ3QgZXhpc3QgYXMgYSBwYXJ0IG9mIHRoZSBgd29ybGRzYCBhcnJheSB0aGUgYHdvcmxkTWFuYWdlcmAgd2lsbFxuICAgICAqIGZhaWwgdG8gaW5pdGlhbGl6ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TGV2ZWxOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmxldmVsTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0V29ybGRzKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLndvcmxkcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBtYXggYW1vdW50IG9mIHBsYXllcnMgYWxsb3dlZCBvbnRvIHRoZSBzZXJ2ZXIgYXQgdGhlIHNhbWUgdGltZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TWF4UGxheWVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF4UGxheWVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0R2FtZW1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdhbWVtb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZGVmYXVsdCBnYW1lbW9kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBnYW1lbW9kZSAtIHRoZSBnYW1lbW9kZVxuICAgICAqIEBwYXJhbSBjb21taXQgLSBpZiB0aGUgdmFsdWUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdGhlIGBjb25maWcueW1sYCBmaWxlXG4gICAgICovXG4gICAgcHVibGljIHNldEdhbWVtb2RlKGdhbWVtb2RlOiBudW1iZXIsIGNvbW1pdCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuZ2FtZW1vZGUgPSBnZXRHYW1ldHlwZU5hbWUoZ2FtZW1vZGUpO1xuICAgICAgICBpZiAoY29tbWl0KSB0aGlzLmNvbmZpZ0J1aWxkZXIuc2V0KCdnYW1lbW9kZScsIHRoaXMuZ2FtZW1vZGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBvciBmYWxzZSBkZXBlbmRpbmcgb24gaWYgb25saW5lIG1vZGUgaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBtZXNzYWdlIG9mIHRoZSBkYXkgYXMgYSBgc3RyaW5nYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNb3RkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vdGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBtb3RkLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vdGQgLSB0aGUgZ2FtZW1vZGVcbiAgICAgKiBAcGFyYW0gY29tbWl0IC0gaWYgdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuIHRvIHRoZSBgY29uZmlnLnltbGAgZmlsZVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRNb3RkKG1vdGQ6IHN0cmluZywgY29tbWl0ID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5tb3RkID0gbW90ZDtcblxuICAgICAgICBpZiAoY29tbWl0KSB0aGlzLmNvbmZpZ0J1aWxkZXIuc2V0KCdtb3RkJywgdGhpcy5tb3RkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2aWV3IGRpc3RhbmNlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIHZpZXcgZGlzdGFuY2UgYXMgYW4gYGludGVnZXJgXG4gICAgICovXG4gICAgcHVibGljIGdldFZpZXdEaXN0YW5jZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzLnZpZXdEaXN0YW5jZSk7IC8vIE1ha2Ugc3VyZSBpdCdzIGFsd2F5cyBhbiBpbnRlZ2VyXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIG9yIGZhbHNlIGRlcGVuZGluZyBvbiBpZiBvbmxpbmUgbW9kZSBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIGVuYWJsZWQsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gICAgICovXG4gICAgcHVibGljIGdldE9ubGluZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm9ubGluZU1vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhY2tldENvbXByZXNzaW9uTGV2ZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhY2tldENvbXByZXNzaW9uTGV2ZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEVuYWJsZVF1ZXJ5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmFibGVRdWVyeTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RW5hYmxlUHJvY2Vzc1RpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmFibGVQcm9jZXNzVGl0bGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEVuYWJsZVRpY2tpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuYWJsZVRpY2tpbmc7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBT0EsTUFBTSxLQUFBLEdBQVEsT0FBUSxDQUFBLEdBQUEsQ0FBSSxRQUFhLEtBQUEs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