@throw-out-error/minecraft-mcfunction
Version:
A simple way to create your mcfunction files using Typescript syntax.
200 lines • 7.42 kB
JavaScript
;
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