@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
173 lines (172 loc) • 15.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
require("../_virtual/_rolldown/runtime.cjs.cjs");
const require_utils_cwd = require("../utils/cwd.cjs.cjs");
const require_utils_Seed = require("../utils/Seed.cjs.cjs");
const require_config_ConfigBuilder = require("./ConfigBuilder.cjs.cjs");
let _jsprismarine_minecraft = require("@jsprismarine/minecraft");
//#region src/config/Config.ts
var isDev = process.env.NODE_ENV === "development";
var FILE_NAME = "config.yaml";
var Config = class {
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 require_config_ConfigBuilder.ConfigBuilder(require_utils_cwd.withCwd(FILE_NAME));
this.logLevel = this.configBuilder.get("log-level", isDev ? "verbose" : "info");
}
/**
* On enable hook.
* @group Lifecycle
*/
async enable() {
this.configBuilder = new require_config_ConfigBuilder.ConfigBuilder(require_utils_cwd.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: require_utils_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 = (0, _jsprismarine_minecraft.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;
}
};
//#endregion
exports.Config = Config;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnLmNqcy5janMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9Db25maWcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvbG9nZ2VyJztcbmltcG9ydCB7IFNlZWRHZW5lcmF0b3IgfSBmcm9tICcuLi91dGlscy9TZWVkJztcbmltcG9ydCB7IHdpdGhDd2QgfSBmcm9tICcuLi91dGlscy9jd2QnO1xuaW1wb3J0IHsgQ29uZmlnQnVpbGRlciB9IGZyb20gJy4vQ29uZmlnQnVpbGRlcic7XG5cbmltcG9ydCB7IGdldEdhbWV0eXBlTmFtZSB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvbWluZWNyYWZ0JztcblxuY29uc3QgaXNEZXYgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JztcblxuY29uc3QgRklMRV9OQU1FID0gJ2NvbmZpZy55YW1sJztcblxuZXhwb3J0IGNsYXNzIENvbmZpZyB7XG4gICAgcHJpdmF0ZSBjb25maWdCdWlsZGVyITogQ29uZmlnQnVpbGRlcjtcblxuICAgIHByaXZhdGUgbG9nTGV2ZWwhOiBMb2dMZXZlbDtcblxuICAgIHByaXZhdGUgcG9ydCE6IG51bWJlcjtcbiAgICBwcml2YXRlIHNlcnZlcklwITogc3RyaW5nO1xuICAgIHByaXZhdGUgbGV2ZWxOYW1lITogc3RyaW5nO1xuICAgIHByaXZhdGUgd29ybGRzITogYW55O1xuICAgIHByaXZhdGUgbWF4UGxheWVycyE6IG51bWJlcjtcbiAgICBwcml2YXRlIGdhbWVtb2RlITogc3RyaW5nO1xuICAgIHByaXZhdGUgbW90ZCE6IHN0cmluZztcbiAgICBwcml2YXRlIHZpZXdEaXN0YW5jZSE6IG51bWJlcjtcbiAgICBwcml2YXRlIG9ubGluZU1vZGUhOiBib29sZWFuO1xuICAgIHByaXZhdGUgcGFja2V0Q29tcHJlc3Npb25MZXZlbCE6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIGlmIHRoZSBtaW5lY3JhZnQvc291cmNlIHF1ZXJ5IHJlc3BvbnNlIHNob3VsZCBiZSBlbmFibGVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgZW5hYmxlUXVlcnk6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgaWYgdGhlIHByb2Nlc3MgdGl0bGUgc2hvdWxkIGJlIHVwZGF0ZWQuXG4gICAgICogQHJlbWFya3MgdGhpcyBjYW4gY2F1c2UgcGVyZm9ybWFuY2UgaXNzdWVzIGluIHNvbWUgdGVybWluYWxzLlxuICAgICAqL1xuICAgIHByaXZhdGUgZW5hYmxlUHJvY2Vzc1RpdGxlOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIGlmIHRoZSB0aWNraW5nIHNob3VsZCBiZSBlbmFibGVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgZW5hYmxlVGlja2luZzogYm9vbGVhbiA9IHRydWU7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29uZmlnQnVpbGRlciA9IG5ldyBDb25maWdCdWlsZGVyKHdpdGhDd2QoRklMRV9OQU1FKSk7XG4gICAgICAgIHRoaXMubG9nTGV2ZWwgPSB0aGlzLmNvbmZpZ0J1aWxkZXIuZ2V0KCdsb2ctbGV2ZWwnLCBpc0RldiA/ICd2ZXJib3NlJyA6ICdpbmZvJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT24gZW5hYmxlIGhvb2suXG4gICAgICogQGdyb3VwIExpZmVjeWNsZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBlbmFibGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY29uZmlnQnVpbGRlciA9IG5ldyBDb25maWdCdWlsZGVyKHdpdGhDd2QoRklMRV9OQU1FKSk7XG4gICAgICAgIHRoaXMubG9nTGV2ZWwgPSB0aGlzLmNvbmZpZ0J1aWxkZXIuZ2V0KCdsb2ctbGV2ZWwnLCBpc0RldiA/ICd2ZXJib3NlJyA6ICdpbmZvJyk7XG4gICAgICAgIHRoaXMucG9ydCA9IHRoaXMuY29uZmlnQnVpbGRlci5nZXQoJ3BvcnQnLCAxOTEzMikgYXMgbnVtYmVyO1xuICAgICAgICB0aGlzLnNlcnZlcklwID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgnc2VydmVyLWlwJywgJzAuMC4wLjAnKSBhcyBzdHJpbmc7XG4gICAgICAgIHRoaXMubGV2ZWxOYW1lID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgnbGV2ZWwtbmFtZScsICd3b3JsZCcpIGFzIHN0cmluZztcbiAgICAgICAgdGhpcy53b3JsZHMgPSB0aGlzLmNvbmZpZ0J1aWxkZXIuZ2V0KCd3b3JsZHMnLCB7XG4gICAgICAgICAgICB3b3JsZDoge1xuICAgICAgICAgICAgICAgIGdlbmVyYXRvcjogJ0ZsYXQnLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyOiAnRmlsZXN5c3RlbScsXG4gICAgICAgICAgICAgICAgc2VlZDogU2VlZEdlbmVyYXRvcigpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm1heFBsYXllcnMgPSB0aGlzLmNvbmZpZ0J1aWxkZXIuZ2V0KCdtYXgtcGxheWVycycsIDIwKSBhcyBudW1iZXI7XG4gICAgICAgIHRoaXMuZ2FtZW1vZGUgPSB0aGlzLmNvbmZpZ0J1aWxkZXIuZ2V0KCdnYW1lbW9kZScsICdzdXJ2aXZhbCcpIGFzIHN0cmluZztcbiAgICAgICAgdGhpcy5tb3RkID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgnbW90ZCcsICdBbm90aGVyIEpTUHJpc21hcmluZSBzZXJ2ZXIhJykgYXMgc3RyaW5nO1xuICAgICAgICB0aGlzLnZpZXdEaXN0YW5jZSA9IHRoaXMuY29uZmlnQnVpbGRlci5nZXQoJ3ZpZXctZGlzdGFuY2UnLCAxMCkgYXMgbnVtYmVyO1xuICAgICAgICB0aGlzLm9ubGluZU1vZGUgPSB0aGlzLmNvbmZpZ0J1aWxkZXIuZ2V0KCdvbmxpbmUtbW9kZScsIGZhbHNlKSBhcyBib29sZWFuO1xuICAgICAgICB0aGlzLnBhY2tldENvbXByZXNzaW9uTGV2ZWwgPSB0aGlzLmNvbmZpZ0J1aWxkZXIuZ2V0KCdwYWNrZXQtY29tcHJlc3Npb24tbGV2ZWwnLCA3KSBhcyBudW1iZXI7XG4gICAgICAgIHRoaXMuZW5hYmxlUXVlcnkgPSB0aGlzLmNvbmZpZ0J1aWxkZXIuZ2V0KCdlbmFibGUtcXVlcnknLCB0aGlzLmVuYWJsZVF1ZXJ5KSBhcyB0eXBlb2YgdGhpcy5lbmFibGVRdWVyeTtcbiAgICAgICAgdGhpcy5lbmFibGVQcm9jZXNzVGl0bGUgPSB0aGlzLmNvbmZpZ0J1aWxkZXIuZ2V0KFxuICAgICAgICAgICAgJ2VuYWJsZS1wcm9jZXNzLXRpdGxlJyxcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlUHJvY2Vzc1RpdGxlXG4gICAgICAgICkgYXMgdHlwZW9mIHRoaXMuZW5hYmxlUHJvY2Vzc1RpdGxlO1xuICAgICAgICB0aGlzLmVuYWJsZVRpY2tpbmcgPSB0aGlzLmNvbmZpZ0J1aWxkZXIuZ2V0KCdlbmFibGUtdGlja2luZycsIHRoaXMuZW5hYmxlVGlja2luZykgYXMgdHlwZW9mIHRoaXMuZW5hYmxlVGlja2luZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiBkaXNhYmxlIGhvb2suXG4gICAgICogQGdyb3VwIExpZmVjeWNsZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkaXNhYmxlKCk6IFByb21pc2U8dm9pZD4ge31cblxuICAgIHB1YmxpYyBnZXRMb2dMZXZlbCgpOiBMb2dMZXZlbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvZ0xldmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2VydmVyJ3MgcG9ydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgc2VydmVyJ3MgcG9ydFxuICAgICAqIEByZW1hcmtzIFRoZSBkZWZhdWx0IHBvcnQgaXMgYDE5MTMyYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2VydmVyUG9ydCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3J0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2VydmVyJ3MgSVAgYWRkcmVzcy5cbiAgICAgKiBAcmVtYXJrcyBUaGUgZGVmYXVsdCBJUCBhZGRyZXNzIGlzIGAwLjAuMC4wYFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzZXJ2ZXIncyBJUCBhZGRyZXNzXG4gICAgICovXG4gICAgcHVibGljIGdldFNlcnZlcklwKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlcnZlcklwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgd29ybGQncyBuYW1lIChgaWRgKS5cbiAgICAgKiBAcmV0dXJucyBUaGUgd29ybGQncyBuYW1lIGFzIGEgYHN0cmluZ2BcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIHRoZSB3b3JsZCBkb2Vzbid0IGV4aXN0IGFzIGEgcGFydCBvZiB0aGUgYHdvcmxkc2AgYXJyYXkgdGhlIGB3b3JsZE1hbmFnZXJgIHdpbGxcbiAgICAgKiBmYWlsIHRvIGluaXRpYWxpemUuXG4gICAgICovXG4gICAgcHVibGljIGdldExldmVsTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5sZXZlbE5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFdvcmxkcygpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy53b3JsZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgbWF4IGFtb3VudCBvZiBwbGF5ZXJzIGFsbG93ZWQgb250byB0aGUgc2VydmVyIGF0IHRoZSBzYW1lIHRpbWUuXG4gICAgICovXG4gICAgcHVibGljIGdldE1heFBsYXllcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heFBsYXllcnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEdhbWVtb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nYW1lbW9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgZ2FtZW1vZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ2FtZW1vZGUgLSB0aGUgZ2FtZW1vZGVcbiAgICAgKiBAcGFyYW0gY29tbWl0IC0gaWYgdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuIHRvIHRoZSBgY29uZmlnLnltbGAgZmlsZVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRHYW1lbW9kZShnYW1lbW9kZTogbnVtYmVyLCBjb21taXQgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLmdhbWVtb2RlID0gZ2V0R2FtZXR5cGVOYW1lKGdhbWVtb2RlKTtcbiAgICAgICAgaWYgKGNvbW1pdCkgdGhpcy5jb25maWdCdWlsZGVyLnNldCgnZ2FtZW1vZGUnLCB0aGlzLmdhbWVtb2RlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgb3IgZmFsc2UgZGVwZW5kaW5nIG9uIGlmIG9ubGluZSBtb2RlIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgbWVzc2FnZSBvZiB0aGUgZGF5IGFzIGEgYHN0cmluZ2BcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TW90ZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5tb3RkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbW90ZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb3RkIC0gdGhlIGdhbWVtb2RlXG4gICAgICogQHBhcmFtIGNvbW1pdCAtIGlmIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbiB0byB0aGUgYGNvbmZpZy55bWxgIGZpbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0TW90ZChtb3RkOiBzdHJpbmcsIGNvbW1pdCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubW90ZCA9IG1vdGQ7XG5cbiAgICAgICAgaWYgKGNvbW1pdCkgdGhpcy5jb25maWdCdWlsZGVyLnNldCgnbW90ZCcsIHRoaXMubW90ZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdmlldyBkaXN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSB2aWV3IGRpc3RhbmNlIGFzIGFuIGBpbnRlZ2VyYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWaWV3RGlzdGFuY2UoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy52aWV3RGlzdGFuY2UpOyAvLyBNYWtlIHN1cmUgaXQncyBhbHdheXMgYW4gaW50ZWdlclxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBvciBmYWxzZSBkZXBlbmRpbmcgb24gaWYgb25saW5lIG1vZGUgaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiBlbmFibGVkLCBgZmFsc2VgIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRPbmxpbmVNb2RlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5vbmxpbmVNb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYWNrZXRDb21wcmVzc2lvbkxldmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWNrZXRDb21wcmVzc2lvbkxldmVsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFbmFibGVRdWVyeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5hYmxlUXVlcnk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEVuYWJsZVByb2Nlc3NUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5hYmxlUHJvY2Vzc1RpdGxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFbmFibGVUaWNraW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmFibGVUaWNraW5nO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFPQSxJQUFNLFFBQUEsUUFBQSxJQUFBLGFBQWlDO0FBRXZDLElBQU0sWUFB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