From 73c6a2a9c27ec12777b88905e40285e6c5d27a7e Mon Sep 17 00:00:00 2001
From: asie <kontakt@asie.pl>
Date: Thu, 29 Nov 2018 10:07:10 +0100
Subject: [PATCH] further datapack loading tweaks

---
 .../mixin/resources/MixinMinecraftServer.java | 11 +-------
 .../fabric/resources/ModDataPackSupplier.java | 27 ++++++++++++-------
 .../resources/ModDirectoryResourcePack.java   |  1 +
 .../fabric/resources/ModResourcePack.java     |  4 +++
 .../fabric/resources/ModZipResourcePack.java  |  1 +
 5 files changed, 24 insertions(+), 20 deletions(-)

diff --git a/src/main/java/net/fabricmc/fabric/mixin/resources/MixinMinecraftServer.java b/src/main/java/net/fabricmc/fabric/mixin/resources/MixinMinecraftServer.java
index 232e003a3..ecc7b01e6 100644
--- a/src/main/java/net/fabricmc/fabric/mixin/resources/MixinMinecraftServer.java
+++ b/src/main/java/net/fabricmc/fabric/mixin/resources/MixinMinecraftServer.java
@@ -45,15 +45,6 @@ public class MixinMinecraftServer {
 
     @Inject(method = "method_3800", at = @At(value = "INVOKE", target = "Lnet/minecraft/class_3283;method_14443(Lnet/minecraft/class_3285;)V", ordinal = 1))
     public void method_3800(File file, LevelProperties properties, CallbackInfo info) {
-    	// TODO: "vanilla" does not emit a message; neither should a modded datapack
-    	List<ResourcePack> packs = new ArrayList<>();
-        ModResourcePackUtil.appendModResourcePacks(packs, ResourceType.DATA);
-        for (ResourcePack pack : packs) {
-        	if (!(pack instanceof ModResourcePack)) {
-        		throw new RuntimeException("Not a ModResourcePack!");
-	        }
-
-			field_4595.method_14443(new ModDataPackSupplier((ModResourcePack) pack));
-        }
+	    field_4595.method_14443(new ModDataPackSupplier());
     }
 }
diff --git a/src/main/java/net/fabricmc/fabric/resources/ModDataPackSupplier.java b/src/main/java/net/fabricmc/fabric/resources/ModDataPackSupplier.java
index 8d63f9132..1c8737652 100644
--- a/src/main/java/net/fabricmc/fabric/resources/ModDataPackSupplier.java
+++ b/src/main/java/net/fabricmc/fabric/resources/ModDataPackSupplier.java
@@ -18,23 +18,30 @@ package net.fabricmc.fabric.resources;
 
 import net.minecraft.class_3285;
 import net.minecraft.class_3288;
+import net.minecraft.resource.ResourcePack;
+import net.minecraft.resource.ResourceType;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 public class ModDataPackSupplier implements class_3285 {
-	private final ModResourcePack pack;
-
-	public ModDataPackSupplier(ModResourcePack pack) {
-		this.pack = pack;
-	}
-
 	@Override
 	public <T extends class_3288> void method_14453(Map<String, T> map, class_3288.class_3290<T> class_3290) {
-		T var3 = class_3288.method_14456("fabric:" + pack.getModInfo().getId(),
-			false, () -> this.pack, class_3290, class_3288.class_3289.BOTTOM);
+		// TODO: "vanilla" does not emit a message; neither should a modded datapack
+		List<ResourcePack> packs = new ArrayList<>();
+		ModResourcePackUtil.appendModResourcePacks(packs, ResourceType.DATA);
+		for (ResourcePack pack : packs) {
+			if (!(pack instanceof ModResourcePack)) {
+				throw new RuntimeException("Not a ModResourcePack!");
+			}
 
-		if (var3 != null) {
-			map.put(var3.method_14463(), var3);
+			T var3 = class_3288.method_14456("fabric/" + ((ModResourcePack) pack).getModInfo().getId(),
+				false, () -> pack, class_3290, class_3288.class_3289.BOTTOM);
+
+			if (var3 != null) {
+				map.put(var3.method_14463(), var3);
+			}
 		}
 	}
 }
diff --git a/src/main/java/net/fabricmc/fabric/resources/ModDirectoryResourcePack.java b/src/main/java/net/fabricmc/fabric/resources/ModDirectoryResourcePack.java
index 2f3d234d1..9a4e2d81a 100644
--- a/src/main/java/net/fabricmc/fabric/resources/ModDirectoryResourcePack.java
+++ b/src/main/java/net/fabricmc/fabric/resources/ModDirectoryResourcePack.java
@@ -19,6 +19,7 @@ package net.fabricmc.fabric.resources;
 import net.fabricmc.loader.ModInfo;
 import net.minecraft.resource.DirectoryResourcePack;
 import net.minecraft.resource.ResourceNotFoundException;
+import net.minecraft.resource.ResourceType;
 
 import java.io.*;
 
diff --git a/src/main/java/net/fabricmc/fabric/resources/ModResourcePack.java b/src/main/java/net/fabricmc/fabric/resources/ModResourcePack.java
index 9b5609aa8..d8085f801 100644
--- a/src/main/java/net/fabricmc/fabric/resources/ModResourcePack.java
+++ b/src/main/java/net/fabricmc/fabric/resources/ModResourcePack.java
@@ -18,7 +18,11 @@ package net.fabricmc.fabric.resources;
 
 import net.fabricmc.loader.ModInfo;
 import net.minecraft.resource.ResourcePack;
+import net.minecraft.resource.ResourceType;
 
 public interface ModResourcePack extends ResourcePack {
 	ModInfo getModInfo();
+	default boolean provides(ResourceType type) {
+		return true;
+	}
 }
diff --git a/src/main/java/net/fabricmc/fabric/resources/ModZipResourcePack.java b/src/main/java/net/fabricmc/fabric/resources/ModZipResourcePack.java
index 6521ee454..c656ed53f 100644
--- a/src/main/java/net/fabricmc/fabric/resources/ModZipResourcePack.java
+++ b/src/main/java/net/fabricmc/fabric/resources/ModZipResourcePack.java
@@ -19,6 +19,7 @@ package net.fabricmc.fabric.resources;
 import com.google.common.io.ByteStreams;
 import net.fabricmc.loader.ModInfo;
 import net.minecraft.resource.ResourceNotFoundException;
+import net.minecraft.resource.ResourceType;
 import net.minecraft.resource.ZipResourcePack;
 
 import java.io.File;