UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

109 lines (104 loc) 14 kB
'use strict'; Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } }); const network_NetworkUtil = require('../network/NetworkUtil.cjs.cjs'); const GameRules = { CommandBlockOutput: "commandblockoutput", DoDayLightCycle: "dodaylightcycle", DoEntityDrops: "doentitydrops", DoFireTick: "dofiretick", DoMobLoot: "domobloot", DoMobSpawning: "domobspawning", DoTileDrops: "dotiledrops", DoWeatherCycle: "doweathercycle", DrowingDamage: "drowningdamage", FallDamage: "falldamage", FireDamage: "firedamage", KeepInventory: "keepinventory", MobGriefing: "mobgriefing", NaturalRegeneration: "naturalregeneration", PVP: "pvp", ShowCoordinates: "showcoordinates", // Bool RandomTickSpeed: "randomtickspeed", TNTExplodes: "tntexplodes", sendCommandFeedback: "sendcommandfeedback" }; class GameruleManager { server; rules = /* @__PURE__ */ new Map(); constructor(server) { this.server = server; this.setGamerule("CommandBlockOutput", true, true); this.setGamerule("DoDayLightCycle", true, true); this.setGamerule("DoEntityDrops", true, true); this.setGamerule("DoFireTick", true, true); this.setGamerule("DoMobLoot", true, true); this.setGamerule("DoMobSpawning", true, true); this.setGamerule("DoTileDrops", true, true); this.setGamerule("DoWeatherCycle", true, true); this.setGamerule("DrowningDamage", true, true); this.setGamerule("FallDamage", true, true); this.setGamerule("FireDamage", true, true); this.setGamerule("KeepInventory", false, true); this.setGamerule("MobGriefing", true, true); this.setGamerule("NaturalRegeneration", true, true); this.setGamerule("PVP", true, true); this.setGamerule("ShowCoordinates", false, true); this.setGamerule("RandomTickSpeed", 3, true); this.setGamerule("TNTExplodes", true, true); this.setGamerule("sendCommandFeedback", true, true); } /** * Sets a game rule. * @param {string} name - the gamerule's name. * @param {boolean | number} value - the value, boolean OR number. * @param {boolean} editable - if the gamerule is editable. * @TODO: notify clients about gamerule change. */ setGamerule(name, value, editable) { this.rules.set(name.toLowerCase(), [value, editable]); } /** * Returns the gamerule value. * @param {string} name - the gamerule's name. */ getGamerule(name) { if (!Object.values(GameRules).includes(name.toLowerCase())) { this.server.getLogger().error(`Unknown Gamerule with name ${name}`); } return this.rules.get(name.toLowerCase()) ?? null; } getGamerules() { return this.rules; } networkSerialize(stream) { const isInt = (n) => { return n % 1 === 0; }; stream.writeUnsignedVarInt(this.getGamerules().size); for (const [name, [value, editable]] of this.getGamerules()) { network_NetworkUtil.NetworkUtil.writeString(stream, name.toLowerCase()); stream.writeBoolean(editable); switch (typeof value) { case "boolean": stream.writeByte(1); stream.writeBoolean(value); break; case "number": if (isInt(value)) { stream.writeByte(2); stream.writeUnsignedVarInt(value); } else { stream.writeByte(3); stream.writeFloatLE(value); } break; default: this.server.getLogger().error("Gamerule format not implemented"); } } } } exports.GameRules = GameRules; exports.default = GameruleManager; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2FtZXJ1bGVNYW5hZ2VyLmNqcy5janMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JsZC9HYW1lcnVsZU1hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IHR5cGUgU2VydmVyIGZyb20gJy4uL1NlcnZlcic7XG5pbXBvcnQgeyBOZXR3b3JrVXRpbCB9IGZyb20gJy4uL25ldHdvcmsvTmV0d29ya1V0aWwnO1xuXG5leHBvcnQgY29uc3QgR2FtZVJ1bGVzID0ge1xuICAgIENvbW1hbmRCbG9ja091dHB1dDogJ2NvbW1hbmRibG9ja291dHB1dCcsXG4gICAgRG9EYXlMaWdodEN5Y2xlOiAnZG9kYXlsaWdodGN5Y2xlJyxcbiAgICBEb0VudGl0eURyb3BzOiAnZG9lbnRpdHlkcm9wcycsXG4gICAgRG9GaXJlVGljazogJ2RvZmlyZXRpY2snLFxuICAgIERvTW9iTG9vdDogJ2RvbW9ibG9vdCcsXG4gICAgRG9Nb2JTcGF3bmluZzogJ2RvbW9ic3Bhd25pbmcnLFxuICAgIERvVGlsZURyb3BzOiAnZG90aWxlZHJvcHMnLFxuICAgIERvV2VhdGhlckN5Y2xlOiAnZG93ZWF0aGVyY3ljbGUnLFxuICAgIERyb3dpbmdEYW1hZ2U6ICdkcm93bmluZ2RhbWFnZScsXG4gICAgRmFsbERhbWFnZTogJ2ZhbGxkYW1hZ2UnLFxuICAgIEZpcmVEYW1hZ2U6ICdmaXJlZGFtYWdlJyxcbiAgICBLZWVwSW52ZW50b3J5OiAna2VlcGludmVudG9yeScsXG4gICAgTW9iR3JpZWZpbmc6ICdtb2JncmllZmluZycsXG4gICAgTmF0dXJhbFJlZ2VuZXJhdGlvbjogJ25hdHVyYWxyZWdlbmVyYXRpb24nLFxuICAgIFBWUDogJ3B2cCcsXG4gICAgU2hvd0Nvb3JkaW5hdGVzOiAnc2hvd2Nvb3JkaW5hdGVzJywgLy8gQm9vbFxuICAgIFJhbmRvbVRpY2tTcGVlZDogJ3JhbmRvbXRpY2tzcGVlZCcsXG4gICAgVE5URXhwbG9kZXM6ICd0bnRleHBsb2RlcycsXG4gICAgc2VuZENvbW1hbmRGZWVkYmFjazogJ3NlbmRjb21tYW5kZmVlZGJhY2snXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW1lcnVsZU1hbmFnZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmVyOiBTZXJ2ZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBydWxlczogTWFwPHN0cmluZywgW2Jvb2xlYW4gfCBudW1iZXIsIGJvb2xlYW5dPiA9IG5ldyBNYXAoKSBhcyBNYXA8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgW2Jvb2xlYW4gfCBudW1iZXIsIGJvb2xlYW5dXG4gICAgPjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXJ2ZXI6IFNlcnZlcikge1xuICAgICAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcblxuICAgICAgICAvLyBTZXQgZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgdGhpcy5zZXRHYW1lcnVsZSgnQ29tbWFuZEJsb2NrT3V0cHV0JywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ0RvRGF5TGlnaHRDeWNsZScsIHRydWUsIHRydWUpO1xuICAgICAgICB0aGlzLnNldEdhbWVydWxlKCdEb0VudGl0eURyb3BzJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ0RvRmlyZVRpY2snLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRHYW1lcnVsZSgnRG9Nb2JMb290JywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ0RvTW9iU3Bhd25pbmcnLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRHYW1lcnVsZSgnRG9UaWxlRHJvcHMnLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRHYW1lcnVsZSgnRG9XZWF0aGVyQ3ljbGUnLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRHYW1lcnVsZSgnRHJvd25pbmdEYW1hZ2UnLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRHYW1lcnVsZSgnRmFsbERhbWFnZScsIHRydWUsIHRydWUpO1xuICAgICAgICB0aGlzLnNldEdhbWVydWxlKCdGaXJlRGFtYWdlJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ0tlZXBJbnZlbnRvcnknLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ01vYkdyaWVmaW5nJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ05hdHVyYWxSZWdlbmVyYXRpb24nLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRHYW1lcnVsZSgnUFZQJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ1Nob3dDb29yZGluYXRlcycsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRHYW1lcnVsZSgnUmFuZG9tVGlja1NwZWVkJywgMywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ1ROVEV4cGxvZGVzJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ3NlbmRDb21tYW5kRmVlZGJhY2snLCB0cnVlLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgZ2FtZSBydWxlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gdGhlIGdhbWVydWxlJ3MgbmFtZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW4gfCBudW1iZXJ9IHZhbHVlIC0gdGhlIHZhbHVlLCBib29sZWFuIE9SIG51bWJlci5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVkaXRhYmxlIC0gaWYgdGhlIGdhbWVydWxlIGlzIGVkaXRhYmxlLlxuICAgICAqIEBUT0RPOiBub3RpZnkgY2xpZW50cyBhYm91dCBnYW1lcnVsZSBjaGFuZ2UuXG4gICAgICovXG4gICAgcHVibGljIHNldEdhbWVydWxlKG5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4gfCBudW1iZXIsIGVkaXRhYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMucnVsZXMuc2V0KG5hbWUudG9Mb3dlckNhc2UoKSwgW3ZhbHVlLCBlZGl0YWJsZV0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGdhbWVydWxlIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gdGhlIGdhbWVydWxlJ3MgbmFtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0R2FtZXJ1bGUobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICghT2JqZWN0LnZhbHVlcyhHYW1lUnVsZXMpLmluY2x1ZGVzKG5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmVyLmdldExvZ2dlcigpLmVycm9yKGBVbmtub3duIEdhbWVydWxlIHdpdGggbmFtZSAke25hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5ydWxlcy5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKSA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRHYW1lcnVsZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJ1bGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZXR3b3JrU2VyaWFsaXplKHN0cmVhbTogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlzSW50ID0gKG46IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG4gJSAxID09PSAwO1xuICAgICAgICB9O1xuXG4gICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkVmFySW50KHRoaXMuZ2V0R2FtZXJ1bGVzKCkuc2l6ZSk7XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIFt2YWx1ZSwgZWRpdGFibGVdXSBvZiB0aGlzLmdldEdhbWVydWxlcygpKSB7XG4gICAgICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sIG5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVCb29sZWFuKGVkaXRhYmxlKTtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZUJ5dGUoMSk7IC8vIE1heWJlIHZhbHVlIHR5cGUgPz9cbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlQm9vbGVhbih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0ludCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZUJ5dGUoMik7IC8vIE1heWJlIHZhbHVlIHR5cGUgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkVmFySW50KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZUJ5dGUoMyk7IC8vIE1heWJlIHZhbHVlIHR5cGUgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZUZsb2F0TEUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLmdldExvZ2dlcigpLmVycm9yKCdHYW1lcnVsZSBmb3JtYXQgbm90IGltcGxlbWVudGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwibmFtZXMiOlsiTmV0d29ya1V0aWwiXSwibWFwcGluZ3MiOiI7Ozs7OztB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