diff --git a/src/main/java/org/embeddedt/modernfix/common/mixin/perf/optimize_surface_rules/SurfaceSystemMixin.java b/src/main/java/org/embeddedt/modernfix/common/mixin/perf/optimize_surface_rules/SurfaceSystemMixin.java index 9c48fe9a..9a3a8e64 100644 --- a/src/main/java/org/embeddedt/modernfix/common/mixin/perf/optimize_surface_rules/SurfaceSystemMixin.java +++ b/src/main/java/org/embeddedt/modernfix/common/mixin/perf/optimize_surface_rules/SurfaceSystemMixin.java @@ -37,11 +37,18 @@ public class SurfaceSystemMixin { @Local(ordinal = 0, argsOnly = true) BiomeManager manager, @Local(ordinal = 0, argsOnly = true) ChunkAccess chunk, @Share("chunkBiomeLookup") LocalRef lookupRef) { - var lookup = MFIX_LOOKUP_CACHE.get(); - BiomeManagerAccessor accessor = (BiomeManagerAccessor)manager; - lookup.prepare(accessor.mfix$getBiomeSource(), accessor.mfix$getZoomSeed(), chunk, manager); - lookupRef.set(lookup); - return lookup; + // If mods use their own BiomeManager subclass, we cannot trust them to use the same blurring as vanilla, + // so we cannot apply our optimized path + if (manager.getClass() == BiomeManager.class) { + var lookup = MFIX_LOOKUP_CACHE.get(); + BiomeManagerAccessor accessor = (BiomeManagerAccessor)manager; + lookup.prepare(accessor.mfix$getBiomeSource(), accessor.mfix$getZoomSeed(), chunk, manager); + lookupRef.set(lookup); + return lookup; + } else { + lookupRef.set(null); + return biomeGetter; + } } @Inject(method = "buildSurface", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/levelgen/SurfaceRules$RuleSource;apply(Ljava/lang/Object;)Ljava/lang/Object;", ordinal = 0)) @@ -60,7 +67,12 @@ public class SurfaceSystemMixin { @Redirect(method = "buildSurface", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/biome/BiomeManager;getBiome(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/core/Holder;")) private Holder useFasterLookup(BiomeManager instance, BlockPos pos, @Share("chunkBiomeLookup") LocalRef lookupRef) { - return lookupRef.get().apply(pos); + var lookup = lookupRef.get(); + if (lookup != null) { + return lookup.apply(pos); + } else { + return instance.getBiome(pos); + } } @Inject(method = "buildSurface", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/levelgen/SurfaceRules$Context;(Lnet/minecraft/world/level/levelgen/SurfaceSystem;Lnet/minecraft/world/level/levelgen/RandomState;Lnet/minecraft/world/level/chunk/ChunkAccess;Lnet/minecraft/world/level/levelgen/NoiseChunk;Ljava/util/function/Function;Lnet/minecraft/core/Registry;Lnet/minecraft/world/level/levelgen/WorldGenerationContext;)V")) diff --git a/src/main/java/org/embeddedt/modernfix/world/gen/ChunkBiomeLookup.java b/src/main/java/org/embeddedt/modernfix/world/gen/ChunkBiomeLookup.java index 03c9b6bb..f96b4309 100644 --- a/src/main/java/org/embeddedt/modernfix/world/gen/ChunkBiomeLookup.java +++ b/src/main/java/org/embeddedt/modernfix/world/gen/ChunkBiomeLookup.java @@ -97,6 +97,9 @@ public class ChunkBiomeLookup implements Function> { } public void dispose() { + if (this.fallbackManager == null) { + return; + } // Make sure we do not retain strong references to the biome holders Arrays.fill(biomes, null); this.fallbackManager = null;