From 649ca78d6c2cf611eaf7b6a4d0b84dd60aedae23 Mon Sep 17 00:00:00 2001 From: JFronny Date: Thu, 26 Aug 2021 22:31:47 +0200 Subject: [PATCH] Quick hack to "fix" DashLoader --- build.gradle | 19 +++++++++--- .../jfronny/respackopts/GuiFactory.java | 2 ++ .../jfronny/respackopts/Respackopts.java | 4 +++ .../integration/ModMenuCompat.java | 2 ++ .../dashloader/DashLoaderCompat.java | 19 ++++++++++++ .../dashloader/HackedDashLoader.java | 29 +++++++++++++++++++ 6 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 src/main/java/io/gitlab/jfronny/respackopts/integration/dashloader/DashLoaderCompat.java create mode 100644 src/main/java/io/gitlab/jfronny/respackopts/integration/dashloader/HackedDashLoader.java diff --git a/build.gradle b/build.gradle index a947e32..a631729 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,12 @@ repositories { maven { url = 'https://server.bbkr.space/artifactory/libs-release'; name = "Required for canvas" } maven { url = "https://minecraft.curseforge.com/api/maven"; name = "CurseForge (for canvas)" } maven { url = "https://jitpack.io"; name = "jitpack (for StarScript)" } + maven { + url "https://oskarstrom.net/maven" + content { + includeGroup "net.oskarstrom" + } + } } dependencies { @@ -14,17 +20,22 @@ dependencies { mappings "net.fabricmc:yarn:${project.minecraft_version}+${project.yarn_mappings}:v2" modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" - modImplementation "net.fabricmc.fabric-api:fabric-api:0.38.2+1.17" + modImplementation "net.fabricmc.fabric-api:fabric-api:0.39.2+1.17" modImplementation "com.terraformersmc:modmenu:2.0.5" download("https://gitlab.com/jfmods/LibJF/-/jobs/artifacts/master/raw/latest-dev.jar?job=build_test", "libjf") include modImplementation("com.github.MeteorDevelopment:starscript:0.1.5") modApi("me.shedaniel.cloth:cloth-config-fabric:5.0.38") modCompileOnly "grondag:frex-mc117:+" - modRuntime("grondag:canvas-mc117-1.17:+") { - exclude(group: "me.shedaniel.cloth") - } + //modRuntime("grondag:canvas-mc117-1.17:+") { + // exclude(group: "me.shedaniel.cloth") + //} testImplementation('org.junit.jupiter:junit-jupiter:5.6.2') + + //DashLoader "compatibility" + modImplementation ('net.oskarstrom:DashLoader:2.1-dev7') { + exclude group: 'net.fabricmc.fabric-api' + } } test { diff --git a/src/main/java/io/gitlab/jfronny/respackopts/GuiFactory.java b/src/main/java/io/gitlab/jfronny/respackopts/GuiFactory.java index c82b042..9943ae0 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/GuiFactory.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/GuiFactory.java @@ -1,5 +1,6 @@ package io.gitlab.jfronny.respackopts; +import io.gitlab.jfronny.respackopts.integration.dashloader.DashLoaderCompat; import io.gitlab.jfronny.respackopts.data.entry.ConfigBranch; import io.gitlab.jfronny.respackopts.data.entry.ConfigEntry; import me.shedaniel.clothconfig2.api.AbstractConfigListEntry; @@ -58,6 +59,7 @@ public class GuiFactory { builder.setSavingRunnable(() -> { Respackopts.save(); Respackopts.forceRespackReload = true; + DashLoaderCompat.forceReload = true; Respackopts.reloadData(); }); ConfigCategory config = builder.getOrCreateCategory(getText(resourcepackid, source.getVersion() < 4 ? "respackopts.title" : "rpo")); diff --git a/src/main/java/io/gitlab/jfronny/respackopts/Respackopts.java b/src/main/java/io/gitlab/jfronny/respackopts/Respackopts.java index 45ece6a..b479321 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/Respackopts.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/Respackopts.java @@ -3,6 +3,7 @@ package io.gitlab.jfronny.respackopts; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import io.gitlab.jfronny.libjf.data.WrappedPack; +import io.gitlab.jfronny.respackopts.integration.dashloader.DashLoaderCompat; import io.gitlab.jfronny.respackopts.data.DirRpo; import io.gitlab.jfronny.respackopts.data.PackCapability; import io.gitlab.jfronny.respackopts.data.Respackmeta; @@ -53,6 +54,8 @@ public class Respackopts implements ClientModInitializer { public static Starscript STAR_SCRIPT; + public static final Boolean DASHLOADER_PRESENT = FabricLoader.getInstance().isModLoaded("dashloader"); + public static final Gson GSON; public static GuiFactory factory = new GuiFactory(); public static boolean forceRespackReload = false; @@ -98,6 +101,7 @@ public class Respackopts implements ClientModInitializer { } catch (IOException e) { LOGGER.error("Could not initialize config directory", e); } + if (DASHLOADER_PRESENT) DashLoaderCompat.hookDashLoader(); if (FabricLoader.getInstance().isDevelopmentEnvironment()) SAVE_ACTIONS.add(() -> LOGGER.info("Save")); SAVE_ACTIONS.add(() -> { diff --git a/src/main/java/io/gitlab/jfronny/respackopts/integration/ModMenuCompat.java b/src/main/java/io/gitlab/jfronny/respackopts/integration/ModMenuCompat.java index 5594cdd..aa599bd 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/integration/ModMenuCompat.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/integration/ModMenuCompat.java @@ -3,6 +3,7 @@ package io.gitlab.jfronny.respackopts.integration; import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; import io.gitlab.jfronny.respackopts.Respackopts; +import io.gitlab.jfronny.respackopts.integration.dashloader.DashLoaderCompat; import me.shedaniel.clothconfig2.api.ConfigBuilder; import me.shedaniel.clothconfig2.api.ConfigCategory; import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; @@ -23,6 +24,7 @@ public class ModMenuCompat implements ModMenuApi { ConfigEntryBuilder entryBuilder = builder.entryBuilder(); builder.setSavingRunnable(() -> { Respackopts.save(); + DashLoaderCompat.forceReload = true; Respackopts.forceReloadResources(); }); AtomicBoolean categoryAdded = new AtomicBoolean(false); diff --git a/src/main/java/io/gitlab/jfronny/respackopts/integration/dashloader/DashLoaderCompat.java b/src/main/java/io/gitlab/jfronny/respackopts/integration/dashloader/DashLoaderCompat.java new file mode 100644 index 0000000..c165374 --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/respackopts/integration/dashloader/DashLoaderCompat.java @@ -0,0 +1,19 @@ +package io.gitlab.jfronny.respackopts.integration.dashloader; + +import net.oskarstrom.dashloader.DashLoader; + +import java.lang.reflect.Field; + +public class DashLoaderCompat { + public static boolean forceReload = false; + + public static void hookDashLoader() { + try { + Field instance = DashLoader.class.getDeclaredField("instance"); + instance.setAccessible(true); + instance.set(null, new HackedDashLoader((DashLoader) instance.get(null))); + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/io/gitlab/jfronny/respackopts/integration/dashloader/HackedDashLoader.java b/src/main/java/io/gitlab/jfronny/respackopts/integration/dashloader/HackedDashLoader.java new file mode 100644 index 0000000..9c00563 --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/respackopts/integration/dashloader/HackedDashLoader.java @@ -0,0 +1,29 @@ +package io.gitlab.jfronny.respackopts.integration.dashloader; + +import net.oskarstrom.dashloader.DashLoader; +import net.oskarstrom.dashloader.util.enums.DashCachePaths; + +import java.io.IOException; +import java.nio.file.Files; +import java.util.Collection; + +public class HackedDashLoader extends DashLoader { + public HackedDashLoader(DashLoader previous) { + super(previous.getAssignedClassLoader().getParent()); + initialize(); + } + + @Override + public void reload(Collection resourcePacks) { + if (DashLoaderCompat.forceReload) + for (DashCachePaths value : DashCachePaths.values()) { + try { + Files.deleteIfExists(value.getPath()); + } catch (IOException e) { + e.printStackTrace(); + } + } + super.reload(resourcePacks); + DashLoaderCompat.forceReload = false; + } +}