From 26b0f3567ef4351167b46fc1d11f8088ac2eccd5 Mon Sep 17 00:00:00 2001
From: Sollace <sollacea@gmail.com>
Date: Sun, 27 Mar 2022 00:36:47 +0200
Subject: [PATCH] Fixed batponies' vision giving strange results on higher
 brightness settings

---
 .../unicopia/client/BatEyesApplicator.java    | 35 ++++++++++++++
 .../unicopia/client/UnicopiaClient.java       |  2 +-
 .../mixin/client/MixinGameRenderer.java       | 10 +++-
 .../client/MixinLightmapTextureManager.java   | 46 -------------------
 src/main/resources/unicopia.mixin.json        |  1 -
 5 files changed, 45 insertions(+), 49 deletions(-)
 create mode 100644 src/main/java/com/minelittlepony/unicopia/client/BatEyesApplicator.java
 delete mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/client/MixinLightmapTextureManager.java

diff --git a/src/main/java/com/minelittlepony/unicopia/client/BatEyesApplicator.java b/src/main/java/com/minelittlepony/unicopia/client/BatEyesApplicator.java
new file mode 100644
index 00000000..a3191d17
--- /dev/null
+++ b/src/main/java/com/minelittlepony/unicopia/client/BatEyesApplicator.java
@@ -0,0 +1,35 @@
+package com.minelittlepony.unicopia.client;
+
+import com.minelittlepony.unicopia.EquinePredicates;
+
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.entity.effect.StatusEffectInstance;
+import net.minecraft.entity.effect.StatusEffects;
+import net.minecraft.entity.player.PlayerEntity;
+
+public class BatEyesApplicator {
+
+    public static final BatEyesApplicator INSTANCE = new BatEyesApplicator();
+
+    private boolean batEyesApplied;
+
+    private final MinecraftClient client = MinecraftClient.getInstance();
+
+    public void enable() {
+        if (client.world != null) {
+            PlayerEntity player = client.player;
+            if (!player.hasStatusEffect(StatusEffects.NIGHT_VISION) && EquinePredicates.PLAYER_BAT.test(player)) {
+                player.addStatusEffect(new StatusEffectInstance(StatusEffects.NIGHT_VISION, 1, 1, false, false));
+                batEyesApplied = true;
+            }
+        }
+    }
+
+    public void disable() {
+        if (batEyesApplied) {
+            client.player.removeStatusEffect(StatusEffects.NIGHT_VISION);
+            batEyesApplied = false;
+        }
+    }
+
+}
diff --git a/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java b/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java
index 931f81b1..81332d7f 100644
--- a/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java
+++ b/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java
@@ -52,7 +52,7 @@ public class UnicopiaClient implements ClientModInitializer {
     }
 
     public static float getWorldBrightness(float initial) {
-        return initial > 0 ? 3 : 2;
+        return 0.6F;
     }
 
     @Override
diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinGameRenderer.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinGameRenderer.java
index 6b0b9a9b..702d9204 100644
--- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinGameRenderer.java
+++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinGameRenderer.java
@@ -7,6 +7,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
 
 import com.minelittlepony.unicopia.EquinePredicates;
+import com.minelittlepony.unicopia.client.BatEyesApplicator;
 import com.minelittlepony.unicopia.client.UnicopiaClient;
 import net.minecraft.client.render.Camera;
 import net.minecraft.client.render.GameRenderer;
@@ -27,8 +28,15 @@ abstract class MixinGameRenderer implements AutoCloseable, SynchronousResourceRe
 
     @Inject(method = "renderWorld(FJLnet/minecraft/client/util/math/MatrixStack;)V",
             at = @At("HEAD"))
-    private void onRenderWorld(float tickDelta, long limitTime, MatrixStack matrices, CallbackInfo info) {
+    private void beforeRenderWorld(float tickDelta, long limitTime, MatrixStack matrices, CallbackInfo info) {
         UnicopiaClient.getCamera().ifPresent(c -> matrices.multiply(Vec3f.POSITIVE_Z.getDegreesQuaternion(c.calculateRoll())));
+        BatEyesApplicator.INSTANCE.enable();
+    }
+
+    @Inject(method = "renderWorld(FJLnet/minecraft/client/util/math/MatrixStack;)V",
+            at = @At("RETURN"))
+    private void afterRenderWorld(float tickDelta, long limitTime, MatrixStack matrices, CallbackInfo info) {
+        BatEyesApplicator.INSTANCE.disable();
     }
 
     @Inject(method = "getNightVisionStrength(Lnet/minecraft/entity/LivingEntity;F)F",
diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinLightmapTextureManager.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinLightmapTextureManager.java
deleted file mode 100644
index 3be24d7b..00000000
--- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinLightmapTextureManager.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.minelittlepony.unicopia.mixin.client;
-
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.ModifyVariable;
-
-import com.minelittlepony.unicopia.EquinePredicates;
-
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.render.LightmapTextureManager;
-import net.minecraft.entity.effect.StatusEffectInstance;
-import net.minecraft.entity.effect.StatusEffects;
-import net.minecraft.entity.player.PlayerEntity;
-
-@Mixin(value = LightmapTextureManager.class, priority = 999)
-abstract class MixinLightmapTextureManager implements AutoCloseable {
-
-    private @Shadow boolean dirty;
-    private @Shadow @Final MinecraftClient client;
-
-    private boolean batEyesApplied;
-
-    @ModifyVariable(method = "update(F)V", at = @At(value = "HEAD"), argsOnly = true)
-    private float beforeUpdate(float delta) {
-        if (dirty && client.world != null) {
-            PlayerEntity player = client.player;
-            if (!player.hasStatusEffect(StatusEffects.NIGHT_VISION) && EquinePredicates.PLAYER_BAT.test(player)) {
-                player.addStatusEffect(new StatusEffectInstance(StatusEffects.NIGHT_VISION, 1, 1, false, false));
-                batEyesApplied = true;
-            }
-        }
-
-        return delta;
-    }
-
-    @ModifyVariable(method = "update(F)V", at = @At(value = "RETURN"), argsOnly = true)
-    private float afterUpdate(float delta) {
-        if (batEyesApplied) {
-            client.player.removeStatusEffect(StatusEffects.NIGHT_VISION);
-            batEyesApplied = false;
-        }
-        return delta;
-    }
-}
diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json
index ebb9410e..d7b89ee6 100644
--- a/src/main/resources/unicopia.mixin.json
+++ b/src/main/resources/unicopia.mixin.json
@@ -41,7 +41,6 @@
     "client.MixinItem",
     "client.MixinItemModels",
     "client.MixinKeyboardInput",
-    "client.MixinLightmapTextureManager",
     "client.MixinLivingEntityRenderer",
     "client.MixinMouse",
     "client.MixinPlayerEntityRenderer",