From 4f010d5414fa666b354c8d17ac55beb58669dc06 Mon Sep 17 00:00:00 2001
From: Misode <Misoloo64@gmail.com>
Date: Sun, 12 May 2024 03:47:08 +0200
Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Implement=20various=20command=20par?=
 =?UTF-8?q?sers=20and=20tree=20patch=20changes=20(#1128)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 packages/core/src/symbol/Symbol.ts            |  4 ++
 .../java-edition/src/dependency/common.ts     |  7 +++-
 .../src/mcfunction/common/index.ts            | 22 +++++++++++
 .../src/mcfunction/completer/argument.ts      | 10 +++++
 .../src/mcfunction/parser/argument.ts         | 10 +++++
 .../src/mcfunction/tree/argument.ts           | 27 +++++++++++++
 .../java-edition/src/mcfunction/tree/patch.ts | 38 +++++++++++++++++++
 7 files changed, 117 insertions(+), 1 deletion(-)

diff --git a/packages/core/src/symbol/Symbol.ts b/packages/core/src/symbol/Symbol.ts
index aaf677852..291ede24b 100644
--- a/packages/core/src/symbol/Symbol.ts
+++ b/packages/core/src/symbol/Symbol.ts
@@ -119,6 +119,8 @@ export type TagFileCategory = (typeof TagFileCategories)[number]
 export const FileCategories = Object.freeze(
 	[
 		'advancement',
+		'chat_type',
+		'damage_type',
 		'dimension',
 		'dimension_type',
 		'function',
@@ -127,6 +129,8 @@ export const FileCategories = Object.freeze(
 		'predicate',
 		'recipe',
 		'structure',
+		'trim_material',
+		'trim_pattern',
 		...TagFileCategories,
 		...WorldgenFileCategories,
 	] as const,
diff --git a/packages/java-edition/src/dependency/common.ts b/packages/java-edition/src/dependency/common.ts
index c0abecf03..becb74e46 100644
--- a/packages/java-edition/src/dependency/common.ts
+++ b/packages/java-edition/src/dependency/common.ts
@@ -28,7 +28,12 @@ export const PackVersionMap: Record<number, RegExp | undefined> = {
 	7: /^1\.17.*$/,
 	8: /^1\.18(\.1)?$/,
 	9: /^1\.18.*$/,
-	10: /^1\.19.*$/,
+	10: /^1\.19(\.[1-3])?$/,
+	12: /^1\.19.*$/,
+	15: /^1\.20(\.1)?$/,
+	18: /^1\.20\.2$/,
+	26: /^1\.20\.[3-4]$/,
+	41: /^1\.20\.[5-6]$/,
 }
 
 export interface PackMcmeta {
diff --git a/packages/java-edition/src/mcfunction/common/index.ts b/packages/java-edition/src/mcfunction/common/index.ts
index 952288b32..a63852daf 100644
--- a/packages/java-edition/src/mcfunction/common/index.ts
+++ b/packages/java-edition/src/mcfunction/common/index.ts
@@ -66,3 +66,25 @@ export const SwizzleArgumentValues = [
 	'zxy',
 	'zyx',
 ]
+
+export const HeightmapValues = [
+	'motion_blocking',
+	'motion_blocking_no_leaves',
+	'ocean_floor',
+	'ocean_floor_wg',
+	'world_surface',
+	'world_surface_wg',
+]
+
+export const RotationValues = [
+	'none',
+	'clockwise_90',
+	'180',
+	'counterclockwise_90',
+]
+
+export const MirrorValues = [
+	'none',
+	'left_right',
+	'front_back',
+]
diff --git a/packages/java-edition/src/mcfunction/completer/argument.ts b/packages/java-edition/src/mcfunction/completer/argument.ts
index 84aab0ae3..af92cc3b7 100644
--- a/packages/java-edition/src/mcfunction/completer/argument.ts
+++ b/packages/java-edition/src/mcfunction/completer/argument.ts
@@ -31,8 +31,11 @@ import {
 	ColorArgumentValues,
 	EntityAnchorArgumentValues,
 	GamemodeArgumentValues,
+	HeightmapValues,
 	ItemSlotArgumentValues,
+	MirrorValues,
 	OperationArgumentValues,
+	RotationValues,
 	ScoreboardSlotArgumentValues,
 	SwizzleArgumentValues,
 } from '../common/index.js'
@@ -98,6 +101,8 @@ export const getMockNodes: mcf.completer.MockNodesGetter = (
 		case 'minecraft:entity':
 		case 'minecraft:game_profile':
 			return EntitySelectorNode.mock(range)
+		case 'minecraft:heightmap':
+			return LiteralNode.mock(range, { pool: HeightmapValues })
 		case 'minecraft:entity_anchor':
 			return LiteralNode.mock(range, { pool: EntityAnchorArgumentValues })
 		case 'minecraft:entity_summon':
@@ -130,6 +135,7 @@ export const getMockNodes: mcf.completer.MockNodesGetter = (
 		case 'minecraft:particle':
 			return ParticleNode.mock(range)
 		case 'minecraft:resource':
+		case 'minecraft:resource_key':
 		case 'minecraft:resource_or_tag':
 			return ResourceLocationNode.mock(range, {
 				category: ResourceLocation.shorten(treeNode.properties.registry) as
@@ -152,6 +158,10 @@ export const getMockNodes: mcf.completer.MockNodesGetter = (
 			return LiteralNode.mock(range, { pool: SwizzleArgumentValues })
 		case 'minecraft:team':
 			return SymbolNode.mock(range, { category: 'team' })
+		case 'minecraft:template_mirror':
+			return LiteralNode.mock(range, { pool: MirrorValues })
+		case 'minecraft:template_rotation':
+			return LiteralNode.mock(range, { pool: RotationValues })
 		case 'minecraft:vec2':
 			return VectorNode.mock(range, { dimension: 2, integersOnly: true })
 		case 'minecraft:vec3':
diff --git a/packages/java-edition/src/mcfunction/parser/argument.ts b/packages/java-edition/src/mcfunction/parser/argument.ts
index 461e766e0..2655b8eed 100644
--- a/packages/java-edition/src/mcfunction/parser/argument.ts
+++ b/packages/java-edition/src/mcfunction/parser/argument.ts
@@ -9,8 +9,11 @@ import {
 	ColorArgumentValues,
 	EntityAnchorArgumentValues,
 	GamemodeArgumentValues,
+	HeightmapValues,
 	ItemSlotArgumentValues,
+	MirrorValues,
 	OperationArgumentValues,
+	RotationValues,
 	ScoreboardSlotArgumentValues,
 	SwizzleArgumentValues,
 } from '../common/index.js'
@@ -173,6 +176,8 @@ export const argument: mcf.ArgumentParserGetter = (
 			return wrap(core.literal(...GamemodeArgumentValues))
 		case 'minecraft:game_profile':
 			return wrap(entity('multiple', 'players'))
+		case 'minecraft:heightmap':
+			return wrap(core.literal(...HeightmapValues))
 		case 'minecraft:int_range':
 			return wrap(range('integer'))
 		case 'minecraft:item_enchantment':
@@ -221,6 +226,7 @@ export const argument: mcf.ArgumentParserGetter = (
 		case 'minecraft:particle':
 			return wrap(particle)
 		case 'minecraft:resource':
+		case 'minecraft:resource_key':
 		case 'minecraft:resource_or_tag':
 			return wrap(
 				core.resourceLocation({
@@ -257,6 +263,10 @@ export const argument: mcf.ArgumentParserGetter = (
 						: undefined,
 				),
 			)
+		case 'minecraft:template_mirror':
+			return wrap(core.literal(...MirrorValues))
+		case 'minecraft:template_rotation':
+			return wrap(core.literal(...RotationValues))
 		case 'minecraft:time':
 			return wrap(time)
 		case 'minecraft:uuid':
diff --git a/packages/java-edition/src/mcfunction/tree/argument.ts b/packages/java-edition/src/mcfunction/tree/argument.ts
index fd4bf7ef3..bc022c861 100644
--- a/packages/java-edition/src/mcfunction/tree/argument.ts
+++ b/packages/java-edition/src/mcfunction/tree/argument.ts
@@ -112,6 +112,11 @@ export interface MinecraftGameProfileArgumentTreeNode
 {
 	parser: 'minecraft:game_profile'
 }
+export interface MinecraftHeightmapArgumentTreeNode
+	extends mcf.ArgumentTreeNode
+{
+	parser: 'minecraft:heightmap'
+}
 export interface MinecraftIntRangeArgumentTreeNode
 	extends mcf.ArgumentTreeNode
 {
@@ -184,6 +189,14 @@ export interface MinecraftResourceArgumentTreeNode
 		registry: string
 	}
 }
+export interface MinecraftResourceKeyArgumentTreeNode
+	extends mcf.ArgumentTreeNode
+{
+	parser: 'minecraft:resource_key'
+	properties: {
+		registry: string
+	}
+}
 export interface MinecraftResourceLocationArgumentTreeNode
 	extends mcf.ArgumentTreeNode
 {
@@ -222,6 +235,16 @@ export interface MinecraftSwizzleArgumentTreeNode extends mcf.ArgumentTreeNode {
 export interface MinecraftTeamArgumentTreeNode extends mcf.ArgumentTreeNode {
 	parser: 'minecraft:team'
 }
+export interface MinecraftTemplateMirrorArgumentTreeNode
+	extends mcf.ArgumentTreeNode
+{
+	parser: 'minecraft:template_mirror'
+}
+export interface MinecraftTemplateRotationArgumentTreeNode
+	extends mcf.ArgumentTreeNode
+{
+	parser: 'minecraft:template_rotation'
+}
 export interface MinecraftTimeArgumentTreeNode extends mcf.ArgumentTreeNode {
 	parser: 'minecraft:time'
 }
@@ -262,6 +285,7 @@ export type ArgumentTreeNode =
 	| MinecraftFunctionArgumentTreeNode
 	| MinecraftGamemodeArgumentTreeNode
 	| MinecraftGameProfileArgumentTreeNode
+	| MinecraftHeightmapArgumentTreeNode
 	| MinecraftIntRangeArgumentTreeNode
 	| MinecraftItemEnchantmentArgumentTreeNode
 	| MinecraftItemPredicateArgumentTreeNode
@@ -277,6 +301,7 @@ export type ArgumentTreeNode =
 	| MinecraftOperationArgumentTreeNode
 	| MinecraftParticleArgumentTreeNode
 	| MinecraftResourceArgumentTreeNode
+	| MinecraftResourceKeyArgumentTreeNode
 	| MinecraftResourceLocationArgumentTreeNode
 	| MinecraftResourceOrTagArgumentTreeNode
 	| MinecraftRotationArgumentTreeNode
@@ -284,6 +309,8 @@ export type ArgumentTreeNode =
 	| MinecraftScoreboardSlotArgumentTreeNode
 	| MinecraftSwizzleArgumentTreeNode
 	| MinecraftTeamArgumentTreeNode
+	| MinecraftTemplateMirrorArgumentTreeNode
+	| MinecraftTemplateRotationArgumentTreeNode
 	| MinecraftTimeArgumentTreeNode
 	| MinecraftUuidArgumentTreeNode
 	| MinecraftVec2ArgumentTreeNode
diff --git a/packages/java-edition/src/mcfunction/tree/patch.ts b/packages/java-edition/src/mcfunction/tree/patch.ts
index 322bf93e3..580fb9b81 100644
--- a/packages/java-edition/src/mcfunction/tree/patch.ts
+++ b/packages/java-edition/src/mcfunction/tree/patch.ts
@@ -333,6 +333,13 @@ export function getPatch(release: ReleaseVersion): PartialRootTreeNode {
 			help: {
 				permission: 0,
 			},
+			...(ReleaseVersion.cmp(release, '1.18') >= 0
+				? {
+						jfr: {
+							permission: 4,
+						},
+				  }
+				: {}),
 			kick: {
 				permission: 3,
 			},
@@ -418,6 +425,30 @@ export function getPatch(release: ReleaseVersion): PartialRootTreeNode {
 			'pardon-ip': {
 				permission: 3,
 			},
+			...(ReleaseVersion.cmp(release, '1.17') >= 0
+				? {
+						perf: {
+							permission: 4,
+						},
+				  }
+				: {}),
+			...(ReleaseVersion.cmp(release, '1.19') >= 0
+				? {
+						place: {
+							children: {
+								template: {
+									children: {
+										template: {
+											properties: {
+												category: 'structure'
+											}
+										}
+									}
+								}
+							}
+						},
+				  }
+				: {}),
 			playsound: Sound,
 			publish: {
 				permission: 4,
@@ -559,6 +590,13 @@ export function getPatch(release: ReleaseVersion): PartialRootTreeNode {
 			tell: {
 				permission: 0,
 			},
+			...(ReleaseVersion.cmp(release, '1.20.2') >= 0
+				? {
+						tick: {
+							permission: 3,
+						},
+				  }
+				: {}),
 			tm: {
 				permission: 0,
 			},