From bc1c70bd0c22f016bbddea4b9c4c400c46c9afb7 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 18 Mar 2023 19:53:07 -0400 Subject: [PATCH] Remove (usually) redundant datapack reload on world creation screen The second, Forge-added reload is enough in all cases except when mods supply invalid datapacks. In this edge case, we will need to reload server resources when the user requests to revert to vanilla --- .../core/config/ModernFixEarlyConfig.java | 1 + .../CreateWorldScreenMixin.java | 32 +++++++++++++++++++ src/main/resources/modernfix.mixins.json | 1 + 3 files changed, 34 insertions(+) create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/perf/skip_first_datapack_reload/CreateWorldScreenMixin.java diff --git a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index be6c50c0..be57cbc9 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -24,6 +24,7 @@ public class ModernFixEarlyConfig { this.addMixinRule("feature.reduce_loading_screen_freezes", false); this.addMixinRule("feature.direct_stack_trace", false); this.addMixinRule("perf.fast_registry_validation", true); + this.addMixinRule("perf.skip_first_datapack_reload", true); this.addMixinRule("perf.use_integrated_resources", true); this.addMixinRule("perf.remove_biome_temperature_cache", true); this.addMixinRule("perf.reduce_blockstate_cache_rebuilds", true); diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/skip_first_datapack_reload/CreateWorldScreenMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/skip_first_datapack_reload/CreateWorldScreenMixin.java new file mode 100644 index 00000000..c2a6fa31 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/skip_first_datapack_reload/CreateWorldScreenMixin.java @@ -0,0 +1,32 @@ +package org.embeddedt.modernfix.mixin.perf.skip_first_datapack_reload; + +import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Lifecycle; +import net.minecraft.client.gui.screens.worldselection.CreateWorldScreen; +import net.minecraft.client.gui.screens.worldselection.WorldCreationContext; +import net.minecraft.core.RegistryAccess; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.WorldLoader; +import net.minecraft.world.level.levelgen.WorldGenSettings; +import org.embeddedt.modernfix.ModernFix; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; + +@Mixin(CreateWorldScreen.class) +public class CreateWorldScreenMixin { + @Redirect(method = "openFresh", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/WorldLoader;load(Lnet/minecraft/server/WorldLoader$InitConfig;Lnet/minecraft/server/WorldLoader$WorldDataSupplier;Lnet/minecraft/server/WorldLoader$ResultFactory;Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;")) + private static CompletableFuture doLoad(WorldLoader.InitConfig config, WorldLoader.WorldDataSupplier supplier, WorldLoader.ResultFactory factory, Executor backgroundExecutor, Executor mainExecutor) { + ModernFix.LOGGER.warn("Skipping first datapack reload"); + // Make sure to configure the pack repository as though the load happened + MinecraftServer.configurePackRepository(config.packConfig().packRepository(), config.packConfig().initialDataPacks(), config.packConfig().safeMode()); + Pair creationPair = supplier.get(null, null); + WorldGenSettings settings = creationPair.getFirst(); + // Don't load any datapack resources, since Forge is about to do it themselves + WorldCreationContext context = new WorldCreationContext(settings, Lifecycle.stable(), creationPair.getSecond(), null); + return CompletableFuture.completedFuture(context); + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index 75f54462..69846437 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -60,6 +60,7 @@ "perf.cache_model_materials.MultipartMixin", "perf.faster_texture_stitching.StitcherMixin", "perf.use_integrated_resources.LootTableHelperMixin", + "perf.skip_first_datapack_reload.CreateWorldScreenMixin", "perf.faster_singleplayer_load.MinecraftServerMixin" ], "injectors": {