diff --git a/common/src/main/java/org/embeddedt/modernfix/annotation/IgnoreOutsideDev.java b/common/src/main/java/org/embeddedt/modernfix/annotation/IgnoreOutsideDev.java new file mode 100644 index 00000000..ae4307c3 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/annotation/IgnoreOutsideDev.java @@ -0,0 +1,15 @@ +package org.embeddedt.modernfix.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * The config system will ignore mixins with this annotation when generating config options unless running + * in a dev environment. + */ +@Retention(RetentionPolicy.CLASS) +@Target(ElementType.TYPE) +public @interface IgnoreOutsideDev { +} diff --git a/common/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java b/common/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java index c27995f1..ca2fb8ca 100644 --- a/common/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java +++ b/common/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java @@ -97,7 +97,11 @@ public class ModernFixMixinPlugin implements IMixinConfigPlugin { Option option = instance.config.getEffectiveOptionForMixin(mixin); if (option == null) { - this.logger.error("No rules matched mixin '{}', treating as foreign and disabling!", mixin); + String msg = "No rules matched mixin '{}', treating as foreign and disabling!"; + if(ModernFixPlatformHooks.isDevEnv()) + this.logger.error(msg, mixin); + else + this.logger.debug(msg, mixin); return false; } diff --git a/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index 70229cfc..139cb832 100644 --- a/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -8,10 +8,14 @@ import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.embeddedt.modernfix.ModernFix; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.embeddedt.modernfix.annotation.IgnoreOutsideDev; +import org.embeddedt.modernfix.annotation.RequiresMod; import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; import org.objectweb.asm.ClassReader; import org.objectweb.asm.tree.AnnotationNode; import org.objectweb.asm.tree.ClassNode; +import org.spongepowered.asm.mixin.Mixin; import java.io.*; import java.nio.charset.StandardCharsets; @@ -47,9 +51,10 @@ public class ModernFixEarlyConfig { return ModernFixPlatformHooks.modPresent(modId); } - private static final String MIXIN_DESC = "Lorg/spongepowered/asm/mixin/Mixin;"; - private static final String MIXIN_CLIENT_ONLY_DESC = "Lorg/embeddedt/modernfix/annotation/ClientOnlyMixin;"; - private static final String MIXIN_REQUIRES_MOD_DESC = "Lorg/embeddedt/modernfix/annotation/RequiresMod;"; + private static final String MIXIN_DESC = Mixin.class.descriptorString(); + private static final String MIXIN_CLIENT_ONLY_DESC = ClientOnlyMixin.class.descriptorString(); + private static final String MIXIN_REQUIRES_MOD_DESC = RequiresMod.class.descriptorString(); + private static final String MIXIN_DEV_ONLY_DESC = IgnoreOutsideDev.class.descriptorString(); private static final Pattern PLATFORM_PREFIX = Pattern.compile("(forge|fabric|common)\\."); @@ -92,7 +97,7 @@ public class ModernFixEarlyConfig { reader.accept(node, ClassReader.SKIP_CODE | ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); if(node.invisibleAnnotations == null) return; - boolean isMixin = false, isClientOnly = false, requiredModPresent = true; + boolean isMixin = false, isClientOnly = false, requiredModPresent = true, isDevOnly = false; String requiredModId = ""; for(AnnotationNode annotation : node.invisibleAnnotations) { if(Objects.equals(annotation.desc, MIXIN_DESC)) { @@ -110,9 +115,11 @@ public class ModernFixEarlyConfig { break; } } + } else if(Objects.equals(annotation.desc, MIXIN_DEV_ONLY_DESC)) { + isDevOnly = true; } } - if(isMixin) { + if(isMixin && (!isDevOnly || ModernFixPlatformHooks.isDevEnv())) { String mixinClassName = sanitize(node.name.replace('/', '.')).replace("org.embeddedt.modernfix.mixin.", ""); if(!requiredModPresent) mixinsMissingMods.put(mixinClassName, requiredModId); @@ -121,10 +128,17 @@ public class ModernFixEarlyConfig { List mixinOptionNames = dotSplitter.splitToList(mixinClassName); StringBuilder optionBuilder = new StringBuilder(mixinClassName.length()); optionBuilder.append("mixin"); + // mixin.core, mixin.safety can be top-level, everything else must have a subcategory + boolean allowTopLevel; + if(mixinOptionNames.size() > 0) + allowTopLevel = mixinOptionNames.get(0).equals("core") || mixinOptionNames.get(0).equals("safety"); + else + allowTopLevel = false; for(int i = 0; i < mixinOptionNames.size() - 1; i++) { optionBuilder.append('.'); optionBuilder.append(mixinOptionNames.get(i)); - mixinOptions.add(optionBuilder.toString()); + if(i > 0 || allowTopLevel) + mixinOptions.add(optionBuilder.toString()); } } } catch(IOException e) { @@ -152,9 +166,8 @@ public class ModernFixEarlyConfig { private static final ImmutableMap DEFAULT_SETTING_OVERRIDES = new DefaultSettingMapBuilder() .put("mixin.perf.dynamic_resources", false) .put("mixin.feature.direct_stack_trace", false) - .put("mixin.perf.rewrite_registry", false) + .putConditionally(ModernFixPlatformHooks::isDevEnv, "mixin.perf.rewrite_registry", false) .put("mixin.perf.clear_mixin_classinfo", false) - .put("mixin.perf.compress_blockstate", false) .put("mixin.bugfix.packet_leak", false) .put("mixin.perf.deduplicate_location", false) .put("mixin.perf.dynamic_entity_renderers", false) diff --git a/fabric/build.gradle b/fabric/build.gradle index f93bd8b8..bec736e5 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -40,7 +40,7 @@ dependencies { modIncludeImplementation(fabricApi.module("fabric-models-v0", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' } modImplementation(fabricApi.module("fabric-resource-loader-v0", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' } modImplementation(fabricApi.module("fabric-data-generation-api-v1", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' } - modCompileOnly("com.terraformersmc:modmenu:${rootProject.modmenu_version}") { transitive false } + modImplementation("com.terraformersmc:modmenu:${rootProject.modmenu_version}") { transitive false } modImplementation "curse.maven:spark-361579:${rootProject.spark_version}" modRuntimeOnly("net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}") { exclude group: 'net.fabricmc', module: 'fabric-loader' } // Remove the next line if you don't want to depend on the API diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/rewrite_registry/ForgeRegistryMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/rewrite_registry/ForgeRegistryMixin.java index 69a30123..591be0f4 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/rewrite_registry/ForgeRegistryMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/rewrite_registry/ForgeRegistryMixin.java @@ -5,6 +5,7 @@ import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.registries.ForgeRegistry; +import org.embeddedt.modernfix.annotation.IgnoreOutsideDev; import org.embeddedt.modernfix.forge.registry.FastForgeRegistry; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -16,6 +17,7 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = ForgeRegistry.class, remap = false) +@IgnoreOutsideDev public class ForgeRegistryMixin { @Shadow @Final diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/rewrite_registry/ForgeRegistrySnapshotMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/rewrite_registry/ForgeRegistrySnapshotMixin.java index 8421e5cf..a538a112 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/rewrite_registry/ForgeRegistrySnapshotMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/rewrite_registry/ForgeRegistrySnapshotMixin.java @@ -4,6 +4,7 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.registries.ForgeRegistry; +import org.embeddedt.modernfix.annotation.IgnoreOutsideDev; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; @@ -16,6 +17,7 @@ import java.util.Map; import java.util.Set; @Mixin(ForgeRegistry.Snapshot.class) +@IgnoreOutsideDev public class ForgeRegistrySnapshotMixin { @Shadow @Final @Mutable public Map ids;