diff --git a/build.gradle b/build.gradle index f78365b..a0507c7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,4 @@ -//version: 1656003793falsepattern60 +//version: 1656003793falsepattern62 /* DO NOT CHANGE THIS FILE! @@ -670,12 +670,13 @@ def getCredentials = { } //Publishing -publish.dependsOn(build) publishing { publications { maven(MavenPublication) { from components.java - artifact source: usesShadowedDependencies.toBoolean() ? shadowJar : jar, classifier: "" + if (usesShadowedDependencies.toBoolean()) { + artifact source: shadowJar, classifier: "" + } if (!project.hasProperty("noPublishedSources") || !noPublishedSources) { artifact source: sourcesJar, classifier: "sources" } @@ -724,6 +725,12 @@ publishing { } } +tasks.withType(PublishToMavenRepository) { task -> + dependsOn("build") +} + +publishToMavenLocal.dependsOn("build") + if (project.changelog == "") { File changelogFile = new File(System.getenv("CHANGELOG_FILE") ?: "CHANGELOG.md") if (changelogFile.exists()) { diff --git a/src/main/java/com/falsepattern/lib/internal/impl/mixin/UCPImpl.java b/src/main/java/com/falsepattern/lib/internal/impl/mixin/UCPImpl.java index ed9995e..2d44808 100644 --- a/src/main/java/com/falsepattern/lib/internal/impl/mixin/UCPImpl.java +++ b/src/main/java/com/falsepattern/lib/internal/impl/mixin/UCPImpl.java @@ -22,7 +22,6 @@ package com.falsepattern.lib.internal.impl.mixin; import lombok.val; -import sun.misc.URLClassPath; import net.minecraft.launchwrapper.Launch; import net.minecraft.launchwrapper.LaunchClassLoader; @@ -31,7 +30,6 @@ import java.io.File; import java.io.IOException; public final class UCPImpl { - private static final URLClassPath ucp; private static final boolean GRIMOIRE; static { @@ -49,24 +47,14 @@ public final class UCPImpl { } } GRIMOIRE = grimoire; - if (!GRIMOIRE) { - try { - val ucpField = LaunchClassLoader.class.getSuperclass().getDeclaredField("ucp"); - ucpField.setAccessible(true); - - ucp = (URLClassPath) ucpField.get(Launch.classLoader); - } catch (NoSuchFieldException | IllegalAccessException e) { - throw new RuntimeException(e.getMessage()); - } - } else { - ucp = null; - System.err.println("Grimoire detected, disabling jar loading utility"); - } } public static void addJar(File pathToJar) throws Exception { if (!GRIMOIRE) { - ucp.addURL(pathToJar.toURI().toURL()); + final LaunchClassLoader loader = Launch.classLoader; + loader.addURL(pathToJar.toURI().toURL()); + // Act as-if we only added the mod to ucp + loader.getSources().remove(loader.getSources().size() - 1); } } } diff --git a/src/main/java/com/falsepattern/lib/mixin/IMixinPlugin.java b/src/main/java/com/falsepattern/lib/mixin/IMixinPlugin.java index 41eca8d..0c42233 100644 --- a/src/main/java/com/falsepattern/lib/mixin/IMixinPlugin.java +++ b/src/main/java/com/falsepattern/lib/mixin/IMixinPlugin.java @@ -33,8 +33,9 @@ import net.minecraft.launchwrapper.Launch; import java.io.File; import java.io.FileNotFoundException; -import java.io.IOException; +import java.net.URL; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -55,12 +56,29 @@ public interface IMixinPlugin extends IMixinConfigPlugin { @StableAPI.Expose static File findJarOf(final ITargetedMod mod) { + File result = null; try (val stream = walk(MODS_DIRECTORY_PATH)) { - return stream.filter(mod::isMatchingJar).map(Path::toFile).findFirst().orElse(null); - } catch (IOException e) { + result = stream.filter(mod::isMatchingJar) + .map(Path::toFile) + .findFirst() + .orElse(null); + } catch (Exception e) { e.printStackTrace(); - return null; } + if (result == null) { + try { + result = Arrays.stream(Launch.classLoader.getURLs()) + .map(URL::getPath) + .map(Paths::get) + .filter(mod::isMatchingJar) + .map(Path::toFile) + .findFirst() + .orElse(null); + } catch (Exception e) { + e.printStackTrace(); + } + } + return result; } @StableAPI.Expose diff --git a/src/main/java/com/falsepattern/lib/mixin/MixinInfo.java b/src/main/java/com/falsepattern/lib/mixin/MixinInfo.java index fcf4682..615f6e8 100644 --- a/src/main/java/com/falsepattern/lib/mixin/MixinInfo.java +++ b/src/main/java/com/falsepattern/lib/mixin/MixinInfo.java @@ -33,7 +33,12 @@ import java.util.Optional; @StableAPI(since = "0.10.2") public final class MixinInfo { @StableAPI.Expose - public static final MixinBootstrapperType mixinBootstrapper = detect(); + public static final MixinBootstrapperType mixinBootstrapper; + + static { + MixinInfoCompatCompanion.mixinInfoClassLoaded = true; + mixinBootstrapper = detect(); + } @StableAPI.Expose public static boolean isMixinsInstalled() { @@ -68,6 +73,11 @@ public final class MixinInfo { return mixinBootstrapper == MixinBootstrapperType.GasStation; } + @StableAPI.Expose(since = "0.10.15") + public static boolean isUniMixin() { + return mixinBootstrapper == MixinBootstrapperType.UniMixin; + } + @StableAPI.Expose public static MixinBootstrapperType bootstrapperType() { return mixinBootstrapper; @@ -97,6 +107,11 @@ public final class MixinInfo { private static MixinBootstrapperType detect() { if (!isClassPresentSafe("org.spongepowered.asm.launch.MixinBootstrap")) return MixinBootstrapperType.None; + for (val candidate: MixinInfoCompatCompanion.UNIMIXIN_CANDIDATES) { + if (isClassPresentSafe(candidate)) { + return MixinBootstrapperType.UniMixin; + } + } if (isClassPresentSafe("com.falsepattern.gasstation.GasStation")) return MixinBootstrapperType.GasStation; if (isClassPresentSafe("ru.timeconqueror.spongemixins.core.SpongeMixinsCore")) @@ -115,6 +130,7 @@ public final class MixinInfo { @StableAPI.Expose SpongeMixins, @StableAPI.Expose Grimoire, @StableAPI.Expose MixinBooterLegacy, - @StableAPI.Expose Other + @StableAPI.Expose Other, + @StableAPI.Expose(since = "0.10.15") UniMixin } } diff --git a/src/main/java/com/falsepattern/lib/mixin/MixinInfoCompatCompanion.java b/src/main/java/com/falsepattern/lib/mixin/MixinInfoCompatCompanion.java new file mode 100644 index 0000000..6f83cf6 --- /dev/null +++ b/src/main/java/com/falsepattern/lib/mixin/MixinInfoCompatCompanion.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2022 FalsePattern + * All Rights Reserved + * + * The above copyright notice, this permission notice and the word "SNEED" + * shall be included in all copies or substantial portions of the Software. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.falsepattern.lib.mixin; + +import com.falsepattern.lib.StableAPI; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * This is a class you can use to interact with MixinInfo before it gets classloaded. + * (Originally placed here for future unimixins compat in case they change the class names) + */ +@StableAPI(since = "0.10.15") +public class MixinInfoCompatCompanion { + /** + * A list of all mixin classes that are candidates for unimixins. + * This is used to determine if a mixin plugin is unimixins. Once MixinInfo is classloaded, this list has no effect. + */ + @StableAPI.Expose + public static final List UNIMIXIN_CANDIDATES = new ArrayList<>(Arrays.asList("io.github.legacymoddingmc.unimixins.compat.CompatCore", + "io.github.legacymoddingmc.unimixins.devcompat.DevCompatCore", + "io.github.legacymoddingmc.unimixins.all.AllCore", + "io.github.legacymoddingmc.unimixins.mixin.MixinModule")); + + @Getter(onMethod_ = @StableAPI.Expose) + static boolean mixinInfoClassLoaded = false; +}