aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--build.gradle.kts236
-rw-r--r--buildSrc/build.gradle.kts18
-rw-r--r--buildSrc/src/AutoMixinDiscovery.kt50
-rw-r--r--buildSrc/src/EnvFile.kt12
-rw-r--r--gradle.properties3
-rw-r--r--gradle/libs.versions.toml1
-rw-r--r--log4j2.xml53
-rw-r--r--settings.gradle.kts9
-rw-r--r--src/main/java/at/hannibal2/skyhanni/mixins/init/SkyhanniMixinPlugin.java91
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/MinecraftConsoleFilter.kt13
11 files changed, 190 insertions, 298 deletions
diff --git a/.gitignore b/.gitignore
index df98a38f7..d79aeba45 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,5 +15,3 @@ gradle.properties
.devauth/*
!.devauth/config.toml
-
-.env
diff --git a/build.gradle.kts b/build.gradle.kts
index f0553f106..5503faaa7 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,13 +1,12 @@
+import org.apache.commons.lang3.SystemUtils
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-import xyz.wagyourtail.unimined.api.minecraft.MinecraftConfig
-import xyz.wagyourtail.unimined.api.minecraft.task.RemapJarTask
-import xyz.wagyourtail.unimined.api.runs.RunConfig
import java.io.ByteArrayOutputStream
plugins {
idea
java
- id("xyz.wagyourtail.unimined") version "1.2.0-SNAPSHOT"
+ id("gg.essential.loom") version "0.10.0.+"
+ id("dev.architectury.architectury-pack200") version "0.1.3"
id("com.github.johnrengelman.shadow") version "7.1.2"
kotlin("jvm") version "1.9.0"
id("com.bnorm.power.kotlin-power-assert") version "0.13.0"
@@ -39,10 +38,6 @@ sourceSets.main {
kotlin.destinationDirectory.set(java.destinationDirectory)
}
-val patternSourceSet = sourceSets.create("pattern") {
- this.runtimeClasspath += sourceSets.main.get().runtimeClasspath
-}
-
repositories {
mavenCentral()
mavenLocal()
@@ -56,19 +51,15 @@ repositories {
maven("https://repo.nea.moe/releases")
maven("https://maven.notenoughupdates.org/releases")
maven("https://repo.hypixel.net/repository/Hypixel/")
- ivy("https://repo1.maven.org/maven2/org/apache/logging/log4j") {
- this.content {
- this.includeGroup("log4jhack")
- }
- this.patternLayout {
- this.artifact("log4j-[artifact]/[revision]/log4j-[artifact]-[revision].[ext]")
- }
- this.metadataSources {
- this.artifact()
- }
- }
}
+val shadowImpl: Configuration by configurations.creating {
+ configurations.implementation.get().extendsFrom(this)
+}
+
+val shadowModImpl: Configuration by configurations.creating {
+ configurations.modImplementation.get().extendsFrom(this)
+}
val devenvMod: Configuration by configurations.creating {
isTransitive = false
@@ -82,125 +73,10 @@ val headlessLwjgl by configurations.creating {
val shot = shots.shot("minecraft", project.file("shots.txt"))
-val modRuntimeOnly by configurations.creating {
- configurations.runtimeOnly.get().extendsFrom(this)
-}
-val modCompileOnly by configurations.creating {
- configurations.compileOnly.get().extendsFrom(this)
-}
-
-fun RunConfig.setBaseConfig() {
- val runDir = file("run").absoluteFile
- this.javaVersion = JavaVersion.VERSION_1_8
- this.args.addAll(
- listOf(
- "--tweakClass",
- "org.spongepowered.asm.launch.MixinTweaker",
- "--tweakClass",
- "io.github.notenoughupdates.moulconfig.tweaker.DevelopmentResourceTweaker",
- "--mods",
- devenvMod.resolve().joinToString(",") { it.relativeTo(runDir).path }
- )
- )
- this.args.set(
- this.args.indexOf("--gameDir") + 1,
- runDir.absolutePath
- )
- this.jvmArgs.removeIf { it.startsWith("-Xmx") || it.startsWith("-XX:") }
- this.jvmArgs.addAll(
- listOf(
- "-Xmx4G",
- "-Dmixin.debug=true",
- "-Dlog4j.configurationFile=${project.file("log4j2.xml").absolutePath}"
- )
- )
- this.workingDir = runDir
- if (System.getenv("repo_action") != "true") {
- this.jvmArgs.add("-Ddevauth.configDir=${rootProject.file(".devauth").absolutePath}")
- }
- this.env.putAll(parseEnvFile(file(".env")))
-}
-
-fun MinecraftConfig.defaultMinecraft() {
- this.version("1.8.9")
- this.mappings {
- this.searge()
- this.mcp("stable", "22-1.8.9")
- }
- this.minecraftForge {
- this.loader("11.15.1.2318-1.8.9")
- this.mixinConfig("mixins.skyhanni.json")
- }
-}
-
-unimined.minecraft {
- this.defaultMinecraft()
- this.runs {
- this.config("client") {
- this.setBaseConfig()
- }
- this.config("server") {
- this.disabled = true
- }
- }
- this.mods {
- this.remap(modRuntimeOnly)
- this.remap(devenvMod)
- this.remap(modCompileOnly)
- }
-}
-
-unimined.minecraft(patternSourceSet) {
- this.defaultMinecraft()
- this.runs {
- this.config("client") {
- this.setBaseConfig()
- this.jvmArgs.addAll(
- listOf(
- "-Dorg.lwjgl.opengl.Display.allowSoftwareOpenGL=true",
- "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5006",
- "-javaagent:${headlessLwjgl.singleFile.absolutePath}"
- )
- )
- val outputFile = project.file("build/regexes/constants.json")
- this.env.put("SKYHANNI_DUMP_REGEXES", "${gitHash}:${outputFile.absolutePath}")
- this.env.put("SKYHANNI_DUMP_REGEXES_EXIT", "true")
- }
- this.config("server") {
- this.disabled = true
- }
- }
-}
-unimined.minecraft(sourceSets.test.get()) {
- this.defaultMinecraft()
- this.runs {
- this.off = true
- }
-}
-val modImplementation by configurations
-val testModImplementation by configurations
-val patternModImplementation by configurations
-
-testModImplementation.extendsFrom(modImplementation)
-patternModImplementation.extendsFrom(testModImplementation)
-
-val shadowImpl: Configuration by configurations.creating {
- configurations.implementation.get().extendsFrom(this)
-}
-
-val shadowModImpl: Configuration by configurations.creating {
- modImplementation.extendsFrom(this)
-
-}
-
-configurations.named("minecraftLibraries") {
- this.resolutionStrategy {
- this.force("org.apache.logging.log4j:log4j-core:2.8.1")
- this.force("org.apache.logging.log4j:log4j-api:2.8.1")
- }
-}
-
dependencies {
+ minecraft("com.mojang:minecraft:1.8.9")
+ mappings("de.oceanlabs.mcp:mcp_stable:22-1.8.9")
+ forge("net.minecraftforge:forge:1.8.9-11.15.1.2318-1.8.9")
// Discord RPC client
shadowImpl("com.github.NetheriteMiner:DiscordIPC:3106be5") {
@@ -216,13 +92,14 @@ dependencies {
shadowImpl("org.spongepowered:mixin:0.7.11-SNAPSHOT") {
isTransitive = false
}
+ annotationProcessor("org.spongepowered:mixin:0.8.4-SNAPSHOT")
implementation(kotlin("stdlib-jdk8"))
shadowImpl("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") {
exclude(group = "org.jetbrains.kotlin")
}
- modRuntimeOnly("me.djtheredstoner:DevAuth-forge-legacy:1.2.0")
+ modRuntimeOnly("me.djtheredstoner:DevAuth-forge-legacy:1.1.0")
modCompileOnly("com.github.hannibal002:notenoughupdates:4957f0b:all") {
exclude(module = "unspecified")
@@ -247,11 +124,9 @@ dependencies {
testImplementation("io.mockk:mockk:1.12.5")
implementation("net.hypixel:mod-api:0.3.1")
-
- runtimeOnly(libs.terminalConsoleAppender)
- // Manually load 2.0-beta.9 on the class path *after* loading 2.8.X, since forge uses some of the helper classes only available in this version.
- runtimeOnly("log4jhack:api:2.0-beta9")
- runtimeOnly("log4jhack:core:2.0-beta9")
+}
+configurations.getByName("minecraftNamed").dependencies.forEach {
+ shot.applyTo(it as HasConfigurableAttributes<*>)
}
tasks.withType(Test::class) {
@@ -270,19 +145,64 @@ kotlin {
}
}
+// Minecraft configuration:
+loom {
+ launchConfigs {
+ "client" {
+ property("mixin.debug", "true")
+ if (System.getenv("repo_action") != "true") {
+ property("devauth.configDir", rootProject.file(".devauth").absolutePath)
+ }
+ arg("--tweakClass", "org.spongepowered.asm.launch.MixinTweaker")
+ arg("--tweakClass", "io.github.notenoughupdates.moulconfig.tweaker.DevelopmentResourceTweaker")
+ arg("--mods", devenvMod.resolve().joinToString(",") { it.relativeTo(file("run")).path })
+ }
+ }
+ forge {
+ pack200Provider.set(dev.architectury.pack200.java.Pack200Adapter())
+ mixinConfig("mixins.skyhanni.json")
+ }
+ @Suppress("UnstableApiUsage")
+ mixin {
+ defaultRefmapName.set("mixins.skyhanni.refmap.json")
+ }
+ runConfigs {
+ "client" {
+ if (SystemUtils.IS_OS_MAC_OSX) {
+ vmArgs.remove("-XstartOnFirstThread")
+ }
+ vmArgs.add("-Xmx4G")
+ }
+ "server" {
+ isIdeConfigGenerated = false
+ }
+ }
+}
+
// Tasks:
tasks.processResources {
inputs.property("version", version)
filesMatching("mcmod.info") {
expand("version" to version)
}
- this.filesMatching("mixins.skyhanni.json") {
- this.autoDiscoverMixins(sourceSets.main.get())
- }
}
-val generateRepoPatterns by tasks.creating() {
- afterEvaluate { dependsOn(tasks["patternRunClient"]) }
+val generateRepoPatterns by tasks.creating(JavaExec::class) {
+ javaLauncher.set(javaToolchains.launcherFor(java.toolchain))
+ mainClass.set("net.fabricmc.devlaunchinjector.Main")
+ workingDir(project.file("run"))
+ classpath(sourceSets.main.map { it.runtimeClasspath }, sourceSets.main.map { it.output })
+ jvmArgs(
+ "-Dfabric.dli.config=${project.file(".gradle/loom-cache/launch.cfg").absolutePath}",
+ "-Dfabric.dli.env=client",
+ "-Dfabric.dli.main=net.minecraft.launchwrapper.Launch",
+ "-Dorg.lwjgl.opengl.Display.allowSoftwareOpenGL=true",
+ "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5006",
+ "-javaagent:${headlessLwjgl.singleFile.absolutePath}"
+ )
+ val outputFile = project.file("build/regexes/constants.json")
+ environment("SKYHANNI_DUMP_REGEXES", "${gitHash}:${outputFile.absolutePath}")
+ environment("SKYHANNI_DUMP_REGEXES_EXIT", "true")
}
tasks.compileJava {
@@ -295,9 +215,6 @@ tasks.withType(JavaCompile::class) {
tasks.withType(Jar::class) {
archiveBaseName.set("SkyHanni")
- if (this.name != "remapJar") {
- this.destinationDirectory.set(layout.buildDirectory.dir("badjars"))
- }
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
manifest.attributes.run {
this["FMLCorePluginContainsFMLMod"] = "true"
@@ -310,14 +227,21 @@ tasks.withType(Jar::class) {
}
-val remapJar by tasks.named<RemapJarTask>("remapJar") {
+val remapJar by tasks.named<net.fabricmc.loom.task.RemapJarTask>("remapJar") {
archiveClassifier.set("")
- inputFile.set(tasks.shadowJar.flatMap { it.archiveFile })
+ from(tasks.shadowJar)
+ input.set(tasks.shadowJar.get().archiveFile)
}
tasks.shadowJar {
+ destinationDirectory.set(layout.buildDirectory.dir("badjars"))
archiveClassifier.set("all-dev")
configurations = listOf(shadowImpl, shadowModImpl)
+ doLast {
+ configurations.forEach {
+ println("Config: ${it.files}")
+ }
+ }
exclude("META-INF/versions/**")
mergeServiceFiles()
relocate("io.github.notenoughupdates.moulconfig", "at.hannibal2.skyhanni.deps.moulconfig")
@@ -325,8 +249,9 @@ tasks.shadowJar {
}
tasks.jar {
archiveClassifier.set("nodeps")
+ destinationDirectory.set(layout.buildDirectory.dir("badjars"))
}
-tasks.assemble.get().dependsOn(remapJar)
+tasks.assemble.get().dependsOn(tasks.remapJar)
val compileKotlin: KotlinCompile by tasks
compileKotlin.kotlinOptions {
@@ -337,13 +262,14 @@ compileTestKotlin.kotlinOptions {
jvmTarget = "1.8"
}
val sourcesJar by tasks.creating(Jar::class) {
+ destinationDirectory.set(layout.buildDirectory.dir("badjars"))
archiveClassifier.set("src")
from(sourceSets.main.get().allSource)
}
publishing.publications {
create<MavenPublication>("maven") {
- artifact(remapJar)
+ artifact(tasks.remapJar)
artifact(sourcesJar) { classifier = "sources" }
pom {
name.set("SkyHanni")
diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
deleted file mode 100644
index 15870b3ce..000000000
--- a/buildSrc/build.gradle.kts
+++ /dev/null
@@ -1,18 +0,0 @@
-
-plugins {
- `kotlin-dsl`
- kotlin("jvm")version "1.8.10"
-}
-repositories {
- mavenCentral()
-}
-
-dependencies {
- implementation("com.google.code.gson:gson:2.10.1")
-}
-
-sourceSets.main {
- kotlin {
- srcDir(file("src"))
- }
-}
diff --git a/buildSrc/src/AutoMixinDiscovery.kt b/buildSrc/src/AutoMixinDiscovery.kt
deleted file mode 100644
index f66229030..000000000
--- a/buildSrc/src/AutoMixinDiscovery.kt
+++ /dev/null
@@ -1,50 +0,0 @@
-import com.google.gson.GsonBuilder
-import com.google.gson.JsonArray
-import com.google.gson.JsonObject
-import com.google.gson.JsonPrimitive
-import org.apache.tools.ant.filters.BaseParamFilterReader
-import org.gradle.api.file.FileCopyDetails
-import org.gradle.api.tasks.SourceSet
-import java.io.File
-import java.io.Reader
-import java.io.StringReader
-
-class MixinFilterReader(reader: Reader) : BaseParamFilterReader() {
- lateinit var sourceRoots: Collection<File>
- val gson = GsonBuilder().setPrettyPrinting().create()
- val betterReader: StringReader by lazy {
- StringReader(run {
- val json = gson.fromJson(reader.readText(), JsonObject::class.java)
- val mixinPackage = (json["package"] as JsonPrimitive).asString
- val allMixins = (json["mixins"] as JsonArray?)?.map { it.asString }?.toMutableSet() ?: mutableSetOf()
- sourceRoots
- .forEach { base ->
- base.walk()
- .filter { it.isFile }
- .forEach {
- val relativeString = it.toRelativeString(base).replace("\\", "/")
- if (relativeString.startsWith(mixinPackage.replace(".", "/") + "/")
- && relativeString.endsWith(".java")
- && it.readText().contains("@Mixin")
- )
- allMixins.add(
- relativeString.replace("/", ".").dropLast(5).drop(mixinPackage.length + 1)
- )
- }
- }
- json.add("mixins", JsonArray().also { jsonAllMixins ->
- allMixins.forEach { jsonAllMixins.add(it) }
- })
- gson.toJson(json)
- })
-
- }
-
- override fun read(): Int {
- return betterReader.read()
- }
-}
-
-fun FileCopyDetails.autoDiscoverMixins(sourceSet: SourceSet) {
- filter(mapOf("sourceRoots" to sourceSet.allSource.srcDirs), MixinFilterReader::class.java)
-}
diff --git a/buildSrc/src/EnvFile.kt b/buildSrc/src/EnvFile.kt
deleted file mode 100644
index 76d6fa959..000000000
--- a/buildSrc/src/EnvFile.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-import java.io.File
-
-fun parseEnvFile(file: File): Map<String, String> {
- if (!file.exists()) return mapOf()
- val map = mutableMapOf<String, String>()
- for (line in file.readText().lines()) {
- if (line.isEmpty() || line.startsWith("#")) continue
- val parts = line.split("=", limit = 2)
- map[parts[0]] = parts.getOrNull(1) ?: ""
- }
- return map
-}
diff --git a/gradle.properties b/gradle.properties
index d7a34a502..065574755 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1 +1,2 @@
-org.gradle.jvmargs=-Xmx2g
+loom.platform=forge
+org.gradle.jvmargs=-Xmx2g \ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 6d6193970..634e49064 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -10,4 +10,3 @@ libautoupdate = { module = "moe.nea:libautoupdate", version.ref = "libautoupdate
headlessLwjgl = { module = "com.github.3arthqu4ke.HeadlessMc:headlessmc-lwjgl", version.ref = "headlessLwjgl" }
jbAnnotations = { module = "org.jetbrains:annotations", version.ref = "jbAnnotations" }
hotswapagentforge = { module = "moe.nea:hotswapagent-forge", version = "1.0.1" }
-terminalConsoleAppender = { module = "net.minecrell:terminalconsoleappender", version = "1.3.0" }
diff --git a/log4j2.xml b/log4j2.xml
deleted file mode 100644
index b37b4235d..000000000
--- a/log4j2.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Configuration status="WARN" packages="com.mojang.util,net.minecrell.terminalconsole.util">
- <Appenders>
-
- <!-- System out -->
- <Console name="SysOut" target="SYSTEM_OUT">
- <PatternLayout>
- <LoggerNamePatternSelector defaultPattern="%style{[%d{HH:mm:ss}]}{blue} %highlight{[%t/%level]}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=green, TRACE=blue} %style{(%logger{1})}{cyan} %highlight{%msg%n}{FATAL=red, ERROR=red, WARN=normal, INFO=normal, DEBUG=normal, TRACE=normal}" disableAnsi="false">
- <!-- Dont show the logger name for minecraft classes-->
- <PatternMatch key="net.minecraft.,com.mojang." pattern="%style{[%d{HH:mm:ss}]}{blue} %highlight{[%t/%level]}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=green, TRACE=blue} %style{(Minecraft)}{cyan} %highlight{%msg{nolookups}%n}{FATAL=red, ERROR=red, WARN=normal, INFO=normal, DEBUG=normal, TRACE=normal}"/>
- </LoggerNamePatternSelector>
- </PatternLayout>
- </Console>
-
- <!-- latest.log same as vanilla -->
- <RollingRandomAccessFile name="LatestFile" fileName="logs/latest.log" filePattern="logs/%d{yyyy-MM-dd}-%i.log.gz">
- <PatternLayout>
- <LoggerNamePatternSelector defaultPattern="[%d{HH:mm:ss}] [%t/%level] (%logger{1}) %msg{nolookups}%n">
- <!-- Dont show the logger name for minecraft classes-->
- <PatternMatch key="net.minecraft.,com.mojang." pattern="[%d{HH:mm:ss}] [%t/%level] (Minecraft) %msg{nolookups}%n"/>
- </LoggerNamePatternSelector>
- </PatternLayout>
- <Policies>
- <TimeBasedTriggeringPolicy />
- <OnStartupTriggeringPolicy />
- </Policies>
- </RollingRandomAccessFile>
-
- <!-- Debug log file -->
- <RollingRandomAccessFile name="DebugFile" fileName="logs/debug.log" filePattern="logs/debug-%i.log.gz">
- <PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level] (%logger) %msg{nolookups}%n" />
-
- <!-- Keep 5 files max -->
- <DefaultRolloverStrategy max="5" fileIndex="min"/>
-
- <Policies>
- <SizeBasedTriggeringPolicy size="200MB"/>
- <OnStartupTriggeringPolicy />
- </Policies>
-
- </RollingRandomAccessFile>
- </Appenders>
- <Loggers>
- <Logger level="${sys:fabric.log.level:-info}" name="net.minecraft"/>
- <Logger level="warn" name="cpw.mods.modlauncher.ClassTransformer"/>
- <Root level="all">
- <AppenderRef ref="DebugFile" level="${sys:fabric.log.debug.level:-debug}"/>
- <AppenderRef ref="SysOut" level="${sys:fabric.log.level:-info}"/>
- <AppenderRef ref="LatestFile" level="${sys:fabric.log.level:-info}"/>
- <AppenderRef ref="ServerGuiConsole" level="${sys:fabric.log.level:-info}"/>
- </Root>
- </Loggers>
-</Configuration>
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 5004d7675..12734a34a 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -9,8 +9,13 @@ pluginManagement {
maven("https://repo.spongepowered.org/maven/")
maven("https://repo.nea.moe/releases")
maven("https://repo.sk1er.club/repository/maven-releases/")
- maven("https://maven.wagyourtail.xyz/releases")
- maven("https://maven.wagyourtail.xyz/snapshots")
+ }
+ resolutionStrategy {
+ eachPlugin {
+ when (requested.id.id) {
+ "gg.essential.loom" -> useModule("gg.essential:architectury-loom:${requested.version}")
+ }
+ }
}
}
diff --git a/src/main/java/at/hannibal2/skyhanni/mixins/init/SkyhanniMixinPlugin.java b/src/main/java/at/hannibal2/skyhanni/mixins/init/SkyhanniMixinPlugin.java
index eb4009ce5..1f1b0e1fe 100644
--- a/src/main/java/at/hannibal2/skyhanni/mixins/init/SkyhanniMixinPlugin.java
+++ b/src/main/java/at/hannibal2/skyhanni/mixins/init/SkyhanniMixinPlugin.java
@@ -4,13 +4,24 @@ import org.spongepowered.asm.lib.tree.ClassNode;
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
+import java.util.stream.Stream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
public class SkyhanniMixinPlugin implements IMixinConfigPlugin {
@Override
public void onLoad(String mixinPackage) {
+
}
@Override
@@ -20,7 +31,7 @@ public class SkyhanniMixinPlugin implements IMixinConfigPlugin {
@Override
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
- return true;
+ return false;
}
@Override
@@ -28,9 +39,85 @@ public class SkyhanniMixinPlugin implements IMixinConfigPlugin {
}
+ public URL baseUrl(URL classUrl) {
+ String string = classUrl.toString();
+ if (classUrl.getProtocol().equals("jar")) {
+ try {
+ return new URL(string.substring(4).split("!")[0]);
+ } catch (MalformedURLException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ if (string.endsWith(".class")) {
+ try {
+ return new URL(string.replace("\\", "/")
+ .replace(getClass().getCanonicalName().replace(".", "/") + ".class", ""));
+ } catch (MalformedURLException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ return classUrl;
+ }
+
+ String mixinBasePackage = "at.hannibal2.skyhanni.mixins.transformers.";
+ String mixinBaseDir = mixinBasePackage.replace(".", "/");
+
+ List<String> mixins = null;
+
+ public void tryAddMixinClass(String className) {
+ String norm = (className.endsWith(".class") ? className.substring(0, className.length() - ".class".length()) : className)
+ .replace("\\", "/")
+ .replace("/", ".");
+ if (norm.startsWith(mixinBasePackage) && !norm.endsWith(".")) {
+ mixins.add(norm.substring(mixinBasePackage.length()));
+ }
+ }
+
+ public void walkDir(Path file) {
+ System.out.println("Trying to find mixins from directory");
+ try (Stream<Path> classes = Files.walk(file.resolve(mixinBaseDir))) {
+ classes.map(it -> file.relativize(it).toString())
+ .forEach(this::tryAddMixinClass);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
@Override
public List<String> getMixins() {
- return new ArrayList<>();
+ if (mixins != null) return mixins;
+ System.out.println("Trying to discover mixins");
+ mixins = new ArrayList<>();
+ URL classUrl = getClass().getProtectionDomain().getCodeSource().getLocation();
+ System.out.println("Found classes at " + classUrl);
+ Path file;
+ try {
+ file = Paths.get(baseUrl(classUrl).toURI());
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(e);
+ }
+ System.out.println("Base directory found at " + file);
+ if (Files.isDirectory(file)) {
+ walkDir(file);
+ } else {
+ walkJar(file);
+ }
+ System.out.println("Found mixins: " + mixins);
+
+ return mixins;
+ }
+
+ private void walkJar(Path file) {
+ System.out.println("Trying to find mixins from jar file");
+ try (ZipInputStream zis = new ZipInputStream(Files.newInputStream(file))) {
+ ZipEntry next;
+ while ((next = zis.getNextEntry()) != null) {
+ tryAddMixinClass(next.getName());
+ zis.closeEntry();
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
}
@Override
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/MinecraftConsoleFilter.kt b/src/main/java/at/hannibal2/skyhanni/utils/MinecraftConsoleFilter.kt
index 5de464872..4022b382c 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/MinecraftConsoleFilter.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/MinecraftConsoleFilter.kt
@@ -11,10 +11,9 @@ import org.apache.logging.log4j.core.Filter
import org.apache.logging.log4j.core.LogEvent
import org.apache.logging.log4j.core.Logger
import org.apache.logging.log4j.core.LoggerContext
-import org.apache.logging.log4j.core.filter.AbstractFilter
import org.apache.logging.log4j.message.Message
-class MinecraftConsoleFilter(private val loggerConfigName: String) : AbstractFilter(Filter.Result.ACCEPT, Filter.Result.DENY) {
+class MinecraftConsoleFilter(private val loggerConfigName: String) : Filter {
private val config get() = SkyHanniMod.feature.dev.minecraftConsoles
private val filterConfig get() = config.consoleFilter
@@ -36,6 +35,8 @@ class MinecraftConsoleFilter(private val loggerConfigName: String) : AbstractFil
}
}
+ // prevents error sending on every shutdown
+ fun stop() {}
override fun filter(event: LogEvent?): Filter.Result {
if (event == null) return Filter.Result.ACCEPT
@@ -204,6 +205,14 @@ class MinecraftConsoleFilter(private val loggerConfigName: String) : AbstractFil
}
}
+ override fun getOnMismatch(): Filter.Result {
+ return Filter.Result.DENY
+ }
+
+ override fun getOnMatch(): Filter.Result {
+ return Filter.Result.ACCEPT
+ }
+
override fun filter(
logger: Logger?,
level: Level?,