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()) {