@spyglassmc/java-edition 0.3.10 → 0.3.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.js +46 -12
- package/lib/json/index.js +2 -0
- package/lib/json/mcdocAttributes.d.ts +3 -0
- package/lib/json/mcdocAttributes.js +35 -0
- package/lib/mcfunction/checker/index.d.ts +1 -1
- package/lib/mcfunction/checker/index.js +0 -4
- package/lib/mcfunction/completer/argument.js +13 -1
- package/lib/mcfunction/index.js +8 -3
- package/lib/mcfunction/mcdocAttributes.js +18 -4
- package/lib/mcfunction/node/argument.d.ts +1 -1
- package/lib/mcfunction/parser/argument.d.ts +1 -0
- package/lib/mcfunction/parser/argument.js +42 -24
- package/lib/mcfunction/signatureHelpProvider.d.ts +1 -1
- package/lib/mcfunction/tree/argument.d.ts +4 -1
- package/lib/mcfunction/tree/patch.js +8 -0
- package/package.json +7 -7
package/lib/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as core from '@spyglassmc/core';
|
|
2
2
|
import * as json from '@spyglassmc/json';
|
|
3
|
+
import { localize } from '@spyglassmc/locales';
|
|
3
4
|
import * as mcdoc from '@spyglassmc/mcdoc';
|
|
4
5
|
import * as nbt from '@spyglassmc/nbt';
|
|
5
6
|
import { uriBinder } from './binder/index.js';
|
|
@@ -11,7 +12,7 @@ export * as dependency from './dependency/index.js';
|
|
|
11
12
|
export * as json from './json/index.js';
|
|
12
13
|
export * as mcf from './mcfunction/index.js';
|
|
13
14
|
export const initialize = async (ctx) => {
|
|
14
|
-
const { config, downloader, externals, logger, meta,
|
|
15
|
+
const { config, downloader, externals, logger, meta, projectRoots } = ctx;
|
|
15
16
|
async function readPackMcmeta(uri) {
|
|
16
17
|
try {
|
|
17
18
|
const data = await core.fileUtil.readJson(externals, uri);
|
|
@@ -21,7 +22,7 @@ export const initialize = async (ctx) => {
|
|
|
21
22
|
catch (e) {
|
|
22
23
|
if (!externals.error.isKind(e, 'ENOENT')) {
|
|
23
24
|
// `pack.mcmeta` exists but broken. Log an error.
|
|
24
|
-
logger.error(`[je.initialize] Failed loading pack.mcmeta
|
|
25
|
+
logger.error(`[je.initialize] Failed loading pack.mcmeta ${uri}`, e);
|
|
25
26
|
}
|
|
26
27
|
}
|
|
27
28
|
return undefined;
|
|
@@ -29,16 +30,18 @@ export const initialize = async (ctx) => {
|
|
|
29
30
|
async function findPackMcmeta() {
|
|
30
31
|
const searched = new Set();
|
|
31
32
|
for (let depth = 0; depth <= 2; depth += 1) {
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
33
|
+
for (const projectRoot of projectRoots) {
|
|
34
|
+
const files = await externals.fs.getAllFiles(projectRoot, depth + 1);
|
|
35
|
+
for (const uri of files.filter(uri => uri.endsWith('/pack.mcmeta'))) {
|
|
36
|
+
if (searched.has(uri)) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
searched.add(uri);
|
|
40
|
+
const data = await readPackMcmeta(uri);
|
|
41
|
+
if (data) {
|
|
42
|
+
logger.info(`[je.initialize] Found a valid pack.mcmeta ${uri} with pack_format ${data.pack.pack_format}`);
|
|
43
|
+
return data;
|
|
44
|
+
}
|
|
42
45
|
}
|
|
43
46
|
}
|
|
44
47
|
}
|
|
@@ -112,6 +115,37 @@ export const initialize = async (ctx) => {
|
|
|
112
115
|
return field;
|
|
113
116
|
},
|
|
114
117
|
});
|
|
118
|
+
const packFormats = new Map();
|
|
119
|
+
for (const version of versions) {
|
|
120
|
+
if (version.type === 'release' && !packFormats.has(version.data_pack_version)) {
|
|
121
|
+
packFormats.set(version.data_pack_version, version);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
mcdoc.runtime.registerAttribute(meta, 'pack_format', () => undefined, {
|
|
125
|
+
checker: (_, typeDef) => {
|
|
126
|
+
if (typeDef.kind !== 'literal' || typeof typeDef.value.value !== 'number') {
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
const target = typeDef.value.value;
|
|
130
|
+
return (node, ctx) => {
|
|
131
|
+
const targetVersion = packFormats.get(target);
|
|
132
|
+
if (!targetVersion) {
|
|
133
|
+
ctx.err.report(localize('java-edition.pack-format.unsupported', target), node, 2 /* core.ErrorSeverity.Warning */);
|
|
134
|
+
}
|
|
135
|
+
else if (targetVersion.id !== release) {
|
|
136
|
+
ctx.err.report(localize('java-edition.pack-format.not-loaded', target, release), node, 2 /* core.ErrorSeverity.Warning */);
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
},
|
|
140
|
+
numericCompleter: (_, ctx) => {
|
|
141
|
+
return [...packFormats.values()].map((v, i) => ({
|
|
142
|
+
range: core.Range.create(ctx.offset),
|
|
143
|
+
label: `${v.data_pack_version}`,
|
|
144
|
+
labelSuffix: ` (${v.id})`,
|
|
145
|
+
sortText: `${i}`.padStart(4, '0'),
|
|
146
|
+
}));
|
|
147
|
+
},
|
|
148
|
+
});
|
|
115
149
|
json.initialize(ctx);
|
|
116
150
|
jeJson.initialize(ctx);
|
|
117
151
|
jeMcf.initialize(ctx, summary.commands, release);
|
package/lib/json/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/* istanbul ignore file */
|
|
2
2
|
import * as checker from './checker/index.js';
|
|
3
|
+
import { registerMcdocAttributes } from './mcdocAttributes.js';
|
|
3
4
|
export const initialize = (ctx) => {
|
|
5
|
+
registerMcdocAttributes(ctx.meta);
|
|
4
6
|
checker.register(ctx.meta);
|
|
5
7
|
};
|
|
6
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as core from '@spyglassmc/core';
|
|
2
|
+
import * as mcdoc from '@spyglassmc/mcdoc';
|
|
3
|
+
import { dissectUri } from '../binder/index.js';
|
|
4
|
+
const validator = mcdoc.runtime.attribute.validator;
|
|
5
|
+
const criterionValidator = validator.alternatives(validator.tree({
|
|
6
|
+
definition: validator.boolean,
|
|
7
|
+
}), () => ({ definition: false }));
|
|
8
|
+
export function registerMcdocAttributes(meta) {
|
|
9
|
+
mcdoc.runtime.registerAttribute(meta, 'criterion', criterionValidator, {
|
|
10
|
+
stringParser: (config, _, ctx) => {
|
|
11
|
+
const parts = dissectUri(ctx.doc.uri, ctx);
|
|
12
|
+
if (!parts || !parts.ok || parts.category !== 'advancement') {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
return core.symbol({
|
|
16
|
+
category: 'advancement',
|
|
17
|
+
subcategory: 'criterion',
|
|
18
|
+
parentPath: [`${parts.namespace}:${parts.identifier}`],
|
|
19
|
+
usageType: config.definition ? 'definition' : 'reference',
|
|
20
|
+
});
|
|
21
|
+
},
|
|
22
|
+
stringMocker: (config, _, ctx) => {
|
|
23
|
+
const parts = dissectUri(ctx.doc.uri, ctx);
|
|
24
|
+
if (!parts || !parts.ok || parts.category !== 'advancement') {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
return core.SymbolNode.mock(ctx.offset, {
|
|
28
|
+
category: 'advancement',
|
|
29
|
+
subcategory: 'criterion',
|
|
30
|
+
parentPath: [`${parts.namespace}:${parts.identifier}`],
|
|
31
|
+
});
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=mcdocAttributes.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as core from '@spyglassmc/core';
|
|
2
|
-
import * as mcf from '@spyglassmc/mcfunction';
|
|
2
|
+
import type * as mcf from '@spyglassmc/mcfunction';
|
|
3
3
|
export declare const command: core.Checker<mcf.CommandNode>;
|
|
4
4
|
export declare function register(meta: core.MetaRegistry): void;
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import * as core from '@spyglassmc/core';
|
|
2
2
|
import * as json from '@spyglassmc/json';
|
|
3
3
|
import { localize } from '@spyglassmc/locales';
|
|
4
|
-
import * as mcf from '@spyglassmc/mcfunction';
|
|
5
4
|
import * as nbt from '@spyglassmc/nbt';
|
|
6
5
|
import { dissectUri, reportDissectError } from '../../binder/index.js';
|
|
7
6
|
import { getTagValues } from '../../common/index.js';
|
|
@@ -15,9 +14,6 @@ const entry = (node, ctx) => {
|
|
|
15
14
|
core.checker.dispatchSync(node, ctx);
|
|
16
15
|
};
|
|
17
16
|
export const command = (node, ctx) => {
|
|
18
|
-
if (node.slash && node.parent && mcf.McfunctionNode.is(node.parent)) {
|
|
19
|
-
ctx.err.report(localize('unexpected-leading-slash'), node.slash);
|
|
20
|
-
}
|
|
21
17
|
rootCommand(node.children, 0, ctx);
|
|
22
18
|
};
|
|
23
19
|
function getEarlierNode(nodes, before, name) {
|
|
@@ -5,7 +5,7 @@ import { getTagValues } from '../../common/index.js';
|
|
|
5
5
|
import { ReleaseVersion } from '../../dependency/common.js';
|
|
6
6
|
import { ColorArgumentValues, EntityAnchorArgumentValues, GamemodeArgumentValues, getItemSlotArgumentValues, getItemSlotsArgumentValues, getScoreboardSlotArgumentValues, HeightmapValues, MirrorValues, OperationArgumentValues, RotationValues, SwizzleArgumentValues, } from '../common/index.js';
|
|
7
7
|
import { BlockNode, ComponentTestExactNode, ComponentTestSubpredicateNode, CoordinateNode, EntitySelectorAtVariable, EntitySelectorNode, IntRangeNode, ItemPredicateNode, ItemStackNode, ObjectiveCriteriaNode, ParticleNode, ScoreHolderNode, VectorNode, } from '../node/index.js';
|
|
8
|
-
export const getMockNodes = (rawTreeNode, ctx) => {
|
|
8
|
+
export const getMockNodes = (rawTreeNode, prevNodes, ctx) => {
|
|
9
9
|
const range = ctx.offset;
|
|
10
10
|
const treeNode = rawTreeNode;
|
|
11
11
|
switch (treeNode.parser) {
|
|
@@ -122,6 +122,18 @@ export const getMockNodes = (rawTreeNode, ctx) => {
|
|
|
122
122
|
return VectorNode.mock(range, { dimension: 2, integersOnly: true });
|
|
123
123
|
case 'minecraft:vec3':
|
|
124
124
|
return VectorNode.mock(range, { dimension: 3 });
|
|
125
|
+
case 'spyglassmc:criterion':
|
|
126
|
+
const advancementNode = prevNodes.length > 0
|
|
127
|
+
? prevNodes[prevNodes.length - 1].children[0]
|
|
128
|
+
: undefined;
|
|
129
|
+
if (ResourceLocationNode.is(advancementNode)) {
|
|
130
|
+
return SymbolNode.mock(range, {
|
|
131
|
+
category: 'advancement',
|
|
132
|
+
subcategory: 'criterion',
|
|
133
|
+
parentPath: [ResourceLocationNode.toString(advancementNode, 'full')],
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return [];
|
|
125
137
|
case 'spyglassmc:tag':
|
|
126
138
|
return SymbolNode.mock(range, { category: 'tag' });
|
|
127
139
|
// ==== Unimplemented ====
|
package/lib/mcfunction/index.js
CHANGED
|
@@ -24,11 +24,16 @@ export const initialize = (ctx, commands, releaseVersion) => {
|
|
|
24
24
|
validatePatchedTree(tree, ctx.logger);
|
|
25
25
|
}
|
|
26
26
|
mcf.initialize(ctx);
|
|
27
|
-
const
|
|
28
|
-
|
|
27
|
+
const mcfunctionOptions = {
|
|
28
|
+
lineContinuation: ReleaseVersion.cmp(releaseVersion, '1.20.2') >= 0,
|
|
29
|
+
macros: ReleaseVersion.cmp(releaseVersion, '1.20.2') >= 0,
|
|
30
|
+
commandOptions: ReleaseVersion.cmp(releaseVersion, '1.20.5') >= 0
|
|
31
|
+
? { maxLength: 2_000_000 }
|
|
32
|
+
: {},
|
|
33
|
+
};
|
|
29
34
|
meta.registerLanguage('mcfunction', {
|
|
30
35
|
extensions: ['.mcfunction'],
|
|
31
|
-
parser: mcf.entry(tree, parser.argument,
|
|
36
|
+
parser: mcf.entry(tree, parser.argument, mcfunctionOptions),
|
|
32
37
|
completer: mcf.completer.entry(tree, completer.getMockNodes),
|
|
33
38
|
triggerCharacters: [' ', '[', '=', '!', ',', '{', ':', '/', '.', '"', "'"],
|
|
34
39
|
});
|
|
@@ -7,6 +7,11 @@ import { getItemSlotsArgumentValues } from './common/index.js';
|
|
|
7
7
|
import { EntitySelectorAtVariable, EntitySelectorNode, ScoreHolderNode } from './node/argument.js';
|
|
8
8
|
import * as parser from './parser/index.js';
|
|
9
9
|
const validator = mcdoc.runtime.attribute.validator;
|
|
10
|
+
const commandValidator = validator.alternatives(validator.tree({
|
|
11
|
+
slash: validator.optional(validator.options('allowed', 'required', 'chat')),
|
|
12
|
+
max_length: validator.optional(validator.number),
|
|
13
|
+
empty: validator.optional(validator.options('allowed')),
|
|
14
|
+
}), () => ({}));
|
|
10
15
|
const entityValidator = validator.alternatives(validator.tree({
|
|
11
16
|
amount: validator.options('multiple', 'single'),
|
|
12
17
|
type: validator.options('entities', 'players'),
|
|
@@ -15,11 +20,20 @@ const scoreHolderValidator = validator.alternatives(validator.tree({
|
|
|
15
20
|
amount: validator.options('multiple', 'single'),
|
|
16
21
|
}), () => ({ amount: 'multiple' }));
|
|
17
22
|
export function registerMcdocAttributes(meta, rootTreeNode) {
|
|
18
|
-
mcdoc.runtime.registerAttribute(meta, 'command',
|
|
19
|
-
// TODO: validate slash
|
|
23
|
+
mcdoc.runtime.registerAttribute(meta, 'command', commandValidator, {
|
|
20
24
|
// TODO: fix completer inside commands
|
|
21
|
-
stringParser: () => {
|
|
22
|
-
return
|
|
25
|
+
stringParser: ({ slash, max_length, empty }) => {
|
|
26
|
+
return (src, ctx) => {
|
|
27
|
+
if ((empty && !src.canRead()) || (slash === 'chat' && src.peek() !== '/')) {
|
|
28
|
+
return core.string({
|
|
29
|
+
unquotable: { blockList: new Set(), allowEmpty: true },
|
|
30
|
+
})(src, ctx);
|
|
31
|
+
}
|
|
32
|
+
return mcf.command(rootTreeNode, parser.argument, {
|
|
33
|
+
slash: slash === 'chat' ? 'allowed' : slash,
|
|
34
|
+
maxLength: max_length,
|
|
35
|
+
})(src, ctx);
|
|
36
|
+
};
|
|
23
37
|
},
|
|
24
38
|
});
|
|
25
39
|
mcdoc.runtime.registerAttribute(meta, 'text_component', () => undefined, {
|
|
@@ -36,7 +36,7 @@ export declare const enum CoordinateSystem {
|
|
|
36
36
|
World = 0,
|
|
37
37
|
Local = 1
|
|
38
38
|
}
|
|
39
|
-
export interface EntitySelectorAdvancementsArgumentCriteriaNode extends core.RecordBaseNode<core.StringNode, core.BooleanNode> {
|
|
39
|
+
export interface EntitySelectorAdvancementsArgumentCriteriaNode extends core.RecordBaseNode<core.StringNode | core.SymbolNode, core.BooleanNode> {
|
|
40
40
|
type: 'mcfunction:entity_selector/arguments/advancements/criteria';
|
|
41
41
|
}
|
|
42
42
|
export interface EntitySelectorAdvancementsArgumentNode extends core.RecordBaseNode<core.ResourceLocationNode, core.BooleanNode | EntitySelectorAdvancementsArgumentCriteriaNode> {
|
|
@@ -9,6 +9,7 @@ import { EntitySelectorNode } from '../node/index.js';
|
|
|
9
9
|
*/
|
|
10
10
|
export declare const argument: mcf.ArgumentParserGetter;
|
|
11
11
|
export declare const blockPredicate: core.InfallibleParser<BlockNode>;
|
|
12
|
+
export declare function criterion(advancement: core.FullResourceLocation, usageType?: core.SymbolUsageType, terminators?: string[]): core.InfallibleParser<core.SymbolNode>;
|
|
12
13
|
export declare function entity(amount: 'multiple' | 'single', type: 'entities' | 'players'): core.Parser<EntityNode>;
|
|
13
14
|
export declare const itemSlots: core.InfallibleParser<core.LiteralNode>;
|
|
14
15
|
export declare function jsonParser(typeRef: `::${string}::${string}`): core.Parser<json.TypedJsonNode>;
|
|
@@ -45,7 +45,7 @@ function shouldUseOldItemStackFormat(ctx) {
|
|
|
45
45
|
* @returns The parser for the specified argument tree node. All argument parsers used in the `mcfunction` package
|
|
46
46
|
* fail on empty input.
|
|
47
47
|
*/
|
|
48
|
-
export const argument = (rawTreeNode) => {
|
|
48
|
+
export const argument = (rawTreeNode, prevNodes) => {
|
|
49
49
|
const treeNode = rawTreeNode;
|
|
50
50
|
const wrap = (parser) => core.failOnEmpty(core.stopBefore(parser, '\r', '\n'));
|
|
51
51
|
switch (treeNode.parser) {
|
|
@@ -81,7 +81,7 @@ export const argument = (rawTreeNode) => {
|
|
|
81
81
|
return wrap(core.map(core.literal(...ColorArgumentValues), (res) => ({
|
|
82
82
|
...res,
|
|
83
83
|
color: core.Color.NamedColors.has(res.value)
|
|
84
|
-
? core.Color.
|
|
84
|
+
? core.Color.fromCompositeRGB(core.Color.NamedColors.get(res.value))
|
|
85
85
|
: undefined,
|
|
86
86
|
})));
|
|
87
87
|
case 'minecraft:column_pos':
|
|
@@ -186,6 +186,16 @@ export const argument = (rawTreeNode) => {
|
|
|
186
186
|
return wrap(vector({ dimension: 2, noLocal: true }));
|
|
187
187
|
case 'minecraft:vec3':
|
|
188
188
|
return wrap(vector({ dimension: 3 }));
|
|
189
|
+
case 'spyglassmc:criterion':
|
|
190
|
+
const advancementNode = prevNodes.length > 0
|
|
191
|
+
? prevNodes[prevNodes.length - 1].children[0]
|
|
192
|
+
: undefined;
|
|
193
|
+
if (core.ResourceLocationNode.is(advancementNode)) {
|
|
194
|
+
return wrap(criterion(core.ResourceLocationNode.toString(advancementNode, 'full'), core.SymbolUsageType.is(treeNode.properties?.usageType)
|
|
195
|
+
? treeNode.properties?.usageType
|
|
196
|
+
: undefined));
|
|
197
|
+
}
|
|
198
|
+
return wrap(greedyString);
|
|
189
199
|
case 'spyglassmc:tag':
|
|
190
200
|
return wrap(tag(core.SymbolUsageType.is(treeNode.properties?.usageType)
|
|
191
201
|
? treeNode.properties?.usageType
|
|
@@ -266,6 +276,9 @@ function coordinate(integerOnly = false) {
|
|
|
266
276
|
return ans;
|
|
267
277
|
};
|
|
268
278
|
}
|
|
279
|
+
export function criterion(advancement, usageType, terminators = []) {
|
|
280
|
+
return unquotableSymbol({ category: 'advancement', subcategory: 'criterion', parentPath: [advancement], usageType }, terminators);
|
|
281
|
+
}
|
|
269
282
|
export function entity(amount, type) {
|
|
270
283
|
return core.map(core.select([{ predicate: (src) => src.peek() === '@', parser: selector() }, {
|
|
271
284
|
parser: core.any([
|
|
@@ -588,26 +601,31 @@ export function selector(ignoreInvalidPrefix = false) {
|
|
|
588
601
|
category: 'advancement',
|
|
589
602
|
}),
|
|
590
603
|
sep: '=',
|
|
591
|
-
value:
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
604
|
+
value: {
|
|
605
|
+
get: (_, key) => core.select([{
|
|
606
|
+
predicate: (src) => src.peek() === '{',
|
|
607
|
+
parser: core.map(core.record({
|
|
608
|
+
start: '{',
|
|
609
|
+
pair: {
|
|
610
|
+
key: key
|
|
611
|
+
? criterion(core.ResourceLocationNode
|
|
612
|
+
.toString(key, 'full'), 'reference', ['}', ',', '='])
|
|
613
|
+
: unquotedString,
|
|
614
|
+
sep: '=',
|
|
615
|
+
value: core.boolean,
|
|
616
|
+
end: ',',
|
|
617
|
+
trailingEnd: true,
|
|
618
|
+
},
|
|
619
|
+
end: '}',
|
|
620
|
+
}), (res) => {
|
|
621
|
+
const ans = {
|
|
622
|
+
...res,
|
|
623
|
+
type: 'mcfunction:entity_selector/arguments/advancements/criteria',
|
|
624
|
+
};
|
|
625
|
+
return ans;
|
|
626
|
+
}),
|
|
627
|
+
}, { parser: core.boolean }]),
|
|
628
|
+
},
|
|
611
629
|
end: ',',
|
|
612
630
|
trailingEnd: true,
|
|
613
631
|
},
|
|
@@ -1066,7 +1084,7 @@ const componentTest = (src, ctx) => {
|
|
|
1066
1084
|
negated,
|
|
1067
1085
|
};
|
|
1068
1086
|
const value = nbt.parser.entry(src, ctx);
|
|
1069
|
-
if (value
|
|
1087
|
+
if (value === core.Failure) {
|
|
1070
1088
|
ctx.err.report(localize('expected', localize('nbt.node')), src);
|
|
1071
1089
|
src.skipUntilOrEnd(',', '|', ']');
|
|
1072
1090
|
}
|
|
@@ -1090,7 +1108,7 @@ const componentTest = (src, ctx) => {
|
|
|
1090
1108
|
negated,
|
|
1091
1109
|
};
|
|
1092
1110
|
const predicate = nbt.parser.entry(src, ctx);
|
|
1093
|
-
if (predicate
|
|
1111
|
+
if (predicate === core.Failure) {
|
|
1094
1112
|
ctx.err.report(localize('expected', localize('nbt.node')), src);
|
|
1095
1113
|
src.skipUntilOrEnd(',', '|', ']');
|
|
1096
1114
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as core from '@spyglassmc/core';
|
|
2
2
|
import * as mcf from '@spyglassmc/mcfunction';
|
|
3
|
-
import type { RootTreeNode } from '../dependency';
|
|
3
|
+
import type { RootTreeNode } from '../dependency/index.js';
|
|
4
4
|
/**
|
|
5
5
|
* Only command options that can be satisfied by the current command node will be listed in `signatures`.
|
|
6
6
|
* Only parameters at and immediately after the `offset` will be listed in `parameters`.
|
|
@@ -257,8 +257,11 @@ export interface MinecraftVec2ArgumentTreeNode extends mcf.ArgumentTreeNode {
|
|
|
257
257
|
export interface MinecraftVec3ArgumentTreeNode extends mcf.ArgumentTreeNode {
|
|
258
258
|
parser: 'minecraft:vec3';
|
|
259
259
|
}
|
|
260
|
+
export interface SpyglassmcCriterionArgumentTreeNode extends mcf.ArgumentTreeNode {
|
|
261
|
+
parser: 'spyglassmc:criterion';
|
|
262
|
+
}
|
|
260
263
|
export interface SpyglassmcTagArgumentTreeNode extends mcf.ArgumentTreeNode {
|
|
261
264
|
parser: 'spyglassmc:tag';
|
|
262
265
|
}
|
|
263
|
-
export type ArgumentTreeNode = BrigadierBoolArgumentTreeNode | BrigadierDoubleArgumentTreeNode | BrigadierFloatArgumentTreeNode | BrigadierIntegerArgumentTreeNode | BrigadierLongArgumentTreeNode | BrigadierStringArgumentTreeNode | MinecraftAngleArgumentTreeNode | MinecraftBlockPosArgumentTreeNode | MinecraftBlockPredicateArgumentTreeNode | MinecraftBlockStateArgumentTreeNode | MinecraftColorArgumentTreeNode | MinecraftColumnPosArgumentTreeNode | MinecraftComponentArgumentTreeNode | MinecraftDimensionArgumentTreeNode | MinecraftEntityArgumentTreeNode | MinecraftEntityAnchorArgumentTreeNode | MinecraftEntitySummonArgumentTreeNode | MinecraftFloatRangeArgumentTreeNode | MinecraftFunctionArgumentTreeNode | MinecraftGamemodeArgumentTreeNode | MinecraftGameProfileArgumentTreeNode | MinecraftHeightmapArgumentTreeNode | MinecraftIntRangeArgumentTreeNode | MinecraftItemEnchantmentArgumentTreeNode | MinecraftItemPredicateArgumentTreeNode | MinecraftItemSlotArgumentTreeNode | MinecraftItemSlotsArgumentTreeNode | MinecraftItemStackArgumentTreeNode | MinecraftLootModifierArgumentTreeNode | MinecraftLootPredicateArgumentTreeNode | MinecraftLootTableArgumentTreeNode | MinecraftMessageArgumentTreeNode | MinecraftMobEffectArgumentTreeNode | MinecraftNbtCompoundTagArgumentTreeNode | MinecraftNbtPathArgumentTreeNode | MinecraftNbtTagArgumentTreeNode | MinecraftObjectiveArgumentTreeNode | MinecraftObjectiveCriteriaArgumentTreeNode | MinecraftOperationArgumentTreeNode | MinecraftParticleArgumentTreeNode | MinecraftResourceArgumentTreeNode | MinecraftResourceKeyArgumentTreeNode | MinecraftResourceLocationArgumentTreeNode | MinecraftResourceOrTagArgumentTreeNode | MinecraftResourceOrTagKeyArgumentTreeNode | MinecraftRotationArgumentTreeNode | MinecraftScoreHolderArgumentTreeNode | MinecraftScoreboardSlotArgumentTreeNode | MinecraftStyleArgumentTreeNode | MinecraftSwizzleArgumentTreeNode | MinecraftTeamArgumentTreeNode | MinecraftTemplateMirrorArgumentTreeNode | MinecraftTemplateRotationArgumentTreeNode | MinecraftTimeArgumentTreeNode | MinecraftUuidArgumentTreeNode | MinecraftVec2ArgumentTreeNode | MinecraftVec3ArgumentTreeNode | SpyglassmcTagArgumentTreeNode;
|
|
266
|
+
export type ArgumentTreeNode = BrigadierBoolArgumentTreeNode | BrigadierDoubleArgumentTreeNode | BrigadierFloatArgumentTreeNode | BrigadierIntegerArgumentTreeNode | BrigadierLongArgumentTreeNode | BrigadierStringArgumentTreeNode | MinecraftAngleArgumentTreeNode | MinecraftBlockPosArgumentTreeNode | MinecraftBlockPredicateArgumentTreeNode | MinecraftBlockStateArgumentTreeNode | MinecraftColorArgumentTreeNode | MinecraftColumnPosArgumentTreeNode | MinecraftComponentArgumentTreeNode | MinecraftDimensionArgumentTreeNode | MinecraftEntityArgumentTreeNode | MinecraftEntityAnchorArgumentTreeNode | MinecraftEntitySummonArgumentTreeNode | MinecraftFloatRangeArgumentTreeNode | MinecraftFunctionArgumentTreeNode | MinecraftGamemodeArgumentTreeNode | MinecraftGameProfileArgumentTreeNode | MinecraftHeightmapArgumentTreeNode | MinecraftIntRangeArgumentTreeNode | MinecraftItemEnchantmentArgumentTreeNode | MinecraftItemPredicateArgumentTreeNode | MinecraftItemSlotArgumentTreeNode | MinecraftItemSlotsArgumentTreeNode | MinecraftItemStackArgumentTreeNode | MinecraftLootModifierArgumentTreeNode | MinecraftLootPredicateArgumentTreeNode | MinecraftLootTableArgumentTreeNode | MinecraftMessageArgumentTreeNode | MinecraftMobEffectArgumentTreeNode | MinecraftNbtCompoundTagArgumentTreeNode | MinecraftNbtPathArgumentTreeNode | MinecraftNbtTagArgumentTreeNode | MinecraftObjectiveArgumentTreeNode | MinecraftObjectiveCriteriaArgumentTreeNode | MinecraftOperationArgumentTreeNode | MinecraftParticleArgumentTreeNode | MinecraftResourceArgumentTreeNode | MinecraftResourceKeyArgumentTreeNode | MinecraftResourceLocationArgumentTreeNode | MinecraftResourceOrTagArgumentTreeNode | MinecraftResourceOrTagKeyArgumentTreeNode | MinecraftRotationArgumentTreeNode | MinecraftScoreHolderArgumentTreeNode | MinecraftScoreboardSlotArgumentTreeNode | MinecraftStyleArgumentTreeNode | MinecraftSwizzleArgumentTreeNode | MinecraftTeamArgumentTreeNode | MinecraftTemplateMirrorArgumentTreeNode | MinecraftTemplateRotationArgumentTreeNode | MinecraftTimeArgumentTreeNode | MinecraftUuidArgumentTreeNode | MinecraftVec2ArgumentTreeNode | MinecraftVec3ArgumentTreeNode | SpyglassmcCriterionArgumentTreeNode | SpyglassmcTagArgumentTreeNode;
|
|
264
267
|
//# sourceMappingURL=argument.d.ts.map
|
|
@@ -758,6 +758,14 @@ const AdvancementTargets = Object.freeze({
|
|
|
758
758
|
properties: {
|
|
759
759
|
category: 'advancement',
|
|
760
760
|
},
|
|
761
|
+
children: {
|
|
762
|
+
criterion: {
|
|
763
|
+
parser: 'spyglassmc:criterion',
|
|
764
|
+
properties: {
|
|
765
|
+
usageType: 'reference',
|
|
766
|
+
},
|
|
767
|
+
},
|
|
768
|
+
},
|
|
761
769
|
},
|
|
762
770
|
},
|
|
763
771
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spyglassmc/java-edition",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.12",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "lib/index.d.ts",
|
|
@@ -17,12 +17,12 @@
|
|
|
17
17
|
"release:dry": "npm publish --dry-run"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@spyglassmc/core": "0.4.
|
|
21
|
-
"@spyglassmc/json": "0.3.
|
|
22
|
-
"@spyglassmc/locales": "0.3.
|
|
23
|
-
"@spyglassmc/mcfunction": "0.2.
|
|
24
|
-
"@spyglassmc/mcdoc": "0.3.
|
|
25
|
-
"@spyglassmc/nbt": "0.3.
|
|
20
|
+
"@spyglassmc/core": "0.4.9",
|
|
21
|
+
"@spyglassmc/json": "0.3.11",
|
|
22
|
+
"@spyglassmc/locales": "0.3.8",
|
|
23
|
+
"@spyglassmc/mcfunction": "0.2.11",
|
|
24
|
+
"@spyglassmc/mcdoc": "0.3.12",
|
|
25
|
+
"@spyglassmc/nbt": "0.3.12"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"fast-glob": "^3.2.5"
|