diff options
8 files changed, 86 insertions, 9 deletions
diff --git a/build.gradle.kts b/build.gradle.kts index 5d38e7a..8f0aa55 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -239,6 +239,7 @@ tasks { "TweakOrder" to "0", "MixinConfigs" to "mixins.oneconfig.json", "TweakClass" to "org.spongepowered.asm.launch.MixinTweaker", + //"FMLCorePlugin" to "cc.polyfrost.oneconfig.internal.plugin.LoadingPlugin", "FMLCorePluginContainsFMLMod" to "lol" ) ) diff --git a/src/main/java/cc/polyfrost/oneconfig/internal/OneConfig.java b/src/main/java/cc/polyfrost/oneconfig/internal/OneConfig.java index 13e34ff..479192d 100644 --- a/src/main/java/cc/polyfrost/oneconfig/internal/OneConfig.java +++ b/src/main/java/cc/polyfrost/oneconfig/internal/OneConfig.java @@ -36,7 +36,7 @@ public class OneConfig { public static void preLaunch() { if (preLaunched) return; try { - OneConfig.class.getResourceAsStream("net/minecraft/world/World"); + Class.forName("net.minecraft.world.World"); LOGGER.warn("OneConfig is NOT obfuscated!"); isObfuscated = false; } catch (Exception ignored) { diff --git a/src/main/java/cc/polyfrost/oneconfig/internal/mixin/OptifineConfigMixin.java b/src/main/java/cc/polyfrost/oneconfig/internal/mixin/OptifineConfigMixin.java new file mode 100644 index 0000000..bc1d400 --- /dev/null +++ b/src/main/java/cc/polyfrost/oneconfig/internal/mixin/OptifineConfigMixin.java @@ -0,0 +1,21 @@ +package cc.polyfrost.oneconfig.internal.mixin; + +import cc.polyfrost.oneconfig.internal.plugin.OptifineConfigHook; +import org.spongepowered.asm.mixin.Dynamic; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Pseudo +@Mixin(targets = "Config", remap = false) +public class OptifineConfigMixin { + @Dynamic("OptiFine") + @Inject(method = "isFastRender", at = @At("HEAD"), cancellable = true) + private static void cancelFastRender(CallbackInfoReturnable<Boolean> cir) { + if (OptifineConfigHook.shouldNotApplyFastRender()) { + cir.setReturnValue(false); + } + } +} diff --git a/src/main/java/cc/polyfrost/oneconfig/internal/plugin/OptifineConfigHook.java b/src/main/java/cc/polyfrost/oneconfig/internal/plugin/OptifineConfigHook.java new file mode 100644 index 0000000..69d1f2e --- /dev/null +++ b/src/main/java/cc/polyfrost/oneconfig/internal/plugin/OptifineConfigHook.java @@ -0,0 +1,23 @@ +package cc.polyfrost.oneconfig.internal.plugin; + +import cc.polyfrost.oneconfig.gui.OneConfigGui; +import cc.polyfrost.oneconfig.libs.universal.UScreen; +import cc.polyfrost.oneconfig.utils.gui.GuiUtils; +import net.minecraft.client.gui.GuiScreen; + +import java.util.Optional; + +public class OptifineConfigHook { + + public static boolean shouldNotApplyFastRender() { + if (UScreen.getCurrentScreen() instanceof OneConfigGui) { + return true; + } + for (Optional<GuiScreen> screen : GuiUtils.getScreenQueue()) { + if (screen.isPresent() && screen.get() instanceof OneConfigGui) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/cc/polyfrost/oneconfig/utils/TickDelay.java b/src/main/java/cc/polyfrost/oneconfig/utils/TickDelay.java index b51ee85..b7ee2c8 100644 --- a/src/main/java/cc/polyfrost/oneconfig/utils/TickDelay.java +++ b/src/main/java/cc/polyfrost/oneconfig/utils/TickDelay.java @@ -7,14 +7,20 @@ import cc.polyfrost.oneconfig.libs.eventbus.Subscribe; /** * Schedules a Runnable to be called after a certain amount of ticks. + * + * If the amount of ticks is below 1, the Runnable will be called immediately. */ public class TickDelay { private final Runnable function; private int delay; public TickDelay(Runnable functionName, int ticks) { - EventManager.INSTANCE.register(this); - delay = ticks; + if (ticks < 1) { + functionName.run(); + } else { + EventManager.INSTANCE.register(this); + delay = ticks; + } function = functionName; } diff --git a/src/main/java/cc/polyfrost/oneconfig/utils/gui/GuiUtils.java b/src/main/java/cc/polyfrost/oneconfig/utils/gui/GuiUtils.java index d7b3bea..6ff0254 100644 --- a/src/main/java/cc/polyfrost/oneconfig/utils/gui/GuiUtils.java +++ b/src/main/java/cc/polyfrost/oneconfig/utils/gui/GuiUtils.java @@ -3,18 +3,24 @@ package cc.polyfrost.oneconfig.utils.gui; import cc.polyfrost.oneconfig.events.EventManager; import cc.polyfrost.oneconfig.events.event.RenderEvent; import cc.polyfrost.oneconfig.events.event.Stage; -import cc.polyfrost.oneconfig.utils.TickDelay; +import cc.polyfrost.oneconfig.gui.OneConfigGui; +import cc.polyfrost.oneconfig.libs.eventbus.Subscribe; import cc.polyfrost.oneconfig.libs.universal.UMinecraft; import cc.polyfrost.oneconfig.libs.universal.UScreen; -import cc.polyfrost.oneconfig.libs.eventbus.Subscribe; +import cc.polyfrost.oneconfig.utils.TickDelay; import net.minecraft.client.gui.GuiScreen; +import java.util.Deque; +import java.util.Optional; +import java.util.concurrent.ConcurrentLinkedDeque; + /** * A class containing utility methods for working with GuiScreens. */ public final class GuiUtils { private static long time = -1L; private static long deltaTime = 17L; + private static final Deque<Optional<GuiScreen>> screenQueue = new ConcurrentLinkedDeque<>(); static { EventManager.INSTANCE.register(new GuiUtils()); @@ -26,7 +32,26 @@ public final class GuiUtils { * @param screen the screen to display. */ public static void displayScreen(GuiScreen screen) { - new TickDelay(() -> UScreen.displayScreen(screen), 1); + displayScreen(screen, screen instanceof OneConfigGui ? 2 : 1); + } + + /** + * Displays a screen after the specified amount of ticks. + * + * @param screen the screen to display. + * @param ticks the amount of ticks to wait for before displaying the screen. + */ + public static void displayScreen(GuiScreen screen, int ticks) { + Optional<GuiScreen> optional = Optional.of(screen); + screenQueue.add(optional); + new TickDelay(() -> { + UScreen.displayScreen(screen); + screenQueue.remove(optional); + }, ticks); + } + + public static Deque<Optional<GuiScreen>> getScreenQueue() { + return screenQueue; } /** diff --git a/src/main/kotlin/cc/polyfrost/oneconfig/utils/dsl/GuiUtilsDSL.kt b/src/main/kotlin/cc/polyfrost/oneconfig/utils/dsl/GuiUtilsDSL.kt index 8596a8a..c70f686 100644 --- a/src/main/kotlin/cc/polyfrost/oneconfig/utils/dsl/GuiUtilsDSL.kt +++ b/src/main/kotlin/cc/polyfrost/oneconfig/utils/dsl/GuiUtilsDSL.kt @@ -4,8 +4,8 @@ import cc.polyfrost.oneconfig.utils.gui.GuiUtils import net.minecraft.client.gui.GuiScreen /** - * Displays the provided screen after a tick, preventing mouse sync issues. + * Displays a screen after the specified amount of ticks. * - * @see GuiUtils.displayScreen + * @param ticks the amount of ticks to wait for before displaying the screen. */ -fun GuiScreen.openScreen() = GuiUtils.displayScreen(this)
\ No newline at end of file +fun GuiScreen.openScreen(ticks: Int = 1) = GuiUtils.displayScreen(this, ticks)
\ No newline at end of file diff --git a/src/main/resources/mixins.oneconfig.json b/src/main/resources/mixins.oneconfig.json index 6b0b982..e1e0449 100644 --- a/src/main/resources/mixins.oneconfig.json +++ b/src/main/resources/mixins.oneconfig.json @@ -14,6 +14,7 @@ "MinecraftMixin", "NetHandlerPlayClientMixin", "NetworkManagerMixin", + "OptifineConfigMixin", "ShaderGroupAccessor", "VigilantMixin", "WorldClientMixin" |