diff --git a/common/src/main/java/org/redlance/dima_dencep/mods/rrls/mixins/workaround/ReloadableResourceManagerMixin.java b/common/src/main/java/org/redlance/dima_dencep/mods/rrls/mixins/workaround/ReloadableResourceManagerMixin.java new file mode 100644 index 0000000..1b22da5 --- /dev/null +++ b/common/src/main/java/org/redlance/dima_dencep/mods/rrls/mixins/workaround/ReloadableResourceManagerMixin.java @@ -0,0 +1,138 @@ +/* + * Copyright 2023 - 2024 dima_dencep. + * + * Licensed under the Open Software License, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * You may obtain a copy of the License at + * https://spdx.org/licenses/OSL-3.0.txt + */ + +package org.redlance.dima_dencep.mods.rrls.mixins.workaround; + +import com.google.common.collect.Lists; +import net.minecraft.Util; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiSpriteManager; +import net.minecraft.client.gui.font.FontManager; +import net.minecraft.client.resources.SplashManager; +import net.minecraft.client.resources.language.LanguageManager; +import net.minecraft.server.packs.PackResources; +import net.minecraft.server.packs.PackType; +import net.minecraft.server.packs.resources.CloseableResourceManager; +import net.minecraft.server.packs.resources.MultiPackResourceManager; +import net.minecraft.server.packs.resources.PreparableReloadListener; +import net.minecraft.server.packs.resources.ReloadInstance; +import net.minecraft.server.packs.resources.ReloadableResourceManager; +import net.minecraft.util.Unit; +import net.minecraft.util.profiling.InactiveProfiler; +import org.redlance.dima_dencep.mods.rrls.ConfigExpectPlatform; +import org.redlance.dima_dencep.mods.rrls.Rrls; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import java.util.function.BiConsumer; + +@Mixin(ReloadableResourceManager.class) +public class ReloadableResourceManagerMixin { + @Shadow + private CloseableResourceManager resources; + + @Unique + private static final Minecraft RRLS$MINECRAFT = Minecraft.getInstance(); + + @Unique + private final List rrls$listeners = Lists.newArrayList(); + + @Inject( + method = "registerReloadListener", + at = @At( + value = "TAIL" + ) + ) + public void rrls$initReloader(PreparableReloadListener listener, CallbackInfo ci) { + if (!ConfigExpectPlatform.hideType().forceClose()) { + return; + } + + if (listener instanceof FontManager fontManager && + !fontManager.fontSets.containsKey(Minecraft.DEFAULT_FONT) + ) { + rrls$reloadListener(fontManager, RRLS$MINECRAFT, + (unused, throwable) -> rrls$refreshScreen() + ); + } + + if (listener instanceof LanguageManager languageManager && + languageManager.getLanguages().size() <= 1 + ) { + rrls$reloadListener(languageManager, Util.backgroundExecutor(), (unused, throwable) -> {}); + } + + if (listener instanceof SplashManager splashManager && + splashManager.splashes.isEmpty() + ) { + rrls$reloadListener(splashManager, Util.backgroundExecutor(), + (unused, throwable) -> rrls$refreshScreen() + ); + } + + if (listener instanceof GuiSpriteManager spriteManager && + spriteManager.textureAtlas.texturesByName.isEmpty() + ) { + rrls$reloadListener(spriteManager, RRLS$MINECRAFT, (unused, throwable) -> {}); + } + } + + @Inject( + method = "createReload", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/packs/resources/SimpleReloadInstance;create(Lnet/minecraft/server/packs/resources/ResourceManager;Ljava/util/List;Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletableFuture;Z)Lnet/minecraft/server/packs/resources/ReloadInstance;" + ) + ) + private void rrls$initReloaders(Executor backgroundExecutor, Executor gameExecutor, CompletableFuture waitingFor, List resourcePacks, CallbackInfoReturnable cir) { + for (PreparableReloadListener listener : this.rrls$listeners) { + rrls$reloadListener(listener, RRLS$MINECRAFT, (unused, throwable) -> {}); + } + this.rrls$listeners.clear(); + } + + @Unique + private void rrls$reloadListener(PreparableReloadListener listener, Executor gameExecutor, BiConsumer action) { + try { + if (this.resources.getNamespaces().isEmpty()) { + this.resources = new MultiPackResourceManager(PackType.CLIENT_RESOURCES, + RRLS$MINECRAFT.getResourcePackRepository().openAllSelected() + ); + } + + Rrls.LOGGER.info("Quick reload listener '{}'", listener.getName()); + + listener.reload( + CompletableFuture::completedFuture, (ReloadableResourceManager) (Object) this, InactiveProfiler.INSTANCE, + InactiveProfiler.INSTANCE, Util.backgroundExecutor(), gameExecutor + ).whenCompleteAsync(action, Util.backgroundExecutor()); + + } catch (Throwable th) { + this.rrls$listeners.add(listener); + } + } + + @Unique + private void rrls$refreshScreen() { + if (ConfigExpectPlatform.reInitScreen() && RRLS$MINECRAFT.screen != null) { + RRLS$MINECRAFT.screen.init(RRLS$MINECRAFT, + RRLS$MINECRAFT.getWindow().getGuiScaledWidth(), RRLS$MINECRAFT.getWindow().getGuiScaledHeight() + ); + } + } +} diff --git a/common/src/main/java/org/redlance/dima_dencep/mods/rrls/mixins/workaround/SimpleReloadInstanceMixin.java b/common/src/main/java/org/redlance/dima_dencep/mods/rrls/mixins/workaround/SimpleReloadInstanceMixin.java deleted file mode 100644 index 96b2276..0000000 --- a/common/src/main/java/org/redlance/dima_dencep/mods/rrls/mixins/workaround/SimpleReloadInstanceMixin.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2023 - 2024 dima_dencep. - * - * Licensed under the Open Software License, Version 3.0 (the "License"); - * you may not use this file except in compliance with the License. - * - * You may obtain a copy of the License at - * https://spdx.org/licenses/OSL-3.0.txt - */ - -package org.redlance.dima_dencep.mods.rrls.mixins.workaround; - -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiSpriteManager; -import net.minecraft.client.gui.font.FontManager; -import net.minecraft.client.resources.SplashManager; -import net.minecraft.client.resources.language.LanguageManager; -import net.minecraft.server.packs.resources.PreparableReloadListener; -import net.minecraft.util.Unit; -import org.redlance.dima_dencep.mods.rrls.ConfigExpectPlatform; -import org.redlance.dima_dencep.mods.rrls.Rrls; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; - -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.CompletionStage; -import java.util.function.BiFunction; - -@Mixin(targets = "net.minecraft.server.packs.resources.SimpleReloadInstance$1") -public class SimpleReloadInstanceMixin { - @Shadow - @Final - PreparableReloadListener val$listener; - - @WrapOperation( - method = "wait", - at = @At( - value = "INVOKE", - target = "Ljava/util/concurrent/CompletableFuture;thenCombine(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletableFuture;" - ) - ) - public CompletableFuture rrls$async(CompletableFuture instance, CompletionStage other, BiFunction fn, Operation> original) { - if (ConfigExpectPlatform.hideType().forceClose() && rrls$filterListener(val$listener)) { - Rrls.LOGGER.info("Skip wait for {}!", val$listener.getName()); - - return CompletableFuture.completedFuture(fn.apply(null, null)); - } - - return original.call(instance, other, fn); - } - - @Unique - private static boolean rrls$filterListener(PreparableReloadListener listener) { - if (listener instanceof FontManager fontManager) { - return !fontManager.fontSets.containsKey(Minecraft.DEFAULT_FONT); - } - - if (listener instanceof LanguageManager languageManager) { - return languageManager.getLanguages().size() == 1; - } - - if (listener instanceof SplashManager splashManager) { - return splashManager.splashes.isEmpty(); - } - - if (listener instanceof GuiSpriteManager spriteManager) { - return spriteManager.textureAtlas.texturesByName.isEmpty(); - } - - return false; - } -} diff --git a/common/src/main/resources/rrls.accesswidener b/common/src/main/resources/rrls.accesswidener index a184e5f..5d76381 100644 --- a/common/src/main/resources/rrls.accesswidener +++ b/common/src/main/resources/rrls.accesswidener @@ -1,5 +1,4 @@ accessWidener v2 named -extendable method net/minecraft/server/packs/resources/SimplePreparableReloadListener reload (Lnet/minecraft/server/packs/resources/PreparableReloadListener$PreparationBarrier;Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/util/profiling/ProfilerFiller;Lnet/minecraft/util/profiling/ProfilerFiller;Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture; accessible method net/minecraft/client/gui/GuiGraphics flushIfUnmanaged ()V extendable method net/minecraft/client/gui/GuiGraphics flushIfUnmanaged ()V accessible method net/minecraft/client/gui/GuiGraphics flushIfManaged ()V diff --git a/common/src/main/resources/rrls.mixins.json b/common/src/main/resources/rrls.mixins.json index a74223f..b01789b 100644 --- a/common/src/main/resources/rrls.mixins.json +++ b/common/src/main/resources/rrls.mixins.json @@ -12,7 +12,7 @@ "compat.OverlayMixin", "compat.ServerPackManagerMixin", "workaround.GuiGraphicsMixin", - "workaround.SimpleReloadInstanceMixin", + "workaround.ReloadableResourceManagerMixin", "workaround.VertexBufferMixin", "workaround.EntityRenderDispatcherMixin" ], diff --git a/gradle.properties b/gradle.properties index d8d6cc2..2fed15f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ org.gradle.parallel=true forge_version = 21.0.167 # Mod Properties - mod_version = 5.0.6 + mod_version = 5.0.7 maven_group = org.redlance.dima_dencep.mods archives_base_name = rrls