From 8ef3ab86474b2a6b8690fe722833febe96dc1b0c Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Fri, 4 Sep 2020 11:37:25 +0200 Subject: [PATCH] Stop relying on fabric-api internals to inject resource packs Fixes compatibility with fabric-api 0.20+ --- .../java/com/replaymod/core/ReplayMod.java | 20 +++---- .../core/mixin/MixinModResourcePackUtil.java | 40 ------------- .../mixin/Mixin_HideDynamicResourcePacks.java | 37 ++++++++++++ .../Mixin_RegisterDynamicResourcePacks.java | 56 +++++++++++++++++++ .../core/versions/LangResourcePack.java | 18 +++++- src/main/resources/mixins.core.replaymod.json | 3 +- 6 files changed, 120 insertions(+), 54 deletions(-) delete mode 100644 src/main/java/com/replaymod/core/mixin/MixinModResourcePackUtil.java create mode 100644 src/main/java/com/replaymod/core/mixin/Mixin_HideDynamicResourcePacks.java create mode 100644 src/main/java/com/replaymod/core/mixin/Mixin_RegisterDynamicResourcePacks.java diff --git a/src/main/java/com/replaymod/core/ReplayMod.java b/src/main/java/com/replaymod/core/ReplayMod.java index e23a45f9..e9d4dece 100644 --- a/src/main/java/com/replaymod/core/ReplayMod.java +++ b/src/main/java/com/replaymod/core/ReplayMod.java @@ -32,8 +32,6 @@ import org.apache.commons.io.FileUtils; //#if MC>=11400 import net.minecraft.client.options.Option; -import net.minecraft.resource.ResourcePackProvider; -import net.minecraft.resource.ResourcePackProfile; import net.minecraft.util.thread.ReentrantThreadExecutor; //#endif @@ -184,14 +182,6 @@ public class ReplayMod implements } //#endif - //#if MC>=11400 - // Not needed on fabric, using MixinModResourcePackUtil instead. Could in theory also use it on 1.13 but it already works as is. - //#else - //#if MC>=11400 - //$$ DeferredWorkQueue.runLater(() -> MCVer.getMinecraft().getResourcePackList().addPackFinder(new LangResourcePack.Finder())); - //#endif - //#endif - // Register all RM modules modules.add(this); modules.add(new ReplayModRecording(this)); @@ -234,6 +224,7 @@ public class ReplayMod implements } public static final DirectoryResourcePack jGuiResourcePack; + public static final String JGUI_RESOURCE_PACK_NAME = "replaymod_jgui"; static { // Note: even preInit is too late and we'd have to issue another resource reload jGuiResourcePack = initJGuiResourcePack(); } @@ -245,6 +236,15 @@ public class ReplayMod implements } //noinspection UnnecessaryLocalVariable DirectoryResourcePack jGuiResourcePack = new DirectoryResourcePack(folder) { + @Override + //#if MC>=11400 + public String getName() { + //#else + //$$ public String getPackName() { + //#endif + return JGUI_RESOURCE_PACK_NAME; + } + @Override protected InputStream openFile(String resourceName) throws IOException { try { diff --git a/src/main/java/com/replaymod/core/mixin/MixinModResourcePackUtil.java b/src/main/java/com/replaymod/core/mixin/MixinModResourcePackUtil.java deleted file mode 100644 index 6c4722b2..00000000 --- a/src/main/java/com/replaymod/core/mixin/MixinModResourcePackUtil.java +++ /dev/null @@ -1,40 +0,0 @@ -//#if FABRIC>=1 -package com.replaymod.core.mixin; - -import com.replaymod.core.ReplayMod; -import com.replaymod.core.versions.LangResourcePack; -import net.fabricmc.fabric.api.resource.ModResourcePack; -import net.fabricmc.fabric.impl.resource.loader.ModResourcePackUtil; -import net.fabricmc.loader.api.FabricLoader; -import net.fabricmc.loader.api.ModContainer; -import net.minecraft.resource.ResourcePack; -import net.minecraft.resource.ResourceType; -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 java.util.List; - -@Mixin(value = ModResourcePackUtil.class, remap = false) -public class MixinModResourcePackUtil { - @Inject(method = "appendModResourcePacks", at = @At("RETURN"), remap = false) - private static void injectRMLangPack(List packList, ResourceType type, CallbackInfo ci) { - if (type != ResourceType.CLIENT_RESOURCES) return; - - for (int i = 0; i < packList.size(); i++) { - ResourcePack pack = packList.get(i); - if (pack instanceof ModResourcePack && ((ModResourcePack) pack).getFabricModMetadata().getId().equals(ReplayMod.MOD_ID)) { - ModContainer container = FabricLoader.getInstance().getModContainer(ReplayMod.MOD_ID).orElseThrow(IllegalAccessError::new); - packList.add(i, new LangResourcePack(container.getRootPath())); - if (ReplayMod.jGuiResourcePack != null) { - packList.add(i, ReplayMod.jGuiResourcePack); - } - return; - } - } - - throw new IllegalStateException("Could not find ReplayMod resource pack."); - } -} -//#endif diff --git a/src/main/java/com/replaymod/core/mixin/Mixin_HideDynamicResourcePacks.java b/src/main/java/com/replaymod/core/mixin/Mixin_HideDynamicResourcePacks.java new file mode 100644 index 00000000..853c9cd4 --- /dev/null +++ b/src/main/java/com/replaymod/core/mixin/Mixin_HideDynamicResourcePacks.java @@ -0,0 +1,37 @@ +//#if FABRIC>=1 +package com.replaymod.core.mixin; + +import net.minecraft.client.gui.screen.pack.PackListWidget; +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; + +//#if MC>=11600 +import net.minecraft.client.gui.screen.pack.PackScreen; +import net.minecraft.client.gui.screen.pack.ResourcePackOrganizer; +//#else +//$$ import net.minecraft.client.resource.ClientResourcePackProfile; +//#endif + +//#if MC>=11600 +@Mixin(PackScreen.class) +//#else +//$$ @Mixin(ResourcePackListWidget.class) +//#endif +public abstract class Mixin_HideDynamicResourcePacks { + //#if MC>=11600 + @Inject(method = "method_29672", at = @At("HEAD"), cancellable = true) + private void hideInternalPacks(PackListWidget packListWidget, ResourcePackOrganizer.Pack pack, CallbackInfo info) { + //#else + //$$ @Inject(method = "add", at = @At("HEAD"), cancellable = true) + //$$ private void hideInternalPacks(ResourcePackListWidget.ResourcePackEntry entry, CallbackInfo info) { + //$$ ClientResourcePackProfile pack = entry.getPack(); + //#endif + String name = pack.getDisplayName().asString(); + if (name.equals("replaymod_lang") || name.equals("replaymod_jgui")) { + info.cancel(); + } + } +} +//#endif diff --git a/src/main/java/com/replaymod/core/mixin/Mixin_RegisterDynamicResourcePacks.java b/src/main/java/com/replaymod/core/mixin/Mixin_RegisterDynamicResourcePacks.java new file mode 100644 index 00000000..fde3a013 --- /dev/null +++ b/src/main/java/com/replaymod/core/mixin/Mixin_RegisterDynamicResourcePacks.java @@ -0,0 +1,56 @@ +//#if FABRIC>=1 +package com.replaymod.core.mixin; + +import com.replaymod.core.ReplayMod; +import com.replaymod.core.versions.LangResourcePack; +import net.minecraft.client.resource.ClientBuiltinResourcePackProvider; +import net.minecraft.resource.ResourcePackProfile; +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 java.util.function.Consumer; + +//#if MC>=11600 +import net.minecraft.resource.ResourcePackSource; +//#else +//$$ import java.util.Map; +//#endif + +@Mixin(ClientBuiltinResourcePackProvider.class) +public class Mixin_RegisterDynamicResourcePacks { + @Inject(method = "register", at = @At("RETURN")) + //#if MC>=11600 + private void registerReplayMod(Consumer consumer, ResourcePackProfile.Factory factory, CallbackInfo ci) { + //#else + //$$ private void registerReplayMod(Map map, ResourcePackProfile.Factory factory, CallbackInfo ci) { + //$$ Consumer consumer = (pack) -> map.put(pack.getName(), pack); + //#endif + + consumer.accept(ResourcePackProfile.of( + LangResourcePack.NAME, + true, + LangResourcePack::new, + factory, + ResourcePackProfile.InsertionPosition.BOTTOM + //#if MC>=11600 + , ResourcePackSource.PACK_SOURCE_BUILTIN + //#endif + )); + + if (ReplayMod.jGuiResourcePack != null) { + consumer.accept(ResourcePackProfile.of( + ReplayMod.JGUI_RESOURCE_PACK_NAME, + true, + () -> ReplayMod.jGuiResourcePack, + factory, + ResourcePackProfile.InsertionPosition.BOTTOM + //#if MC>=11600 + , ResourcePackSource.PACK_SOURCE_BUILTIN + //#endif + )); + } + } +} +//#endif diff --git a/src/main/java/com/replaymod/core/versions/LangResourcePack.java b/src/main/java/com/replaymod/core/versions/LangResourcePack.java index 2fdb7bc4..63e4304c 100644 --- a/src/main/java/com/replaymod/core/versions/LangResourcePack.java +++ b/src/main/java/com/replaymod/core/versions/LangResourcePack.java @@ -27,6 +27,12 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +//#if FABRIC>=1 +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.loader.api.ModContainer; +//#else +//#endif + //#if MC>=11400 //#else //$$ import net.minecraft.resources.IPackFinder; @@ -42,7 +48,7 @@ import java.util.stream.Collectors; */ public class LangResourcePack extends AbstractFileResourcePack { private static final Gson GSON = new Gson(); - private static final String NAME = "replaymod_lang"; + public static final String NAME = "replaymod_lang"; private static final Pattern JSON_FILE_PATTERN = Pattern.compile("^assets/" + ReplayMod.MOD_ID + "/lang/([a-z][a-z])_([a-z][a-z]).json$"); private static final Pattern LANG_FILE_NAME_PATTERN = Pattern.compile("^([a-z][a-z])_([a-z][a-z]).lang$"); @@ -51,9 +57,15 @@ public class LangResourcePack extends AbstractFileResourcePack { private static final String FABRIC_KEY_FORMAT = "key." + ReplayMod.MOD_ID + ".%s"; private final Path basePath; - public LangResourcePack(Path basePath) { + public LangResourcePack() { super(new File(NAME)); - this.basePath = basePath; + + //#if FABRIC>=1 + ModContainer container = FabricLoader.getInstance().getModContainer(ReplayMod.MOD_ID).orElseThrow(IllegalAccessError::new); + this.basePath = container.getRootPath(); + //#else + //$$ this.basePath = null; // stub + //#endif } //#else //$$ public LangResourcePack() { diff --git a/src/main/resources/mixins.core.replaymod.json b/src/main/resources/mixins.core.replaymod.json index c403dc01..111052a2 100644 --- a/src/main/resources/mixins.core.replaymod.json +++ b/src/main/resources/mixins.core.replaymod.json @@ -8,7 +8,8 @@ "AbstractButtonWidgetAccessor", "Mixin_ContextualKeyBindings", "MixinGameRenderer", - "MixinModResourcePackUtil", + "Mixin_HideDynamicResourcePacks", + "Mixin_RegisterDynamicResourcePacks", //#endif //#if MC>=11400 "MixinKeyboardListener",