UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

100 lines (99 loc) 11.6 kB
import { NetworkUtil } from "../network/NetworkUtil.es.js"; //#region src/world/GameruleManager.ts var 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", RandomTickSpeed: "randomtickspeed", TNTExplodes: "tntexplodes", sendCommandFeedback: "sendcommandfeedback" }; var GameruleManager = class { 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()) { 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"); } } } }; //#endregion export { GameRules, GameruleManager as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2FtZXJ1bGVNYW5hZ2VyLmVzLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JsZC9HYW1lcnVsZU1hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IHR5cGUgU2VydmVyIGZyb20gJy4uL1NlcnZlcic7XG5pbXBvcnQgeyBOZXR3b3JrVXRpbCB9IGZyb20gJy4uL25ldHdvcmsvTmV0d29ya1V0aWwnO1xuXG5leHBvcnQgY29uc3QgR2FtZVJ1bGVzID0ge1xuICAgIENvbW1hbmRCbG9ja091dHB1dDogJ2NvbW1hbmRibG9ja291dHB1dCcsXG4gICAgRG9EYXlMaWdodEN5Y2xlOiAnZG9kYXlsaWdodGN5Y2xlJyxcbiAgICBEb0VudGl0eURyb3BzOiAnZG9lbnRpdHlkcm9wcycsXG4gICAgRG9GaXJlVGljazogJ2RvZmlyZXRpY2snLFxuICAgIERvTW9iTG9vdDogJ2RvbW9ibG9vdCcsXG4gICAgRG9Nb2JTcGF3bmluZzogJ2RvbW9ic3Bhd25pbmcnLFxuICAgIERvVGlsZURyb3BzOiAnZG90aWxlZHJvcHMnLFxuICAgIERvV2VhdGhlckN5Y2xlOiAnZG93ZWF0aGVyY3ljbGUnLFxuICAgIERyb3dpbmdEYW1hZ2U6ICdkcm93bmluZ2RhbWFnZScsXG4gICAgRmFsbERhbWFnZTogJ2ZhbGxkYW1hZ2UnLFxuICAgIEZpcmVEYW1hZ2U6ICdmaXJlZGFtYWdlJyxcbiAgICBLZWVwSW52ZW50b3J5OiAna2VlcGludmVudG9yeScsXG4gICAgTW9iR3JpZWZpbmc6ICdtb2JncmllZmluZycsXG4gICAgTmF0dXJhbFJlZ2VuZXJhdGlvbjogJ25hdHVyYWxyZWdlbmVyYXRpb24nLFxuICAgIFBWUDogJ3B2cCcsXG4gICAgU2hvd0Nvb3JkaW5hdGVzOiAnc2hvd2Nvb3JkaW5hdGVzJywgLy8gQm9vbFxuICAgIFJhbmRvbVRpY2tTcGVlZDogJ3JhbmRvbXRpY2tzcGVlZCcsXG4gICAgVE5URXhwbG9kZXM6ICd0bnRleHBsb2RlcycsXG4gICAgc2VuZENvbW1hbmRGZWVkYmFjazogJ3NlbmRjb21tYW5kZmVlZGJhY2snXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW1lcnVsZU1hbmFnZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmVyOiBTZXJ2ZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBydWxlczogTWFwPHN0cmluZywgW2Jvb2xlYW4gfCBudW1iZXIsIGJvb2xlYW5dPiA9IG5ldyBNYXAoKSBhcyBNYXA8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgW2Jvb2xlYW4gfCBudW1iZXIsIGJvb2xlYW5dXG4gICAgPjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXJ2ZXI6IFNlcnZlcikge1xuICAgICAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcblxuICAgICAgICAvLyBTZXQgZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgdGhpcy5zZXRHYW1lcnVsZSgnQ29tbWFuZEJsb2NrT3V0cHV0JywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ0RvRGF5TGlnaHRDeWNsZScsIHRydWUsIHRydWUpO1xuICAgICAgICB0aGlzLnNldEdhbWVydWxlKCdEb0VudGl0eURyb3BzJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ0RvRmlyZVRpY2snLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRHYW1lcnVsZSgnRG9Nb2JMb290JywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ0RvTW9iU3Bhd25pbmcnLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRHYW1lcnVsZSgnRG9UaWxlRHJvcHMnLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRHYW1lcnVsZSgnRG9XZWF0aGVyQ3ljbGUnLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRHYW1lcnVsZSgnRHJvd25pbmdEYW1hZ2UnLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRHYW1lcnVsZSgnRmFsbERhbWFnZScsIHRydWUsIHRydWUpO1xuICAgICAgICB0aGlzLnNldEdhbWVydWxlKCdGaXJlRGFtYWdlJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ0tlZXBJbnZlbnRvcnknLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ01vYkdyaWVmaW5nJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ05hdHVyYWxSZWdlbmVyYXRpb24nLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRHYW1lcnVsZSgnUFZQJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ1Nob3dDb29yZGluYXRlcycsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRHYW1lcnVsZSgnUmFuZG9tVGlja1NwZWVkJywgMywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ1ROVEV4cGxvZGVzJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ3NlbmRDb21tYW5kRmVlZGJhY2snLCB0cnVlLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgZ2FtZSBydWxlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gdGhlIGdhbWVydWxlJ3MgbmFtZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW4gfCBudW1iZXJ9IHZhbHVlIC0gdGhlIHZhbHVlLCBib29sZWFuIE9SIG51bWJlci5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVkaXRhYmxlIC0gaWYgdGhlIGdhbWVydWxlIGlzIGVkaXRhYmxlLlxuICAgICAqIEBUT0RPOiBub3RpZnkgY2xpZW50cyBhYm91dCBnYW1lcnVsZSBjaGFuZ2UuXG4gICAgICovXG4gICAgcHVibGljIHNldEdhbWVydWxlKG5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4gfCBudW1iZXIsIGVkaXRhYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMucnVsZXMuc2V0KG5hbWUudG9Mb3dlckNhc2UoKSwgW3ZhbHVlLCBlZGl0YWJsZV0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGdhbWVydWxlIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gdGhlIGdhbWVydWxlJ3MgbmFtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0R2FtZXJ1bGUobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICghT2JqZWN0LnZhbHVlcyhHYW1lUnVsZXMpLmluY2x1ZGVzKG5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmVyLmdldExvZ2dlcigpLmVycm9yKGBVbmtub3duIEdhbWVydWxlIHdpdGggbmFtZSAke25hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5ydWxlcy5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKSA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRHYW1lcnVsZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJ1bGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZXR3b3JrU2VyaWFsaXplKHN0cmVhbTogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlzSW50ID0gKG46IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG4gJSAxID09PSAwO1xuICAgICAgICB9O1xuXG4gICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkVmFySW50KHRoaXMuZ2V0R2FtZXJ1bGVzKCkuc2l6ZSk7XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIFt2YWx1ZSwgZWRpdGFibGVdXSBvZiB0aGlzLmdldEdhbWVydWxlcygpKSB7XG4gICAgICAgICAgICBOZXR3b3JrVXRpbC53cml0ZVN0cmluZyhzdHJlYW0sIG5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVCb29sZWFuKGVkaXRhYmxlKTtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZUJ5dGUoMSk7IC8vIE1heWJlIHZhbHVlIHR5cGUgPz9cbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlQm9vbGVhbih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0ludCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZUJ5dGUoMik7IC8vIE1heWJlIHZhbHVlIHR5cGUgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkVmFySW50KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZUJ5dGUoMyk7IC8vIE1heWJlIHZhbHVlIHR5cGUgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZUZsb2F0TEUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLmdldExvZ2dlcigpLmVycm9yKCdHYW1lcnVsZSBmb3JtYXQgbm90IGltcGxlbWVudGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBSUEsSUFBYSxZQUFZO0NBQ3JC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