@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
104 lines (101 loc) • 13.8 kB
JavaScript
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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