@spyglassmc/java-edition 0.3.18 → 0.3.20
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/binder/index.d.ts +2 -1
- package/lib/binder/index.js +63 -26
- package/lib/dependency/common.d.ts +10 -0
- package/lib/dependency/common.js +7 -0
- package/lib/dependency/index.d.ts +8 -0
- package/lib/dependency/index.js +23 -2
- package/lib/dependency/mcmeta.d.ts +4 -2
- package/lib/dependency/mcmeta.js +89 -19
- package/lib/index.d.ts +1 -0
- package/lib/index.js +51 -80
- package/lib/mcdocAttributes.d.ts +6 -0
- package/lib/mcdocAttributes.js +89 -0
- package/lib/mcfunction/checker/index.js +12 -15
- package/lib/mcfunction/completer/argument.js +27 -14
- package/lib/mcfunction/mcdocAttributes.js +1 -1
- package/lib/mcfunction/node/argument.d.ts +23 -4
- package/lib/mcfunction/node/argument.js +16 -0
- package/lib/mcfunction/parser/argument.js +92 -22
- package/lib/mcfunction/tree/argument.d.ts +8 -0
- package/lib/mcfunction/tree/patch.js +39 -4
- package/package.json +7 -7
|
@@ -97,7 +97,7 @@ export const argument = (rawTreeNode, prevNodes) => {
|
|
|
97
97
|
case 'minecraft:entity_summon':
|
|
98
98
|
return wrap(core.resourceLocation({ category: 'entity_type' }));
|
|
99
99
|
case 'minecraft:float_range':
|
|
100
|
-
return wrap(range('float'));
|
|
100
|
+
return wrap(range('float', treeNode.properties?.min, treeNode.properties?.max, treeNode.properties?.minSpan, treeNode.properties?.maxSpan));
|
|
101
101
|
case 'minecraft:function':
|
|
102
102
|
return wrap(core.resourceLocation({ category: 'function', allowTag: true }));
|
|
103
103
|
case 'minecraft:gamemode':
|
|
@@ -107,7 +107,7 @@ export const argument = (rawTreeNode, prevNodes) => {
|
|
|
107
107
|
case 'minecraft:heightmap':
|
|
108
108
|
return wrap(core.literal(...HeightmapValues));
|
|
109
109
|
case 'minecraft:int_range':
|
|
110
|
-
return wrap(range('integer'));
|
|
110
|
+
return wrap(range('integer', treeNode.properties?.min, treeNode.properties?.max, treeNode.properties?.minSpan, treeNode.properties?.maxSpan));
|
|
111
111
|
case 'minecraft:item_enchantment':
|
|
112
112
|
return wrap(core.resourceLocation({ category: 'enchantment' }));
|
|
113
113
|
case 'minecraft:item_predicate':
|
|
@@ -453,7 +453,7 @@ export const particle = (src, ctx) => {
|
|
|
453
453
|
return ans;
|
|
454
454
|
})(src, ctx);
|
|
455
455
|
};
|
|
456
|
-
function range(type, min, max, cycleable) {
|
|
456
|
+
function range(type, min, max, minSpan, maxSpan, cycleable) {
|
|
457
457
|
const number = type === 'float'
|
|
458
458
|
? float(min, max)
|
|
459
459
|
: integer(min, max);
|
|
@@ -488,6 +488,17 @@ function range(type, min, max, cycleable) {
|
|
|
488
488
|
&& ans.value[0] > ans.value[1]) {
|
|
489
489
|
ctx.err.report(localize('mcfunction.parser.range.min>max', ans.value[0], ans.value[1]), res);
|
|
490
490
|
}
|
|
491
|
+
else if (minSpan !== undefined || maxSpan !== undefined) {
|
|
492
|
+
const span = ans.value[0] !== undefined && ans.value[1] !== undefined
|
|
493
|
+
? Math.abs(ans.value[0] - ans.value[1])
|
|
494
|
+
: (ans.value[0] ?? ans.value[1] ?? Infinity);
|
|
495
|
+
if (minSpan !== undefined && span < minSpan) {
|
|
496
|
+
ctx.err.report(localize('mcfunction.parser.range.span-too-small', span, minSpan), res);
|
|
497
|
+
}
|
|
498
|
+
else if (maxSpan !== undefined && span > maxSpan) {
|
|
499
|
+
ctx.err.report(localize('mcfunction.parser.range.span-too-large', span, maxSpan), res);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
491
502
|
return ans;
|
|
492
503
|
});
|
|
493
504
|
}
|
|
@@ -798,7 +809,7 @@ export function selector(ignoreInvalidPrefix = false) {
|
|
|
798
809
|
});
|
|
799
810
|
case 'x_rotation':
|
|
800
811
|
case 'y_rotation':
|
|
801
|
-
return core.map(range('float', undefined, undefined, true), (res, _, ctx) => {
|
|
812
|
+
return core.map(range('float', undefined, undefined, undefined, undefined, true), (res, _, ctx) => {
|
|
802
813
|
if (hasKey(key.value)) {
|
|
803
814
|
ctx.err.report(localize('duplicate-key', localeQuote(key.value)), key);
|
|
804
815
|
}
|
|
@@ -883,9 +894,12 @@ export function scoreHolderFakeName(usageType) {
|
|
|
883
894
|
return validateLength(symbol({ category: 'score_holder', usageType }), FakeNameMaxLength, 'mcfunction.parser.score_holder.fake-name.too-long');
|
|
884
895
|
}
|
|
885
896
|
export function scoreHolder(usageType, amount) {
|
|
886
|
-
return core.map(core.select([
|
|
887
|
-
|
|
888
|
-
|
|
897
|
+
return core.map(core.select([
|
|
898
|
+
// Technically score holders can start with *, but this doesn't account for it
|
|
899
|
+
{ prefix: '*', parser: core.literal('*') },
|
|
900
|
+
{ prefix: '@', parser: selector() },
|
|
901
|
+
{ parser: scoreHolderFakeName(usageType) },
|
|
902
|
+
]), (res, _src, ctx) => {
|
|
889
903
|
const ans = {
|
|
890
904
|
type: 'mcfunction:score_holder',
|
|
891
905
|
range: res.range,
|
|
@@ -894,9 +908,12 @@ export function scoreHolder(usageType, amount) {
|
|
|
894
908
|
if (core.SymbolNode.is(res)) {
|
|
895
909
|
ans.fakeName = res;
|
|
896
910
|
}
|
|
897
|
-
else {
|
|
911
|
+
else if (EntitySelectorNode.is(res)) {
|
|
898
912
|
ans.selector = res;
|
|
899
913
|
}
|
|
914
|
+
else {
|
|
915
|
+
ans.wildcard = res;
|
|
916
|
+
}
|
|
900
917
|
if (amount === 'single' && ans.selector && !ans.selector.single) {
|
|
901
918
|
ctx.err.report(localize('mcfunction.parser.entity-selector.multiple-disallowed'), ans);
|
|
902
919
|
}
|
|
@@ -1046,24 +1063,75 @@ function vector(options) {
|
|
|
1046
1063
|
return ans;
|
|
1047
1064
|
};
|
|
1048
1065
|
}
|
|
1049
|
-
const components =
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
key: core.resourceLocation({ category: 'data_component_type' }),
|
|
1053
|
-
sep: '=',
|
|
1054
|
-
value: nbt.parser.entry,
|
|
1055
|
-
end: ',',
|
|
1056
|
-
trailingEnd: true,
|
|
1057
|
-
},
|
|
1058
|
-
end: ']',
|
|
1059
|
-
}), (res) => {
|
|
1066
|
+
const components = (src, ctx) => {
|
|
1067
|
+
const release = ctx.project['loadedVersion'];
|
|
1068
|
+
const allowComponentRemoval = !release || ReleaseVersion.cmp(release, '1.21') >= 0;
|
|
1060
1069
|
const ans = {
|
|
1061
1070
|
type: 'mcfunction:component_list',
|
|
1062
|
-
range:
|
|
1063
|
-
children:
|
|
1071
|
+
range: core.Range.create(src),
|
|
1072
|
+
children: [],
|
|
1064
1073
|
};
|
|
1074
|
+
if (!src.trySkip('[')) {
|
|
1075
|
+
return core.Failure;
|
|
1076
|
+
}
|
|
1077
|
+
src.skipWhitespace();
|
|
1078
|
+
while (src.canRead() && src.peek() !== ']') {
|
|
1079
|
+
const start = src.cursor;
|
|
1080
|
+
if (allowComponentRemoval && src.tryPeek('!')) {
|
|
1081
|
+
const prefix = core.literal('!')(src, ctx);
|
|
1082
|
+
src.skipWhitespace();
|
|
1083
|
+
const key = core.resourceLocation({ category: 'data_component_type' })(src, ctx);
|
|
1084
|
+
ans.children.push({
|
|
1085
|
+
type: 'mcfunction:component_removal',
|
|
1086
|
+
range: core.Range.create(start, src),
|
|
1087
|
+
children: [prefix, key],
|
|
1088
|
+
prefix,
|
|
1089
|
+
key,
|
|
1090
|
+
});
|
|
1091
|
+
src.skipWhitespace();
|
|
1092
|
+
}
|
|
1093
|
+
else {
|
|
1094
|
+
const key = core.resourceLocation({ category: 'data_component_type' })(src, ctx);
|
|
1095
|
+
src.skipWhitespace();
|
|
1096
|
+
core.literal('=')(src, ctx);
|
|
1097
|
+
src.skipWhitespace();
|
|
1098
|
+
const value = nbt.parser.entry(src, ctx);
|
|
1099
|
+
if (value === core.Failure) {
|
|
1100
|
+
ctx.err.report(localize('expected', localize('parser.record.value')), core.Range.create(src, () => src.skipUntilOrEnd(',', ']', '\r', '\n')));
|
|
1101
|
+
ans.children.push({
|
|
1102
|
+
type: 'mcfunction:component',
|
|
1103
|
+
range: core.Range.create(start, src),
|
|
1104
|
+
children: [key],
|
|
1105
|
+
key,
|
|
1106
|
+
value: undefined,
|
|
1107
|
+
});
|
|
1108
|
+
}
|
|
1109
|
+
else {
|
|
1110
|
+
ans.children.push({
|
|
1111
|
+
type: 'mcfunction:component',
|
|
1112
|
+
range: core.Range.create(start, src),
|
|
1113
|
+
children: [key, value],
|
|
1114
|
+
key,
|
|
1115
|
+
value,
|
|
1116
|
+
});
|
|
1117
|
+
}
|
|
1118
|
+
src.skipWhitespace();
|
|
1119
|
+
}
|
|
1120
|
+
if (src.trySkip(',')) {
|
|
1121
|
+
src.skipWhitespace();
|
|
1122
|
+
if (src.peek() === ']') {
|
|
1123
|
+
break;
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
else {
|
|
1127
|
+
break;
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
src.skipWhitespace();
|
|
1131
|
+
core.literal(']')(src, ctx);
|
|
1132
|
+
ans.range.end = src.cursor;
|
|
1065
1133
|
return ans;
|
|
1066
|
-
}
|
|
1134
|
+
};
|
|
1067
1135
|
const componentTest = (src, ctx) => {
|
|
1068
1136
|
const start = src.cursor;
|
|
1069
1137
|
src.skipWhitespace();
|
|
@@ -1076,6 +1144,7 @@ const componentTest = (src, ctx) => {
|
|
|
1076
1144
|
key.options.pool = ['minecraft:count'];
|
|
1077
1145
|
}
|
|
1078
1146
|
if (src.trySkip('=')) {
|
|
1147
|
+
src.skipWhitespace();
|
|
1079
1148
|
const ans = {
|
|
1080
1149
|
type: 'mcfunction:component_test_exact',
|
|
1081
1150
|
range: core.Range.create(start, src),
|
|
@@ -1097,6 +1166,7 @@ const componentTest = (src, ctx) => {
|
|
|
1097
1166
|
return ans;
|
|
1098
1167
|
}
|
|
1099
1168
|
if (src.trySkip('~')) {
|
|
1169
|
+
src.skipWhitespace();
|
|
1100
1170
|
if (key.options.category !== undefined) {
|
|
1101
1171
|
key.options.category = 'item_sub_predicate_type';
|
|
1102
1172
|
}
|
|
@@ -74,8 +74,15 @@ export interface MinecraftEntityAnchorArgumentTreeNode extends mcf.ArgumentTreeN
|
|
|
74
74
|
export interface MinecraftEntitySummonArgumentTreeNode extends mcf.ArgumentTreeNode {
|
|
75
75
|
parser: 'minecraft:entity_summon';
|
|
76
76
|
}
|
|
77
|
+
export interface RangeProperties extends Record<string, unknown> {
|
|
78
|
+
min: number;
|
|
79
|
+
max: number;
|
|
80
|
+
minSpan: number;
|
|
81
|
+
maxSpan: number;
|
|
82
|
+
}
|
|
77
83
|
export interface MinecraftFloatRangeArgumentTreeNode extends mcf.ArgumentTreeNode {
|
|
78
84
|
parser: 'minecraft:float_range';
|
|
85
|
+
properties?: RangeProperties;
|
|
79
86
|
}
|
|
80
87
|
export interface MinecraftFunctionArgumentTreeNode extends mcf.ArgumentTreeNode {
|
|
81
88
|
parser: 'minecraft:function';
|
|
@@ -91,6 +98,7 @@ export interface MinecraftHeightmapArgumentTreeNode extends mcf.ArgumentTreeNode
|
|
|
91
98
|
}
|
|
92
99
|
export interface MinecraftIntRangeArgumentTreeNode extends mcf.ArgumentTreeNode {
|
|
93
100
|
parser: 'minecraft:int_range';
|
|
101
|
+
properties?: RangeProperties;
|
|
94
102
|
}
|
|
95
103
|
export interface MinecraftItemEnchantmentArgumentTreeNode extends mcf.ArgumentTreeNode {
|
|
96
104
|
parser: 'minecraft:item_enchantment';
|
|
@@ -23,16 +23,25 @@ export function getPatch(release) {
|
|
|
23
23
|
children: {
|
|
24
24
|
add: {
|
|
25
25
|
children: {
|
|
26
|
+
id: {
|
|
27
|
+
properties: {
|
|
28
|
+
category: 'attribute_modifier',
|
|
29
|
+
},
|
|
30
|
+
},
|
|
26
31
|
uuid: {
|
|
27
32
|
properties: {
|
|
28
33
|
category: 'attribute_modifier_uuid',
|
|
29
|
-
usageType: 'definition',
|
|
30
34
|
},
|
|
31
35
|
},
|
|
32
36
|
},
|
|
33
37
|
},
|
|
34
38
|
remove: {
|
|
35
39
|
children: {
|
|
40
|
+
id: {
|
|
41
|
+
properties: {
|
|
42
|
+
category: 'attribute_modifier',
|
|
43
|
+
},
|
|
44
|
+
},
|
|
36
45
|
uuid: {
|
|
37
46
|
properties: {
|
|
38
47
|
category: 'attribute_modifier_uuid',
|
|
@@ -44,6 +53,11 @@ export function getPatch(release) {
|
|
|
44
53
|
children: {
|
|
45
54
|
get: {
|
|
46
55
|
children: {
|
|
56
|
+
id: {
|
|
57
|
+
properties: {
|
|
58
|
+
category: 'attribute_modifier',
|
|
59
|
+
},
|
|
60
|
+
},
|
|
47
61
|
uuid: {
|
|
48
62
|
properties: {
|
|
49
63
|
category: 'attribute_modifier_uuid',
|
|
@@ -501,6 +515,10 @@ export function getPatch(release) {
|
|
|
501
515
|
roll: {
|
|
502
516
|
children: {
|
|
503
517
|
range: {
|
|
518
|
+
properties: {
|
|
519
|
+
minSpan: 1,
|
|
520
|
+
maxSpan: 2147483646,
|
|
521
|
+
},
|
|
504
522
|
children: {
|
|
505
523
|
sequence: {
|
|
506
524
|
properties: {
|
|
@@ -515,6 +533,10 @@ export function getPatch(release) {
|
|
|
515
533
|
value: {
|
|
516
534
|
children: {
|
|
517
535
|
range: {
|
|
536
|
+
properties: {
|
|
537
|
+
minSpan: 1,
|
|
538
|
+
maxSpan: 2147483646,
|
|
539
|
+
},
|
|
518
540
|
children: {
|
|
519
541
|
sequence: {
|
|
520
542
|
properties: {
|
|
@@ -635,9 +657,6 @@ export function getPatch(release) {
|
|
|
635
657
|
children: {
|
|
636
658
|
name: {
|
|
637
659
|
parser: 'spyglassmc:tag',
|
|
638
|
-
properties: {
|
|
639
|
-
usageType: 'definition',
|
|
640
|
-
},
|
|
641
660
|
},
|
|
642
661
|
},
|
|
643
662
|
},
|
|
@@ -937,6 +956,22 @@ const ExecuteStoreTarget = Object.freeze({
|
|
|
937
956
|
},
|
|
938
957
|
},
|
|
939
958
|
},
|
|
959
|
+
score: {
|
|
960
|
+
children: {
|
|
961
|
+
targets: {
|
|
962
|
+
properties: {
|
|
963
|
+
usageType: 'definition',
|
|
964
|
+
},
|
|
965
|
+
children: {
|
|
966
|
+
objective: {
|
|
967
|
+
properties: {
|
|
968
|
+
accessType: 1 /* SymbolAccessType.Write */,
|
|
969
|
+
},
|
|
970
|
+
},
|
|
971
|
+
},
|
|
972
|
+
},
|
|
973
|
+
},
|
|
974
|
+
},
|
|
940
975
|
},
|
|
941
976
|
});
|
|
942
977
|
const LootSource = Object.freeze({
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spyglassmc/java-edition",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.20",
|
|
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.16",
|
|
21
|
+
"@spyglassmc/json": "0.3.18",
|
|
22
|
+
"@spyglassmc/locales": "0.3.10",
|
|
23
|
+
"@spyglassmc/mcfunction": "0.2.18",
|
|
24
|
+
"@spyglassmc/mcdoc": "0.3.19",
|
|
25
|
+
"@spyglassmc/nbt": "0.3.19"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"fast-glob": "^3.2.5"
|