UNPKG

@throw-out-error/minecraft-mcfunction

Version:

A simple way to create your mcfunction files using Typescript syntax.

200 lines 7.42 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Selector = exports.SelectorTarget = void 0; const _1 = require("./"); var SelectorTarget; (function (SelectorTarget) { SelectorTarget["nearest"] = "p"; SelectorTarget["random"] = "r"; SelectorTarget["player"] = "a"; SelectorTarget["entity"] = "e"; SelectorTarget["executer"] = "s"; })(SelectorTarget = exports.SelectorTarget || (exports.SelectorTarget = {})); function boolanMapToKVPairs(map, key) { return Object.entries(map).map(([val, v]) => [ key, `${v ? '' : '!'}${val}`, ]); } class Selector extends _1.ArgumentObject { constructor(target, args = {}) { var _a; super(); this.target = (_a = SelectorTarget[target]) !== null && _a !== void 0 ? _a : target; this.arguments = args; } async *compile() { yield `@${this.target}`; const args = Object.entries(this.arguments); const list = []; args.forEach(([arg, val]) => { switch (arg) { case 'scores': { const scores = Object.entries(val).map(([s, r]) => `${s}=${_1.rangeToString(r)}`); if (!scores.length) return; list.push(['scores', `{${scores.join(',')}}`]); break; } case 'distance': case 'level': list.push([arg, `${_1.rangeToString(val)}`]); break; case 'team': case 'gamemode': case 'name': case 'type': case 'tag': case 'predicate': if (typeof val === 'string') { list.push([arg, val]); break; } list.push(...boolanMapToKVPairs(val, arg)); break; case 'x_rotation': case 'y_rotation': list.push([arg, _1.rangeToString(val)]); break; case 'advancements': { const advancements = Object.entries(val).map(([adv, v]) => { if (typeof v === 'boolean') { return `${adv}=${v ? 'true' : 'false'}`; } const criterias = Object.entries(v).map(([c, v]) => { return `${c}=${v ? 'true' : 'false'}`; }); return `${adv}={${criterias.join(',')}}`; }); if (!advancements.length) return; list.push([arg, `{${advancements.join(',')}}`]); break; } default: list.push([arg, val.toString()]); break; } }); list.sort(([a1, v1], [a2, v2]) => { if (a1 === 'type' && v1.charAt(0) !== '!') return -1; if (a2 === 'type' && v2.charAt(0) !== '!') return 1; if (a1 === 'gamemode') return -1; if (a2 === 'gamemode') return 1; if (a1 === 'team') return -1; if (a2 === 'team') return 1; if (a1 === 'type') return -1; if (a2 === 'type') return 1; if (a1 === 'tag') return -1; if (a2 === 'tag') return 1; if (a1 === 'name') return -1; if (a2 === 'name') return 1; if (a1 === 'scores') return -1; if (a2 === 'scores') return 1; if (a1 === 'advancements') return -1; if (a2 === 'advancements') return 1; if (a1 === 'nbt') return -1; if (a2 === 'nbt') return 1; return a1.localeCompare(a2); }); if (list.length) { yield '['; for (let i = 0; i < list.length; i++) { if (i > 0) yield ','; const [arg, val] = list[i]; yield arg; yield '='; yield val; } yield ']'; } } toString() { const argList = []; for (let [arg, val] of Object.entries(this.arguments)) { switch (arg) { case 'scores': { const scores = Object.entries(val).map(([s, r]) => `${s}=${_1.rangeToString(r)}`); if (!scores.length) break; argList.push(`scores={${scores.join(',')}}`); break; } case 'level': argList.push(`level=${_1.rangeToString(val)}`); break; case 'team': case 'gamemode': case 'name': case 'type': case 'tag': case 'predicate': if (typeof val === 'string') { argList.push(`${arg}=${val}`); break; } argList.push(...boolanMapToKVPairs(val, arg).map((p) => `${p[0]}=${p[1]}`)); break; case 'x_rotation': case 'y_rotation': argList.push(`${arg}=${_1.rangeToString(val)}`); break; case 'advancements': { const advancements = Object.entries(val).map(([adv, v]) => { if (typeof v === 'boolean') { return `${adv}=${v ? 'true' : 'false'}`; } const criterias = Object.entries(v).map(([c, v]) => { return `${c}=${v ? 'true' : 'false'}`; }); return `${adv}={${criterias.join(',')}}`; }); if (!advancements.length) break; argList.push(`advancements={${advancements.join(',')}}`); break; } default: argList.push(`${arg}=${val}`); } } const args = argList.length ? `[${argList.join(',')}]` : ''; return `@${this.target}${args}`; } static entity(args = {}) { return new Selector(SelectorTarget.entity, args); } static executer(args = {}) { return new Selector(SelectorTarget.executer, args); } static nearest(args = {}) { return new Selector(SelectorTarget.nearest, args); } static player(args = {}) { return new Selector(SelectorTarget.player, args); } static random(args = {}) { return new Selector(SelectorTarget.random, args); } } exports.Selector = Selector; //# sourceMappingURL=selector.js.map