From bb453a94b99b1ae797086bd183c90e94877558ec Mon Sep 17 00:00:00 2001
From: Leijurv <leijurv@gmail.com>
Date: Tue, 14 Aug 2018 15:04:41 -0700
Subject: [PATCH] beautiful settings

---
 src/main/java/baritone/bot/Baritone.java      |  1 +
 src/main/java/baritone/bot/Settings.java      | 97 ++++++++++++++++---
 .../bot/behavior/impl/PathingBehavior.java    | 12 +--
 .../baritone/bot/event/GameEventHandler.java  |  8 +-
 .../bot/pathing/calc/AStarPathFinder.java     |  7 +-
 .../baritone/bot/pathing/goals/GoalXZ.java    |  2 +-
 .../pathing/movement/CalculationContext.java  |  4 +-
 .../bot/pathing/movement/Movement.java        |  2 +-
 .../bot/pathing/movement/MovementHelper.java  |  3 +-
 .../bot/pathing/movement/MovementState.java   |  2 +-
 .../movement/movements/MovementAscend.java    |  2 +-
 .../movement/movements/MovementDescend.java   |  2 +-
 .../movement/movements/MovementFall.java      |  2 +-
 .../movement/movements/MovementPillar.java    |  2 +-
 .../movement/movements/MovementTraverse.java  |  2 +-
 .../bot/utils/BlockStateInterface.java        |  2 +-
 .../bot/utils/ExampleBaritoneControl.java     | 19 ++--
 src/main/java/baritone/bot/utils/Helper.java  |  2 +-
 .../bot/{ => utils}/InputOverrideHandler.java | 22 ++++-
 .../baritone/movement/MovementManager.java    |  2 +-
 20 files changed, 146 insertions(+), 49 deletions(-)
 rename src/main/java/baritone/bot/{ => utils}/InputOverrideHandler.java (82%)

diff --git a/src/main/java/baritone/bot/Baritone.java b/src/main/java/baritone/bot/Baritone.java
index 3bc352b9..e13cbade 100755
--- a/src/main/java/baritone/bot/Baritone.java
+++ b/src/main/java/baritone/bot/Baritone.java
@@ -22,6 +22,7 @@ import baritone.bot.behavior.impl.LookBehavior;
 import baritone.bot.behavior.impl.MemoryBehavior;
 import baritone.bot.behavior.impl.PathingBehavior;
 import baritone.bot.event.GameEventHandler;
+import baritone.bot.utils.InputOverrideHandler;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/src/main/java/baritone/bot/Settings.java b/src/main/java/baritone/bot/Settings.java
index ad93d7fe..0c135370 100644
--- a/src/main/java/baritone/bot/Settings.java
+++ b/src/main/java/baritone/bot/Settings.java
@@ -17,25 +17,98 @@
 
 package baritone.bot;
 
+import java.lang.reflect.Field;
+import java.lang.reflect.ParameterizedType;
+import java.util.*;
+
 /**
  * Baritone's settings
  *
  * @author leijurv
  */
 public class Settings {
-    public boolean allowBreak = true;
-    public boolean allowPlaceThrowaway = true;
-    public double costHeuristic = 4;
-    public boolean chuckCaching = false;
-    public boolean allowWaterBucketFall = true;
-    public int planningTickLookAhead = 150;
-    public boolean renderPath = true;
-    public boolean chatDebug = true;
-    public boolean chatControl = true;
-    public boolean fadePath = true;
-    public boolean slowPath = false;
+    public Setting<Boolean> allowBreak = new Setting<>(true);
+    public Setting<Boolean> allowPlaceThrowaway = new Setting<>(true);
+    public Setting<Double> costHeuristic = new <Double>Setting<Double>(4D);
+    public Setting<Boolean> chuckCaching = new Setting<>(false);
+    public Setting<Boolean> allowWaterBucketFall = new Setting<>(true);
+    public Setting<Integer> planningTickLookAhead = new Setting<>(150);
+    public Setting<Boolean> renderPath = new Setting<>(true);
+    public Setting<Boolean> chatDebug = new Setting<>(true);
+    public Setting<Boolean> chatControl = new Setting<>(true); // probably false in impact
+    public Setting<Boolean> fadePath = new Setting<>(false); // give this a better name in the UI, like "better path fps" idk
+    public Setting<Boolean> slowPath = new Setting<>(false);
 
-    Settings() {
+    public final Map<String, Setting<?>> byName;
+    public final List<Setting<?>> allSettings;
 
+    public class Setting<T> {
+        public T value;
+        private String name;
+        private Class<? extends T> klass;
+
+        private <V extends T> Setting(V value) {
+            this.value = value;
+        }
+
+        public final T get() {
+            return value;
+        }
+
+        public final String getName() {
+            return name;
+        }
+
+        public String toString() {
+            return name + ": " + value;
+        }
     }
+
+    // here be dragons
+
+    {
+        Field[] temp = getClass().getFields();
+        HashMap<String, Setting<?>> tmpByName = new HashMap<>();
+        List<Setting<?>> tmpAll = new ArrayList<>();
+        for (Field field : temp) {
+            if (field.getType().equals(Setting.class)) {
+                try {
+                    ParameterizedType param = (ParameterizedType) field.getGenericType();
+                    Class settingType = (Class<? extends Object>) param.getActualTypeArguments()[0];
+                    // can't always do field.get(this).value.getClass() because default value might be null
+                    Setting<?> setting = (Setting<? extends Object>) field.get(this);
+                    if (setting.value != null) {
+                        if (setting.value.getClass() != settingType) {
+                            throw new IllegalStateException("Generic mismatch" + setting.value + " " + setting.value.getClass() + " " + settingType);
+                        }
+                    }
+                    String name = field.getName();
+                    setting.name = name;
+                    setting.klass = settingType;
+                    if (tmpByName.containsKey(name)) {
+                        throw new IllegalStateException("Duplicate setting name");
+                    }
+                    tmpByName.put(name, setting);
+                    tmpAll.add(setting);
+                } catch (IllegalAccessException e) {
+                    throw new RuntimeException(e);
+                }
+
+            }
+        }
+        byName = Collections.unmodifiableMap(tmpByName);
+        allSettings = Collections.unmodifiableList(tmpAll);
+    }
+
+    public <T, V extends T> List<Setting<V>> getByValueType(Class<T> klass) {
+        ArrayList<Setting<V>> result = new ArrayList<>();
+        for (Setting<?> setting : allSettings) {
+            if (setting.klass.equals(klass)) {
+                result.add((Setting<V>) setting);
+            }
+        }
+        return result;
+    }
+
+    Settings() { }
 }
diff --git a/src/main/java/baritone/bot/behavior/impl/PathingBehavior.java b/src/main/java/baritone/bot/behavior/impl/PathingBehavior.java
index 53b0e036..6e848884 100644
--- a/src/main/java/baritone/bot/behavior/impl/PathingBehavior.java
+++ b/src/main/java/baritone/bot/behavior/impl/PathingBehavior.java
@@ -122,7 +122,7 @@ public class PathingBehavior extends Behavior {
                     // and this path dosen't get us all the way there
                     return;
                 }
-                if (current.getPath().ticksRemainingFrom(current.getPosition()) < Baritone.settings().planningTickLookAhead) {
+                if (current.getPath().ticksRemainingFrom(current.getPosition()) < Baritone.settings().planningTickLookAhead.get()) {
                     // and this path has 5 seconds or less left
                     displayChatMessageRaw("Path almost over. Planning ahead...");
                     findPathInNewThread(current.getPath().getDest(), false);
@@ -231,7 +231,7 @@ public class PathingBehavior extends Behavior {
 
     @Override
     public void onRenderPass(RenderEvent event) {
-        if (!Baritone.settings().renderPath) {
+        if (!Baritone.settings().renderPath.get()) {
             return;
         }
         // System.out.println("Render passing");
@@ -246,10 +246,10 @@ public class PathingBehavior extends Behavior {
         // Render the current path, if there is one
         if (current != null && current.getPath() != null) {
             int renderBegin = Math.max(current.getPosition() - 3, 0);
-            PathRenderer.drawPath(current.getPath(), renderBegin, player(), partialTicks, Color.RED, Baritone.settings().fadePath, 10, 20);
+            PathRenderer.drawPath(current.getPath(), renderBegin, player(), partialTicks, Color.RED, Baritone.settings().fadePath.get(), 10, 20);
         }
         if (next != null && next.getPath() != null) {
-            PathRenderer.drawPath(next.getPath(), 0, player(), partialTicks, Color.GREEN, Baritone.settings().fadePath, 10, 20);
+            PathRenderer.drawPath(next.getPath(), 0, player(), partialTicks, Color.GREEN, Baritone.settings().fadePath.get(), 10, 20);
         }
 
         long split = System.nanoTime();
@@ -262,10 +262,10 @@ public class PathingBehavior extends Behavior {
         // If there is a path calculation currently running, render the path calculation process
         AbstractNodeCostSearch.getCurrentlyRunning().ifPresent(currentlyRunning -> {
             currentlyRunning.bestPathSoFar().ifPresent(p -> {
-                PathRenderer.drawPath(p, 0, player(), partialTicks, Color.BLUE, Baritone.settings().fadePath, 10, 20);
+                PathRenderer.drawPath(p, 0, player(), partialTicks, Color.BLUE, Baritone.settings().fadePath.get(), 10, 20);
                 currentlyRunning.pathToMostRecentNodeConsidered().ifPresent(mr -> {
 
-                    PathRenderer.drawPath(mr, 0, player(), partialTicks, Color.CYAN, Baritone.settings().fadePath, 10, 20);
+                    PathRenderer.drawPath(mr, 0, player(), partialTicks, Color.CYAN, Baritone.settings().fadePath.get(), 10, 20);
                     PathRenderer.drawManySelectionBoxes(player(), Collections.singletonList(mr.getDest()), partialTicks, Color.CYAN);
                 });
             });
diff --git a/src/main/java/baritone/bot/event/GameEventHandler.java b/src/main/java/baritone/bot/event/GameEventHandler.java
index ea151c2e..32bcde8c 100644
--- a/src/main/java/baritone/bot/event/GameEventHandler.java
+++ b/src/main/java/baritone/bot/event/GameEventHandler.java
@@ -35,15 +35,15 @@
 package baritone.bot.event;
 
 import baritone.bot.Baritone;
-import baritone.bot.InputOverrideHandler;
 import baritone.bot.behavior.Behavior;
 import baritone.bot.chunk.CachedWorld;
 import baritone.bot.chunk.CachedWorldProvider;
 import baritone.bot.chunk.ChunkPacker;
-import baritone.bot.event.listener.IGameEventListener;
 import baritone.bot.event.events.*;
 import baritone.bot.event.events.type.EventState;
+import baritone.bot.event.listener.IGameEventListener;
 import baritone.bot.utils.Helper;
+import baritone.bot.utils.InputOverrideHandler;
 import net.minecraft.client.renderer.BufferBuilder;
 import net.minecraft.client.renderer.GlStateManager;
 import net.minecraft.client.renderer.Tessellator;
@@ -108,7 +108,7 @@ public final class GameEventHandler implements IGameEventListener, Helper {
                 && type == ChunkEvent.Type.UNLOAD
                 && mc.world.getChunkProvider().isChunkGeneratedAt(event.getX(), event.getZ());
 
-        if (Baritone.settings().chuckCaching) {
+        if (Baritone.settings().chuckCaching.get()) {
             if (isPostPopulate || isPreUnload) {
                 CachedWorldProvider.INSTANCE.ifWorldLoaded(world ->
                         world.updateCachedChunk(event.getX(), event.getZ(),
@@ -132,7 +132,7 @@ public final class GameEventHandler implements IGameEventListener, Helper {
 
     @Override
     public void onWorldEvent(WorldEvent event) {
-        if (Baritone.settings().chuckCaching) {
+        if (Baritone.settings().chuckCaching.get()) {
             CachedWorldProvider cache = CachedWorldProvider.INSTANCE;
 
             switch (event.getState()) {
diff --git a/src/main/java/baritone/bot/pathing/calc/AStarPathFinder.java b/src/main/java/baritone/bot/pathing/calc/AStarPathFinder.java
index 93025a53..694b05a3 100644
--- a/src/main/java/baritone/bot/pathing/calc/AStarPathFinder.java
+++ b/src/main/java/baritone/bot/pathing/calc/AStarPathFinder.java
@@ -81,14 +81,15 @@ public class AStarPathFinder extends AbstractNodeCostSearch implements Helper {
         }
         currentlyRunning = this;
         long startTime = System.currentTimeMillis();
-        long timeoutTime = startTime + (Baritone.settings().slowPath ? 40000 : 4000);
+        boolean slowPath = Baritone.settings().slowPath.get();
+        long timeoutTime = startTime + (slowPath ? 40000 : 4000);
         long lastPrintout = 0;
         int numNodes = 0;
         CalculationContext calcContext = new CalculationContext();
         int numEmptyChunk = 0;
-        boolean cache = Baritone.settings().chuckCaching;
+        boolean cache = Baritone.settings().chuckCaching.get();
         while (!openSet.isEmpty() && numEmptyChunk < 50 && System.currentTimeMillis() < timeoutTime) {
-            if (Baritone.settings().slowPath) {
+            if (slowPath) {
                 try {
                     Thread.sleep(100);
                 } catch (InterruptedException ex) {
diff --git a/src/main/java/baritone/bot/pathing/goals/GoalXZ.java b/src/main/java/baritone/bot/pathing/goals/GoalXZ.java
index acc8592c..ca70c951 100644
--- a/src/main/java/baritone/bot/pathing/goals/GoalXZ.java
+++ b/src/main/java/baritone/bot/pathing/goals/GoalXZ.java
@@ -99,7 +99,7 @@ public class GoalXZ implements Goal {
             diagonal = z;
         }
         diagonal *= SQRT_2;
-        return (diagonal + straight) * Baritone.settings().costHeuristic; // big TODO tune
+        return (diagonal + straight) * Baritone.settings().costHeuristic.get(); // big TODO tune
     }
 
     public static GoalXZ fromDirection(Vec3d origin, float yaw, double distance) {
diff --git a/src/main/java/baritone/bot/pathing/movement/CalculationContext.java b/src/main/java/baritone/bot/pathing/movement/CalculationContext.java
index 6c171475..92a9de9f 100644
--- a/src/main/java/baritone/bot/pathing/movement/CalculationContext.java
+++ b/src/main/java/baritone/bot/pathing/movement/CalculationContext.java
@@ -42,8 +42,8 @@ public class CalculationContext implements Helper {
 
     public CalculationContext(ToolSet toolSet) {
         this.toolSet = toolSet;
-        this.hasWaterBucket = Baritone.settings().allowWaterBucketFall && InventoryPlayer.isHotbar(player().inventory.getSlotFor(STACK_BUCKET_WATER)) && !world().provider.isNether();
-        this.hasThrowaway = Baritone.settings().allowPlaceThrowaway && MovementHelper.throwaway(false);
+        this.hasWaterBucket = Baritone.settings().allowWaterBucketFall.get() && InventoryPlayer.isHotbar(player().inventory.getSlotFor(STACK_BUCKET_WATER)) && !world().provider.isNether();
+        this.hasThrowaway = Baritone.settings().allowPlaceThrowaway.get() && MovementHelper.throwaway(false);
     }
 
     public ToolSet getToolSet() {
diff --git a/src/main/java/baritone/bot/pathing/movement/Movement.java b/src/main/java/baritone/bot/pathing/movement/Movement.java
index 9db706b7..7b79fc4f 100644
--- a/src/main/java/baritone/bot/pathing/movement/Movement.java
+++ b/src/main/java/baritone/bot/pathing/movement/Movement.java
@@ -37,7 +37,7 @@ import net.minecraft.util.math.Vec3d;
 import java.util.ArrayList;
 import java.util.Optional;
 
-import static baritone.bot.InputOverrideHandler.Input;
+import static baritone.bot.utils.InputOverrideHandler.Input;
 
 public abstract class Movement implements Helper, MovementHelper {
 
diff --git a/src/main/java/baritone/bot/pathing/movement/MovementHelper.java b/src/main/java/baritone/bot/pathing/movement/MovementHelper.java
index 5a5732a3..4872e2fa 100644
--- a/src/main/java/baritone/bot/pathing/movement/MovementHelper.java
+++ b/src/main/java/baritone/bot/pathing/movement/MovementHelper.java
@@ -18,7 +18,6 @@
 package baritone.bot.pathing.movement;
 
 import baritone.bot.Baritone;
-import baritone.bot.InputOverrideHandler;
 import baritone.bot.behavior.impl.LookBehaviorUtils;
 import baritone.bot.pathing.movement.MovementState.MovementTarget;
 import baritone.bot.pathing.movement.movements.MovementDescend;
@@ -137,7 +136,7 @@ public interface MovementHelper extends ActionCosts, Helper {
         IBlockState state = BlockStateInterface.get(position);
         Block block = state.getBlock();
         if (!block.equals(Blocks.AIR) && !canWalkThrough(position)) {
-            if (!Baritone.settings().allowBreak) {
+            if (!Baritone.settings().allowBreak.get()) {
                 return COST_INF;
             }
             if (avoidBreaking(position)) {
diff --git a/src/main/java/baritone/bot/pathing/movement/MovementState.java b/src/main/java/baritone/bot/pathing/movement/MovementState.java
index 9dea192d..efc56c08 100644
--- a/src/main/java/baritone/bot/pathing/movement/MovementState.java
+++ b/src/main/java/baritone/bot/pathing/movement/MovementState.java
@@ -17,7 +17,7 @@
 
 package baritone.bot.pathing.movement;
 
-import baritone.bot.InputOverrideHandler.Input;
+import baritone.bot.utils.InputOverrideHandler.Input;
 import baritone.bot.utils.Rotation;
 import net.minecraft.util.math.Vec3d;
 
diff --git a/src/main/java/baritone/bot/pathing/movement/movements/MovementAscend.java b/src/main/java/baritone/bot/pathing/movement/movements/MovementAscend.java
index b021e19f..7d68608c 100644
--- a/src/main/java/baritone/bot/pathing/movement/movements/MovementAscend.java
+++ b/src/main/java/baritone/bot/pathing/movement/movements/MovementAscend.java
@@ -17,7 +17,7 @@
 
 package baritone.bot.pathing.movement.movements;
 
-import baritone.bot.InputOverrideHandler;
+import baritone.bot.utils.InputOverrideHandler;
 import baritone.bot.behavior.impl.LookBehaviorUtils;
 import baritone.bot.pathing.movement.CalculationContext;
 import baritone.bot.pathing.movement.Movement;
diff --git a/src/main/java/baritone/bot/pathing/movement/movements/MovementDescend.java b/src/main/java/baritone/bot/pathing/movement/movements/MovementDescend.java
index 2b25a191..fa2381e2 100644
--- a/src/main/java/baritone/bot/pathing/movement/movements/MovementDescend.java
+++ b/src/main/java/baritone/bot/pathing/movement/movements/MovementDescend.java
@@ -17,7 +17,7 @@
 
 package baritone.bot.pathing.movement.movements;
 
-import baritone.bot.InputOverrideHandler;
+import baritone.bot.utils.InputOverrideHandler;
 import baritone.bot.pathing.movement.CalculationContext;
 import baritone.bot.pathing.movement.Movement;
 import baritone.bot.pathing.movement.MovementHelper;
diff --git a/src/main/java/baritone/bot/pathing/movement/movements/MovementFall.java b/src/main/java/baritone/bot/pathing/movement/movements/MovementFall.java
index 592440ff..d1312a39 100644
--- a/src/main/java/baritone/bot/pathing/movement/movements/MovementFall.java
+++ b/src/main/java/baritone/bot/pathing/movement/movements/MovementFall.java
@@ -17,7 +17,7 @@
 
 package baritone.bot.pathing.movement.movements;
 
-import baritone.bot.InputOverrideHandler;
+import baritone.bot.utils.InputOverrideHandler;
 import baritone.bot.behavior.impl.LookBehaviorUtils;
 import baritone.bot.pathing.movement.*;
 import baritone.bot.pathing.movement.MovementState.MovementStatus;
diff --git a/src/main/java/baritone/bot/pathing/movement/movements/MovementPillar.java b/src/main/java/baritone/bot/pathing/movement/movements/MovementPillar.java
index eace641e..d8d68c87 100644
--- a/src/main/java/baritone/bot/pathing/movement/movements/MovementPillar.java
+++ b/src/main/java/baritone/bot/pathing/movement/movements/MovementPillar.java
@@ -17,7 +17,7 @@
 
 package baritone.bot.pathing.movement.movements;
 
-import baritone.bot.InputOverrideHandler;
+import baritone.bot.utils.InputOverrideHandler;
 import baritone.bot.pathing.movement.CalculationContext;
 import baritone.bot.pathing.movement.Movement;
 import baritone.bot.pathing.movement.MovementHelper;
diff --git a/src/main/java/baritone/bot/pathing/movement/movements/MovementTraverse.java b/src/main/java/baritone/bot/pathing/movement/movements/MovementTraverse.java
index fb2cba39..92d147e2 100644
--- a/src/main/java/baritone/bot/pathing/movement/movements/MovementTraverse.java
+++ b/src/main/java/baritone/bot/pathing/movement/movements/MovementTraverse.java
@@ -17,7 +17,7 @@
 
 package baritone.bot.pathing.movement.movements;
 
-import baritone.bot.InputOverrideHandler;
+import baritone.bot.utils.InputOverrideHandler;
 import baritone.bot.behavior.impl.LookBehaviorUtils;
 import baritone.bot.pathing.movement.CalculationContext;
 import baritone.bot.pathing.movement.Movement;
diff --git a/src/main/java/baritone/bot/utils/BlockStateInterface.java b/src/main/java/baritone/bot/utils/BlockStateInterface.java
index 7ab42c1d..cddd7351 100644
--- a/src/main/java/baritone/bot/utils/BlockStateInterface.java
+++ b/src/main/java/baritone/bot/utils/BlockStateInterface.java
@@ -41,7 +41,7 @@ public class BlockStateInterface implements Helper {
         if (chunk.isLoaded()) {
             return chunk.getBlockState(pos);
         }
-        if(Baritone.settings().chuckCaching) {
+        if (Baritone.settings().chuckCaching.get()) {
             CachedWorld world = CachedWorldProvider.INSTANCE.getCurrentWorld();
             if (world != null) {
                 PathingBlockType type = world.getBlockType(pos);
diff --git a/src/main/java/baritone/bot/utils/ExampleBaritoneControl.java b/src/main/java/baritone/bot/utils/ExampleBaritoneControl.java
index d4865449..aaf59b05 100644
--- a/src/main/java/baritone/bot/utils/ExampleBaritoneControl.java
+++ b/src/main/java/baritone/bot/utils/ExampleBaritoneControl.java
@@ -18,6 +18,7 @@
 package baritone.bot.utils;
 
 import baritone.bot.Baritone;
+import baritone.bot.Settings;
 import baritone.bot.behavior.Behavior;
 import baritone.bot.behavior.impl.PathingBehavior;
 import baritone.bot.event.events.ChatEvent;
@@ -27,6 +28,8 @@ import baritone.bot.pathing.goals.GoalXZ;
 import baritone.bot.pathing.goals.GoalYLevel;
 import net.minecraft.util.math.BlockPos;
 
+import java.util.List;
+
 public class ExampleBaritoneControl extends Behavior {
     public static ExampleBaritoneControl INSTANCE = new ExampleBaritoneControl();
 
@@ -40,7 +43,7 @@ public class ExampleBaritoneControl extends Behavior {
 
     @Override
     public void onSendChatMessage(ChatEvent event) {
-        if (!Baritone.settings().chatControl) {
+        if (!Baritone.settings().chatControl.get()) {
             return;
         }
         String msg = event.getMessage();
@@ -82,11 +85,6 @@ public class ExampleBaritoneControl extends Behavior {
             event.cancel();
             return;
         }
-        if (msg.toLowerCase().equals("slowpath")) {
-            Baritone.settings().slowPath ^= true;
-            event.cancel();
-            return;
-        }
         if (msg.toLowerCase().equals("cancel")) {
             PathingBehavior.INSTANCE.cancel();
             event.cancel();
@@ -100,5 +98,14 @@ public class ExampleBaritoneControl extends Behavior {
             event.cancel();
             return;
         }
+        List<Settings.Setting<Boolean>> toggleable = Baritone.settings().getByValueType(Boolean.class);
+        for (Settings.Setting<Boolean> setting : toggleable) {
+            if (msg.toLowerCase().equals(setting.getName().toLowerCase())) {
+                setting.value ^= true;
+                event.cancel();
+                displayChatMessageRaw("Toggled " + setting.getName() + " to " + setting.value);
+                return;
+            }
+        }
     }
 }
diff --git a/src/main/java/baritone/bot/utils/Helper.java b/src/main/java/baritone/bot/utils/Helper.java
index 4f2ef227..8571f23e 100755
--- a/src/main/java/baritone/bot/utils/Helper.java
+++ b/src/main/java/baritone/bot/utils/Helper.java
@@ -68,7 +68,7 @@ public interface Helper {
     }
 
     default void displayChatMessageRaw(String message) {
-        if (!Baritone.settings().chatDebug) {
+        if (!Baritone.settings().chatDebug.get()) {
             System.out.println("Suppressed debug message:");
             System.out.println(message);
             return;
diff --git a/src/main/java/baritone/bot/InputOverrideHandler.java b/src/main/java/baritone/bot/utils/InputOverrideHandler.java
similarity index 82%
rename from src/main/java/baritone/bot/InputOverrideHandler.java
rename to src/main/java/baritone/bot/utils/InputOverrideHandler.java
index 63f3bb39..99e59e3f 100755
--- a/src/main/java/baritone/bot/InputOverrideHandler.java
+++ b/src/main/java/baritone/bot/utils/InputOverrideHandler.java
@@ -15,9 +15,25 @@
  * along with Baritone.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-package baritone.bot;
+/*
+ * This file is part of Baritone.
+ *
+ * Baritone is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Baritone.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package baritone.bot.utils;
 
-import baritone.bot.utils.Helper;
 import net.minecraft.client.settings.KeyBinding;
 import org.lwjgl.input.Keyboard;
 
@@ -34,7 +50,7 @@ import java.util.Map;
  */
 public final class InputOverrideHandler implements Helper {
 
-    InputOverrideHandler() {}
+    public InputOverrideHandler() {}
 
     /**
      * Maps keybinds to whether or not we are forcing their state down.
diff --git a/src/main/resources/baritone/movement/MovementManager.java b/src/main/resources/baritone/movement/MovementManager.java
index 704cc929..357f7514 100644
--- a/src/main/resources/baritone/movement/MovementManager.java
+++ b/src/main/resources/baritone/movement/MovementManager.java
@@ -1,7 +1,7 @@
 package baritone.movement;
 
 import baritone.Baritone;
-import baritone.bot.InputOverrideHandler;
+import baritone.bot.utils.InputOverrideHandler;
 import baritone.ui.LookManager;
 import net.minecraft.block.BlockLadder;
 import net.minecraft.block.BlockVine;