@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.
@@ -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([{ predicate: (src) => src.peek() === '@', parser: selector() }, {
887
- parser: scoreHolderFakeName(usageType),
888
- }]), (res, _src, ctx) => {
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 = core.map(core.record({
1050
- start: '[',
1051
- pair: {
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: res.range,
1063
- children: res.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.18",
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.14",
21
- "@spyglassmc/json": "0.3.16",
22
- "@spyglassmc/locales": "0.3.8",
23
- "@spyglassmc/mcfunction": "0.2.16",
24
- "@spyglassmc/mcdoc": "0.3.17",
25
- "@spyglassmc/nbt": "0.3.17"
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"