diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 59006a9e..599a02b7 100755
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Tue Jul 31 21:56:56 PDT 2018
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-all.zip
+#Tue Jul 31 21:56:56 PDT 2018
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-all.zip
diff --git a/gradlew.bat b/gradlew.bat
index e95643d6..f9553162 100755
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -1,84 +1,84 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/settings.gradle b/settings.gradle
index baa9dfc9..567f8411 100755
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,19 +1,19 @@
-/*
- * 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 .
- */
-
-rootProject.name = 'baritone'
-
+/*
+ * 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 .
+ */
+
+rootProject.name = 'baritone'
+
diff --git a/src/main/java/baritone/Baritone.java b/src/main/java/baritone/Baritone.java
index 2eb69cba..51a6ff69 100755
--- a/src/main/java/baritone/Baritone.java
+++ b/src/main/java/baritone/Baritone.java
@@ -1,211 +1,211 @@
-/*
- * 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 .
- */
-
-package baritone;
-
-import baritone.api.BaritoneAPI;
-import baritone.api.IBaritone;
-import baritone.api.Settings;
-import baritone.api.event.listener.IEventBus;
-import baritone.api.utils.IPlayerContext;
-import baritone.behavior.*;
-import baritone.cache.WorldProvider;
-import baritone.event.GameEventHandler;
-import baritone.process.CustomGoalProcess;
-import baritone.process.FollowProcess;
-import baritone.process.GetToBlockProcess;
-import baritone.process.MineProcess;
-import baritone.utils.*;
-import baritone.utils.player.PrimaryPlayerContext;
-import net.minecraft.client.Minecraft;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Executor;
-import java.util.concurrent.SynchronousQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author Brady
- * @since 7/31/2018
- */
-public class Baritone implements IBaritone {
-
- private static ThreadPoolExecutor threadPool;
- private static File dir;
-
- static {
- threadPool = new ThreadPoolExecutor(4, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<>());
-
- dir = new File(Minecraft.getMinecraft().gameDir, "baritone");
- if (!Files.exists(dir.toPath())) {
- try {
- Files.createDirectories(dir.toPath());
- } catch (IOException ignored) {}
- }
- }
-
- /**
- * Whether or not {@link Baritone#init()} has been called yet
- */
- private boolean initialized;
-
- private GameEventHandler gameEventHandler;
-
- private List behaviors;
- private PathingBehavior pathingBehavior;
- private LookBehavior lookBehavior;
- private MemoryBehavior memoryBehavior;
- private InputOverrideHandler inputOverrideHandler;
-
- private FollowProcess followProcess;
- private MineProcess mineProcess;
- private GetToBlockProcess getToBlockProcess;
- private CustomGoalProcess customGoalProcess;
-
- private PathingControlManager pathingControlManager;
-
- private IPlayerContext playerContext;
- private WorldProvider worldProvider;
-
- public BlockStateInterface bsi;
-
- Baritone() {
- this.gameEventHandler = new GameEventHandler(this);
- }
-
- @Override
- public synchronized void init() {
- if (initialized) {
- return;
- }
-
- // Define this before behaviors try and get it, or else it will be null and the builds will fail!
- this.playerContext = PrimaryPlayerContext.INSTANCE;
-
- this.behaviors = new ArrayList<>();
- {
- // the Behavior constructor calls baritone.registerBehavior(this) so this populates the behaviors arraylist
- pathingBehavior = new PathingBehavior(this);
- lookBehavior = new LookBehavior(this);
- memoryBehavior = new MemoryBehavior(this);
- new InventoryBehavior(this);
- inputOverrideHandler = new InputOverrideHandler(this);
- new ExampleBaritoneControl(this);
- }
-
- this.pathingControlManager = new PathingControlManager(this);
- {
- followProcess = new FollowProcess(this);
- mineProcess = new MineProcess(this);
- customGoalProcess = new CustomGoalProcess(this); // very high iq
- getToBlockProcess = new GetToBlockProcess(this);
- }
-
- this.worldProvider = new WorldProvider();
-
- if (BaritoneAutoTest.ENABLE_AUTO_TEST) {
- this.gameEventHandler.registerEventListener(BaritoneAutoTest.INSTANCE);
- }
-
- this.initialized = true;
- }
-
- @Override
- public PathingControlManager getPathingControlManager() {
- return this.pathingControlManager;
- }
-
- public List getBehaviors() {
- return this.behaviors;
- }
-
- public void registerBehavior(Behavior behavior) {
- this.behaviors.add(behavior);
- this.gameEventHandler.registerEventListener(behavior);
- }
-
- @Override
- public InputOverrideHandler getInputOverrideHandler() {
- return this.inputOverrideHandler;
- }
-
- @Override
- public CustomGoalProcess getCustomGoalProcess() { // Iffy
- return this.customGoalProcess;
- }
-
- @Override
- public GetToBlockProcess getGetToBlockProcess() { // Iffy
- return this.getToBlockProcess;
- }
-
- @Override
- public IPlayerContext getPlayerContext() {
- return this.playerContext;
- }
-
- public MemoryBehavior getMemoryBehavior() {
- return this.memoryBehavior;
- }
-
- @Override
- public FollowProcess getFollowProcess() {
- return this.followProcess;
- }
-
- @Override
- public LookBehavior getLookBehavior() {
- return this.lookBehavior;
- }
-
- @Override
- public MineProcess getMineProcess() {
- return this.mineProcess;
- }
-
- @Override
- public PathingBehavior getPathingBehavior() {
- return this.pathingBehavior;
- }
-
- @Override
- public WorldProvider getWorldProvider() {
- return this.worldProvider;
- }
-
- @Override
- public IEventBus getGameEventHandler() {
- return this.gameEventHandler;
- }
-
- public static Settings settings() {
- return BaritoneAPI.getSettings();
- }
-
- public static File getDir() {
- return dir;
- }
-
- public static Executor getExecutor() {
- return threadPool;
- }
-}
+/*
+ * 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 .
+ */
+
+package baritone;
+
+import baritone.api.BaritoneAPI;
+import baritone.api.IBaritone;
+import baritone.api.Settings;
+import baritone.api.event.listener.IEventBus;
+import baritone.api.utils.IPlayerContext;
+import baritone.behavior.*;
+import baritone.cache.WorldProvider;
+import baritone.event.GameEventHandler;
+import baritone.process.CustomGoalProcess;
+import baritone.process.FollowProcess;
+import baritone.process.GetToBlockProcess;
+import baritone.process.MineProcess;
+import baritone.utils.*;
+import baritone.utils.player.PrimaryPlayerContext;
+import net.minecraft.client.Minecraft;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author Brady
+ * @since 7/31/2018
+ */
+public class Baritone implements IBaritone {
+
+ private static ThreadPoolExecutor threadPool;
+ private static File dir;
+
+ static {
+ threadPool = new ThreadPoolExecutor(4, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<>());
+
+ dir = new File(Minecraft.getMinecraft().gameDir, "baritone");
+ if (!Files.exists(dir.toPath())) {
+ try {
+ Files.createDirectories(dir.toPath());
+ } catch (IOException ignored) {}
+ }
+ }
+
+ /**
+ * Whether or not {@link Baritone#init()} has been called yet
+ */
+ private boolean initialized;
+
+ private GameEventHandler gameEventHandler;
+
+ private List behaviors;
+ private PathingBehavior pathingBehavior;
+ private LookBehavior lookBehavior;
+ private MemoryBehavior memoryBehavior;
+ private InputOverrideHandler inputOverrideHandler;
+
+ private FollowProcess followProcess;
+ private MineProcess mineProcess;
+ private GetToBlockProcess getToBlockProcess;
+ private CustomGoalProcess customGoalProcess;
+
+ private PathingControlManager pathingControlManager;
+
+ private IPlayerContext playerContext;
+ private WorldProvider worldProvider;
+
+ public BlockStateInterface bsi;
+
+ Baritone() {
+ this.gameEventHandler = new GameEventHandler(this);
+ }
+
+ @Override
+ public synchronized void init() {
+ if (initialized) {
+ return;
+ }
+
+ // Define this before behaviors try and get it, or else it will be null and the builds will fail!
+ this.playerContext = PrimaryPlayerContext.INSTANCE;
+
+ this.behaviors = new ArrayList<>();
+ {
+ // the Behavior constructor calls baritone.registerBehavior(this) so this populates the behaviors arraylist
+ pathingBehavior = new PathingBehavior(this);
+ lookBehavior = new LookBehavior(this);
+ memoryBehavior = new MemoryBehavior(this);
+ new InventoryBehavior(this);
+ inputOverrideHandler = new InputOverrideHandler(this);
+ new ExampleBaritoneControl(this);
+ }
+
+ this.pathingControlManager = new PathingControlManager(this);
+ {
+ followProcess = new FollowProcess(this);
+ mineProcess = new MineProcess(this);
+ customGoalProcess = new CustomGoalProcess(this); // very high iq
+ getToBlockProcess = new GetToBlockProcess(this);
+ }
+
+ this.worldProvider = new WorldProvider();
+
+ if (BaritoneAutoTest.ENABLE_AUTO_TEST) {
+ this.gameEventHandler.registerEventListener(BaritoneAutoTest.INSTANCE);
+ }
+
+ this.initialized = true;
+ }
+
+ @Override
+ public PathingControlManager getPathingControlManager() {
+ return this.pathingControlManager;
+ }
+
+ public List getBehaviors() {
+ return this.behaviors;
+ }
+
+ public void registerBehavior(Behavior behavior) {
+ this.behaviors.add(behavior);
+ this.gameEventHandler.registerEventListener(behavior);
+ }
+
+ @Override
+ public InputOverrideHandler getInputOverrideHandler() {
+ return this.inputOverrideHandler;
+ }
+
+ @Override
+ public CustomGoalProcess getCustomGoalProcess() { // Iffy
+ return this.customGoalProcess;
+ }
+
+ @Override
+ public GetToBlockProcess getGetToBlockProcess() { // Iffy
+ return this.getToBlockProcess;
+ }
+
+ @Override
+ public IPlayerContext getPlayerContext() {
+ return this.playerContext;
+ }
+
+ public MemoryBehavior getMemoryBehavior() {
+ return this.memoryBehavior;
+ }
+
+ @Override
+ public FollowProcess getFollowProcess() {
+ return this.followProcess;
+ }
+
+ @Override
+ public LookBehavior getLookBehavior() {
+ return this.lookBehavior;
+ }
+
+ @Override
+ public MineProcess getMineProcess() {
+ return this.mineProcess;
+ }
+
+ @Override
+ public PathingBehavior getPathingBehavior() {
+ return this.pathingBehavior;
+ }
+
+ @Override
+ public WorldProvider getWorldProvider() {
+ return this.worldProvider;
+ }
+
+ @Override
+ public IEventBus getGameEventHandler() {
+ return this.gameEventHandler;
+ }
+
+ public static Settings settings() {
+ return BaritoneAPI.getSettings();
+ }
+
+ public static File getDir() {
+ return dir;
+ }
+
+ public static Executor getExecutor() {
+ return threadPool;
+ }
+}
diff --git a/src/main/java/baritone/utils/Helper.java b/src/main/java/baritone/utils/Helper.java
index 9ee6ed59..f85f240c 100755
--- a/src/main/java/baritone/utils/Helper.java
+++ b/src/main/java/baritone/utils/Helper.java
@@ -1,72 +1,72 @@
-/*
- * 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 .
- */
-
-package baritone.utils;
-
-import baritone.Baritone;
-import net.minecraft.client.Minecraft;
-import net.minecraft.util.text.ITextComponent;
-import net.minecraft.util.text.TextComponentString;
-import net.minecraft.util.text.TextFormatting;
-
-/**
- * @author Brady
- * @since 8/1/2018
- */
-public interface Helper {
-
- /**
- * Instance of {@link Helper}. Used for static-context reference.
- */
- Helper HELPER = new Helper() {};
-
- ITextComponent MESSAGE_PREFIX = new TextComponentString(String.format(
- "%s[%sBaritone%s]%s",
- TextFormatting.DARK_PURPLE,
- TextFormatting.LIGHT_PURPLE,
- TextFormatting.DARK_PURPLE,
- TextFormatting.GRAY
- ));
-
- Minecraft mc = Minecraft.getMinecraft();
-
- /**
- * Send a message to chat only if chatDebug is on
- *
- * @param message The message to display in chat
- */
- default void logDebug(String message) {
- if (!Baritone.settings().chatDebug.get()) {
- //System.out.println("Suppressed debug message:");
- //System.out.println(message);
- return;
- }
- logDirect(message);
- }
-
- /**
- * Send a message to chat regardless of chatDebug (should only be used for critically important messages, or as a direct response to a chat command)
- *
- * @param message The message to display in chat
- */
- default void logDirect(String message) {
- ITextComponent component = MESSAGE_PREFIX.createCopy();
- component.getStyle().setColor(TextFormatting.GRAY);
- component.appendSibling(new TextComponentString(" " + message));
- Minecraft.getMinecraft().addScheduledTask(() -> Baritone.settings().logger.get().accept(component));
- }
-}
+/*
+ * 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 .
+ */
+
+package baritone.utils;
+
+import baritone.Baritone;
+import net.minecraft.client.Minecraft;
+import net.minecraft.util.text.ITextComponent;
+import net.minecraft.util.text.TextComponentString;
+import net.minecraft.util.text.TextFormatting;
+
+/**
+ * @author Brady
+ * @since 8/1/2018
+ */
+public interface Helper {
+
+ /**
+ * Instance of {@link Helper}. Used for static-context reference.
+ */
+ Helper HELPER = new Helper() {};
+
+ ITextComponent MESSAGE_PREFIX = new TextComponentString(String.format(
+ "%s[%sBaritone%s]%s",
+ TextFormatting.DARK_PURPLE,
+ TextFormatting.LIGHT_PURPLE,
+ TextFormatting.DARK_PURPLE,
+ TextFormatting.GRAY
+ ));
+
+ Minecraft mc = Minecraft.getMinecraft();
+
+ /**
+ * Send a message to chat only if chatDebug is on
+ *
+ * @param message The message to display in chat
+ */
+ default void logDebug(String message) {
+ if (!Baritone.settings().chatDebug.get()) {
+ //System.out.println("Suppressed debug message:");
+ //System.out.println(message);
+ return;
+ }
+ logDirect(message);
+ }
+
+ /**
+ * Send a message to chat regardless of chatDebug (should only be used for critically important messages, or as a direct response to a chat command)
+ *
+ * @param message The message to display in chat
+ */
+ default void logDirect(String message) {
+ ITextComponent component = MESSAGE_PREFIX.createCopy();
+ component.getStyle().setColor(TextFormatting.GRAY);
+ component.appendSibling(new TextComponentString(" " + message));
+ Minecraft.getMinecraft().addScheduledTask(() -> Baritone.settings().logger.get().accept(component));
+ }
+}
diff --git a/src/main/java/baritone/utils/InputOverrideHandler.java b/src/main/java/baritone/utils/InputOverrideHandler.java
index f5ee0530..6b0a96e7 100755
--- a/src/main/java/baritone/utils/InputOverrideHandler.java
+++ b/src/main/java/baritone/utils/InputOverrideHandler.java
@@ -1,140 +1,140 @@
-/*
- * 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 .
- */
-
-package baritone.utils;
-
-import baritone.Baritone;
-import baritone.api.BaritoneAPI;
-import baritone.api.event.events.TickEvent;
-import baritone.api.utils.IInputOverrideHandler;
-import baritone.api.utils.input.Input;
-import baritone.behavior.Behavior;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.settings.KeyBinding;
-import net.minecraft.util.MovementInputFromOptions;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * An interface with the game's control system allowing the ability to
- * force down certain controls, having the same effect as if we were actually
- * physically forcing down the assigned key.
- *
- * @author Brady
- * @since 7/31/2018
- */
-public final class InputOverrideHandler extends Behavior implements IInputOverrideHandler {
-
- /**
- * Maps inputs to whether or not we are forcing their state down.
- */
- private final Map inputForceStateMap = new HashMap<>();
-
- private final BlockBreakHelper blockBreakHelper;
-
- public InputOverrideHandler(Baritone baritone) {
- super(baritone);
- this.blockBreakHelper = new BlockBreakHelper(baritone.getPlayerContext());
- }
-
- /**
- * Returns whether or not we are forcing down the specified {@link KeyBinding}.
- *
- * @param key The KeyBinding object
- * @return Whether or not it is being forced down
- */
- @Override
- public final Boolean isInputForcedDown(KeyBinding key) {
- Input input = Input.getInputForBind(key);
- if (input == null) {
- return null;
- }
- if (input == Input.CLICK_LEFT && inControl()) {
- // only override left click off when pathing
- return false;
- }
- if (input == Input.CLICK_RIGHT) {
- if (isInputForcedDown(Input.CLICK_RIGHT)) {
- // gettoblock and builder can right click even when not pathing; allow them to do so
- return true;
- } else if (inControl()) {
- // but when we are pathing for real, force right click off
- return false;
- }
- }
- return null; // dont force any inputs other than left and right click
- }
-
- /**
- * Returns whether or not we are forcing down the specified {@link Input}.
- *
- * @param input The input
- * @return Whether or not it is being forced down
- */
- @Override
- public final boolean isInputForcedDown(Input input) {
- return input == null ? false : this.inputForceStateMap.getOrDefault(input, false);
- }
-
- /**
- * Sets whether or not the specified {@link Input} is being forced down.
- *
- * @param input The {@link Input}
- * @param forced Whether or not the state is being forced
- */
- @Override
- public final void setInputForceState(Input input, boolean forced) {
- this.inputForceStateMap.put(input, forced);
- }
-
- /**
- * Clears the override state for all keys
- */
- @Override
- public final void clearAllKeys() {
- this.inputForceStateMap.clear();
- }
-
- @Override
- public final void onTick(TickEvent event) {
- if (event.getType() == TickEvent.Type.OUT) {
- return;
- }
- blockBreakHelper.tick(isInputForcedDown(Input.CLICK_LEFT));
-
- if (inControl()) {
- if (ctx.player().movementInput.getClass() != PlayerMovementInput.class) {
- ctx.player().movementInput = new PlayerMovementInput(this);
- }
- } else {
- if (ctx.player().movementInput.getClass() == PlayerMovementInput.class) { // allow other movement inputs that aren't this one, e.g. for a freecam
- ctx.player().movementInput = new MovementInputFromOptions(Minecraft.getMinecraft().gameSettings);
- }
- }
- // only set it if it was previously incorrect
- // gotta do it this way, or else it constantly thinks you're beginning a double tap W sprint lol
- }
-
- private boolean inControl() {
- return baritone.getPathingBehavior().isPathing() || baritone != BaritoneAPI.getProvider().getPrimaryBaritone();
- }
-
- public BlockBreakHelper getBlockBreakHelper() {
- return blockBreakHelper;
- }
-}
+/*
+ * 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 .
+ */
+
+package baritone.utils;
+
+import baritone.Baritone;
+import baritone.api.BaritoneAPI;
+import baritone.api.event.events.TickEvent;
+import baritone.api.utils.IInputOverrideHandler;
+import baritone.api.utils.input.Input;
+import baritone.behavior.Behavior;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.settings.KeyBinding;
+import net.minecraft.util.MovementInputFromOptions;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * An interface with the game's control system allowing the ability to
+ * force down certain controls, having the same effect as if we were actually
+ * physically forcing down the assigned key.
+ *
+ * @author Brady
+ * @since 7/31/2018
+ */
+public final class InputOverrideHandler extends Behavior implements IInputOverrideHandler {
+
+ /**
+ * Maps inputs to whether or not we are forcing their state down.
+ */
+ private final Map inputForceStateMap = new HashMap<>();
+
+ private final BlockBreakHelper blockBreakHelper;
+
+ public InputOverrideHandler(Baritone baritone) {
+ super(baritone);
+ this.blockBreakHelper = new BlockBreakHelper(baritone.getPlayerContext());
+ }
+
+ /**
+ * Returns whether or not we are forcing down the specified {@link KeyBinding}.
+ *
+ * @param key The KeyBinding object
+ * @return Whether or not it is being forced down
+ */
+ @Override
+ public final Boolean isInputForcedDown(KeyBinding key) {
+ Input input = Input.getInputForBind(key);
+ if (input == null) {
+ return null;
+ }
+ if (input == Input.CLICK_LEFT && inControl()) {
+ // only override left click off when pathing
+ return false;
+ }
+ if (input == Input.CLICK_RIGHT) {
+ if (isInputForcedDown(Input.CLICK_RIGHT)) {
+ // gettoblock and builder can right click even when not pathing; allow them to do so
+ return true;
+ } else if (inControl()) {
+ // but when we are pathing for real, force right click off
+ return false;
+ }
+ }
+ return null; // dont force any inputs other than left and right click
+ }
+
+ /**
+ * Returns whether or not we are forcing down the specified {@link Input}.
+ *
+ * @param input The input
+ * @return Whether or not it is being forced down
+ */
+ @Override
+ public final boolean isInputForcedDown(Input input) {
+ return input == null ? false : this.inputForceStateMap.getOrDefault(input, false);
+ }
+
+ /**
+ * Sets whether or not the specified {@link Input} is being forced down.
+ *
+ * @param input The {@link Input}
+ * @param forced Whether or not the state is being forced
+ */
+ @Override
+ public final void setInputForceState(Input input, boolean forced) {
+ this.inputForceStateMap.put(input, forced);
+ }
+
+ /**
+ * Clears the override state for all keys
+ */
+ @Override
+ public final void clearAllKeys() {
+ this.inputForceStateMap.clear();
+ }
+
+ @Override
+ public final void onTick(TickEvent event) {
+ if (event.getType() == TickEvent.Type.OUT) {
+ return;
+ }
+ blockBreakHelper.tick(isInputForcedDown(Input.CLICK_LEFT));
+
+ if (inControl()) {
+ if (ctx.player().movementInput.getClass() != PlayerMovementInput.class) {
+ ctx.player().movementInput = new PlayerMovementInput(this);
+ }
+ } else {
+ if (ctx.player().movementInput.getClass() == PlayerMovementInput.class) { // allow other movement inputs that aren't this one, e.g. for a freecam
+ ctx.player().movementInput = new MovementInputFromOptions(Minecraft.getMinecraft().gameSettings);
+ }
+ }
+ // only set it if it was previously incorrect
+ // gotta do it this way, or else it constantly thinks you're beginning a double tap W sprint lol
+ }
+
+ private boolean inControl() {
+ return baritone.getPathingBehavior().isPathing() || baritone != BaritoneAPI.getProvider().getPrimaryBaritone();
+ }
+
+ public BlockBreakHelper getBlockBreakHelper() {
+ return blockBreakHelper;
+ }
+}