From da85c8bfe03bba8dfed1b730c6f1d8574235fb51 Mon Sep 17 00:00:00 2001 From: Delfayne <97418063+Delfayne@users.noreply.github.com> Date: Thu, 14 Dec 2023 13:01:44 +0900 Subject: [PATCH 1/6] Don't think Jackson is used --- build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/build.gradle b/build.gradle index 12ba3cf0..04611e59 100644 --- a/build.gradle +++ b/build.gradle @@ -106,7 +106,6 @@ dependencies { implementation 'zone.rong:mixinbooter:8.2' } - implementation("com.fasterxml.jackson.core:jackson-core:2.12.5") implementation("com.google.code.findbugs:jsr305:3.0.2") compileOnly rfg.deobf("curse.maven:industrial-craft-2-242638:3838713") From 85c920ff6b40b495d133b07196bbdccfd5f44c1b Mon Sep 17 00:00:00 2001 From: Delfayne <97418063+Delfayne@users.noreply.github.com> Date: Thu, 14 Dec 2023 13:16:39 +0900 Subject: [PATCH 2/6] Prototype dimension type mixin --- gradle.properties | 2 +- .../annotation/LateMixin.java | 12 ++ .../mixin/core/LateMixins.java | 18 ++ .../mixin/core/MixinConfigPlugin.java | 193 ++++++++++++++++++ .../mixin/forge/DimensionTypeMixin.java | 41 ++++ .../resources/mixins.advancedrocketry.json | 15 ++ .../mixins.advancedrocketry.late.json | 15 ++ 7 files changed, 295 insertions(+), 1 deletion(-) create mode 100644 src/main/java/zmaster587/advancedRocketry/annotation/LateMixin.java create mode 100644 src/main/java/zmaster587/advancedRocketry/mixin/core/LateMixins.java create mode 100644 src/main/java/zmaster587/advancedRocketry/mixin/core/MixinConfigPlugin.java create mode 100644 src/main/java/zmaster587/advancedRocketry/mixin/forge/DimensionTypeMixin.java create mode 100644 src/main/resources/mixins.advancedrocketry.json create mode 100644 src/main/resources/mixins.advancedrocketry.late.json diff --git a/gradle.properties b/gradle.properties index bfbeee7d..d576fd1d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -29,7 +29,7 @@ startGitRev=8e676bd use_spark = false # Boilerplate Options -use_mixins = false +use_mixins = true use_coremod = false use_assetmover = false diff --git a/src/main/java/zmaster587/advancedRocketry/annotation/LateMixin.java b/src/main/java/zmaster587/advancedRocketry/annotation/LateMixin.java new file mode 100644 index 00000000..f7108e35 --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/annotation/LateMixin.java @@ -0,0 +1,12 @@ +package zmaster587.advancedRocketry.annotation; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.CLASS; + +@Retention(CLASS) +@Target(TYPE) +public @interface LateMixin { +} diff --git a/src/main/java/zmaster587/advancedRocketry/mixin/core/LateMixins.java b/src/main/java/zmaster587/advancedRocketry/mixin/core/LateMixins.java new file mode 100644 index 00000000..dbcb982c --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/mixin/core/LateMixins.java @@ -0,0 +1,18 @@ +package zmaster587.advancedRocketry.mixin.core; + +import com.google.common.collect.ImmutableList; +import zmaster487.advancedRocketry.advancedrocketry.Reference; +import zone.rong.mixinbooter.ILateMixinLoader; + +import java.util.List; + +// https://github.com/embeddedt/VintageFix/blob/15291a5829ead82cf7dde9b482a2a2cc95ea45b7/src/main/java/org/embeddedt/vintagefix/core/LateMixins.java +public class LateMixins implements ILateMixinLoader { + static boolean atLateStage = false; + + @Override + public List getMixinConfigs() { + atLateStage = true; + return ImmutableList.of("mixins." + Reference.MOD_ID + ".late.json"); + } +} diff --git a/src/main/java/zmaster587/advancedRocketry/mixin/core/MixinConfigPlugin.java b/src/main/java/zmaster587/advancedRocketry/mixin/core/MixinConfigPlugin.java new file mode 100644 index 00000000..7b2ee1ca --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/mixin/core/MixinConfigPlugin.java @@ -0,0 +1,193 @@ +package zmaster587.advancedRocketry.mixin.core; + +import com.google.common.collect.ImmutableMap; +import net.minecraft.launchwrapper.Launch; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.tree.AnnotationNode; +import org.objectweb.asm.tree.ClassNode; +import org.spongepowered.asm.mixin.MixinEnvironment; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; +import zmaster487.advancedRocketry.advancedrocketry.Reference; + +import java.io.*; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.file.FileSystem; +import java.nio.file.*; +import java.util.*; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +// https://github.com/embeddedt/VintageFix/blob/15291a5829ead82cf7dde9b482a2a2cc95ea45b7/src/main/java/org/embeddedt/vintagefix/core/MixinConfigPlugin.java +public class MixinConfigPlugin implements IMixinConfigPlugin { + private static final Logger LOGGER = LogManager.getLogger(Reference.NAME + " Mixin Loader"); + + private static final String PACKAGE_PREFIX = "zmaster587.advancedRocketry."; + + private static final ImmutableMap> MIXIN_PROCESSING_MAP = ImmutableMap.>builder() + .put("Lorg/spongepowered/asm/mixin/Mixin;", p -> p.valid = true) + .put("Lorg/dv/minecraft/logisticsbridge/annotation/LateMixin;", p -> p.isLate = true) + .build(); + + static class PotentialMixin { + String className; + boolean valid; + boolean isClientOnly; + boolean isLate; + } + + private static final List allMixins = new ArrayList<>(); + + private void considerClass(String pathString) throws IOException { + try (InputStream stream = MixinConfigPlugin.class.getClassLoader().getResourceAsStream("zmaster587/advancedRocketry/mixin/" + pathString)) { + if (stream == null) + return; + ClassReader reader = new ClassReader(stream); + ClassNode node = new ClassNode(); + reader.accept(node, ClassReader.SKIP_CODE | ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); + if (node.invisibleAnnotations == null) + return; + PotentialMixin mixin = new PotentialMixin(); + mixin.className = node.name.replace('/', '.'); + for (AnnotationNode annotation : node.invisibleAnnotations) { + Consumer consumer = MIXIN_PROCESSING_MAP.get(annotation.desc); + if (consumer != null) + consumer.accept(mixin); + } + if (mixin.valid) + allMixins.add(mixin); + } + } + + private static Properties config; + + private static String mixinClassNameToBaseName(String mixinClassName) { + String noPrefix = mixinClassName.replace(PACKAGE_PREFIX, ""); + return noPrefix.substring(0, noPrefix.lastIndexOf('.')); + } + + @SuppressWarnings("unchecked") + private static void writeOrderedProperties(Properties props, OutputStream stream) throws IOException { + try (PrintWriter writer = new PrintWriter(stream)) { + writer.println("# " + Reference.NAME + " config file"); + writer.println(); + List lst = new ArrayList<>((Set) (Set) props.keySet()); + lst.sort(Comparator.naturalOrder()); + for (String k : lst) { + writer.println(k + "=" + props.getProperty(k)); + } + } + } + + @Override + public void onLoad(String s) { + if (allMixins.isEmpty()) { + try { + URI uri = Objects.requireNonNull(MixinConfigPlugin.class.getResource("/mixins." + Reference.MOD_ID + ".json")).toURI(); + FileSystem fs; + try { + fs = FileSystems.getFileSystem(uri); + } catch (FileSystemNotFoundException var11) { + fs = FileSystems.newFileSystem(uri, Collections.emptyMap()); + } + List list; + Path basePath = fs.getPath("zmaster587", "advancedRocketry", "mixin").toAbsolutePath(); + try (Stream stream = Files.walk(basePath)) { + list = stream.collect(Collectors.toList()); + } + for (Path p : list) { + if (p == null) + continue; + p = basePath.relativize(p.toAbsolutePath()); + String pathString = p.toString(); + if (pathString.endsWith(".class")) { + considerClass(pathString); + } + } + } catch (IOException | URISyntaxException e) { + throw new RuntimeException(e); + } + LOGGER.info("Found {} mixins", allMixins.size()); + config = new Properties(); + File targetConfig = new File(Launch.minecraftHome, "config" + File.separator + Reference.MOD_ID + ".properties"); + try { + if (targetConfig.exists()) { + try (InputStream stream = Files.newInputStream(targetConfig.toPath())) { + config.load(stream); + } catch (IllegalArgumentException ignored) { + } + } + for (PotentialMixin m : allMixins) { + String baseName = mixinClassNameToBaseName(m.className); + if (!config.containsKey(baseName)) { + LOGGER.warn("Added missing entry '{}' to config file", baseName); + config.put(baseName, "true"); + } + } + try (OutputStream stream = Files.newOutputStream(targetConfig.toPath())) { + writeOrderedProperties(config, stream); + } + LOGGER.info("Successfully saved config file"); + } catch (IOException e) { + LOGGER.error("Exception handling config", e); + } + } + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetName, String className) { + return true; + } + + @Override + public void acceptTargets(Set set, Set set1) { + } + + public static boolean isMixinClassApplied(String name) { + String baseName = mixinClassNameToBaseName(name); + boolean isEnabled = Boolean.parseBoolean(config.getProperty(baseName, "")); + if (!isEnabled) { + LOGGER.warn("Not applying mixin '{}' as '{}' is disabled in config", name, baseName); + } + return isEnabled; + } + + @Override + public List getMixins() { + MixinEnvironment.Phase phase = MixinEnvironment.getCurrentEnvironment().getPhase(); + if (phase == MixinEnvironment.Phase.DEFAULT) { + MixinEnvironment.Side side = MixinEnvironment.getCurrentEnvironment().getSide(); + List list = allMixins.stream() + .filter(p -> !p.isClientOnly || side == MixinEnvironment.Side.CLIENT) + .filter(p -> p.isLate == LateMixins.atLateStage) + .map(p -> p.className) + .filter(MixinConfigPlugin::isMixinClassApplied) + .map(clz -> clz.replace("zmaster587.advancedRocketry.mixin.", "")) + .collect(Collectors.toList()); + for (String mixin : list) { + LOGGER.debug("loading {}", mixin); + } + return list; + } + return null; + } + + @Override + public void preApply(String s, ClassNode classNode, String s1, IMixinInfo iMixinInfo) { + + } + + @Override + public void postApply(String s, ClassNode classNode, String s1, IMixinInfo iMixinInfo) { + + } +} diff --git a/src/main/java/zmaster587/advancedRocketry/mixin/forge/DimensionTypeMixin.java b/src/main/java/zmaster587/advancedRocketry/mixin/forge/DimensionTypeMixin.java new file mode 100644 index 00000000..1c718996 --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/mixin/forge/DimensionTypeMixin.java @@ -0,0 +1,41 @@ +package zmaster587.advancedRocketry.mixin.forge; + +import net.minecraft.world.DimensionType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import zmaster587.advancedRocketry.AdvancedRocketry; +import zmaster587.advancedRocketry.dimension.DimensionManager; +import zmaster587.advancedRocketry.dimension.DimensionProperties; + +@Mixin(DimensionType.class) +public abstract class DimensionTypeMixin { + + @Inject(method = "getName", at = @At("RETURN"), cancellable = true) + public void onGetName(CallbackInfoReturnable ci) { + + AdvancedRocketry.logger.info("DimensionTypeMixin"); + + DimensionProperties dimensionProperties = DimensionManager.getInstance().getDimensionProperties(getId()); + + AdvancedRocketry.logger.info("Found dimensionProperties: " + dimensionProperties); + + AdvancedRocketry.logger.info("Found dimensionProperties with name: " + dimensionProperties.getName()); + + if (dimensionProperties == DimensionManager.overworldProperties) { + + AdvancedRocketry.logger.info("Seems to be overworld, returning"); + return; + } + + AdvancedRocketry.logger.info("Returning with dim name"); + + ci.setReturnValue(dimensionProperties.getName()); + } + + @Shadow + abstract int getId(); + +} diff --git a/src/main/resources/mixins.advancedrocketry.json b/src/main/resources/mixins.advancedrocketry.json new file mode 100644 index 00000000..e7f5c1ff --- /dev/null +++ b/src/main/resources/mixins.advancedrocketry.json @@ -0,0 +1,15 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "zmaster587.advancedRocketry.mixin", + "refmap": "mixins.advancedrocketry.refmap.json", + "plugin": "zmaster587.advancedRocketry.mixin.core.MixinConfigPlugin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + ], + "client": [ + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/src/main/resources/mixins.advancedrocketry.late.json b/src/main/resources/mixins.advancedrocketry.late.json new file mode 100644 index 00000000..e7f5c1ff --- /dev/null +++ b/src/main/resources/mixins.advancedrocketry.late.json @@ -0,0 +1,15 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "zmaster587.advancedRocketry.mixin", + "refmap": "mixins.advancedrocketry.refmap.json", + "plugin": "zmaster587.advancedRocketry.mixin.core.MixinConfigPlugin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + ], + "client": [ + ], + "injectors": { + "defaultRequire": 1 + } +} From 57cd2062f5d772ed3915fd881144efe0b893a608 Mon Sep 17 00:00:00 2001 From: Li Date: Thu, 14 Dec 2023 14:33:52 +0700 Subject: [PATCH 3/6] Update Gradle and RFG --- build.gradle | 4 +--- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 04611e59..b76cba07 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { id 'maven-publish' id 'org.jetbrains.gradle.plugin.idea-ext' version '1.1.7' id 'eclipse' - id 'com.gtnewhorizons.retrofuturagradle' version '1.3.19' + id 'com.gtnewhorizons.retrofuturagradle' version '1.3.26' id 'com.matthewprenger.cursegradle' version '1.4.0' } @@ -21,8 +21,6 @@ archivesBaseName = project.archives_base_name java { toolchain { languageVersion.set(JavaLanguageVersion.of(8)) - // Azul covers the most platforms for Java 8 toolchains, crucially including MacOS arm64 - vendor.set(AZUL) } // Generate sources and javadocs jars when building and publishing // withSourcesJar() diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index fc6f9a39..e97d07a7 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 18eda8e078acd7110a8ad422544678f9fc7bcdb3 Mon Sep 17 00:00:00 2001 From: Li Date: Thu, 14 Dec 2023 14:34:36 +0700 Subject: [PATCH 4/6] Update MixinBooter (8.2 -> 8.9) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b76cba07..b31d7b64 100644 --- a/build.gradle +++ b/build.gradle @@ -122,7 +122,7 @@ dependencies { if (project.use_mixins.toBoolean()) { // Change your mixin refmap name here: - String mixin = modUtils.enableMixins('zone.rong:mixinbooter:8.2', "mixins.${project.archives_base_name}.refmap.json") + String mixin = modUtils.enableMixins('zone.rong:mixinbooter:8.9', "mixins.${project.archives_base_name}.refmap.json") api(mixin) { transitive = false } From 6c8f0796f50eed219bd7f83e6ed69c3f13b19742 Mon Sep 17 00:00:00 2001 From: Li Date: Thu, 14 Dec 2023 14:35:03 +0700 Subject: [PATCH 5/6] Fix gradle properties to include CoreMod info --- gradle.properties | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index d576fd1d..0c3825d8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -30,12 +30,15 @@ use_spark = false # Boilerplate Options use_mixins = true -use_coremod = false +use_coremod = true use_assetmover = false # Access Transformer files should be in the root of `resources` folder and with the filename formatted as: `{archives_base_name}_at.cfg` use_access_transformer = true +# Is Coremod include mod or not, and coremod name +include_mod = true +coremod_plugin_class_name = zmaster587.advancedRocketry.asm.AdvancedRocketryPlugin # Dependencies libVulpesVersion=0.4.2 From 678bcdf72da950bfe02de20b5a314f73364f1e5c Mon Sep 17 00:00:00 2001 From: Li Date: Thu, 14 Dec 2023 14:36:26 +0700 Subject: [PATCH 6/6] Fix Early mixin load in wrong stage, add stub LateMixin for later use + refactor --- .../asm/AdvancedRocketryPlugin.java | 9 +- .../advancedRocketry/asm/LateMixin.java | 13 ++ .../early/minecraft}/DimensionTypeMixin.java | 4 +- .../mixin/core/LateMixins.java | 18 -- .../mixin/core/MixinConfigPlugin.java | 193 ------------------ .../resources/mixins.advancedrocketry.json | 4 +- .../mixins.advancedrocketry.late.json | 3 +- 7 files changed, 26 insertions(+), 218 deletions(-) create mode 100644 src/main/java/zmaster587/advancedRocketry/asm/LateMixin.java rename src/main/java/zmaster587/advancedRocketry/{mixin/forge => asm/mixin/early/minecraft}/DimensionTypeMixin.java (93%) delete mode 100644 src/main/java/zmaster587/advancedRocketry/mixin/core/LateMixins.java delete mode 100644 src/main/java/zmaster587/advancedRocketry/mixin/core/MixinConfigPlugin.java diff --git a/src/main/java/zmaster587/advancedRocketry/asm/AdvancedRocketryPlugin.java b/src/main/java/zmaster587/advancedRocketry/asm/AdvancedRocketryPlugin.java index 1fc9c90e..56b9c1ee 100644 --- a/src/main/java/zmaster587/advancedRocketry/asm/AdvancedRocketryPlugin.java +++ b/src/main/java/zmaster587/advancedRocketry/asm/AdvancedRocketryPlugin.java @@ -3,12 +3,15 @@ import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin.MCVersion; import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin.TransformerExclusions; +import zone.rong.mixinbooter.IEarlyMixinLoader; +import java.util.Collections; +import java.util.List; import java.util.Map; @TransformerExclusions(value = {"zmaster587.advancedRocketry.asm.ClassTransformer"}) @MCVersion("1.12.2") -public class AdvancedRocketryPlugin implements IFMLLoadingPlugin { +public class AdvancedRocketryPlugin implements IFMLLoadingPlugin, IEarlyMixinLoader { public AdvancedRocketryPlugin() { // TODO Auto-generated constructor stub @@ -41,4 +44,8 @@ public String getAccessTransformerClass() { return null; } + @Override + public List getMixinConfigs() { + return Collections.singletonList("mixins.advancedrocketry.json"); + } } diff --git a/src/main/java/zmaster587/advancedRocketry/asm/LateMixin.java b/src/main/java/zmaster587/advancedRocketry/asm/LateMixin.java new file mode 100644 index 00000000..3ea47e06 --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/asm/LateMixin.java @@ -0,0 +1,13 @@ +package zmaster587.advancedRocketry.asm; + +import zone.rong.mixinbooter.ILateMixinLoader; + +import java.util.Collections; +import java.util.List; + +public class LateMixin implements ILateMixinLoader { + @Override + public List getMixinConfigs() { + return Collections.singletonList("mixins.advancedrocketry.late.json"); + } +} diff --git a/src/main/java/zmaster587/advancedRocketry/mixin/forge/DimensionTypeMixin.java b/src/main/java/zmaster587/advancedRocketry/asm/mixin/early/minecraft/DimensionTypeMixin.java similarity index 93% rename from src/main/java/zmaster587/advancedRocketry/mixin/forge/DimensionTypeMixin.java rename to src/main/java/zmaster587/advancedRocketry/asm/mixin/early/minecraft/DimensionTypeMixin.java index 1c718996..74408570 100644 --- a/src/main/java/zmaster587/advancedRocketry/mixin/forge/DimensionTypeMixin.java +++ b/src/main/java/zmaster587/advancedRocketry/asm/mixin/early/minecraft/DimensionTypeMixin.java @@ -1,4 +1,4 @@ -package zmaster587.advancedRocketry.mixin.forge; +package zmaster587.advancedRocketry.asm.mixin.early.minecraft; import net.minecraft.world.DimensionType; import org.spongepowered.asm.mixin.Mixin; @@ -36,6 +36,6 @@ public void onGetName(CallbackInfoReturnable ci) { } @Shadow - abstract int getId(); + public abstract int getId(); } diff --git a/src/main/java/zmaster587/advancedRocketry/mixin/core/LateMixins.java b/src/main/java/zmaster587/advancedRocketry/mixin/core/LateMixins.java deleted file mode 100644 index dbcb982c..00000000 --- a/src/main/java/zmaster587/advancedRocketry/mixin/core/LateMixins.java +++ /dev/null @@ -1,18 +0,0 @@ -package zmaster587.advancedRocketry.mixin.core; - -import com.google.common.collect.ImmutableList; -import zmaster487.advancedRocketry.advancedrocketry.Reference; -import zone.rong.mixinbooter.ILateMixinLoader; - -import java.util.List; - -// https://github.com/embeddedt/VintageFix/blob/15291a5829ead82cf7dde9b482a2a2cc95ea45b7/src/main/java/org/embeddedt/vintagefix/core/LateMixins.java -public class LateMixins implements ILateMixinLoader { - static boolean atLateStage = false; - - @Override - public List getMixinConfigs() { - atLateStage = true; - return ImmutableList.of("mixins." + Reference.MOD_ID + ".late.json"); - } -} diff --git a/src/main/java/zmaster587/advancedRocketry/mixin/core/MixinConfigPlugin.java b/src/main/java/zmaster587/advancedRocketry/mixin/core/MixinConfigPlugin.java deleted file mode 100644 index 7b2ee1ca..00000000 --- a/src/main/java/zmaster587/advancedRocketry/mixin/core/MixinConfigPlugin.java +++ /dev/null @@ -1,193 +0,0 @@ -package zmaster587.advancedRocketry.mixin.core; - -import com.google.common.collect.ImmutableMap; -import net.minecraft.launchwrapper.Launch; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.tree.AnnotationNode; -import org.objectweb.asm.tree.ClassNode; -import org.spongepowered.asm.mixin.MixinEnvironment; -import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; -import org.spongepowered.asm.mixin.extensibility.IMixinInfo; -import zmaster487.advancedRocketry.advancedrocketry.Reference; - -import java.io.*; -import java.net.URI; -import java.net.URISyntaxException; -import java.nio.file.FileSystem; -import java.nio.file.*; -import java.util.*; -import java.util.function.Consumer; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -// https://github.com/embeddedt/VintageFix/blob/15291a5829ead82cf7dde9b482a2a2cc95ea45b7/src/main/java/org/embeddedt/vintagefix/core/MixinConfigPlugin.java -public class MixinConfigPlugin implements IMixinConfigPlugin { - private static final Logger LOGGER = LogManager.getLogger(Reference.NAME + " Mixin Loader"); - - private static final String PACKAGE_PREFIX = "zmaster587.advancedRocketry."; - - private static final ImmutableMap> MIXIN_PROCESSING_MAP = ImmutableMap.>builder() - .put("Lorg/spongepowered/asm/mixin/Mixin;", p -> p.valid = true) - .put("Lorg/dv/minecraft/logisticsbridge/annotation/LateMixin;", p -> p.isLate = true) - .build(); - - static class PotentialMixin { - String className; - boolean valid; - boolean isClientOnly; - boolean isLate; - } - - private static final List allMixins = new ArrayList<>(); - - private void considerClass(String pathString) throws IOException { - try (InputStream stream = MixinConfigPlugin.class.getClassLoader().getResourceAsStream("zmaster587/advancedRocketry/mixin/" + pathString)) { - if (stream == null) - return; - ClassReader reader = new ClassReader(stream); - ClassNode node = new ClassNode(); - reader.accept(node, ClassReader.SKIP_CODE | ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); - if (node.invisibleAnnotations == null) - return; - PotentialMixin mixin = new PotentialMixin(); - mixin.className = node.name.replace('/', '.'); - for (AnnotationNode annotation : node.invisibleAnnotations) { - Consumer consumer = MIXIN_PROCESSING_MAP.get(annotation.desc); - if (consumer != null) - consumer.accept(mixin); - } - if (mixin.valid) - allMixins.add(mixin); - } - } - - private static Properties config; - - private static String mixinClassNameToBaseName(String mixinClassName) { - String noPrefix = mixinClassName.replace(PACKAGE_PREFIX, ""); - return noPrefix.substring(0, noPrefix.lastIndexOf('.')); - } - - @SuppressWarnings("unchecked") - private static void writeOrderedProperties(Properties props, OutputStream stream) throws IOException { - try (PrintWriter writer = new PrintWriter(stream)) { - writer.println("# " + Reference.NAME + " config file"); - writer.println(); - List lst = new ArrayList<>((Set) (Set) props.keySet()); - lst.sort(Comparator.naturalOrder()); - for (String k : lst) { - writer.println(k + "=" + props.getProperty(k)); - } - } - } - - @Override - public void onLoad(String s) { - if (allMixins.isEmpty()) { - try { - URI uri = Objects.requireNonNull(MixinConfigPlugin.class.getResource("/mixins." + Reference.MOD_ID + ".json")).toURI(); - FileSystem fs; - try { - fs = FileSystems.getFileSystem(uri); - } catch (FileSystemNotFoundException var11) { - fs = FileSystems.newFileSystem(uri, Collections.emptyMap()); - } - List list; - Path basePath = fs.getPath("zmaster587", "advancedRocketry", "mixin").toAbsolutePath(); - try (Stream stream = Files.walk(basePath)) { - list = stream.collect(Collectors.toList()); - } - for (Path p : list) { - if (p == null) - continue; - p = basePath.relativize(p.toAbsolutePath()); - String pathString = p.toString(); - if (pathString.endsWith(".class")) { - considerClass(pathString); - } - } - } catch (IOException | URISyntaxException e) { - throw new RuntimeException(e); - } - LOGGER.info("Found {} mixins", allMixins.size()); - config = new Properties(); - File targetConfig = new File(Launch.minecraftHome, "config" + File.separator + Reference.MOD_ID + ".properties"); - try { - if (targetConfig.exists()) { - try (InputStream stream = Files.newInputStream(targetConfig.toPath())) { - config.load(stream); - } catch (IllegalArgumentException ignored) { - } - } - for (PotentialMixin m : allMixins) { - String baseName = mixinClassNameToBaseName(m.className); - if (!config.containsKey(baseName)) { - LOGGER.warn("Added missing entry '{}' to config file", baseName); - config.put(baseName, "true"); - } - } - try (OutputStream stream = Files.newOutputStream(targetConfig.toPath())) { - writeOrderedProperties(config, stream); - } - LOGGER.info("Successfully saved config file"); - } catch (IOException e) { - LOGGER.error("Exception handling config", e); - } - } - } - - @Override - public String getRefMapperConfig() { - return null; - } - - @Override - public boolean shouldApplyMixin(String targetName, String className) { - return true; - } - - @Override - public void acceptTargets(Set set, Set set1) { - } - - public static boolean isMixinClassApplied(String name) { - String baseName = mixinClassNameToBaseName(name); - boolean isEnabled = Boolean.parseBoolean(config.getProperty(baseName, "")); - if (!isEnabled) { - LOGGER.warn("Not applying mixin '{}' as '{}' is disabled in config", name, baseName); - } - return isEnabled; - } - - @Override - public List getMixins() { - MixinEnvironment.Phase phase = MixinEnvironment.getCurrentEnvironment().getPhase(); - if (phase == MixinEnvironment.Phase.DEFAULT) { - MixinEnvironment.Side side = MixinEnvironment.getCurrentEnvironment().getSide(); - List list = allMixins.stream() - .filter(p -> !p.isClientOnly || side == MixinEnvironment.Side.CLIENT) - .filter(p -> p.isLate == LateMixins.atLateStage) - .map(p -> p.className) - .filter(MixinConfigPlugin::isMixinClassApplied) - .map(clz -> clz.replace("zmaster587.advancedRocketry.mixin.", "")) - .collect(Collectors.toList()); - for (String mixin : list) { - LOGGER.debug("loading {}", mixin); - } - return list; - } - return null; - } - - @Override - public void preApply(String s, ClassNode classNode, String s1, IMixinInfo iMixinInfo) { - - } - - @Override - public void postApply(String s, ClassNode classNode, String s1, IMixinInfo iMixinInfo) { - - } -} diff --git a/src/main/resources/mixins.advancedrocketry.json b/src/main/resources/mixins.advancedrocketry.json index e7f5c1ff..0bdf5615 100644 --- a/src/main/resources/mixins.advancedrocketry.json +++ b/src/main/resources/mixins.advancedrocketry.json @@ -1,11 +1,11 @@ { "required": true, "minVersion": "0.8", - "package": "zmaster587.advancedRocketry.mixin", + "package": "zmaster587.advancedRocketry.asm.mixin.early", "refmap": "mixins.advancedrocketry.refmap.json", - "plugin": "zmaster587.advancedRocketry.mixin.core.MixinConfigPlugin", "compatibilityLevel": "JAVA_8", "mixins": [ + "minecraft.DimensionTypeMixin" ], "client": [ ], diff --git a/src/main/resources/mixins.advancedrocketry.late.json b/src/main/resources/mixins.advancedrocketry.late.json index e7f5c1ff..33d20861 100644 --- a/src/main/resources/mixins.advancedrocketry.late.json +++ b/src/main/resources/mixins.advancedrocketry.late.json @@ -1,9 +1,8 @@ { "required": true, "minVersion": "0.8", - "package": "zmaster587.advancedRocketry.mixin", + "package": "zmaster587.advancedRocketry.asm.mixin.late", "refmap": "mixins.advancedrocketry.refmap.json", - "plugin": "zmaster587.advancedRocketry.mixin.core.MixinConfigPlugin", "compatibilityLevel": "JAVA_8", "mixins": [ ],