From c9c630ac11155c6a0cbbd41cfdc47e05ec13de9c Mon Sep 17 00:00:00 2001 From: Martin Prokoph Date: Sat, 29 Mar 2025 18:45:19 +0100 Subject: [PATCH] fix: less invasive gradient injection - Should fix various compatibility issues with other mods --- .../midnightdust/blur/mixin/MixinScreen.java | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/common/src/main/java/eu/midnightdust/blur/mixin/MixinScreen.java b/common/src/main/java/eu/midnightdust/blur/mixin/MixinScreen.java index f2bf18a..8d8899d 100755 --- a/common/src/main/java/eu/midnightdust/blur/mixin/MixinScreen.java +++ b/common/src/main/java/eu/midnightdust/blur/mixin/MixinScreen.java @@ -1,13 +1,17 @@ package eu.midnightdust.blur.mixin; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import eu.midnightdust.blur.BlurInfo; import eu.midnightdust.blur.config.BlurConfig; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.text.Text; +import net.minecraft.util.Identifier; 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 org.spongepowered.asm.mixin.injection.Inject; @@ -20,18 +24,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; public abstract class MixinScreen { @Shadow @Final protected Text title; @Shadow protected MinecraftClient client; - @Shadow public abstract void renderInGameBackground(DrawContext context); @Shadow public int width; @Shadow public int height; + @Shadow protected abstract void applyBlur(); @Inject(at = @At("HEAD"), method = "render") public void blur$processScreenChange(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { Blur.onRender(context, width, height, this.client, delta); } - @Inject(at = @At("HEAD"), method = "renderInGameBackground") - public void blur$getBackgroundEnabled(DrawContext context, CallbackInfo ci) { - BlurInfo.screenHasBackground = true; // Test if the screen has a background - } @Inject(at = @At("HEAD"), method = "applyBlur", cancellable = true) public void blur$getBlurEnabled(CallbackInfo ci) { if (BlurConfig.forceDisabledScreens.contains(this.getClass().getCanonicalName())) { @@ -41,20 +41,23 @@ public abstract class MixinScreen { BlurInfo.screenHasBlur = true; // Test if the screen has blur } - @Inject(at = @At("HEAD"), method = "renderDarkening(Lnet/minecraft/client/gui/DrawContext;IIII)V", cancellable = true) - public void blur$applyGradient(DrawContext context, int x, int y, int width, int height, CallbackInfo ci) { - if (BlurConfig.useGradient) { // Replaces the background texture with a gradient - renderInGameBackground(context); - ci.cancel(); - } + @WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;renderBackgroundTexture(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/util/Identifier;IIFFII)V"), method = "renderDarkening(Lnet/minecraft/client/gui/DrawContext;IIII)V") + private void blur$applyGradient(DrawContext context, Identifier texture, int x, int y, float u, float v, int width, int height, Operation original) { + if (BlurConfig.useGradient) { + blur$renderGradient(context); // Replaces the background texture with a gradient + } else original.call(context, texture, x, y, u, v, width, height); } - @Inject(at = @At("HEAD"), method = "renderInGameBackground", cancellable = true) - public void blur$rotatedGradient(DrawContext context, CallbackInfo ci) { + @WrapOperation(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;fillGradient(IIIIII)V"), method = "renderInGameBackground") + public void blur$rotatedGradient(DrawContext context, int startX, int startY, int endX, int endY, int colorStart, int colorEnd, Operation original) { + blur$renderGradient(context); + } + @Unique + private void blur$renderGradient(DrawContext context) { + BlurInfo.screenHasBackground = true; // Test if the screen has a background if (BlurConfig.forceEnabledScreens.contains(this.getClass().getCanonicalName())) - ((ScreenAccessor)this).forceApplyBlur(); + this.applyBlur(); Blur.renderRotatedGradient(context, width, height); // Replaces the default gradient with our rotated one - ci.cancel(); } }