@spyglassmc/java-edition 0.3.3 → 0.3.4

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.
Files changed (57) hide show
  1. package/lib/binder/index.d.ts +1 -1
  2. package/lib/binder/index.js +1 -1
  3. package/lib/dependency/common.d.ts +0 -4
  4. package/lib/dependency/common.js +0 -15
  5. package/lib/dependency/index.d.ts +8 -0
  6. package/lib/dependency/index.js +23 -1
  7. package/lib/dependency/mcmeta.d.ts +1 -1
  8. package/lib/dependency/mcmeta.js +45 -15
  9. package/lib/index.js +2 -0
  10. package/lib/mcfunction/checker/index.js +1 -2
  11. package/lib/mcfunction/common/index.d.ts +4 -0
  12. package/lib/mcfunction/common/index.js +25 -0
  13. package/lib/mcfunction/completer/argument.js +10 -1
  14. package/lib/mcfunction/inlayHintProvider.js +2 -1
  15. package/lib/mcfunction/node/argument.d.ts +2 -2
  16. package/lib/mcfunction/parser/argument.js +19 -10
  17. package/lib/mcfunction/tree/argument.d.ts +19 -1
  18. package/lib/mcfunction/tree/patch.js +39 -1
  19. package/package.json +7 -7
  20. package/lib/json/checker/data/advancement.d.ts +0 -14
  21. package/lib/json/checker/data/advancement.js +0 -458
  22. package/lib/json/checker/data/biome.d.ts +0 -4
  23. package/lib/json/checker/data/biome.js +0 -148
  24. package/lib/json/checker/data/common.d.ts +0 -22
  25. package/lib/json/checker/data/common.js +0 -278
  26. package/lib/json/checker/data/dimension.d.ts +0 -4
  27. package/lib/json/checker/data/dimension.js +0 -224
  28. package/lib/json/checker/data/feature.d.ts +0 -9
  29. package/lib/json/checker/data/feature.js +0 -748
  30. package/lib/json/checker/data/index.d.ts +0 -4
  31. package/lib/json/checker/data/index.js +0 -40
  32. package/lib/json/checker/data/loot_table.d.ts +0 -8
  33. package/lib/json/checker/data/loot_table.js +0 -295
  34. package/lib/json/checker/data/recipe.d.ts +0 -2
  35. package/lib/json/checker/data/recipe.js +0 -50
  36. package/lib/json/checker/data/structure.d.ts +0 -8
  37. package/lib/json/checker/data/structure.js +0 -155
  38. package/lib/json/checker/data/tag.d.ts +0 -7
  39. package/lib/json/checker/data/tag.js +0 -35
  40. package/lib/json/checker/data/text_component.d.ts +0 -2
  41. package/lib/json/checker/data/text_component.js +0 -155
  42. package/lib/json/checker/util/advancement.d.ts +0 -3
  43. package/lib/json/checker/util/advancement.js +0 -17
  44. package/lib/json/checker/util/block_states.d.ts +0 -13
  45. package/lib/json/checker/util/block_states.js +0 -63
  46. package/lib/json/checker/util/color.d.ts +0 -4
  47. package/lib/json/checker/util/color.js +0 -65
  48. package/lib/json/checker/util/index.d.ts +0 -8
  49. package/lib/json/checker/util/index.js +0 -8
  50. package/lib/json/checker/util/nbt.d.ts +0 -16
  51. package/lib/json/checker/util/nbt.js +0 -68
  52. package/lib/json/checker/util/recipe.d.ts +0 -6
  53. package/lib/json/checker/util/recipe.js +0 -13
  54. package/lib/json/checker/util/uuid.d.ts +0 -2
  55. package/lib/json/checker/util/uuid.js +0 -9
  56. package/lib/json/checker/util/version.d.ts +0 -46
  57. package/lib/json/checker/util/version.js +0 -48
@@ -7,7 +7,7 @@ export declare const Categories: Map<string, {
7
7
  }>;
8
8
  export declare function getRels(uri: string, rootUris: readonly RootUriString[]): Generator<string, undefined, unknown>;
9
9
  export declare function dissectUri(uri: string, ctx: ContextBase): {
10
- category: "function" | "advancement" | "dimension" | "dimension_type" | "item_modifier" | "loot_table" | "predicate" | "recipe" | "structure" | "worldgen/biome" | "worldgen/configured_carver" | "worldgen/configured_feature" | "worldgen/configured_structure_feature" | "worldgen/configured_surface_builder" | "worldgen/density_function" | "worldgen/noise" | "worldgen/noise_settings" | "worldgen/placed_feature" | "worldgen/processor_list" | "worldgen/template_pool" | "tag/function" | "tag/activity" | "tag/attribute" | "tag/block" | "tag/block_entity_type" | "tag/block_predicate_type" | "tag/chunk_status" | "tag/custom_stat" | "tag/enchantment" | "tag/entity_type" | "tag/float_provider_type" | "tag/fluid" | "tag/game_event" | "tag/height_provider_type" | "tag/int_provider_type" | "tag/item" | "tag/loot_condition_type" | "tag/loot_function_type" | "tag/loot_nbt_provider_type" | "tag/loot_number_provider_type" | "tag/loot_pool_entry_type" | "tag/loot_score_provider_type" | "tag/memory_module_type" | "tag/menu" | "tag/mob_effect" | "tag/motive" | "tag/particle_type" | "tag/point_of_interest_type" | "tag/pos_rule_test" | "tag/position_source_type" | "tag/potion" | "tag/recipe_serializer" | "tag/recipe_type" | "tag/rule_test" | "tag/schedule" | "tag/sensor_type" | "tag/sound_event" | "tag/stat_type" | "tag/villager_profession" | "tag/villager_type" | "tag/worldgen/biome_source" | "tag/worldgen/block_placer_type" | "tag/worldgen/block_state_provider_type" | "tag/worldgen/carver" | "tag/worldgen/chunk_generator" | "tag/worldgen/decorator" | "tag/worldgen/feature" | "tag/worldgen/feature_size_type" | "tag/worldgen/foliage_placer_type" | "tag/worldgen/material_condition" | "tag/worldgen/material_rule" | "tag/worldgen/placement_modifier_type" | "tag/worldgen/structure_feature" | "tag/worldgen/structure_piece" | "tag/worldgen/structure_pool_element" | "tag/worldgen/structure_processor" | "tag/worldgen/surface_builder" | "tag/worldgen/tree_decorator_type" | "tag/worldgen/trunk_placer_type" | "tag/worldgen/biome" | "tag/worldgen/configured_carver" | "tag/worldgen/configured_feature" | "tag/worldgen/configured_structure_feature" | "tag/worldgen/configured_surface_builder" | "tag/worldgen/density_function" | "tag/worldgen/noise" | "tag/worldgen/noise_settings" | "tag/worldgen/placed_feature" | "tag/worldgen/processor_list" | "tag/worldgen/template_pool";
10
+ category: "function" | "advancement" | "chat_type" | "damage_type" | "dimension" | "dimension_type" | "item_modifier" | "loot_table" | "predicate" | "recipe" | "structure" | "trim_material" | "trim_pattern" | "tag/function" | "tag/activity" | "tag/attribute" | "tag/block" | "tag/block_entity_type" | "tag/block_predicate_type" | "tag/chunk_status" | "tag/custom_stat" | "tag/enchantment" | "tag/entity_type" | "tag/float_provider_type" | "tag/fluid" | "tag/game_event" | "tag/height_provider_type" | "tag/int_provider_type" | "tag/item" | "tag/loot_condition_type" | "tag/loot_function_type" | "tag/loot_nbt_provider_type" | "tag/loot_number_provider_type" | "tag/loot_pool_entry_type" | "tag/loot_score_provider_type" | "tag/memory_module_type" | "tag/menu" | "tag/mob_effect" | "tag/motive" | "tag/particle_type" | "tag/point_of_interest_type" | "tag/pos_rule_test" | "tag/position_source_type" | "tag/potion" | "tag/recipe_serializer" | "tag/recipe_type" | "tag/rule_test" | "tag/schedule" | "tag/sensor_type" | "tag/sound_event" | "tag/stat_type" | "tag/villager_profession" | "tag/villager_type" | "tag/worldgen/biome_source" | "tag/worldgen/block_placer_type" | "tag/worldgen/block_state_provider_type" | "tag/worldgen/carver" | "tag/worldgen/chunk_generator" | "tag/worldgen/decorator" | "tag/worldgen/feature" | "tag/worldgen/feature_size_type" | "tag/worldgen/foliage_placer_type" | "tag/worldgen/material_condition" | "tag/worldgen/material_rule" | "tag/worldgen/placement_modifier_type" | "tag/worldgen/structure_feature" | "tag/worldgen/structure_piece" | "tag/worldgen/structure_pool_element" | "tag/worldgen/structure_processor" | "tag/worldgen/surface_builder" | "tag/worldgen/tree_decorator_type" | "tag/worldgen/trunk_placer_type" | "tag/worldgen/biome" | "tag/worldgen/configured_carver" | "tag/worldgen/configured_feature" | "tag/worldgen/configured_structure_feature" | "tag/worldgen/configured_surface_builder" | "tag/worldgen/density_function" | "tag/worldgen/noise" | "tag/worldgen/noise_settings" | "tag/worldgen/placed_feature" | "tag/worldgen/processor_list" | "tag/worldgen/template_pool" | "worldgen/biome" | "worldgen/configured_carver" | "worldgen/configured_feature" | "worldgen/configured_structure_feature" | "worldgen/configured_surface_builder" | "worldgen/density_function" | "worldgen/noise" | "worldgen/noise_settings" | "worldgen/placed_feature" | "worldgen/processor_list" | "worldgen/template_pool";
11
11
  namespace: string;
12
12
  identifier: string;
13
13
  } | undefined;
@@ -6,7 +6,7 @@ export const Categories = (() => {
6
6
  'fluid',
7
7
  'function',
8
8
  'game_event',
9
- 'item',
9
+ 'item', // They have the legacy `tags/${plural}` path.
10
10
  'worldgen/block_placer_type',
11
11
  'worldgen/surface_builder', // They are removed at some point.
12
12
  ]);
@@ -14,10 +14,6 @@ export interface VersionInfo {
14
14
  name: string;
15
15
  isLatest: boolean;
16
16
  }
17
- /**
18
- * A map from `pack_format` numbers to a RegExp. The latest version whose `release_target` matches the RegExp should be used.
19
- */
20
- export declare const PackVersionMap: Record<number, RegExp | undefined>;
21
17
  export interface PackMcmeta {
22
18
  pack: {
23
19
  pack_format: number;
@@ -11,18 +11,6 @@ export var ReleaseVersion;
11
11
  }
12
12
  ReleaseVersion.cmp = cmp;
13
13
  })(ReleaseVersion || (ReleaseVersion = {}));
14
- // DOCS: Update here when format_version is changed.
15
- /**
16
- * A map from `pack_format` numbers to a RegExp. The latest version whose `release_target` matches the RegExp should be used.
17
- */
18
- export const PackVersionMap = {
19
- 5: /^1\.15.*$/,
20
- 6: /^1\.16.*$/,
21
- 7: /^1\.17.*$/,
22
- 8: /^1\.18(\.1)?$/,
23
- 9: /^1\.18.*$/,
24
- 10: /^1\.19.*$/,
25
- };
26
14
  export var PackMcmeta;
27
15
  (function (PackMcmeta) {
28
16
  function assert(data) {
@@ -30,9 +18,6 @@ export var PackMcmeta;
30
18
  if (!format) {
31
19
  throw new Error('“pack.pack_format” undefined');
32
20
  }
33
- if (!Object.keys(PackVersionMap).includes(format)) {
34
- throw new Error(`Unknown pack_format “${format}”`);
35
- }
36
21
  }
37
22
  PackMcmeta.assert = assert;
38
23
  })(PackMcmeta || (PackMcmeta = {}));
@@ -17,6 +17,14 @@ interface GetMcmetaSummaryResult extends Partial<McmetaSummary> {
17
17
  * @throws Network/file system errors.
18
18
  */
19
19
  export declare function getMcmetaSummary(externals: core.Externals, downloader: core.Downloader, logger: core.Logger, version: string, isLatest: boolean, source: string, overridePaths?: core.EnvConfig['mcmetaSummaryOverrides']): Promise<GetMcmetaSummaryResult>;
20
+ /**
21
+ * @throws Network/file system errors.
22
+ *
23
+ * @returns
24
+ * - `startDepth`: The amount of level to skip when unzipping the tarball.
25
+ * - `uri`: URI to the `.tar.gz` file.
26
+ */
27
+ export declare function getVanillaDatapack(downloader: core.Downloader, version: string, isLatest: boolean): Promise<core.Dependency>;
20
28
  /**
21
29
  * @throws Network/file system errors.
22
30
  *
@@ -2,7 +2,7 @@ export * from './common.js';
2
2
  export * from './mcmeta.js';
3
3
  import * as core from '@spyglassmc/core';
4
4
  import { Fluids, getMcmetaSummaryUris } from './mcmeta.js';
5
- const DownloaderTtl = 15000;
5
+ const DownloaderTtl = 15_000;
6
6
  /* istanbul ignore next */
7
7
  /**
8
8
  * Return the deserialized [`versions.json`][versions.json].
@@ -125,6 +125,28 @@ async function downloadGitHubRepo({ defaultBranch, downloader, getTag, repo, isL
125
125
  return out.cacheUri;
126
126
  }
127
127
  /* istanbul ignore next */
128
+ /**
129
+ * @throws Network/file system errors.
130
+ *
131
+ * @returns
132
+ * - `startDepth`: The amount of level to skip when unzipping the tarball.
133
+ * - `uri`: URI to the `.tar.gz` file.
134
+ */
135
+ export async function getVanillaDatapack(downloader, version, isLatest) {
136
+ const uri = await downloadGitHubRepo({
137
+ defaultBranch: 'data',
138
+ downloader,
139
+ getTag: (v) => `${v}-data`,
140
+ owner: 'misode',
141
+ repo: 'mcmeta',
142
+ isLatest,
143
+ version,
144
+ });
145
+ return {
146
+ info: { startDepth: 1 },
147
+ uri,
148
+ };
149
+ }
128
150
  /**
129
151
  * @throws Network/file system errors.
130
152
  *
@@ -17,7 +17,7 @@ export declare const Fluids: McmetaStates;
17
17
  export interface McmetaVersion {
18
18
  id: string;
19
19
  name: string;
20
- release_target: string;
20
+ release_target: string | undefined;
21
21
  type: 'release' | 'snapshot';
22
22
  stable: boolean;
23
23
  data_version: number;
@@ -1,19 +1,31 @@
1
1
  import * as core from '@spyglassmc/core';
2
- import { PackVersionMap } from './common.js';
3
2
  /**
4
3
  * @param inputVersion {@link core.Config.env.gameVersion}
5
4
  */
6
5
  export function resolveConfiguredVersion(inputVersion, { packMcmeta, versions, }) {
7
- function toVersionInfo(index) {
8
- if (index < 0) {
9
- index = 0;
6
+ function findReleaseTarget(version) {
7
+ if (version.release_target) {
8
+ return version.release_target;
10
9
  }
11
- const version = versions[index];
10
+ if (version.type === 'release') {
11
+ return version.id;
12
+ }
13
+ const index = versions.findIndex((v) => v.id === version.id);
14
+ for (let i = index; i >= 0; i -= 1) {
15
+ if (versions[i].type === 'release') {
16
+ return versions[i].id;
17
+ }
18
+ }
19
+ // DOCS: Update this when a new snapshot cycle begins
20
+ return '1.21';
21
+ }
22
+ function toVersionInfo(version) {
23
+ version = version ?? versions[0];
12
24
  return {
13
25
  id: version.id,
14
26
  name: version.name,
15
- release: (version.release_target ?? '1.99'),
16
- isLatest: index === 0,
27
+ release: findReleaseTarget(version),
28
+ isLatest: version === versions[0],
17
29
  };
18
30
  }
19
31
  if (versions.length === 0) {
@@ -21,22 +33,40 @@ export function resolveConfiguredVersion(inputVersion, { packMcmeta, versions, }
21
33
  }
22
34
  inputVersion = inputVersion.toLowerCase();
23
35
  versions = versions.sort((a, b) => b.data_version - a.data_version);
36
+ const latestRelease = versions.find((v) => v.type === 'release');
24
37
  if (inputVersion === 'auto') {
25
- if (packMcmeta) {
26
- const regex = PackVersionMap[packMcmeta.pack.pack_format];
27
- if (regex) {
28
- return toVersionInfo(versions.findIndex((v) => regex.test(v.release_target)));
38
+ if (packMcmeta && latestRelease) {
39
+ // If the pack format is larger than the latest release, use the latest snapshot
40
+ if (packMcmeta.pack.pack_format > latestRelease.data_pack_version) {
41
+ return toVersionInfo(versions[0]);
42
+ }
43
+ // Look for versions from recent to oldest, picking the most recent release that matches
44
+ let oldestRelease = undefined;
45
+ for (const version of versions) {
46
+ if (version.type === 'release') {
47
+ // If we already passed the pack format, use the oldest release so far
48
+ if (packMcmeta.pack.pack_format > version.data_pack_version) {
49
+ return toVersionInfo(oldestRelease);
50
+ }
51
+ if (packMcmeta.pack.pack_format === version.data_pack_version) {
52
+ return toVersionInfo(version);
53
+ }
54
+ oldestRelease = version;
55
+ }
29
56
  }
57
+ // If the pack format is still lower, use the oldest known release version
58
+ return toVersionInfo(oldestRelease);
30
59
  }
31
- return toVersionInfo(0);
60
+ // Fall back to the latest release if pack mcmeta is not available
61
+ return toVersionInfo(latestRelease);
32
62
  }
33
63
  else if (inputVersion === 'latest release') {
34
- return toVersionInfo(versions.findIndex((v) => v.type === 'release'));
64
+ return toVersionInfo(latestRelease);
35
65
  }
36
66
  else if (inputVersion === 'latest snapshot') {
37
- return toVersionInfo(versions.findIndex((v) => v.type === 'snapshot'));
67
+ return toVersionInfo(versions[0]);
38
68
  }
39
- return toVersionInfo(versions.findIndex((v) => inputVersion === v.id.toLowerCase() ||
69
+ return toVersionInfo(versions.find((v) => inputVersion === v.id.toLowerCase() ||
40
70
  inputVersion === v.name.toLowerCase()));
41
71
  }
42
72
  const DataSources = {
package/lib/index.js CHANGED
@@ -2,6 +2,7 @@ import * as core from '@spyglassmc/core';
2
2
  import * as mcdoc from '@spyglassmc/mcdoc';
3
3
  import * as nbt from '@spyglassmc/nbt';
4
4
  import { uriBinder } from './binder/index.js';
5
+ import { getVanillaDatapack } from './dependency/index.js';
5
6
  import { getMcmetaSummary, getVanillaMcdoc, getVersions, PackMcmeta, resolveConfiguredVersion, symbolRegistrar, } from './dependency/index.js';
6
7
  import * as jeJson from './json/index.js';
7
8
  import * as jeMcf from './mcfunction/index.js';
@@ -37,6 +38,7 @@ export const initialize = async (ctx) => {
37
38
  packMcmeta,
38
39
  versions,
39
40
  });
41
+ meta.registerDependencyProvider('@vanilla-datapack', () => getVanillaDatapack(downloader, version, isLatest));
40
42
  meta.registerDependencyProvider('@vanilla-mcdoc', () => getVanillaMcdoc(downloader));
41
43
  const summary = await getMcmetaSummary(ctx.externals, downloader, logger, version, isLatest, config.env.dataSource, config.env.mcmetaSummaryOverrides);
42
44
  if (!summary.blocks ||
@@ -4,7 +4,6 @@ import { localize } from '@spyglassmc/locales';
4
4
  import * as mcf from '@spyglassmc/mcfunction';
5
5
  import * as nbt from '@spyglassmc/nbt';
6
6
  import { getTagValues } from '../../common/index.js';
7
- import { text_component } from '../../json/checker/data/text_component.js';
8
7
  import { BlockNode, EntityNode, ItemNode, ParticleNode } from '../node/index.js';
9
8
  export const command = (node, ctx) => {
10
9
  if (node.slash && node.parent && mcf.McfunctionNode.is(node.parent)) {
@@ -33,7 +32,7 @@ const rootCommand = (nodes, index, ctx) => {
33
32
  particle(node, ctx);
34
33
  }
35
34
  else if (json.JsonNode.is(node)) {
36
- text_component(node, { ...ctx, context: '' });
35
+ // TODO v4.0: check text component
37
36
  }
38
37
  }
39
38
  if (getName(nodes, index) === 'data') {
@@ -1,7 +1,11 @@
1
1
  export declare const ColorArgumentValues: string[];
2
2
  export declare const EntityAnchorArgumentValues: string[];
3
+ export declare const GamemodeArgumentValues: string[];
3
4
  export declare const ItemSlotArgumentValues: string[];
4
5
  export declare const OperationArgumentValues: string[];
5
6
  export declare const ScoreboardSlotArgumentValues: string[];
6
7
  export declare const SwizzleArgumentValues: string[];
8
+ export declare const HeightmapValues: string[];
9
+ export declare const RotationValues: string[];
10
+ export declare const MirrorValues: string[];
7
11
  //# sourceMappingURL=index.d.ts.map
@@ -1,6 +1,12 @@
1
1
  import * as core from '@spyglassmc/core';
2
2
  export const ColorArgumentValues = [...core.Color.ColorNames, 'reset'];
3
3
  export const EntityAnchorArgumentValues = ['feet', 'eyes'];
4
+ export const GamemodeArgumentValues = [
5
+ 'adventure',
6
+ 'survival',
7
+ 'creative',
8
+ 'spectator',
9
+ ];
4
10
  export const ItemSlotArgumentValues = [
5
11
  ...[...Array(54).keys()].map((n) => `container.${n}`),
6
12
  ...[...Array(27).keys()].map((n) => `enderchest.${n}`),
@@ -53,4 +59,23 @@ export const SwizzleArgumentValues = [
53
59
  'zxy',
54
60
  'zyx',
55
61
  ];
62
+ export const HeightmapValues = [
63
+ 'motion_blocking',
64
+ 'motion_blocking_no_leaves',
65
+ 'ocean_floor',
66
+ 'ocean_floor_wg',
67
+ 'world_surface',
68
+ 'world_surface_wg',
69
+ ];
70
+ export const RotationValues = [
71
+ 'none',
72
+ 'clockwise_90',
73
+ '180',
74
+ 'counterclockwise_90',
75
+ ];
76
+ export const MirrorValues = [
77
+ 'none',
78
+ 'left_right',
79
+ 'front_back',
80
+ ];
56
81
  //# sourceMappingURL=index.js.map
@@ -2,7 +2,7 @@ import { AstNode, BooleanNode, BrigadierStringOptions, completer, CompletionItem
2
2
  import * as json from '@spyglassmc/json';
3
3
  import { localeQuote, localize } from '@spyglassmc/locales';
4
4
  import { getTagValues } from '../../common/index.js';
5
- import { ColorArgumentValues, EntityAnchorArgumentValues, ItemSlotArgumentValues, OperationArgumentValues, ScoreboardSlotArgumentValues, SwizzleArgumentValues, } from '../common/index.js';
5
+ import { ColorArgumentValues, EntityAnchorArgumentValues, GamemodeArgumentValues, HeightmapValues, ItemSlotArgumentValues, MirrorValues, OperationArgumentValues, RotationValues, ScoreboardSlotArgumentValues, SwizzleArgumentValues, } from '../common/index.js';
6
6
  import { BlockNode, CoordinateNode, EntitySelectorNode, IntRangeNode, ItemNode, ObjectiveCriteriaNode, ParticleNode, ScoreHolderNode, VectorNode, } from '../node/index.js';
7
7
  export const getMockNodes = (rawTreeNode, range) => {
8
8
  const treeNode = rawTreeNode;
@@ -45,12 +45,16 @@ export const getMockNodes = (rawTreeNode, range) => {
45
45
  case 'minecraft:entity':
46
46
  case 'minecraft:game_profile':
47
47
  return EntitySelectorNode.mock(range);
48
+ case 'minecraft:heightmap':
49
+ return LiteralNode.mock(range, { pool: HeightmapValues });
48
50
  case 'minecraft:entity_anchor':
49
51
  return LiteralNode.mock(range, { pool: EntityAnchorArgumentValues });
50
52
  case 'minecraft:entity_summon':
51
53
  return ResourceLocationNode.mock(range, { category: 'entity_type' });
52
54
  case 'minecraft:function':
53
55
  return ResourceLocationNode.mock(range, { category: 'function' });
56
+ case 'minecraft:gamemode':
57
+ return LiteralNode.mock(range, { pool: GamemodeArgumentValues });
54
58
  case 'minecraft:int_range':
55
59
  return IntRangeNode.mock(range);
56
60
  case 'minecraft:item_enchantment':
@@ -75,6 +79,7 @@ export const getMockNodes = (rawTreeNode, range) => {
75
79
  case 'minecraft:particle':
76
80
  return ParticleNode.mock(range);
77
81
  case 'minecraft:resource':
82
+ case 'minecraft:resource_key':
78
83
  case 'minecraft:resource_or_tag':
79
84
  return ResourceLocationNode.mock(range, {
80
85
  category: ResourceLocation.shorten(treeNode.properties.registry),
@@ -92,6 +97,10 @@ export const getMockNodes = (rawTreeNode, range) => {
92
97
  return LiteralNode.mock(range, { pool: SwizzleArgumentValues });
93
98
  case 'minecraft:team':
94
99
  return SymbolNode.mock(range, { category: 'team' });
100
+ case 'minecraft:template_mirror':
101
+ return LiteralNode.mock(range, { pool: MirrorValues });
102
+ case 'minecraft:template_rotation':
103
+ return LiteralNode.mock(range, { pool: RotationValues });
95
104
  case 'minecraft:vec2':
96
105
  return VectorNode.mock(range, { dimension: 2, integersOnly: true });
97
106
  case 'minecraft:vec3':
@@ -13,7 +13,8 @@ export const inlayHintProvider = (node, ctx) => {
13
13
  config.enabledNodes.includes(node.children[0].type))) {
14
14
  ans.push({
15
15
  offset: node.range.start,
16
- text: `${node.path[node.path.length - 1]}:`,
16
+ label: `${node.path[node.path.length - 1]}:`,
17
+ paddingRight: true,
17
18
  });
18
19
  }
19
20
  });
@@ -78,9 +78,9 @@ export interface EntitySelectorNode extends core.AstNode {
78
78
  typeLimited?: boolean;
79
79
  }
80
80
  export declare namespace EntitySelectorNode {
81
- function is<T extends core.DeepReadonly<core.AstNode> | undefined>(node: T): node is core.NodeIsHelper<EntitySelectorNode, T>;
81
+ function is<T extends core.DeepReadonly<core.AstNode> | undefined>(node: T): node is core.InheritReadonly<EntitySelectorNode, T>;
82
82
  function mock(range: core.RangeLike): EntitySelectorNode;
83
- const ArgumentKeys: Set<"predicate" | "tag" | "team" | "type" | "level" | "advancements" | "sort" | "nbt" | "name" | "distance" | "gamemode" | "limit" | "scores" | "x" | "y" | "z" | "dx" | "dy" | "dz" | "x_rotation" | "y_rotation">;
83
+ const ArgumentKeys: Set<"predicate" | "tag" | "team" | "type" | "level" | "advancements" | "sort" | "distance" | "gamemode" | "limit" | "name" | "nbt" | "scores" | "x" | "y" | "z" | "dx" | "dy" | "dz" | "x_rotation" | "y_rotation">;
84
84
  type ArgumentKey = typeof ArgumentKeys extends Set<infer T> ? T : undefined;
85
85
  const enum Result {
86
86
  Ok = 0,
@@ -5,7 +5,7 @@ import { localeQuote, localize } from '@spyglassmc/locales';
5
5
  import * as mcf from '@spyglassmc/mcfunction';
6
6
  import * as nbt from '@spyglassmc/nbt';
7
7
  import { ReleaseVersion } from '../../dependency/index.js';
8
- import { ColorArgumentValues, EntityAnchorArgumentValues, ItemSlotArgumentValues, OperationArgumentValues, ScoreboardSlotArgumentValues, SwizzleArgumentValues, } from '../common/index.js';
8
+ import { ColorArgumentValues, EntityAnchorArgumentValues, GamemodeArgumentValues, HeightmapValues, ItemSlotArgumentValues, MirrorValues, OperationArgumentValues, RotationValues, ScoreboardSlotArgumentValues, SwizzleArgumentValues, } from '../common/index.js';
9
9
  import { BlockStatesNode, EntitySelectorArgumentsNode, EntitySelectorAtVariable, EntitySelectorAtVariables, EntitySelectorNode, ObjectiveCriteriaNode, TimeNode, } from '../node/index.js';
10
10
  const IntegerPattern = /^-?\d+$/;
11
11
  /**
@@ -103,8 +103,12 @@ export const argument = (rawTreeNode) => {
103
103
  category: 'function',
104
104
  allowTag: true,
105
105
  }));
106
+ case 'minecraft:gamemode':
107
+ return wrap(core.literal(...GamemodeArgumentValues));
106
108
  case 'minecraft:game_profile':
107
109
  return wrap(entity('multiple', 'players'));
110
+ case 'minecraft:heightmap':
111
+ return wrap(core.literal(...HeightmapValues));
108
112
  case 'minecraft:int_range':
109
113
  return wrap(range('integer'));
110
114
  case 'minecraft:item_enchantment':
@@ -143,6 +147,7 @@ export const argument = (rawTreeNode) => {
143
147
  case 'minecraft:particle':
144
148
  return wrap(particle);
145
149
  case 'minecraft:resource':
150
+ case 'minecraft:resource_key':
146
151
  case 'minecraft:resource_or_tag':
147
152
  return wrap(core.resourceLocation({
148
153
  category: core.ResourceLocation.shorten(treeNode.properties.registry),
@@ -167,6 +172,10 @@ export const argument = (rawTreeNode) => {
167
172
  return wrap(team(core.SymbolUsageType.is(treeNode.properties?.usageType)
168
173
  ? treeNode.properties?.usageType
169
174
  : undefined));
175
+ case 'minecraft:template_mirror':
176
+ return wrap(core.literal(...MirrorValues));
177
+ case 'minecraft:template_rotation':
178
+ return wrap(core.literal(...RotationValues));
170
179
  case 'minecraft:time':
171
180
  return wrap(time);
172
181
  case 'minecraft:uuid':
@@ -217,7 +226,7 @@ function block(isPredicate) {
217
226
  }
218
227
  const blockState = block(false);
219
228
  export const blockPredicate = block(true);
220
- export const component = json.parser.json();
229
+ export const component = json.parser.entry;
221
230
  function double(min = DoubleMin, max = DoubleMax) {
222
231
  return core.float({
223
232
  pattern: FloatPattern,
@@ -561,7 +570,7 @@ function selector() {
561
570
  .BrigadierUnquotableOption,
562
571
  value: {
563
572
  type: 'literal',
564
- parser: core.literal('adventure', 'creative', 'spectator', 'survival'),
573
+ parser: core.literal(...GamemodeArgumentValues),
565
574
  },
566
575
  })), (res, _, ctx) => {
567
576
  playersOnly = true;
@@ -778,15 +787,15 @@ function selector() {
778
787
  // Might not make into the actual release.
779
788
  function getEntitySelectorHover(node) {
780
789
  const grades = new Map([
781
- [0, '🤢'],
782
- [1, '😅'],
783
- [2, 'Good'],
784
- [3, 'Great'],
790
+ [0, '🤢'], // Bad
791
+ [1, '😅'], // Normal
792
+ [2, 'Good'], // Good
793
+ [3, 'Great'], // Great
785
794
  [4, '😌👌'], // Excellent
786
795
  ]);
787
796
  let ans;
788
797
  if (node.currentEntity) {
789
- ans = `**Performance**: ${grades.get(4)}
798
+ ans = `**Performance**: ${grades.get(4)}
790
799
  - \`currentEntity\`: \`${node.currentEntity}\``;
791
800
  }
792
801
  else {
@@ -796,7 +805,7 @@ function getEntitySelectorHover(node) {
796
805
  node.playersOnly,
797
806
  node.typeLimited,
798
807
  ].filter((v) => v).length;
799
- ans = `**Performance**: ${grades.get(amountOfTrue)}
808
+ ans = `**Performance**: ${grades.get(amountOfTrue)}
800
809
  - \`chunkLimited\`: \`${!!node.chunkLimited}\`
801
810
  - \`dimensionLimited\`: \`${!!node.dimensionLimited}\`
802
811
  - \`playersOnly\`: \`${!!node.playersOnly}\`
@@ -806,7 +815,7 @@ function getEntitySelectorHover(node) {
806
815
  ans += `
807
816
 
808
817
  ------
809
- **Predicates**:
818
+ **Predicates**:
810
819
  ${node.predicates.map((p) => `- \`${p}\``).join('\n')}`;
811
820
  }
812
821
  return ans;
@@ -80,9 +80,15 @@ export interface MinecraftFloatRangeArgumentTreeNode extends mcf.ArgumentTreeNod
80
80
  export interface MinecraftFunctionArgumentTreeNode extends mcf.ArgumentTreeNode {
81
81
  parser: 'minecraft:function';
82
82
  }
83
+ export interface MinecraftGamemodeArgumentTreeNode extends mcf.ArgumentTreeNode {
84
+ parser: 'minecraft:gamemode';
85
+ }
83
86
  export interface MinecraftGameProfileArgumentTreeNode extends mcf.ArgumentTreeNode {
84
87
  parser: 'minecraft:game_profile';
85
88
  }
89
+ export interface MinecraftHeightmapArgumentTreeNode extends mcf.ArgumentTreeNode {
90
+ parser: 'minecraft:heightmap';
91
+ }
86
92
  export interface MinecraftIntRangeArgumentTreeNode extends mcf.ArgumentTreeNode {
87
93
  parser: 'minecraft:int_range';
88
94
  }
@@ -131,6 +137,12 @@ export interface MinecraftResourceArgumentTreeNode extends mcf.ArgumentTreeNode
131
137
  registry: string;
132
138
  };
133
139
  }
140
+ export interface MinecraftResourceKeyArgumentTreeNode extends mcf.ArgumentTreeNode {
141
+ parser: 'minecraft:resource_key';
142
+ properties: {
143
+ registry: string;
144
+ };
145
+ }
134
146
  export interface MinecraftResourceLocationArgumentTreeNode extends mcf.ArgumentTreeNode {
135
147
  parser: 'minecraft:resource_location';
136
148
  properties?: core.ResourceLocationOptions;
@@ -159,6 +171,12 @@ export interface MinecraftSwizzleArgumentTreeNode extends mcf.ArgumentTreeNode {
159
171
  export interface MinecraftTeamArgumentTreeNode extends mcf.ArgumentTreeNode {
160
172
  parser: 'minecraft:team';
161
173
  }
174
+ export interface MinecraftTemplateMirrorArgumentTreeNode extends mcf.ArgumentTreeNode {
175
+ parser: 'minecraft:template_mirror';
176
+ }
177
+ export interface MinecraftTemplateRotationArgumentTreeNode extends mcf.ArgumentTreeNode {
178
+ parser: 'minecraft:template_rotation';
179
+ }
162
180
  export interface MinecraftTimeArgumentTreeNode extends mcf.ArgumentTreeNode {
163
181
  parser: 'minecraft:time';
164
182
  }
@@ -175,5 +193,5 @@ export interface MinecraftVec3ArgumentTreeNode extends mcf.ArgumentTreeNode {
175
193
  export interface SpyglassmcTagArgumentTreeNode extends mcf.ArgumentTreeNode {
176
194
  parser: 'spyglassmc:tag';
177
195
  }
178
- export type ArgumentTreeNode = BrigadierBoolArgumentTreeNode | BrigadierDoubleArgumentTreeNode | BrigadierFloatArgumentTreeNode | BrigadierIntegerArgumentTreeNode | BrigadierLongArgumentTreeNode | BrigadierStringArgumentTreeNode | MinecraftAngleArgumentTreeNode | MinecraftBlockPosArgumentTreeNode | MinecraftBlockPredicateArgumentTreeNode | MinecraftBlockStateArgumentTreeNode | MinecraftColorArgumentTreeNode | MinecraftColumnPosArgumentTreeNode | MinecraftComponentArgumentTreeNode | MinecraftDimensionArgumentTreeNode | MinecraftEntityArgumentTreeNode | MinecraftEntityAnchorArgumentTreeNode | MinecraftEntitySummonArgumentTreeNode | MinecraftFloatRangeArgumentTreeNode | MinecraftFunctionArgumentTreeNode | MinecraftGameProfileArgumentTreeNode | MinecraftIntRangeArgumentTreeNode | MinecraftItemEnchantmentArgumentTreeNode | MinecraftItemPredicateArgumentTreeNode | MinecraftItemSlotArgumentTreeNode | MinecraftItemStackArgumentTreeNode | MinecraftMessageArgumentTreeNode | MinecraftMobEffectArgumentTreeNode | MinecraftNbtCompoundTagArgumentTreeNode | MinecraftNbtPathArgumentTreeNode | MinecraftNbtTagArgumentTreeNode | MinecraftObjectiveArgumentTreeNode | MinecraftObjectiveCriteriaArgumentTreeNode | MinecraftOperationArgumentTreeNode | MinecraftParticleArgumentTreeNode | MinecraftResourceArgumentTreeNode | MinecraftResourceLocationArgumentTreeNode | MinecraftResourceOrTagArgumentTreeNode | MinecraftRotationArgumentTreeNode | MinecraftScoreHolderArgumentTreeNode | MinecraftScoreboardSlotArgumentTreeNode | MinecraftSwizzleArgumentTreeNode | MinecraftTeamArgumentTreeNode | MinecraftTimeArgumentTreeNode | MinecraftUuidArgumentTreeNode | MinecraftVec2ArgumentTreeNode | MinecraftVec3ArgumentTreeNode | SpyglassmcTagArgumentTreeNode;
196
+ 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 | MinecraftItemStackArgumentTreeNode | MinecraftMessageArgumentTreeNode | MinecraftMobEffectArgumentTreeNode | MinecraftNbtCompoundTagArgumentTreeNode | MinecraftNbtPathArgumentTreeNode | MinecraftNbtTagArgumentTreeNode | MinecraftObjectiveArgumentTreeNode | MinecraftObjectiveCriteriaArgumentTreeNode | MinecraftOperationArgumentTreeNode | MinecraftParticleArgumentTreeNode | MinecraftResourceArgumentTreeNode | MinecraftResourceKeyArgumentTreeNode | MinecraftResourceLocationArgumentTreeNode | MinecraftResourceOrTagArgumentTreeNode | MinecraftRotationArgumentTreeNode | MinecraftScoreHolderArgumentTreeNode | MinecraftScoreboardSlotArgumentTreeNode | MinecraftSwizzleArgumentTreeNode | MinecraftTeamArgumentTreeNode | MinecraftTemplateMirrorArgumentTreeNode | MinecraftTemplateRotationArgumentTreeNode | MinecraftTimeArgumentTreeNode | MinecraftUuidArgumentTreeNode | MinecraftVec2ArgumentTreeNode | MinecraftVec3ArgumentTreeNode | SpyglassmcTagArgumentTreeNode;
179
197
  //# sourceMappingURL=argument.d.ts.map
@@ -327,6 +327,13 @@ export function getPatch(release) {
327
327
  help: {
328
328
  permission: 0,
329
329
  },
330
+ ...(ReleaseVersion.cmp(release, '1.18') >= 0
331
+ ? {
332
+ jfr: {
333
+ permission: 4,
334
+ },
335
+ }
336
+ : {}),
330
337
  kick: {
331
338
  permission: 3,
332
339
  },
@@ -412,6 +419,30 @@ export function getPatch(release) {
412
419
  'pardon-ip': {
413
420
  permission: 3,
414
421
  },
422
+ ...(ReleaseVersion.cmp(release, '1.17') >= 0
423
+ ? {
424
+ perf: {
425
+ permission: 4,
426
+ },
427
+ }
428
+ : {}),
429
+ ...(ReleaseVersion.cmp(release, '1.19') >= 0
430
+ ? {
431
+ place: {
432
+ children: {
433
+ template: {
434
+ children: {
435
+ template: {
436
+ properties: {
437
+ category: 'structure'
438
+ }
439
+ }
440
+ }
441
+ }
442
+ }
443
+ },
444
+ }
445
+ : {}),
415
446
  playsound: Sound,
416
447
  publish: {
417
448
  permission: 4,
@@ -528,7 +559,7 @@ export function getPatch(release) {
528
559
  * 2. `teleport <location: vec3>`
529
560
  * 3. `teleport <targets: entity(multiple)> <...arguments>`
530
561
  *
531
- * It is impossible for Spyglass to differentiate between (1) and (3) when it encouters a single entity
562
+ * It is impossible for Spyglass to differentiate between (1) and (3) when it encounters a single entity
532
563
  * at the position of the first argument, due to its lack of ability to backtrack.
533
564
  *
534
565
  * Therefore, we have compromised to patch the trees to something like this:
@@ -553,6 +584,13 @@ export function getPatch(release) {
553
584
  tell: {
554
585
  permission: 0,
555
586
  },
587
+ ...(ReleaseVersion.cmp(release, '1.20.2') >= 0
588
+ ? {
589
+ tick: {
590
+ permission: 3,
591
+ },
592
+ }
593
+ : {}),
556
594
  tm: {
557
595
  permission: 0,
558
596
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spyglassmc/java-edition",
3
- "version": "0.3.3",
3
+ "version": "0.3.4",
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.2",
21
- "@spyglassmc/json": "0.3.3",
22
- "@spyglassmc/locales": "0.3.2",
23
- "@spyglassmc/mcfunction": "0.2.4",
24
- "@spyglassmc/mcdoc": "0.3.3",
25
- "@spyglassmc/nbt": "0.3.3"
20
+ "@spyglassmc/core": "0.4.3",
21
+ "@spyglassmc/json": "0.3.4",
22
+ "@spyglassmc/locales": "0.3.3",
23
+ "@spyglassmc/mcfunction": "0.2.5",
24
+ "@spyglassmc/mcdoc": "0.3.4",
25
+ "@spyglassmc/nbt": "0.3.4"
26
26
  },
27
27
  "devDependencies": {
28
28
  "fast-glob": "^3.2.5",
@@ -1,14 +0,0 @@
1
- export declare const item_predicate: import("@spyglassmc/json/lib/checker/JsonChecker.js").JsonChecker;
2
- export declare const block_predicate: import("@spyglassmc/json/lib/checker/JsonChecker.js").JsonChecker;
3
- export declare const fluid_predicate: import("@spyglassmc/json/lib/checker/JsonChecker.js").JsonChecker;
4
- export declare const location_predicate: import("@spyglassmc/json/lib/checker/JsonChecker.js").JsonChecker;
5
- export declare const distance_predicate: import("@spyglassmc/json/lib/checker/JsonChecker.js").JsonChecker;
6
- export declare const mob_effect_predicate: import("@spyglassmc/json/lib/checker/JsonChecker.js").JsonChecker;
7
- export declare const statistic_predicate: import("@spyglassmc/json/lib/checker/JsonChecker.js").JsonChecker;
8
- export declare const player_predicate: import("@spyglassmc/json/lib/checker/JsonChecker.js").JsonChecker;
9
- export declare const entity_predicate: import("@spyglassmc/json/lib/checker/JsonChecker.js").JsonChecker;
10
- export declare const damage_source_predicate: import("@spyglassmc/json/lib/checker/JsonChecker.js").JsonChecker;
11
- export declare const damage_predicate: import("@spyglassmc/json/lib/checker/JsonChecker.js").JsonChecker;
12
- export declare const criterion: import("@spyglassmc/json/lib/checker/JsonChecker.js").JsonChecker;
13
- export declare const advancement: import("@spyglassmc/json/lib/checker/JsonChecker.js").JsonChecker;
14
- //# sourceMappingURL=advancement.d.ts.map