From 7621966360f2d01b61dd1e7a6f8dc9aee428a874 Mon Sep 17 00:00:00 2001 From: FalsePattern <30945458+FalsePattern@users.noreply.github.com> Date: Sat, 11 Feb 2023 11:14:04 +0100 Subject: [PATCH 1/4] unimixins compat --- .../com/falsepattern/lib/mixin/MixinInfo.java | 20 +++++++- .../lib/mixin/MixinInfoCompatCompanion.java | 49 +++++++++++++++++++ 2 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/falsepattern/lib/mixin/MixinInfoCompatCompanion.java 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; +} From 7994dbe426cb5218f91868d0dad923ced7f13d1d Mon Sep 17 00:00:00 2001 From: FalsePattern <30945458+FalsePattern@users.noreply.github.com> Date: Sat, 11 Feb 2023 11:22:43 +0100 Subject: [PATCH 2/4] Cleaner UCP logic --- .../lib/internal/impl/mixin/UCPImpl.java | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) 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); } } } From df9f52d1543d2445abc90fe25fc8fe78af8b02a2 Mon Sep 17 00:00:00 2001 From: FalsePattern <30945458+FalsePattern@users.noreply.github.com> Date: Sat, 11 Feb 2023 11:22:59 +0100 Subject: [PATCH 3/4] More robust jar detection for mixins --- .../falsepattern/lib/mixin/IMixinPlugin.java | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) 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 From 7fdfb52ada96eddee31ea6416f24157b3ede0084 Mon Sep 17 00:00:00 2001 From: FalsePattern <30945458+FalsePattern@users.noreply.github.com> Date: Sat, 11 Feb 2023 11:24:05 +0100 Subject: [PATCH 4/4] update buildscript --- build.gradle | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index 74849c5..a0507c7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,4 @@ -//version: 1656003793falsepattern59 +//version: 1656003793falsepattern62 /* DO NOT CHANGE THIS FILE! @@ -282,9 +282,13 @@ if(file("addon.gradle").exists()) { apply from: 'repositories.gradle' configurations { - implementation.extendsFrom(shadowImplementation) // TODO: remove after all uses are refactored - implementation.extendsFrom(shadowCompile) - implementation.extendsFrom(shadeCompile) + for (config in [shadowImplementation, shadowCompile, shadeCompile]) { + implementation.extendsFrom(shadeCompile) + compileClasspath.extendsFrom(config) + runtimeClasspath.extendsFrom(config) + testCompileClasspath.extendsFrom(config) + testRuntimeClasspath.extendsFrom(config) + } } repositories { @@ -314,6 +318,8 @@ dependencies { compile("org.spongepowered:mixin:0.8.5-gasstation_7") compile("com.llamalad7:MixinExtras:0.1.1-gasstation") compile("com.falsepattern:00gasstation-mc1.7.10:0.5.1:dev") + runtimeClasspath('org.jetbrains:intellij-fernflower:1.2.1.16') + testRuntimeClasspath('org.jetbrains:intellij-fernflower:1.2.1.16') } else if(hasMixinDeps.toBoolean()) { runtime("com.llamalad7:MixinExtras:0.1.1-gasstation") runtime("org.spongepowered:mixin:0.8.5-gasstation_7") @@ -664,12 +670,16 @@ def getCredentials = { } //Publishing -publish.dependsOn(build) publishing { publications { maven(MavenPublication) { - artifact source: usesShadowedDependencies.toBoolean() ? shadowJar : jar, classifier: "" - artifact source: sourcesJar, classifier: "sources" + from components.java + if (usesShadowedDependencies.toBoolean()) { + artifact source: shadowJar, classifier: "" + } + if (!project.hasProperty("noPublishedSources") || !noPublishedSources) { + artifact source: sourcesJar, classifier: "sources" + } artifact source: usesShadowedDependencies.toBoolean() ? shadowDevJar : devJar, classifier: "dev" if (apiPackage) { artifact source: apiJar, classifier: "api" @@ -715,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()) {