From 83154f1bcb0f39ef14b32be058be2ebd9118ffa3 Mon Sep 17 00:00:00 2001
From: Apollo <102649729+Apollounknowndev@users.noreply.github.com>
Date: Tue, 7 May 2024 11:04:14 -0700
Subject: [PATCH] Support loading a single resource condition instead of array
 (#3749)

* Support loading a single condition instead of array

* Remove extra space

* Use LIST_CODEC field instead of CODEC.listOf()

Co-authored-by: Juuz <6596629+Juuxel@users.noreply.github.com>

---------

Co-authored-by: Juuz <6596629+Juuxel@users.noreply.github.com>
---
 .../api/resource/conditions/v1/ResourceCondition.java |  4 ++++
 .../resource/conditions/ResourceConditionsImpl.java   |  4 ++--
 .../predicates/loaded.json                            | 11 +++--------
 3 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/api/resource/conditions/v1/ResourceCondition.java b/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/api/resource/conditions/v1/ResourceCondition.java
index c727f1cc6..6798f3793 100644
--- a/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/api/resource/conditions/v1/ResourceCondition.java
+++ b/fabric-resource-conditions-api-v1/src/main/java/net/fabricmc/fabric/api/resource/conditions/v1/ResourceCondition.java
@@ -38,6 +38,10 @@ public interface ResourceCondition {
 	 * A codec for a list of conditions.
 	 */
 	Codec<List<ResourceCondition>> LIST_CODEC = CODEC.listOf();
+	/**
+	 * A codec for parsing load conditions. Can either be an array of conditions or a single condition.
+	 */
+	Codec<ResourceCondition> CONDITION_CODEC = Codec.withAlternative(CODEC, LIST_CODEC, conditions -> ResourceConditions.and(conditions.toArray(new ResourceCondition[0])));
 
 	/**
 	 * @return the type of the condition
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 c69e976eb..6f2d206ed 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
@@ -65,10 +65,10 @@ public final class ResourceConditionsImpl implements ModInitializer {
 		boolean debugLogEnabled = ResourceConditionsImpl.LOGGER.isDebugEnabled();
 
 		if (obj.has(ResourceConditions.CONDITIONS_KEY)) {
-			DataResult<List<ResourceCondition>> conditions = ResourceCondition.LIST_CODEC.parse(JsonOps.INSTANCE, obj.get(ResourceConditions.CONDITIONS_KEY));
+			DataResult<ResourceCondition> conditions = ResourceCondition.CONDITION_CODEC.parse(JsonOps.INSTANCE, obj.get(ResourceConditions.CONDITIONS_KEY));
 
 			if (conditions.isSuccess()) {
-				boolean matched = ResourceConditionsImpl.conditionsMet(conditions.getOrThrow(), registryLookup, true);
+				boolean matched = conditions.getOrThrow().test(registryLookup);
 
 				if (debugLogEnabled) {
 					String verdict = matched ? "Allowed" : "Rejected";
diff --git a/fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/predicates/loaded.json b/fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/predicates/loaded.json
index 65460b641..f7ed2d36d 100644
--- a/fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/predicates/loaded.json
+++ b/fabric-resource-conditions-api-v1/src/testmod/resources/data/fabric-resource-conditions-api-v1-testmod/predicates/loaded.json
@@ -4,12 +4,7 @@
   "predicate": {
     "type": "minecraft:pig"
   },
-  "fabric:load_conditions": [
-    {
-      "condition": "fabric:all_mods_loaded",
-      "values": [
-        "fabric-resource-conditions-api-v1"
-      ]
-    }
-  ]
+  "fabric:load_conditions": {
+    "condition": "fabric:true"
+  }
 }