From 2cbe77aa049e203a09ee37fab66aeaf9b1d4c65f Mon Sep 17 00:00:00 2001
From: Leijurv <leijurv@gmail.com>
Date: Mon, 4 Feb 2019 15:24:27 -0800
Subject: [PATCH] many fixes

---
 src/api/java/baritone/api/Settings.java       |  8 +++-
 .../mixins/MixinChunkRenderContainer.java     | 14 ++----
 .../launch/mixins/MixinRenderList.java        | 46 +++++++++++++++++++
 .../launch/mixins/MixinVboRenderList.java     | 46 +++++++++++++++++++
 src/launch/resources/mixins.baritone.json     |  2 +
 .../java/baritone/event/GameEventHandler.java | 10 ++--
 6 files changed, 113 insertions(+), 13 deletions(-)
 create mode 100644 src/launch/java/baritone/launch/mixins/MixinRenderList.java
 create mode 100644 src/launch/java/baritone/launch/mixins/MixinVboRenderList.java

diff --git a/src/api/java/baritone/api/Settings.java b/src/api/java/baritone/api/Settings.java
index a1ae9c71..db97999b 100644
--- a/src/api/java/baritone/api/Settings.java
+++ b/src/api/java/baritone/api/Settings.java
@@ -460,7 +460,13 @@ public final class Settings {
     public final Setting<Boolean> pathThroughCachedOnly = new Setting<>(false);
 
     /**
-     * 😎
+     * 😎 Render cached chunks as semitransparent.
+     * <p>
+     * Can be very useful on servers with low render distance.
+     * <p>
+     * Note that flowing water is cached as AVOID, which is rendered as lava. As you get closer, you may therefore see lava falls being replaced with water falls.
+     * <p>
+     * SOLID is rendered as stone in the overworld, netherrack in the nether, and end stone in the end
      */
     public Setting<Boolean> renderCachedChunks = new Setting<>(false);
 
diff --git a/src/launch/java/baritone/launch/mixins/MixinChunkRenderContainer.java b/src/launch/java/baritone/launch/mixins/MixinChunkRenderContainer.java
index e2c1e025..fef16d6b 100644
--- a/src/launch/java/baritone/launch/mixins/MixinChunkRenderContainer.java
+++ b/src/launch/java/baritone/launch/mixins/MixinChunkRenderContainer.java
@@ -38,15 +38,11 @@ public class MixinChunkRenderContainer {
             at = @At("HEAD")
     )
     private void preRenderChunk(RenderChunk renderChunkIn, CallbackInfo ci) {
-        if (Baritone.settings().renderCachedChunks.get()) {
-            if (Minecraft.getMinecraft().world.getChunk(renderChunkIn.getPosition()).isEmpty()) {
-                GlStateManager.enableAlpha();
-                GlStateManager.enableBlend();
-                GL14.glBlendColor(0, 0, 0, Baritone.settings().cachedChunksOpacity.get());
-                GlStateManager.tryBlendFuncSeparate(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA, GL_ONE, GL_ZERO);
-            } else {
-                GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
-            }
+        if (Baritone.settings().renderCachedChunks.get() && Minecraft.getMinecraft().world.getChunk(renderChunkIn.getPosition()).isEmpty()) {
+            GlStateManager.enableAlpha();
+            GlStateManager.enableBlend();
+            GL14.glBlendColor(0, 0, 0, Baritone.settings().cachedChunksOpacity.get());
+            GlStateManager.tryBlendFuncSeparate(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA, GL_ONE, GL_ZERO);
         }
     }
 }
diff --git a/src/launch/java/baritone/launch/mixins/MixinRenderList.java b/src/launch/java/baritone/launch/mixins/MixinRenderList.java
new file mode 100644
index 00000000..55d1da70
--- /dev/null
+++ b/src/launch/java/baritone/launch/mixins/MixinRenderList.java
@@ -0,0 +1,46 @@
+/*
+ * This file is part of Baritone.
+ *
+ * Baritone is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Baritone is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Baritone.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package baritone.launch.mixins;
+
+import baritone.Baritone;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.client.renderer.RenderList;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import static org.lwjgl.opengl.GL11.*;
+
+@Mixin(RenderList.class)
+public class MixinRenderList {
+
+    @Inject(
+            method = "renderChunkLayer",
+            at = @At(
+                    value = "INVOKE",
+                    target = "net/minecraft/client/renderer/GlStateManager.popMatrix()V"
+            )
+    )
+    private void renderChunkLayer(CallbackInfo info) {
+        if (Baritone.settings().renderCachedChunks.get()) {
+            // reset the blend func to normal (not dependent on constant alpha)
+            GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
+        }
+    }
+}
diff --git a/src/launch/java/baritone/launch/mixins/MixinVboRenderList.java b/src/launch/java/baritone/launch/mixins/MixinVboRenderList.java
new file mode 100644
index 00000000..c2c9fd8c
--- /dev/null
+++ b/src/launch/java/baritone/launch/mixins/MixinVboRenderList.java
@@ -0,0 +1,46 @@
+/*
+ * This file is part of Baritone.
+ *
+ * Baritone is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Baritone is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Baritone.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package baritone.launch.mixins;
+
+import baritone.Baritone;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.client.renderer.VboRenderList;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import static org.lwjgl.opengl.GL11.*;
+
+@Mixin(VboRenderList.class)
+public class MixinVboRenderList {
+
+    @Inject(
+            method = "renderChunkLayer",
+            at = @At(
+                    value = "INVOKE",
+                    target = "net/minecraft/client/renderer/GlStateManager.popMatrix()V"
+            )
+    )
+    private void renderChunkLayer(CallbackInfo info) {
+        if (Baritone.settings().renderCachedChunks.get()) {
+            // reset the blend func to normal (not dependent on constant alpha)
+            GlStateManager.tryBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
+        }
+    }
+}
diff --git a/src/launch/resources/mixins.baritone.json b/src/launch/resources/mixins.baritone.json
index aa9a724f..ddd3a718 100644
--- a/src/launch/resources/mixins.baritone.json
+++ b/src/launch/resources/mixins.baritone.json
@@ -23,6 +23,8 @@
     "MixinNetHandlerPlayClient",
     "MixinNetworkManager",
     "MixinRenderChunk",
+    "MixinRenderList",
+    "MixinVboRenderList",
     "MixinWorldClient"
   ]
 }
\ No newline at end of file
diff --git a/src/main/java/baritone/event/GameEventHandler.java b/src/main/java/baritone/event/GameEventHandler.java
index 1bf63502..84bac80f 100644
--- a/src/main/java/baritone/event/GameEventHandler.java
+++ b/src/main/java/baritone/event/GameEventHandler.java
@@ -47,9 +47,13 @@ public final class GameEventHandler implements IEventBus, Helper {
 
     @Override
     public final void onTick(TickEvent event) {
-        try {
-            baritone.bsi = new BlockStateInterface(baritone.getPlayerContext(), true);
-        } catch (Exception ex) {}
+        if (event.getType() == TickEvent.Type.IN) {
+            try {
+                baritone.bsi = new BlockStateInterface(baritone.getPlayerContext(), true);
+            } catch (Exception ex) {}
+        } else {
+            baritone.bsi = null;
+        }
         listeners.forEach(l -> l.onTick(event));
     }