@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
180 lines (175 loc) • 18 kB
JavaScript
'use strict';
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const utils_Seed = require('../utils/Seed.cjs.cjs');
const utils_cwd = require('../utils/cwd.cjs.cjs');
const config_ConfigBuilder = require('./ConfigBuilder.cjs.cjs');
const minecraft = require('@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 config_ConfigBuilder.ConfigBuilder(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 config_ConfigBuilder.ConfigBuilder(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: 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 = 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;
}
}
exports.Config = Config;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnLmNqcy5janMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvQ29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwgfSBmcm9tICdAanNwcmlzbWFyaW5lL2xvZ2dlcic7XG5pbXBvcnQgeyBTZWVkR2VuZXJhdG9yIH0gZnJvbSAnLi4vdXRpbHMvU2VlZCc7XG5pbXBvcnQgeyB3aXRoQ3dkIH0gZnJvbSAnLi4vdXRpbHMvY3dkJztcbmltcG9ydCB7IENvbmZpZ0J1aWxkZXIgfSBmcm9tICcuL0NvbmZpZ0J1aWxkZXInO1xuXG5pbXBvcnQgeyBnZXRHYW1ldHlwZU5hbWUgfSBmcm9tICdAanNwcmlzbWFyaW5lL21pbmVjcmFmdCc7XG5cbmNvbnN0IGlzRGV2ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCc7XG5cbmNvbnN0IEZJTEVfTkFNRSA9ICdjb25maWcueWFtbCc7XG5cbmV4cG9ydCBjbGFzcyBDb25maWcge1xuICAgIHByaXZhdGUgY29uZmlnQnVpbGRlciE6IENvbmZpZ0J1aWxkZXI7XG5cbiAgICBwcml2YXRlIGxvZ0xldmVsITogTG9nTGV2ZWw7XG5cbiAgICBwcml2YXRlIHBvcnQhOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBzZXJ2ZXJJcCE6IHN0cmluZztcbiAgICBwcml2YXRlIGxldmVsTmFtZSE6IHN0cmluZztcbiAgICBwcml2YXRlIHdvcmxkcyE6IGFueTtcbiAgICBwcml2YXRlIG1heFBsYXllcnMhOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBnYW1lbW9kZSE6IHN0cmluZztcbiAgICBwcml2YXRlIG1vdGQhOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSB2aWV3RGlzdGFuY2UhOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBvbmxpbmVNb2RlITogYm9vbGVhbjtcbiAgICBwcml2YXRlIHBhY2tldENvbXByZXNzaW9uTGV2ZWwhOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyBpZiB0aGUgbWluZWNyYWZ0L3NvdXJjZSBxdWVyeSByZXNwb25zZSBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGVuYWJsZVF1ZXJ5OiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIGlmIHRoZSBwcm9jZXNzIHRpdGxlIHNob3VsZCBiZSB1cGRhdGVkLlxuICAgICAqIEByZW1hcmtzIHRoaXMgY2FuIGNhdXNlIHBlcmZvcm1hbmNlIGlzc3VlcyBpbiBzb21lIHRlcm1pbmFscy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGVuYWJsZVByb2Nlc3NUaXRsZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyBpZiB0aGUgdGlja2luZyBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGVuYWJsZVRpY2tpbmc6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNvbmZpZ0J1aWxkZXIgPSBuZXcgQ29uZmlnQnVpbGRlcih3aXRoQ3dkKEZJTEVfTkFNRSkpO1xuICAgICAgICB0aGlzLmxvZ0xldmVsID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgnbG9nLWxldmVsJywgaXNEZXYgPyAndmVyYm9zZScgOiAnaW5mbycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9uIGVuYWJsZSBob29rLlxuICAgICAqIEBncm91cCBMaWZlY3ljbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZW5hYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNvbmZpZ0J1aWxkZXIgPSBuZXcgQ29uZmlnQnVpbGRlcih3aXRoQ3dkKEZJTEVfTkFNRSkpO1xuICAgICAgICB0aGlzLmxvZ0xldmVsID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgnbG9nLWxldmVsJywgaXNEZXYgPyAndmVyYm9zZScgOiAnaW5mbycpO1xuICAgICAgICB0aGlzLnBvcnQgPSB0aGlzLmNvbmZpZ0J1aWxkZXIuZ2V0KCdwb3J0JywgMTkxMzIpIGFzIG51bWJlcjtcbiAgICAgICAgdGhpcy5zZXJ2ZXJJcCA9IHRoaXMuY29uZmlnQnVpbGRlci5nZXQoJ3NlcnZlci1pcCcsICcwLjAuMC4wJykgYXMgc3RyaW5nO1xuICAgICAgICB0aGlzLmxldmVsTmFtZSA9IHRoaXMuY29uZmlnQnVpbGRlci5nZXQoJ2xldmVsLW5hbWUnLCAnd29ybGQnKSBhcyBzdHJpbmc7XG4gICAgICAgIHRoaXMud29ybGRzID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgnd29ybGRzJywge1xuICAgICAgICAgICAgd29ybGQ6IHtcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdGbGF0JyxcbiAgICAgICAgICAgICAgICBwcm92aWRlcjogJ0ZpbGVzeXN0ZW0nLFxuICAgICAgICAgICAgICAgIHNlZWQ6IFNlZWRHZW5lcmF0b3IoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tYXhQbGF5ZXJzID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgnbWF4LXBsYXllcnMnLCAyMCkgYXMgbnVtYmVyO1xuICAgICAgICB0aGlzLmdhbWVtb2RlID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgnZ2FtZW1vZGUnLCAnc3Vydml2YWwnKSBhcyBzdHJpbmc7XG4gICAgICAgIHRoaXMubW90ZCA9IHRoaXMuY29uZmlnQnVpbGRlci5nZXQoJ21vdGQnLCAnQW5vdGhlciBKU1ByaXNtYXJpbmUgc2VydmVyIScpIGFzIHN0cmluZztcbiAgICAgICAgdGhpcy52aWV3RGlzdGFuY2UgPSB0aGlzLmNvbmZpZ0J1aWxkZXIuZ2V0KCd2aWV3LWRpc3RhbmNlJywgMTApIGFzIG51bWJlcjtcbiAgICAgICAgdGhpcy5vbmxpbmVNb2RlID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgnb25saW5lLW1vZGUnLCBmYWxzZSkgYXMgYm9vbGVhbjtcbiAgICAgICAgdGhpcy5wYWNrZXRDb21wcmVzc2lvbkxldmVsID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgncGFja2V0LWNvbXByZXNzaW9uLWxldmVsJywgNykgYXMgbnVtYmVyO1xuICAgICAgICB0aGlzLmVuYWJsZVF1ZXJ5ID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgnZW5hYmxlLXF1ZXJ5JywgdGhpcy5lbmFibGVRdWVyeSkgYXMgdHlwZW9mIHRoaXMuZW5hYmxlUXVlcnk7XG4gICAgICAgIHRoaXMuZW5hYmxlUHJvY2Vzc1RpdGxlID0gdGhpcy5jb25maWdCdWlsZGVyLmdldChcbiAgICAgICAgICAgICdlbmFibGUtcHJvY2Vzcy10aXRsZScsXG4gICAgICAgICAgICB0aGlzLmVuYWJsZVByb2Nlc3NUaXRsZVxuICAgICAgICApIGFzIHR5cGVvZiB0aGlzLmVuYWJsZVByb2Nlc3NUaXRsZTtcbiAgICAgICAgdGhpcy5lbmFibGVUaWNraW5nID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgnZW5hYmxlLXRpY2tpbmcnLCB0aGlzLmVuYWJsZVRpY2tpbmcpIGFzIHR5cGVvZiB0aGlzLmVuYWJsZVRpY2tpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT24gZGlzYWJsZSBob29rLlxuICAgICAqIEBncm91cCBMaWZlY3ljbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZGlzYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgICBwdWJsaWMgZ2V0TG9nTGV2ZWwoKTogTG9nTGV2ZWwge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2dMZXZlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNlcnZlcidzIHBvcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIHNlcnZlcidzIHBvcnRcbiAgICAgKiBAcmVtYXJrcyBUaGUgZGVmYXVsdCBwb3J0IGlzIGAxOTEzMmAuXG4gICAgICovXG4gICAgcHVibGljIGdldFNlcnZlclBvcnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9ydDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNlcnZlcidzIElQIGFkZHJlc3MuXG4gICAgICogQHJlbWFya3MgVGhlIGRlZmF1bHQgSVAgYWRkcmVzcyBpcyBgMC4wLjAuMGBcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2VydmVyJ3MgSVAgYWRkcmVzc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTZXJ2ZXJJcCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXJ2ZXJJcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHdvcmxkJ3MgbmFtZSAoYGlkYCkuXG4gICAgICogQHJldHVybnMgVGhlIHdvcmxkJ3MgbmFtZSBhcyBhIGBzdHJpbmdgXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiB0aGUgd29ybGQgZG9lc24ndCBleGlzdCBhcyBhIHBhcnQgb2YgdGhlIGB3b3JsZHNgIGFycmF5IHRoZSBgd29ybGRNYW5hZ2VyYCB3aWxsXG4gICAgICogZmFpbCB0byBpbml0aWFsaXplLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRMZXZlbE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGV2ZWxOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRXb3JsZHMoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMud29ybGRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG1heCBhbW91bnQgb2YgcGxheWVycyBhbGxvd2VkIG9udG8gdGhlIHNlcnZlciBhdCB0aGUgc2FtZSB0aW1lLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNYXhQbGF5ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhQbGF5ZXJzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRHYW1lbW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2FtZW1vZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IGdhbWVtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGdhbWVtb2RlIC0gdGhlIGdhbWVtb2RlXG4gICAgICogQHBhcmFtIGNvbW1pdCAtIGlmIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbiB0byB0aGUgYGNvbmZpZy55bWxgIGZpbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0R2FtZW1vZGUoZ2FtZW1vZGU6IG51bWJlciwgY29tbWl0ID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5nYW1lbW9kZSA9IGdldEdhbWV0eXBlTmFtZShnYW1lbW9kZSk7XG4gICAgICAgIGlmIChjb21taXQpIHRoaXMuY29uZmlnQnVpbGRlci5zZXQoJ2dhbWVtb2RlJywgdGhpcy5nYW1lbW9kZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIG9yIGZhbHNlIGRlcGVuZGluZyBvbiBpZiBvbmxpbmUgbW9kZSBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG1lc3NhZ2Ugb2YgdGhlIGRheSBhcyBhIGBzdHJpbmdgXG4gICAgICovXG4gICAgcHVibGljIGdldE1vdGQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW90ZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIG1vdGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW90ZCAtIHRoZSBnYW1lbW9kZVxuICAgICAqIEBwYXJhbSBjb21taXQgLSBpZiB0aGUgdmFsdWUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdGhlIGBjb25maWcueW1sYCBmaWxlXG4gICAgICovXG4gICAgcHVibGljIHNldE1vdGQobW90ZDogc3RyaW5nLCBjb21taXQgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLm1vdGQgPSBtb3RkO1xuXG4gICAgICAgIGlmIChjb21taXQpIHRoaXMuY29uZmlnQnVpbGRlci5zZXQoJ21vdGQnLCB0aGlzLm1vdGQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZpZXcgZGlzdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgdmlldyBkaXN0YW5jZSBhcyBhbiBgaW50ZWdlcmBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Vmlld0Rpc3RhbmNlKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMudmlld0Rpc3RhbmNlKTsgLy8gTWFrZSBzdXJlIGl0J3MgYWx3YXlzIGFuIGludGVnZXJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgb3IgZmFsc2UgZGVwZW5kaW5nIG9uIGlmIG9ubGluZSBtb2RlIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgZW5hYmxlZCwgYGZhbHNlYCBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0T25saW5lTW9kZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub25saW5lTW9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFja2V0Q29tcHJlc3Npb25MZXZlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFja2V0Q29tcHJlc3Npb25MZXZlbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RW5hYmxlUXVlcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuYWJsZVF1ZXJ5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFbmFibGVQcm9jZXNzVGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuYWJsZVByb2Nlc3NUaXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RW5hYmxlVGlja2luZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5hYmxlVGlja2luZztcbiAgICB9XG59XG4iXSwibmFtZXMiOlsiQ29uZmlnQnVpbGRlciIsIndpdGhDd2QiLCJTZWVkR2VuZXJhdG9yIiwiZ2V0R2FtZXR5cGVOYW1lIl0sIm1hcHBp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