From a21facc05f28c7c43f954d56d4295235e23165b9 Mon Sep 17 00:00:00 2001
From: ErrorCraft <51973682+ErrorCraft@users.noreply.github.com>
Date: Thu, 11 Jan 2024 16:44:46 +0100
Subject: [PATCH] Add a system property for a custom output directory for
 gametest structures (#3509)

* Add a check for the output directory in the test command

* Fix style and add a run configuration with the output directory set

* Update fabric-gametest-api-v1/build.gradle

---------

Co-authored-by: modmuss <modmuss50@gmail.com>
---
 fabric-gametest-api-v1/build.gradle           | 11 +++++
 .../mixin/gametest/TestCommandMixin.java      | 45 +++++++++++++++++++
 .../fabric-gametest-api-v1.mixins.json        |  1 +
 3 files changed, 57 insertions(+)
 create mode 100644 fabric-gametest-api-v1/src/main/java/net/fabricmc/fabric/mixin/gametest/TestCommandMixin.java

diff --git a/fabric-gametest-api-v1/build.gradle b/fabric-gametest-api-v1/build.gradle
index 6d90f8f8f..208b87abf 100644
--- a/fabric-gametest-api-v1/build.gradle
+++ b/fabric-gametest-api-v1/build.gradle
@@ -2,6 +2,17 @@ version = getSubprojectVersion(project)
 
 loom {
 	accessWidenerPath = file("src/main/resources/fabric-gametest-api-v1.accesswidener")
+
+	runs {
+		testmodClient {
+			client()
+			name = "Testmod Client"
+			vmArg "-Dfabric-api.gametest.structures.output-dir=${file("src/testmod/resources/data/fabric-gametest-api-v1-testmod/gametest/structures")}"
+
+			ideConfigGenerated = false
+			source sourceSets.testmodClient
+		}
+	}
 }
 
 moduleDependencies(project, [
diff --git a/fabric-gametest-api-v1/src/main/java/net/fabricmc/fabric/mixin/gametest/TestCommandMixin.java b/fabric-gametest-api-v1/src/main/java/net/fabricmc/fabric/mixin/gametest/TestCommandMixin.java
new file mode 100644
index 000000000..44437616b
--- /dev/null
+++ b/fabric-gametest-api-v1/src/main/java/net/fabricmc/fabric/mixin/gametest/TestCommandMixin.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2016, 2017, 2018, 2019 FabricMC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.fabricmc.fabric.mixin.gametest;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Unique;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.ModifyArg;
+
+import net.minecraft.server.command.TestCommand;
+
+@Mixin(TestCommand.class)
+public class TestCommandMixin {
+	@Unique
+	private static final String OUTPUT_DIR = System.getProperty("fabric-api.gametest.structures.output-dir");
+
+	@ModifyArg(
+			method = "executeExport(Lnet/minecraft/server/command/ServerCommandSource;Ljava/lang/String;)I",
+			at = @At(
+					value = "INVOKE",
+					target = "Ljava/nio/file/Paths;get(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/file/Path;"
+			)
+	)
+	private static String useCustomOutputDirectory(String first) {
+		if (OUTPUT_DIR != null) {
+			return OUTPUT_DIR;
+		}
+
+		return first;
+	}
+}
diff --git a/fabric-gametest-api-v1/src/main/resources/fabric-gametest-api-v1.mixins.json b/fabric-gametest-api-v1/src/main/resources/fabric-gametest-api-v1.mixins.json
index 8a47efc1d..723e45278 100644
--- a/fabric-gametest-api-v1/src/main/resources/fabric-gametest-api-v1.mixins.json
+++ b/fabric-gametest-api-v1/src/main/resources/fabric-gametest-api-v1.mixins.json
@@ -7,6 +7,7 @@
     "CommandManagerMixin",
     "MinecraftServerMixin",
     "StructureTemplateManagerMixin",
+    "TestCommandMixin",
     "TestFunctionsMixin",
     "TestServerMixin"
   ],