From 13eda06580927eb37ddddd684149fa410be744e2 Mon Sep 17 00:00:00 2001
From: deirn <deirn@bai.lol>
Date: Mon, 17 Jan 2022 19:11:19 +0700
Subject: [PATCH] Fix tags_populated conditions not working (#1957)

closes #1954
---
 .../v1/DefaultResourceConditions.java         | 10 ++---
 .../conditions/ResourceConditionsImpl.java    | 10 +++--
 .../conditions/JsonDataLoaderMixin.java       | 12 +++---
 ...inglePreparationResourceReloaderMixin.java | 38 +++++++++++++++++++
 ...ric-resource-conditions-api-v1.mixins.json |  3 +-
 .../conditions/ConditionalResourcesTest.java  |  6 ++-
 .../recipes/item_tags_populated.json          | 19 ++++++++++
 .../tags/items/test_condition.json            |  6 +++
 .../src/testmod/resources/fabric.mod.json     |  2 +-
 9 files changed, 86 insertions(+), 20 deletions(-)
 create mode 100644 fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/mixin/resource/conditions/SinglePreparationResourceReloaderMixin.java
 create mode 100644 fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/recipes/item_tags_populated.json
 create mode 100644 fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/tags/items/test_condition.json

diff --git a/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/api/resource/conditions/v1/DefaultResourceConditions.java b/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/api/resource/conditions/v1/DefaultResourceConditions.java
index 63afea2f6..bef3d4386 100644
--- a/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/api/resource/conditions/v1/DefaultResourceConditions.java
+++ b/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/api/resource/conditions/v1/DefaultResourceConditions.java
@@ -22,12 +22,10 @@ import com.google.gson.JsonObject;
 import net.minecraft.block.Block;
 import net.minecraft.fluid.Fluid;
 import net.minecraft.item.Item;
-import net.minecraft.tag.BlockTags;
-import net.minecraft.tag.FluidTags;
-import net.minecraft.tag.ItemTags;
 import net.minecraft.tag.Tag;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.JsonHelper;
+import net.minecraft.util.registry.Registry;
 
 import net.fabricmc.fabric.impl.resource.conditions.ResourceConditionsImpl;
 
@@ -129,9 +127,9 @@ public final class DefaultResourceConditions {
 		});
 		ResourceConditions.register(ALL_MODS_LOADED, object -> ResourceConditionsImpl.modsLoadedMatch(object, true));
 		ResourceConditions.register(ANY_MOD_LOADED, object -> ResourceConditionsImpl.modsLoadedMatch(object, false));
-		ResourceConditions.register(BLOCK_TAGS_POPULATED, object -> ResourceConditionsImpl.tagsPopulatedMatch(object, BlockTags.getTagGroup()));
-		ResourceConditions.register(FLUID_TAGS_POPULATED, object -> ResourceConditionsImpl.tagsPopulatedMatch(object, FluidTags.getTagGroup()));
-		ResourceConditions.register(ITEM_TAGS_POPULATED, object -> ResourceConditionsImpl.tagsPopulatedMatch(object, ItemTags.getTagGroup()));
+		ResourceConditions.register(BLOCK_TAGS_POPULATED, object -> ResourceConditionsImpl.tagsPopulatedMatch(object, Registry.BLOCK_KEY));
+		ResourceConditions.register(FLUID_TAGS_POPULATED, object -> ResourceConditionsImpl.tagsPopulatedMatch(object, Registry.FLUID_KEY));
+		ResourceConditions.register(ITEM_TAGS_POPULATED, object -> ResourceConditionsImpl.tagsPopulatedMatch(object, Registry.ITEM_KEY));
 	}
 
 	private DefaultResourceConditions() {
diff --git a/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/impl/resource/conditions/ResourceConditionsImpl.java b/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/impl/resource/conditions/ResourceConditionsImpl.java
index 4ee49128e..0a81fa8a4 100644
--- a/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/impl/resource/conditions/ResourceConditionsImpl.java
+++ b/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/impl/resource/conditions/ResourceConditionsImpl.java
@@ -25,10 +25,12 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.jetbrains.annotations.ApiStatus;
 
+import net.minecraft.tag.ServerTagManagerHolder;
 import net.minecraft.tag.Tag;
-import net.minecraft.tag.TagGroup;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.JsonHelper;
+import net.minecraft.util.registry.Registry;
+import net.minecraft.util.registry.RegistryKey;
 
 import net.fabricmc.fabric.api.resource.conditions.v1.ConditionJsonProvider;
 import net.fabricmc.loader.api.FabricLoader;
@@ -123,15 +125,15 @@ public class ResourceConditionsImpl {
 		return and;
 	}
 
-	public static <T> boolean tagsPopulatedMatch(JsonObject object, TagGroup<T> tagGroup) {
+	public static <T> boolean tagsPopulatedMatch(JsonObject object, RegistryKey<? extends Registry<T>> registryKey) {
 		JsonArray array = JsonHelper.getArray(object, "values");
 
 		for (JsonElement element : array) {
 			if (element.isJsonPrimitive()) {
 				Identifier id = new Identifier(element.getAsString());
-				Tag<T> tag = tagGroup.getTag(id);
+				Tag<T> tag = ServerTagManagerHolder.getTagManager().getOrCreateTagGroup(registryKey).getTagOrEmpty(id);
 
-				if (tag == null || tag.values().size() == 0) {
+				if (tag.values().isEmpty()) {
 					return false;
 				}
 			} else {
diff --git a/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/mixin/resource/conditions/JsonDataLoaderMixin.java b/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/mixin/resource/conditions/JsonDataLoaderMixin.java
index b4e67b62e..49a1caf65 100644
--- a/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/mixin/resource/conditions/JsonDataLoaderMixin.java
+++ b/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/mixin/resource/conditions/JsonDataLoaderMixin.java
@@ -24,9 +24,6 @@ import com.google.gson.JsonObject;
 import org.spongepowered.asm.mixin.Final;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
 
 import net.minecraft.resource.JsonDataLoader;
 import net.minecraft.resource.ResourceManager;
@@ -37,16 +34,17 @@ import net.fabricmc.fabric.api.resource.conditions.v1.ResourceConditions;
 import net.fabricmc.fabric.impl.resource.conditions.ResourceConditionsImpl;
 
 @Mixin(JsonDataLoader.class)
-public class JsonDataLoaderMixin {
+public class JsonDataLoaderMixin extends SinglePreparationResourceReloaderMixin {
 	@Shadow
 	@Final
 	private String dataType;
 
-	@Inject(at = @At("RETURN"), method = "prepare")
-	public void applyResourceConditions(ResourceManager resourceManager, Profiler profiler, CallbackInfoReturnable<Map<Identifier, JsonElement>> cir) {
+	@Override
+	@SuppressWarnings("unchecked")
+	protected void fabric_applyResourceConditions(ResourceManager resourceManager, Profiler profiler, Object object) {
 		profiler.push("Fabric resource conditions: %s".formatted(dataType));
 
-		Iterator<Map.Entry<Identifier, JsonElement>> it = cir.getReturnValue().entrySet().iterator();
+		Iterator<Map.Entry<Identifier, JsonElement>> it = ((Map<Identifier, JsonElement>) object).entrySet().iterator();
 		boolean debugLogEnabled = ResourceConditionsImpl.LOGGER.isDebugEnabled();
 
 		while (it.hasNext()) {
diff --git a/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/mixin/resource/conditions/SinglePreparationResourceReloaderMixin.java b/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/mixin/resource/conditions/SinglePreparationResourceReloaderMixin.java
new file mode 100644
index 000000000..de03e19c4
--- /dev/null
+++ b/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/mixin/resource/conditions/SinglePreparationResourceReloaderMixin.java
@@ -0,0 +1,38 @@
+/*
+ * 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.resource.conditions;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import net.minecraft.resource.ResourceManager;
+import net.minecraft.resource.SinglePreparationResourceReloader;
+import net.minecraft.util.profiler.Profiler;
+
+@Mixin(SinglePreparationResourceReloader.class)
+public class SinglePreparationResourceReloaderMixin {
+	// thenAcceptAsync in reload
+	@Inject(at = @At("HEAD"), method = "method_18790")
+	private void applyResourceConditions(ResourceManager resourceManager, Profiler profiler, Object object, CallbackInfo ci) {
+		fabric_applyResourceConditions(resourceManager, profiler, object);
+	}
+
+	protected void fabric_applyResourceConditions(ResourceManager resourceManager, Profiler profiler, Object object) {
+	}
+}
diff --git a/fabric-resource-conditions-api-v1/src/main/resources/fabric-resource-conditions-api-v1.mixins.json b/fabric-resource-conditions-api-v1/src/main/resources/fabric-resource-conditions-api-v1.mixins.json
index 7f8e9d7b8..7d98aef51 100644
--- a/fabric-resource-conditions-api-v1/src/main/resources/fabric-resource-conditions-api-v1.mixins.json
+++ b/fabric-resource-conditions-api-v1/src/main/resources/fabric-resource-conditions-api-v1.mixins.json
@@ -3,6 +3,7 @@
   "package": "net.fabricmc.fabric.mixin.resource.conditions",
   "compatibilityLevel": "JAVA_16",
   "mixins": [
-    "JsonDataLoaderMixin"
+    "JsonDataLoaderMixin",
+    "SinglePreparationResourceReloaderMixin"
   ]
 }
diff --git a/fabric-resource-conditions-api-v1/src/testmod/java/net/fabricmc/fabric/test/resource/conditions/ConditionalResourcesTest.java b/fabric-resource-conditions-api-v1/src/testmod/java/net/fabricmc/fabric/test/resource/conditions/ConditionalResourcesTest.java
index 4a7836bb9..b23a0adcc 100644
--- a/fabric-resource-conditions-api-v1/src/testmod/java/net/fabricmc/fabric/test/resource/conditions/ConditionalResourcesTest.java
+++ b/fabric-resource-conditions-api-v1/src/testmod/java/net/fabricmc/fabric/test/resource/conditions/ConditionalResourcesTest.java
@@ -42,8 +42,12 @@ public class ConditionalResourcesTest {
 			throw new AssertionError("loaded recipe should have been loaded.");
 		}
 
+		if (manager.get(id("item_tags_populated")).isEmpty()) {
+			throw new AssertionError("item_tags_populated recipe should have been loaded.");
+		}
+
 		long loadedRecipes = manager.values().stream().filter(r -> r.getId().getNamespace().equals(MOD_ID)).count();
-		if (loadedRecipes != 1) throw new AssertionError("Unexpected loaded recipe count: " + loadedRecipes);
+		if (loadedRecipes != 2) throw new AssertionError("Unexpected loaded recipe count: " + loadedRecipes);
 
 		context.complete();
 	}
diff --git a/fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/recipes/item_tags_populated.json b/fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/recipes/item_tags_populated.json
new file mode 100644
index 000000000..dd186a524
--- /dev/null
+++ b/fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/recipes/item_tags_populated.json
@@ -0,0 +1,19 @@
+{
+  "type": "minecraft:crafting_shapeless",
+  "ingredients": [
+    {
+      "tag": "fabric-resource-conditions-api-v1-testmod:test_condition"
+    }
+  ],
+  "result": {
+    "item": "minecraft:diamond"
+  },
+  "fabric:load_conditions": [
+    {
+      "condition": "fabric:item_tags_populated",
+      "values": [
+        "fabric-resource-conditions-api-v1-testmod:test_condition"
+      ]
+    }
+  ]
+}
diff --git a/fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/tags/items/test_condition.json b/fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/tags/items/test_condition.json
new file mode 100644
index 000000000..653f3b1fb
--- /dev/null
+++ b/fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/tags/items/test_condition.json
@@ -0,0 +1,6 @@
+{
+  "replace": false,
+  "values": [
+    "minecraft:dirt"
+  ]
+}
diff --git a/fabric-resource-conditions-api-v1/src/testmod/resources/fabric.mod.json b/fabric-resource-conditions-api-v1/src/testmod/resources/fabric.mod.json
index 35da07b0c..4945a53ec 100644
--- a/fabric-resource-conditions-api-v1/src/testmod/resources/fabric.mod.json
+++ b/fabric-resource-conditions-api-v1/src/testmod/resources/fabric.mod.json
@@ -6,7 +6,7 @@
   "environment": "*",
   "license": "Apache-2.0",
   "depends": {
-    "fabric-api-lookup-api-v1": "*"
+    "fabric-resource-conditions-api-v1": "*"
   },
   "entrypoints": {
     "fabric-gametest": [