aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/de/hysky/skyblocker/injected/CustomGlowInfo.java8
-rw-r--r--src/main/java/de/hysky/skyblocker/mixins/RenderLayerMultiPhaseMixin.java20
-rw-r--r--src/main/java/de/hysky/skyblocker/mixins/RenderPhaseDepthTestMixin.java49
-rw-r--r--src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java8
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/render/SkyblockerRenderLayers.java4
5 files changed, 88 insertions, 1 deletions
diff --git a/src/main/java/de/hysky/skyblocker/injected/CustomGlowInfo.java b/src/main/java/de/hysky/skyblocker/injected/CustomGlowInfo.java
new file mode 100644
index 00000000..fd1ca401
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/injected/CustomGlowInfo.java
@@ -0,0 +1,8 @@
+package de.hysky.skyblocker.injected;
+
+public interface CustomGlowInfo {
+
+ default boolean atLeastOneMobHasCustomGlow() {
+ return false;
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/RenderLayerMultiPhaseMixin.java b/src/main/java/de/hysky/skyblocker/mixins/RenderLayerMultiPhaseMixin.java
new file mode 100644
index 00000000..87d591de
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/RenderLayerMultiPhaseMixin.java
@@ -0,0 +1,20 @@
+package de.hysky.skyblocker.mixins;
+
+import org.objectweb.asm.Opcodes;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+
+import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
+
+import de.hysky.skyblocker.utils.render.SkyblockerRenderLayers;
+import net.minecraft.client.render.RenderLayer;
+import net.minecraft.client.render.RenderPhase.DepthTest;
+
+@Mixin(RenderLayer.MultiPhase.class)
+public class RenderLayerMultiPhaseMixin {
+
+ @ModifyExpressionValue(method = "method_34844", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/RenderLayer$MultiPhase;ALWAYS_DEPTH_TEST:Lnet/minecraft/client/render/RenderPhase$DepthTest;", opcode = Opcodes.GETSTATIC))
+ private static DepthTest skyblocker$modifyDepthTestForOutlineLayer(DepthTest depthTest) {
+ return SkyblockerRenderLayers.OUTLINE_ALWAYS;
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/RenderPhaseDepthTestMixin.java b/src/main/java/de/hysky/skyblocker/mixins/RenderPhaseDepthTestMixin.java
new file mode 100644
index 00000000..d90606db
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/RenderPhaseDepthTestMixin.java
@@ -0,0 +1,49 @@
+package de.hysky.skyblocker.mixins;
+
+import org.lwjgl.opengl.GL11;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.ModifyArg;
+
+import com.llamalad7.mixinextras.sugar.Local;
+import com.mojang.blaze3d.systems.RenderSystem;
+
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.render.RenderPhase;
+import net.minecraft.client.render.WorldRenderer;
+
+@Mixin(RenderPhase.DepthTest.class)
+public class RenderPhaseDepthTestMixin {
+
+ @ModifyArg(method = "<init>", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/RenderPhase;<init>(Ljava/lang/String;Ljava/lang/Runnable;Ljava/lang/Runnable;)V"), index = 1)
+ private static Runnable skyblocker$modifyOutlineAlwaysStartAction(Runnable original, @Local(argsOnly = true) String depthFunctionName) {
+ if (depthFunctionName.equals("outline_always")) {
+ return () -> {
+ WorldRenderer worldRenderer = MinecraftClient.getInstance().worldRenderer;
+
+ if (worldRenderer != null && worldRenderer.atLeastOneMobHasCustomGlow()) {
+ RenderSystem.enableDepthTest();
+ RenderSystem.depthFunc(GL11.GL_LEQUAL);
+ }
+ };
+ }
+
+ return original;
+ }
+
+ @ModifyArg(method = "<init>", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/RenderPhase;<init>(Ljava/lang/String;Ljava/lang/Runnable;Ljava/lang/Runnable;)V"), index = 2)
+ private static Runnable skyblocker$modifyOutlineAlwaysEndAction(Runnable original, @Local(argsOnly = true) String depthFunctionName) {
+ if (depthFunctionName.equals("outline_always")) {
+ return () -> {
+ WorldRenderer worldRenderer = MinecraftClient.getInstance().worldRenderer;
+
+ if (worldRenderer != null && worldRenderer.atLeastOneMobHasCustomGlow()) {
+ RenderSystem.disableDepthTest();
+ RenderSystem.depthFunc(GL11.GL_LEQUAL);
+ }
+ };
+ }
+
+ return original;
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java
index 01b1a0d6..c98104af 100644
--- a/src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java
@@ -15,6 +15,7 @@ import com.llamalad7.mixinextras.sugar.Local;
import com.llamalad7.mixinextras.sugar.Share;
import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef;
+import de.hysky.skyblocker.injected.CustomGlowInfo;
import de.hysky.skyblocker.skyblock.dungeon.LividColor;
import de.hysky.skyblocker.skyblock.entity.MobBoundingBoxes;
import de.hysky.skyblocker.skyblock.entity.MobGlow;
@@ -26,7 +27,7 @@ import net.minecraft.entity.Entity;
import net.minecraft.entity.decoration.ArmorStandEntity;
@Mixin(WorldRenderer.class)
-public class WorldRendererMixin {
+public class WorldRendererMixin implements CustomGlowInfo {
@Shadow
@Final
private MinecraftClient client;
@@ -81,6 +82,11 @@ public class WorldRendererMixin {
}
}
+ @Override
+ public boolean atLeastOneMobHasCustomGlow() {
+ return atLeastOneMobHasCustomGlow;
+ }
+
@Inject(method = "render", at = @At("TAIL"))
private void skyblocker$resetCustomGlowBool(CallbackInfo ci) {
atLeastOneMobHasCustomGlow = false;
diff --git a/src/main/java/de/hysky/skyblocker/utils/render/SkyblockerRenderLayers.java b/src/main/java/de/hysky/skyblocker/utils/render/SkyblockerRenderLayers.java
index 7724be1f..faa4eebc 100644
--- a/src/main/java/de/hysky/skyblocker/utils/render/SkyblockerRenderLayers.java
+++ b/src/main/java/de/hysky/skyblocker/utils/render/SkyblockerRenderLayers.java
@@ -1,5 +1,7 @@
package de.hysky.skyblocker.utils.render;
+import org.lwjgl.opengl.GL11;
+
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.RenderLayer.MultiPhase;
import net.minecraft.client.render.RenderLayer.MultiPhaseParameters;
@@ -9,6 +11,8 @@ import net.minecraft.client.render.VertexFormat.DrawMode;
import net.minecraft.client.render.VertexFormats;
public class SkyblockerRenderLayers {
+ public static final DepthTest OUTLINE_ALWAYS = new DepthTest("outline_always", GL11.GL_ALWAYS);
+
public static final MultiPhase FILLED = RenderLayer.of("filled", VertexFormats.POSITION_COLOR, DrawMode.TRIANGLE_STRIP, RenderLayer.CUTOUT_BUFFER_SIZE, false, true, MultiPhaseParameters.builder()
.program(RenderPhase.POSITION_COLOR_PROGRAM)
.layering(RenderPhase.VIEW_OFFSET_Z_LAYERING)