diff --git a/src/main/java/baritone/bot/Settings.java b/src/main/java/baritone/bot/Settings.java index 17289170..f6536579 100644 --- a/src/main/java/baritone/bot/Settings.java +++ b/src/main/java/baritone/bot/Settings.java @@ -30,14 +30,14 @@ import java.util.*; */ public class Settings { public Setting allowBreak = new Setting<>(true); - public Setting allowPlaceThrowaway = new Setting<>(true); + public Setting allowSprint = new Setting<>(true); + public Setting allowPlace = new Setting<>(true); /** * It doesn't actually take twenty ticks to place a block, this cost is so high * because we want to generally conserve blocks which might be limited */ public Setting blockPlacementPenalty = new Setting<>(20D); public Setting allowWaterBucketFall = new Setting<>(true); - public Setting allowSprint = new Setting<>(true); public Setting> acceptableThrowawayItems = new Setting<>(Arrays.asList( Item.getItemFromBlock(Blocks.DIRT), Item.getItemFromBlock(Blocks.COBBLESTONE), @@ -48,10 +48,11 @@ public class Settings { // obscure internal A* settings that you probably don't want to change public Setting pathingMaxChunkBorderFetch = new Setting<>(50); - public Setting backtrackCostFavor = new Setting<>(true); // see issue #18 public Setting backtrackCostFavoringCoefficient = new Setting<>(0.9); // see issue #18 public Setting minimumImprovementRepropagation = new Setting<>(true); public Setting cutoffAtLoadBoundary = new Setting<>(true); + public Setting pathCutoffFactor = new Setting<>(0.7); + public Setting pathCutoffMinimumLength = new Setting<>(70); public Setting pathTimeoutMS = new Setting<>(4000L); @@ -61,7 +62,7 @@ public class Settings { public Setting chuckCaching = new Setting<>(false); - public Setting planningTickLookAhead = new Setting<>(150);/**/ + public Setting planningTickLookAhead = new Setting<>(150); public Setting chatDebug = new Setting<>(true); public Setting chatControl = new Setting<>(true); // probably false in impact @@ -73,7 +74,7 @@ public class Settings { public Setting fadePath = new Setting<>(false); // give this a better name in the UI, like "better path fps" idk - public final Map> byName; + public final Map> byLowerName; public final List> allSettings; public class Setting { @@ -118,6 +119,7 @@ public class Settings { Setting setting = (Setting) field.get(this); String name = field.getName(); setting.name = name; + name = name.toLowerCase(); if (tmpByName.containsKey(name)) { throw new IllegalStateException("Duplicate setting name"); } @@ -128,7 +130,7 @@ public class Settings { } catch (IllegalAccessException e) { throw new RuntimeException(e); } - byName = Collections.unmodifiableMap(tmpByName); + byLowerName = Collections.unmodifiableMap(tmpByName); allSettings = Collections.unmodifiableList(tmpAll); } diff --git a/src/main/java/baritone/bot/behavior/impl/PathingBehavior.java b/src/main/java/baritone/bot/behavior/impl/PathingBehavior.java index 90018f69..269cf200 100644 --- a/src/main/java/baritone/bot/behavior/impl/PathingBehavior.java +++ b/src/main/java/baritone/bot/behavior/impl/PathingBehavior.java @@ -205,7 +205,7 @@ public class PathingBehavior extends Behavior { if (Baritone.settings().cutoffAtLoadBoundary.get()) { path = path.map(IPath::cutoffAtLoadedChunks); } - path.map(PathExecutor::new).ifPresent(p -> { + path.map(p -> p.staticCutoff(goal)).map(PathExecutor::new).ifPresent(p -> { synchronized (pathPlanLock) { if (current == null) { current = p; diff --git a/src/main/java/baritone/bot/pathing/calc/AStarPathFinder.java b/src/main/java/baritone/bot/pathing/calc/AStarPathFinder.java index 1d0e66d0..e34a7eff 100644 --- a/src/main/java/baritone/bot/pathing/calc/AStarPathFinder.java +++ b/src/main/java/baritone/bot/pathing/calc/AStarPathFinder.java @@ -93,8 +93,8 @@ public class AStarPathFinder extends AbstractNodeCostSearch implements Helper { long lastPrintout = 0; int numNodes = 0; int numEmptyChunk = 0; - boolean favoring = favoredPositions.isPresent() && Baritone.settings().backtrackCostFavor.get(); // grab all settings beforehand so that changing settings during pathing doesn't cause a crash or unpredictable behavior - boolean cache = Baritone.settings().chuckCaching.get(); + boolean favoring = favoredPositions.isPresent(); + boolean cache = Baritone.settings().chuckCaching.get(); // grab all settings beforehand so that changing settings during pathing doesn't cause a crash or unpredictable behavior int pathingMaxChunkBorderFetch = Baritone.settings().pathingMaxChunkBorderFetch.get(); double favorCoeff = Baritone.settings().backtrackCostFavoringCoefficient.get(); boolean minimumImprovementRepropagation = Baritone.settings().minimumImprovementRepropagation.get(); diff --git a/src/main/java/baritone/bot/pathing/movement/CalculationContext.java b/src/main/java/baritone/bot/pathing/movement/CalculationContext.java index 0f4026be..2d65e789 100644 --- a/src/main/java/baritone/bot/pathing/movement/CalculationContext.java +++ b/src/main/java/baritone/bot/pathing/movement/CalculationContext.java @@ -46,7 +46,7 @@ public class CalculationContext implements Helper { public CalculationContext(ToolSet toolSet) { player().setSprinting(true); this.toolSet = toolSet; - this.hasThrowaway = Baritone.settings().allowPlaceThrowaway.get() && MovementHelper.throwaway(false); + this.hasThrowaway = Baritone.settings().allowPlace.get() && MovementHelper.throwaway(false); this.hasWaterBucket = Baritone.settings().allowWaterBucketFall.get() && InventoryPlayer.isHotbar(player().inventory.getSlotFor(STACK_BUCKET_WATER)) && !world().provider.isNether(); this.canSprint = Baritone.settings().allowSprint.get() && player().getFoodStats().getFoodLevel() > 6; this.placeBlockCost = Baritone.settings().blockPlacementPenalty.get(); diff --git a/src/main/java/baritone/bot/pathing/path/IPath.java b/src/main/java/baritone/bot/pathing/path/IPath.java index d764b12a..ae8b7e4b 100644 --- a/src/main/java/baritone/bot/pathing/path/IPath.java +++ b/src/main/java/baritone/bot/pathing/path/IPath.java @@ -17,6 +17,8 @@ package baritone.bot.pathing.path; +import baritone.bot.Baritone; +import baritone.bot.pathing.goals.Goal; import baritone.bot.pathing.movement.Movement; import baritone.bot.utils.Helper; import baritone.bot.utils.Utils; @@ -135,4 +137,16 @@ public interface IPath extends Helper { return this; } + default IPath staticCutoff(Goal destination) { + if (length() < Baritone.settings().pathCutoffMinimumLength.get()) { + return this; + } + if (destination == null || destination.isInGoal(getDest())) { + return this; + } + double factor = Baritone.settings().pathCutoffFactor.get(); + int newLength = (int) (length() * factor); + displayChatMessageRaw("Static cutoff " + length() + " to " + newLength); + return new CutoffPath(this, newLength); + } } diff --git a/src/main/java/baritone/bot/utils/ExampleBaritoneControl.java b/src/main/java/baritone/bot/utils/ExampleBaritoneControl.java index 39161b72..857a995d 100644 --- a/src/main/java/baritone/bot/utils/ExampleBaritoneControl.java +++ b/src/main/java/baritone/bot/utils/ExampleBaritoneControl.java @@ -55,6 +55,9 @@ public class ExampleBaritoneControl extends Behavior { return; } String msg = event.getMessage(); + if (msg.startsWith("/")) { + msg = msg.substring(1); + } if (msg.toLowerCase().startsWith("goal")) { event.cancel(); String[] params = msg.toLowerCase().substring(4).trim().split(" "); @@ -145,5 +148,44 @@ public class ExampleBaritoneControl extends Behavior { return; } } + if (msg.toLowerCase().equals("baritone") || msg.toLowerCase().equals("settings")) { + for (Settings.Setting setting : Baritone.settings().allSettings) { + displayChatMessageRaw(setting.toString()); + } + event.cancel(); + return; + } + if (msg.contains(" ")) { + String[] data = msg.split(" "); + if (data.length == 2) { + Settings.Setting setting = Baritone.settings().byLowerName.get(data[0].toLowerCase()); + if (setting != null) { + try { + if (setting.value.getClass() == Long.class) { + setting.value = Long.parseLong(data[1]); + } + if (setting.value.getClass() == Integer.class) { + setting.value = Integer.parseInt(data[1]); + } + if (setting.value.getClass() == Double.class) { + setting.value = Double.parseDouble(data[1]); + } + } catch (NumberFormatException e) { + displayChatMessageRaw("Unable to parse " + data[1]); + event.cancel(); + return; + } + displayChatMessageRaw(setting.toString()); + event.cancel(); + return; + } + } + } + if (Baritone.settings().byLowerName.containsKey(msg.toLowerCase())) { + Settings.Setting setting = Baritone.settings().byLowerName.get(msg.toLowerCase()); + displayChatMessageRaw(setting.toString()); + event.cancel(); + return; + } } }