UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

104 lines (101 loc) 13.8 kB
import { NetworkUtil } from '../network/NetworkUtil.es.js'; 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()) { 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"); } } } } export { GameRules, GameruleManager as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2FtZXJ1bGVNYW5hZ2VyLmVzLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ybGQvR2FtZXJ1bGVNYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGltcG9ydCBCaW5hcnlTdHJlYW0gZnJvbSAnQGpzcHJpc21hcmluZS9qc2JpbmFyeXV0aWxzJztcbmltcG9ydCB0eXBlIFNlcnZlciBmcm9tICcuLi9TZXJ2ZXInO1xuaW1wb3J0IHsgTmV0d29ya1V0aWwgfSBmcm9tICcuLi9uZXR3b3JrL05ldHdvcmtVdGlsJztcblxuZXhwb3J0IGNvbnN0IEdhbWVSdWxlcyA9IHtcbiAgICBDb21tYW5kQmxvY2tPdXRwdXQ6ICdjb21tYW5kYmxvY2tvdXRwdXQnLFxuICAgIERvRGF5TGlnaHRDeWNsZTogJ2RvZGF5bGlnaHRjeWNsZScsXG4gICAgRG9FbnRpdHlEcm9wczogJ2RvZW50aXR5ZHJvcHMnLFxuICAgIERvRmlyZVRpY2s6ICdkb2ZpcmV0aWNrJyxcbiAgICBEb01vYkxvb3Q6ICdkb21vYmxvb3QnLFxuICAgIERvTW9iU3Bhd25pbmc6ICdkb21vYnNwYXduaW5nJyxcbiAgICBEb1RpbGVEcm9wczogJ2RvdGlsZWRyb3BzJyxcbiAgICBEb1dlYXRoZXJDeWNsZTogJ2Rvd2VhdGhlcmN5Y2xlJyxcbiAgICBEcm93aW5nRGFtYWdlOiAnZHJvd25pbmdkYW1hZ2UnLFxuICAgIEZhbGxEYW1hZ2U6ICdmYWxsZGFtYWdlJyxcbiAgICBGaXJlRGFtYWdlOiAnZmlyZWRhbWFnZScsXG4gICAgS2VlcEludmVudG9yeTogJ2tlZXBpbnZlbnRvcnknLFxuICAgIE1vYkdyaWVmaW5nOiAnbW9iZ3JpZWZpbmcnLFxuICAgIE5hdHVyYWxSZWdlbmVyYXRpb246ICduYXR1cmFscmVnZW5lcmF0aW9uJyxcbiAgICBQVlA6ICdwdnAnLFxuICAgIFNob3dDb29yZGluYXRlczogJ3Nob3djb29yZGluYXRlcycsIC8vIEJvb2xcbiAgICBSYW5kb21UaWNrU3BlZWQ6ICdyYW5kb210aWNrc3BlZWQnLFxuICAgIFROVEV4cGxvZGVzOiAndG50ZXhwbG9kZXMnLFxuICAgIHNlbmRDb21tYW5kRmVlZGJhY2s6ICdzZW5kY29tbWFuZGZlZWRiYWNrJ1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2FtZXJ1bGVNYW5hZ2VyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlcnZlcjogU2VydmVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcnVsZXM6IE1hcDxzdHJpbmcsIFtib29sZWFuIHwgbnVtYmVyLCBib29sZWFuXT4gPSBuZXcgTWFwKCkgYXMgTWFwPFxuICAgICAgICBzdHJpbmcsXG4gICAgICAgIFtib29sZWFuIHwgbnVtYmVyLCBib29sZWFuXVxuICAgID47XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3Ioc2VydmVyOiBTZXJ2ZXIpIHtcbiAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG5cbiAgICAgICAgLy8gU2V0IGRlZmF1bHQgdmFsdWVzXG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ0NvbW1hbmRCbG9ja091dHB1dCcsIHRydWUsIHRydWUpO1xuICAgICAgICB0aGlzLnNldEdhbWVydWxlKCdEb0RheUxpZ2h0Q3ljbGUnLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRHYW1lcnVsZSgnRG9FbnRpdHlEcm9wcycsIHRydWUsIHRydWUpO1xuICAgICAgICB0aGlzLnNldEdhbWVydWxlKCdEb0ZpcmVUaWNrJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ0RvTW9iTG9vdCcsIHRydWUsIHRydWUpO1xuICAgICAgICB0aGlzLnNldEdhbWVydWxlKCdEb01vYlNwYXduaW5nJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ0RvVGlsZURyb3BzJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ0RvV2VhdGhlckN5Y2xlJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ0Ryb3duaW5nRGFtYWdlJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ0ZhbGxEYW1hZ2UnLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRHYW1lcnVsZSgnRmlyZURhbWFnZScsIHRydWUsIHRydWUpO1xuICAgICAgICB0aGlzLnNldEdhbWVydWxlKCdLZWVwSW52ZW50b3J5JywgZmFsc2UsIHRydWUpO1xuICAgICAgICB0aGlzLnNldEdhbWVydWxlKCdNb2JHcmllZmluZycsIHRydWUsIHRydWUpO1xuICAgICAgICB0aGlzLnNldEdhbWVydWxlKCdOYXR1cmFsUmVnZW5lcmF0aW9uJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ1BWUCcsIHRydWUsIHRydWUpO1xuICAgICAgICB0aGlzLnNldEdhbWVydWxlKCdTaG93Q29vcmRpbmF0ZXMnLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZXJ1bGUoJ1JhbmRvbVRpY2tTcGVlZCcsIDMsIHRydWUpO1xuICAgICAgICB0aGlzLnNldEdhbWVydWxlKCdUTlRFeHBsb2RlcycsIHRydWUsIHRydWUpO1xuICAgICAgICB0aGlzLnNldEdhbWVydWxlKCdzZW5kQ29tbWFuZEZlZWRiYWNrJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGdhbWUgcnVsZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIHRoZSBnYW1lcnVsZSdzIG5hbWUuXG4gICAgICogQHBhcmFtIHtib29sZWFuIHwgbnVtYmVyfSB2YWx1ZSAtIHRoZSB2YWx1ZSwgYm9vbGVhbiBPUiBudW1iZXIuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlZGl0YWJsZSAtIGlmIHRoZSBnYW1lcnVsZSBpcyBlZGl0YWJsZS5cbiAgICAgKiBAVE9ETzogbm90aWZ5IGNsaWVudHMgYWJvdXQgZ2FtZXJ1bGUgY2hhbmdlLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRHYW1lcnVsZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuIHwgbnVtYmVyLCBlZGl0YWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnJ1bGVzLnNldChuYW1lLnRvTG93ZXJDYXNlKCksIFt2YWx1ZSwgZWRpdGFibGVdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBnYW1lcnVsZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIHRoZSBnYW1lcnVsZSdzIG5hbWUuXG4gICAgICovXG4gICAgcHVibGljIGdldEdhbWVydWxlKG5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAoIU9iamVjdC52YWx1ZXMoR2FtZVJ1bGVzKS5pbmNsdWRlcyhuYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICB0aGlzLnNlcnZlci5nZXRMb2dnZXIoKS5lcnJvcihgVW5rbm93biBHYW1lcnVsZSB3aXRoIG5hbWUgJHtuYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucnVsZXMuZ2V0KG5hbWUudG9Mb3dlckNhc2UoKSkgPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0R2FtZXJ1bGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ydWxlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgbmV0d29ya1NlcmlhbGl6ZShzdHJlYW06IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpc0ludCA9IChuOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuICUgMSA9PT0gMDtcbiAgICAgICAgfTtcblxuICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZFZhckludCh0aGlzLmdldEdhbWVydWxlcygpLnNpemUpO1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBbdmFsdWUsIGVkaXRhYmxlXV0gb2YgdGhpcy5nZXRHYW1lcnVsZXMoKSkge1xuICAgICAgICAgICAgTmV0d29ya1V0aWwud3JpdGVTdHJpbmcoc3RyZWFtLCBuYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlQm9vbGVhbihlZGl0YWJsZSk7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGVCeXRlKDEpOyAvLyBNYXliZSB2YWx1ZSB0eXBlID8/XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZUJvb2xlYW4odmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNJbnQodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGVCeXRlKDIpOyAvLyBNYXliZSB2YWx1ZSB0eXBlID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZFZhckludCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGVCeXRlKDMpOyAvLyBNYXliZSB2YWx1ZSB0eXBlID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGVGbG9hdExFKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5nZXRMb2dnZXIoKS5lcnJvcignR2FtZXJ1bGUgZm9ybWF0IG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBSU8sTUFBTSxTQUFZLEdBQUE7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