From 639f0e2c1a763fff5531ee2016354d6c6bf88c1f Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 16 Dec 2024 09:56:38 -0500 Subject: [PATCH 1/4] Force-override updateY to be public Related: #494 --- .../perf/worldgen_allocation/SurfaceRulesContextMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/worldgen_allocation/SurfaceRulesContextMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/worldgen_allocation/SurfaceRulesContextMixin.java index 346722d5..c2be9c3d 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/worldgen_allocation/SurfaceRulesContextMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/worldgen_allocation/SurfaceRulesContextMixin.java @@ -35,7 +35,7 @@ public class SurfaceRulesContextMixin { * @reason Reuse supplier object instead of creating new ones every time */ @Overwrite - protected void updateY(int stoneDepthAbove, int stoneDepthBelow, int waterHeight, int blockX, int blockY, int blockZ) { + public void updateY(int stoneDepthAbove, int stoneDepthBelow, int waterHeight, int blockX, int blockY, int blockZ) { ++this.lastUpdateY; var getter = this.biome; if(getter == null) { From 98e6af87c11902f1d957967d47e04e09b48a9b4a Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 16 Dec 2024 17:00:32 -0500 Subject: [PATCH 2/4] Protect DynamicBakedModelProvider against null keys Related: #495 --- .../modernfix/dynamicresources/DynamicBakedModelProvider.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java index b602af14..d31ac804 100644 --- a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java +++ b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java @@ -145,6 +145,9 @@ public class DynamicBakedModelProvider implements Map Date: Mon, 23 Dec 2024 13:56:54 -0500 Subject: [PATCH 3/4] Detect Redirector and show warnings --- .../assets/modernfix/lang/en_us.json | 3 +- .../modernfix/forge/init/ModernFixForge.java | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/common/src/main/resources/assets/modernfix/lang/en_us.json b/common/src/main/resources/assets/modernfix/lang/en_us.json index 7964db1c..7ab5e016 100644 --- a/common/src/main/resources/assets/modernfix/lang/en_us.json +++ b/common/src/main/resources/assets/modernfix/lang/en_us.json @@ -5,7 +5,8 @@ "modernfix.no_lazydfu": "LazyDFU is not installed. If Minecraft needs to update game data from an older version, there may be noticeable lag.", "modernfix.no_ferritecore": "FerriteCore is not installed. Memory usage will be very high.", "modernfix.connectedness_dynresoruces": "Connectedness and ModernFix's dynamic resources option are not compatible. Remove Connectedness or disable dynamic resources in the ModernFix config.", - "modernfix.perf_mod_warning": "It is recommended to install the mods, but the warning(s) can be disabled in the ModernFix config.", + "modernfix.perf_mod_warning": "ModernFix mod warnings can be disabled by turning off mixin.feature.warn_missing_perf_mods in the ModernFix config.", + "modernfix.redirector_installed": "ModernFix detected that Redirector is installed. Redirector is known to cause many strange and hard-to-debug issues, and removing it is strongly recommended.", "modernfix.config": "ModernFix mixin config", "modernfix.config.done_restart": "Done (restart required)", "modernfix.config.wiki": "Open wiki", diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixForge.java b/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixForge.java index 347619d0..43c5ac4e 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixForge.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixForge.java @@ -24,6 +24,7 @@ import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegisterEvent; import net.minecraftforge.server.ServerLifecycleHooks; import org.apache.commons.lang3.tuple.Pair; +import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.core.ModernFixMixinPlugin; import org.embeddedt.modernfix.entity.EntityDataIDSyncHandler; @@ -89,6 +90,28 @@ public class ModernFixForge { Pair.of(ImmutableList.of("ferritecore"), "modernfix.no_ferritecore") ); + /** + * Redirector 5.0 redirects ALL Enum.values() calls to use a cached array, which breaks any code that mutates + * the given array, and causes all sorts of impossible to debug issues in mods. We complain loudly when it is + * installed now. + */ + private static boolean hasDangerousRedirectorInstalled() { + try { + var clz = Class.forName("com.teampotato.redirector.RedirectorLaunchPluginService"); + var pkg = clz.getPackage(); + if (pkg != null) { + String implVer = pkg.getImplementationVersion(); + var artifactVer = new DefaultArtifactVersion(implVer); + return artifactVer.getMajorVersion() == 5; + } + } catch(Exception e) { + if (!(e instanceof ClassNotFoundException)) { + ModernFix.LOGGER.error("Error detecting Redirector", e); + } + } + return false; + } + @SubscribeEvent public void commonSetup(FMLCommonSetupEvent event) { if(ModernFixMixinPlugin.instance.isOptionEnabled("feature.warn_missing_perf_mods.Warnings")) { @@ -101,6 +124,11 @@ public class ModernFixForge { ModLoader.get().addWarning(new ModLoadingWarning(ModLoadingContext.get().getActiveContainer().getModInfo(), ModLoadingStage.COMMON_SETUP, warning.getRight())); } } + if (hasDangerousRedirectorInstalled()) { + ModernFix.LOGGER.fatal("Redirector 5.x is detected, it is known to cause extremely hard-to-debug issues in other mods"); + ModLoader.get().addWarning(new ModLoadingWarning(ModLoadingContext.get().getActiveContainer().getModInfo(), ModLoadingStage.COMMON_SETUP, "modernfix.redirector_installed")); + atLeastOneWarning = true; + } if(atLeastOneWarning) ModLoader.get().addWarning(new ModLoadingWarning(ModLoadingContext.get().getActiveContainer().getModInfo(), ModLoadingStage.COMMON_SETUP, "modernfix.perf_mod_warning")); }); From 0b8eddbf25b6019de018d7bd8be77551734427fa Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Wed, 25 Dec 2024 15:45:11 -0500 Subject: [PATCH 4/4] Replace RS integration with generic model registry emulation Fixes patterns not rendering Related: #499 --- .../dynresources/ModelBakeEventHelper.java | 1 + .../rs/ClientSetupMixin.java | 38 ------------------- 2 files changed, 1 insertion(+), 38 deletions(-) delete mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/rs/ClientSetupMixin.java diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java b/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java index 3462c43e..fbfdab18 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java @@ -44,6 +44,7 @@ public class ModelBakeEventHelper { "vampirism", "elevatorid", "cfm", + "refinedstorage", "embers"); private final Map modelRegistry; private final Set topLevelModelLocations; diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/rs/ClientSetupMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/rs/ClientSetupMixin.java deleted file mode 100644 index e7865e4a..00000000 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/rs/ClientSetupMixin.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources.rs; - -import com.refinedmods.refinedstorage.render.BakedModelOverrideRegistry; -import com.refinedmods.refinedstorage.setup.ClientSetup; -import net.minecraft.client.resources.model.*; -import net.minecraft.resources.ResourceLocation; -import org.embeddedt.modernfix.ModernFixClient; -import org.embeddedt.modernfix.annotation.ClientOnlyMixin; -import org.embeddedt.modernfix.annotation.RequiresMod; -import org.embeddedt.modernfix.api.entrypoint.ModernFixClientIntegration; -import org.spongepowered.asm.mixin.Final; -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.CallbackInfo; - - -@Mixin(ClientSetup.class) -@RequiresMod("refinedstorage") -@ClientOnlyMixin -public class ClientSetupMixin { - @Shadow(remap = false) @Final private static BakedModelOverrideRegistry BAKED_MODEL_OVERRIDE_REGISTRY; - - @Inject(method = "registerBakedModelOverrides", at = @At("RETURN"), remap = false) - private static void addDynamicListener(CallbackInfo ci) { - ModernFixClient.CLIENT_INTEGRATIONS.add(new ModernFixClientIntegration() { - @Override - public BakedModel onBakedModelLoad(ResourceLocation location, UnbakedModel baseModel, BakedModel originalModel, ModelState state, ModelBakery bakery) { - BakedModelOverrideRegistry.BakedModelOverrideFactory factory = BAKED_MODEL_OVERRIDE_REGISTRY.get(location instanceof ModelResourceLocation ? new ResourceLocation(location.getNamespace(), location.getPath()) : location); - if(factory != null) - return factory.create(originalModel, bakery.getBakedTopLevelModels()); - else - return originalModel; - } - }); - } -}