Merge branch 'master' into backfill-2
This commit is contained in:
commit
7e3aa6efdd
3
USAGE.md
3
USAGE.md
@ -63,9 +63,6 @@ There are about a hundred settings, but here are some fun / interesting / import
|
|||||||
|
|
||||||
# Troubleshooting / common issues
|
# Troubleshooting / common issues
|
||||||
|
|
||||||
## Baritone highlights a block in green but gets completely stuck? Also I'm using Baritone with Future?
|
|
||||||
Baritone is trying to right click to place a block there, but it can't since there's a conflicting mixin. Baritone can't force click right click when Future is also installed. Left click **does work** on recent Baritone even with Future, however. For now, turn off `allowPlace` and Baritone will only search for paths that don't require placing blocks to complete. `allowBreak` can remain on.
|
|
||||||
|
|
||||||
## Why doesn't Baritone respond to any of my chat commands?
|
## Why doesn't Baritone respond to any of my chat commands?
|
||||||
This could be one of many things.
|
This could be one of many things.
|
||||||
|
|
||||||
|
@ -71,6 +71,18 @@ public interface IBaritone {
|
|||||||
*/
|
*/
|
||||||
IBuilderProcess getBuilderProcess();
|
IBuilderProcess getBuilderProcess();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The {@link IExploreProcess} instance
|
||||||
|
* @see IExploreProcess
|
||||||
|
*/
|
||||||
|
IExploreProcess getExploreProcess();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The {@link IFarmProcess} instance
|
||||||
|
* @see IFarmProcess
|
||||||
|
*/
|
||||||
|
IFarmProcess getFarmProcess();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The {@link ICustomGoalProcess} instance
|
* @return The {@link ICustomGoalProcess} instance
|
||||||
* @see ICustomGoalProcess
|
* @see ICustomGoalProcess
|
||||||
@ -115,4 +127,6 @@ public interface IBaritone {
|
|||||||
* @see IEventBus
|
* @see IEventBus
|
||||||
*/
|
*/
|
||||||
IEventBus getGameEventHandler();
|
IEventBus getGameEventHandler();
|
||||||
|
|
||||||
|
void openClick();
|
||||||
}
|
}
|
||||||
|
@ -142,7 +142,8 @@ public final class Settings {
|
|||||||
public final Setting<List<Item>> acceptableThrowawayItems = new Setting<>(new ArrayList<>(Arrays.asList(
|
public final Setting<List<Item>> acceptableThrowawayItems = new Setting<>(new ArrayList<>(Arrays.asList(
|
||||||
Item.getItemFromBlock(Blocks.DIRT),
|
Item.getItemFromBlock(Blocks.DIRT),
|
||||||
Item.getItemFromBlock(Blocks.COBBLESTONE),
|
Item.getItemFromBlock(Blocks.COBBLESTONE),
|
||||||
Item.getItemFromBlock(Blocks.NETHERRACK)
|
Item.getItemFromBlock(Blocks.NETHERRACK),
|
||||||
|
Item.getItemFromBlock(Blocks.STONE)
|
||||||
)));
|
)));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -401,10 +402,12 @@ public final class Settings {
|
|||||||
* On save, delete from RAM any cached regions that are more than 1024 blocks away from the player
|
* On save, delete from RAM any cached regions that are more than 1024 blocks away from the player
|
||||||
* <p>
|
* <p>
|
||||||
* Temporarily disabled
|
* Temporarily disabled
|
||||||
|
* <p>
|
||||||
|
* Temporarily reenabled
|
||||||
*
|
*
|
||||||
* @see <a href="https://github.com/cabaletta/baritone/issues/248">Issue #248</a>
|
* @see <a href="https://github.com/cabaletta/baritone/issues/248">Issue #248</a>
|
||||||
*/
|
*/
|
||||||
public final Setting<Boolean> pruneRegionsFromRAM = new Setting<>(false);
|
public final Setting<Boolean> pruneRegionsFromRAM = new Setting<>(true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remember the contents of containers (chests, echests, furnaces)
|
* Remember the contents of containers (chests, echests, furnaces)
|
||||||
@ -572,6 +575,13 @@ public final class Settings {
|
|||||||
*/
|
*/
|
||||||
public final Setting<Boolean> exploreForBlocks = new Setting<>(true);
|
public final Setting<Boolean> exploreForBlocks = new Setting<>(true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When the cache scan gives less blocks than the maximum threshold (but still above zero), scan the main world too.
|
||||||
|
* <p>
|
||||||
|
* Only if you have a beefy CPU and automatically mine blocks that are in cache
|
||||||
|
*/
|
||||||
|
public final Setting<Boolean> extendCacheOnThreshold = new Setting<>(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Don't consider the next layer in builder until the current one is done
|
* Don't consider the next layer in builder until the current one is done
|
||||||
*/
|
*/
|
||||||
@ -580,7 +590,7 @@ public final class Settings {
|
|||||||
/**
|
/**
|
||||||
* How far to move before repeating the build. -1 for the size of the build in that axis. 0 to disable
|
* How far to move before repeating the build. -1 for the size of the build in that axis. 0 to disable
|
||||||
*/
|
*/
|
||||||
public final Setting<Integer> buildRepeatDistance=new Setting<>(0);
|
public final Setting<Integer> buildRepeatDistance = new Setting<>(0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* What direction te repeat the build in
|
* What direction te repeat the build in
|
||||||
|
@ -23,9 +23,8 @@ import baritone.api.event.listener.IGameEventListener;
|
|||||||
/**
|
/**
|
||||||
* A behavior is simply a type that is able to listen to events.
|
* A behavior is simply a type that is able to listen to events.
|
||||||
*
|
*
|
||||||
* @see IGameEventListener
|
|
||||||
*
|
|
||||||
* @author Brady
|
* @author Brady
|
||||||
|
* @see IGameEventListener
|
||||||
* @since 9/23/2018
|
* @since 9/23/2018
|
||||||
*/
|
*/
|
||||||
public interface IBehavior extends AbstractGameEventListener {}
|
public interface IBehavior extends AbstractGameEventListener {}
|
||||||
|
@ -80,6 +80,13 @@ public interface IPathingBehavior extends IBehavior {
|
|||||||
*/
|
*/
|
||||||
boolean cancelEverything();
|
boolean cancelEverything();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PLEASE never call this
|
||||||
|
* <p>
|
||||||
|
* If cancelEverything was like "kill" this is "sudo kill -9". Or shutting off your computer.
|
||||||
|
*/
|
||||||
|
void forceCancel();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the current path, from the current path executor, if there is one.
|
* Returns the current path, from the current path executor, if there is one.
|
||||||
*
|
*
|
||||||
|
@ -81,4 +81,6 @@ public interface ICachedWorld {
|
|||||||
* in a new thread by default.
|
* in a new thread by default.
|
||||||
*/
|
*/
|
||||||
void save();
|
void save();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -15,9 +15,8 @@
|
|||||||
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package baritone.cache;
|
package baritone.api.cache;
|
||||||
|
|
||||||
import baritone.api.cache.IWaypoint;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@ -47,7 +46,7 @@ public class Waypoint implements IWaypoint {
|
|||||||
* @param location The waypoint location
|
* @param location The waypoint location
|
||||||
* @param creationTimestamp When the waypoint was created
|
* @param creationTimestamp When the waypoint was created
|
||||||
*/
|
*/
|
||||||
Waypoint(String name, Tag tag, BlockPos location, long creationTimestamp) {
|
public Waypoint(String name, Tag tag, BlockPos location, long creationTimestamp) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.tag = tag;
|
this.tag = tag;
|
||||||
this.location = location;
|
this.location = location;
|
@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
package baritone.api.pathing.goals;
|
package baritone.api.pathing.goals;
|
||||||
|
|
||||||
import baritone.api.BaritoneAPI;
|
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
|
||||||
|
@ -31,17 +31,17 @@ public class GoalTwoBlocks implements Goal, IGoalRenderPos {
|
|||||||
/**
|
/**
|
||||||
* The X block position of this goal
|
* The X block position of this goal
|
||||||
*/
|
*/
|
||||||
private final int x;
|
protected final int x;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Y block position of this goal
|
* The Y block position of this goal
|
||||||
*/
|
*/
|
||||||
private final int y;
|
protected final int y;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Z block position of this goal
|
* The Z block position of this goal
|
||||||
*/
|
*/
|
||||||
private final int z;
|
protected final int z;
|
||||||
|
|
||||||
public GoalTwoBlocks(BlockPos pos) {
|
public GoalTwoBlocks(BlockPos pos) {
|
||||||
this(pos.getX(), pos.getY(), pos.getZ());
|
this(pos.getX(), pos.getY(), pos.getZ());
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
package baritone.api.process;
|
package baritone.api.process;
|
||||||
|
|
||||||
import baritone.api.utils.ISchematic;
|
import baritone.api.utils.ISchematic;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.Vec3i;
|
import net.minecraft.util.math.Vec3i;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@ -46,4 +48,15 @@ public interface IBuilderProcess extends IBaritoneProcess {
|
|||||||
* @return Whether or not the schematic was able to load from file
|
* @return Whether or not the schematic was able to load from file
|
||||||
*/
|
*/
|
||||||
boolean build(String name, File schematic, Vec3i origin);
|
boolean build(String name, File schematic, Vec3i origin);
|
||||||
|
|
||||||
|
default boolean build(String schematicFile, BlockPos origin) {
|
||||||
|
File file = new File(new File(Minecraft.getMinecraft().gameDir, "schematics"), schematicFile);
|
||||||
|
return build(schematicFile, file, origin);
|
||||||
|
}
|
||||||
|
|
||||||
|
void pause();
|
||||||
|
|
||||||
|
void resume();
|
||||||
|
|
||||||
|
void clearArea(BlockPos corner1, BlockPos corner2);
|
||||||
}
|
}
|
||||||
|
22
src/api/java/baritone/api/process/IExploreProcess.java
Normal file
22
src/api/java/baritone/api/process/IExploreProcess.java
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* 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.api.process;
|
||||||
|
|
||||||
|
public interface IExploreProcess extends IBaritoneProcess {
|
||||||
|
void explore(int centerX, int centerZ);
|
||||||
|
}
|
22
src/api/java/baritone/api/process/IFarmProcess.java
Normal file
22
src/api/java/baritone/api/process/IFarmProcess.java
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* 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.api.process;
|
||||||
|
|
||||||
|
public interface IFarmProcess extends IBaritoneProcess {
|
||||||
|
void farm();
|
||||||
|
}
|
@ -25,4 +25,6 @@ import net.minecraft.block.Block;
|
|||||||
public interface IGetToBlockProcess extends IBaritoneProcess {
|
public interface IGetToBlockProcess extends IBaritoneProcess {
|
||||||
|
|
||||||
void getToBlock(Block block);
|
void getToBlock(Block block);
|
||||||
|
|
||||||
|
boolean blacklistClosest();
|
||||||
}
|
}
|
||||||
|
63
src/api/java/baritone/api/utils/BlockUtils.java
Normal file
63
src/api/java/baritone/api/utils/BlockUtils.java
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* 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.api.utils;
|
||||||
|
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public class BlockUtils {
|
||||||
|
private static transient Map<String, Block> resourceCache = new HashMap<>();
|
||||||
|
|
||||||
|
public static String blockToString(Block block) {
|
||||||
|
ResourceLocation loc = Block.REGISTRY.getNameForObject(block);
|
||||||
|
String name = loc.getPath(); // normally, only write the part after the minecraft:
|
||||||
|
if (!loc.getNamespace().equals("minecraft")) {
|
||||||
|
// Baritone is running on top of forge with mods installed, perhaps?
|
||||||
|
name = loc.toString(); // include the namespace with the colon
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Block stringToBlockRequired(String name) {
|
||||||
|
Block block = stringToBlockNullable(name);
|
||||||
|
Objects.requireNonNull(block);
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Block stringToBlockNullable(String name) {
|
||||||
|
// do NOT just replace this with a computeWithAbsent, it isn't thread safe
|
||||||
|
Block block = resourceCache.get(name); // map is never mutated in place so this is safe
|
||||||
|
if (block != null) {
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
if (resourceCache.containsKey(name)) {
|
||||||
|
return null; // cached as null
|
||||||
|
}
|
||||||
|
block = Block.getBlockFromName(name.contains(":") ? name : "minecraft:" + name);
|
||||||
|
Map<String, Block> copy = new HashMap<>(resourceCache); // read only copy is safe, wont throw concurrentmodification
|
||||||
|
copy.put(name, block);
|
||||||
|
resourceCache = copy;
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BlockUtils() {}
|
||||||
|
}
|
@ -15,27 +15,21 @@
|
|||||||
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package baritone.utils;
|
package baritone.api.utils;
|
||||||
|
|
||||||
import baritone.Baritone;
|
import baritone.api.BaritoneAPI;
|
||||||
|
import baritone.api.IBaritone;
|
||||||
import baritone.api.Settings;
|
import baritone.api.Settings;
|
||||||
|
import baritone.api.behavior.IPathingBehavior;
|
||||||
import baritone.api.cache.IRememberedInventory;
|
import baritone.api.cache.IRememberedInventory;
|
||||||
import baritone.api.cache.IWaypoint;
|
import baritone.api.cache.IWaypoint;
|
||||||
|
import baritone.api.cache.Waypoint;
|
||||||
import baritone.api.event.events.ChatEvent;
|
import baritone.api.event.events.ChatEvent;
|
||||||
|
import baritone.api.event.listener.AbstractGameEventListener;
|
||||||
import baritone.api.pathing.goals.*;
|
import baritone.api.pathing.goals.*;
|
||||||
import baritone.api.pathing.movement.ActionCosts;
|
|
||||||
import baritone.api.process.IBaritoneProcess;
|
import baritone.api.process.IBaritoneProcess;
|
||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.process.ICustomGoalProcess;
|
||||||
import baritone.api.utils.SettingsUtil;
|
import baritone.api.process.IGetToBlockProcess;
|
||||||
import baritone.behavior.Behavior;
|
|
||||||
import baritone.behavior.PathingBehavior;
|
|
||||||
import baritone.cache.ChunkPacker;
|
|
||||||
import baritone.cache.Waypoint;
|
|
||||||
import baritone.pathing.movement.CalculationContext;
|
|
||||||
import baritone.pathing.movement.Movement;
|
|
||||||
import baritone.pathing.movement.Moves;
|
|
||||||
import baritone.process.CustomGoalProcess;
|
|
||||||
import baritone.utils.pathing.SegmentedCalculator;
|
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.multiplayer.ChunkProviderClient;
|
import net.minecraft.client.multiplayer.ChunkProviderClient;
|
||||||
@ -46,10 +40,8 @@ import net.minecraft.util.math.BlockPos;
|
|||||||
import net.minecraft.world.chunk.Chunk;
|
import net.minecraft.world.chunk.Chunk;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
public class ExampleBaritoneControl extends Behavior implements Helper {
|
public class ExampleBaritoneControl implements Helper, AbstractGameEventListener {
|
||||||
|
|
||||||
private static final String HELP_MSG =
|
private static final String HELP_MSG =
|
||||||
"baritone - Output settings into chat\n" +
|
"baritone - Output settings into chat\n" +
|
||||||
@ -83,21 +75,26 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
|
|
||||||
private static final String COMMAND_PREFIX = "#";
|
private static final String COMMAND_PREFIX = "#";
|
||||||
|
|
||||||
public ExampleBaritoneControl(Baritone baritone) {
|
public final IBaritone baritone;
|
||||||
super(baritone);
|
public final IPlayerContext ctx;
|
||||||
|
|
||||||
|
public ExampleBaritoneControl(IBaritone baritone) {
|
||||||
|
this.baritone = baritone;
|
||||||
|
this.ctx = baritone.getPlayerContext();
|
||||||
|
baritone.getGameEventHandler().registerEventListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSendChatMessage(ChatEvent event) {
|
public void onSendChatMessage(ChatEvent event) {
|
||||||
String msg = event.getMessage();
|
String msg = event.getMessage();
|
||||||
if (Baritone.settings().prefixControl.value && msg.startsWith(COMMAND_PREFIX)) {
|
if (BaritoneAPI.getSettings().prefixControl.value && msg.startsWith(COMMAND_PREFIX)) {
|
||||||
if (!runCommand(msg.substring(COMMAND_PREFIX.length()))) {
|
if (!runCommand(msg.substring(COMMAND_PREFIX.length()))) {
|
||||||
logDirect("Invalid command");
|
logDirect("Invalid command");
|
||||||
}
|
}
|
||||||
event.cancel(); // always cancel if using prefixControl
|
event.cancel(); // always cancel if using prefixControl
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!Baritone.settings().chatControl.value && !Baritone.settings().removePrefix.value) {
|
if (!BaritoneAPI.getSettings().chatControl.value && !BaritoneAPI.getSettings().removePrefix.value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (runCommand(msg)) {
|
if (runCommand(msg)) {
|
||||||
@ -107,20 +104,20 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
|
|
||||||
public boolean runCommand(String msg0) { // you may think this can be private, but impcat calls it from .b =)
|
public boolean runCommand(String msg0) { // you may think this can be private, but impcat calls it from .b =)
|
||||||
String msg = msg0.toLowerCase(Locale.US).trim(); // don't reassign the argument LOL
|
String msg = msg0.toLowerCase(Locale.US).trim(); // don't reassign the argument LOL
|
||||||
PathingBehavior pathingBehavior = baritone.getPathingBehavior();
|
IPathingBehavior pathingBehavior = baritone.getPathingBehavior();
|
||||||
CustomGoalProcess customGoalProcess = baritone.getCustomGoalProcess();
|
ICustomGoalProcess customGoalProcess = baritone.getCustomGoalProcess();
|
||||||
List<Settings.Setting<Boolean>> toggleable = Baritone.settings().getAllValuesByType(Boolean.class);
|
List<Settings.Setting<Boolean>> toggleable = BaritoneAPI.getSettings().getAllValuesByType(Boolean.class);
|
||||||
for (Settings.Setting<Boolean> setting : toggleable) {
|
for (Settings.Setting<Boolean> setting : toggleable) {
|
||||||
if (msg.equalsIgnoreCase(setting.getName())) {
|
if (msg.equalsIgnoreCase(setting.getName())) {
|
||||||
setting.value ^= true;
|
setting.value ^= true;
|
||||||
logDirect("Toggled " + setting.getName() + " to " + setting.value);
|
logDirect("Toggled " + setting.getName() + " to " + setting.value);
|
||||||
SettingsUtil.save(Baritone.settings());
|
SettingsUtil.save(BaritoneAPI.getSettings());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (msg.equals("baritone") || msg.equals("modifiedsettings") || msg.startsWith("settings m") || msg.equals("modified")) {
|
if (msg.equals("baritone") || msg.equals("modifiedsettings") || msg.startsWith("settings m") || msg.equals("modified")) {
|
||||||
logDirect("All settings that have been modified from their default values:");
|
logDirect("All settings that have been modified from their default values:");
|
||||||
for (Settings.Setting<?> setting : SettingsUtil.modifiedSettings(Baritone.settings())) {
|
for (Settings.Setting<?> setting : SettingsUtil.modifiedSettings(BaritoneAPI.getSettings())) {
|
||||||
logDirect(setting.toString());
|
logDirect(setting.toString());
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -130,15 +127,15 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
try {
|
try {
|
||||||
int page = Integer.parseInt(rest.trim());
|
int page = Integer.parseInt(rest.trim());
|
||||||
int min = page * 10;
|
int min = page * 10;
|
||||||
int max = Math.min(Baritone.settings().allSettings.size(), (page + 1) * 10);
|
int max = Math.min(BaritoneAPI.getSettings().allSettings.size(), (page + 1) * 10);
|
||||||
logDirect("Settings " + min + " to " + (max - 1) + ":");
|
logDirect("Settings " + min + " to " + (max - 1) + ":");
|
||||||
for (int i = min; i < max; i++) {
|
for (int i = min; i < max; i++) {
|
||||||
logDirect(Baritone.settings().allSettings.get(i).toString());
|
logDirect(BaritoneAPI.getSettings().allSettings.get(i).toString());
|
||||||
}
|
}
|
||||||
} catch (Exception ex) { // NumberFormatException | ArrayIndexOutOfBoundsException and probably some others I'm forgetting lol
|
} catch (Exception ex) { // NumberFormatException | ArrayIndexOutOfBoundsException and probably some others I'm forgetting lol
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
logDirect("All settings:");
|
logDirect("All settings:");
|
||||||
for (Settings.Setting<?> setting : Baritone.settings().allSettings) {
|
for (Settings.Setting<?> setting : BaritoneAPI.getSettings().allSettings) {
|
||||||
logDirect(setting.toString());
|
logDirect(setting.toString());
|
||||||
}
|
}
|
||||||
logDirect("To get one page of ten settings at a time, do settings <num>");
|
logDirect("To get one page of ten settings at a time, do settings <num>");
|
||||||
@ -154,26 +151,26 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
if (msg.contains(" ")) {
|
if (msg.contains(" ")) {
|
||||||
String settingName = msg.substring(0, msg.indexOf(' '));
|
String settingName = msg.substring(0, msg.indexOf(' '));
|
||||||
String settingValue = msg.substring(msg.indexOf(' ') + 1);
|
String settingValue = msg.substring(msg.indexOf(' ') + 1);
|
||||||
Settings.Setting setting = Baritone.settings().byLowerName.get(settingName);
|
Settings.Setting setting = BaritoneAPI.getSettings().byLowerName.get(settingName);
|
||||||
if (setting != null) {
|
if (setting != null) {
|
||||||
if (settingValue.equals("reset")) {
|
if (settingValue.equals("reset")) {
|
||||||
logDirect("Resetting setting " + settingName + " to default value.");
|
logDirect("Resetting setting " + settingName + " to default value.");
|
||||||
setting.reset();
|
setting.reset();
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
SettingsUtil.parseAndApply(Baritone.settings(), settingName, settingValue);
|
SettingsUtil.parseAndApply(BaritoneAPI.getSettings(), settingName, settingValue);
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
logDirect("Unable to parse setting");
|
logDirect("Unable to parse setting");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SettingsUtil.save(Baritone.settings());
|
SettingsUtil.save(BaritoneAPI.getSettings());
|
||||||
logDirect(setting.toString());
|
logDirect(setting.toString());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Baritone.settings().byLowerName.containsKey(msg)) {
|
if (BaritoneAPI.getSettings().byLowerName.containsKey(msg)) {
|
||||||
Settings.Setting<?> setting = Baritone.settings().byLowerName.get(msg);
|
Settings.Setting<?> setting = BaritoneAPI.getSettings().byLowerName.get(msg);
|
||||||
logDirect(setting.toString());
|
logDirect(setting.toString());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -209,7 +206,7 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (msg.equals("fullpath")) {
|
/*if (msg.equals("fullpath")) {
|
||||||
if (pathingBehavior.getGoal() == null) {
|
if (pathingBehavior.getGoal() == null) {
|
||||||
logDirect("No goal.");
|
logDirect("No goal.");
|
||||||
} else {
|
} else {
|
||||||
@ -225,7 +222,7 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}*/
|
||||||
if (msg.equals("proc")) {
|
if (msg.equals("proc")) {
|
||||||
Optional<IBaritoneProcess> proc = baritone.getPathingControlManager().mostRecentInControl();
|
Optional<IBaritoneProcess> proc = baritone.getPathingControlManager().mostRecentInControl();
|
||||||
if (!proc.isPresent()) {
|
if (!proc.isPresent()) {
|
||||||
@ -283,7 +280,7 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (msg.equals("come")) {
|
if (msg.equals("come")) {
|
||||||
customGoalProcess.setGoalAndPath(new GoalBlock(new BlockPos(mc.getRenderViewEntity())));
|
customGoalProcess.setGoalAndPath(new GoalBlock(new BlockPos(Helper.mc.getRenderViewEntity())));
|
||||||
logDirect("Coming");
|
logDirect("Coming");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -358,11 +355,16 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
logDirect("resumed");
|
logDirect("resumed");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (msg.equals("pause")) {
|
||||||
|
baritone.getBuilderProcess().pause();
|
||||||
|
logDirect("paused");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (msg.equals("reset")) {
|
if (msg.equals("reset")) {
|
||||||
for (Settings.Setting setting : Baritone.settings().allSettings) {
|
for (Settings.Setting setting : BaritoneAPI.getSettings().allSettings) {
|
||||||
setting.reset();
|
setting.reset();
|
||||||
}
|
}
|
||||||
SettingsUtil.save(Baritone.settings());
|
SettingsUtil.save(BaritoneAPI.getSettings());
|
||||||
logDirect("Baritone settings reset");
|
logDirect("Baritone settings reset");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -377,7 +379,13 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
logDirect("okay");
|
logDirect("okay");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (msg.equals("echest")) {
|
if (msg.equals("farm")) {
|
||||||
|
baritone.getFarmProcess().farm();
|
||||||
|
logDirect("farming");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// this literally doesn't work, memory is disabled lol
|
||||||
|
/*if (msg.equals("echest")) {
|
||||||
Optional<List<ItemStack>> contents = baritone.getMemoryBehavior().echest();
|
Optional<List<ItemStack>> contents = baritone.getMemoryBehavior().echest();
|
||||||
if (contents.isPresent()) {
|
if (contents.isPresent()) {
|
||||||
logDirect("echest contents:");
|
logDirect("echest contents:");
|
||||||
@ -386,18 +394,8 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
logDirect("echest contents unknown");
|
logDirect("echest contents unknown");
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}*/
|
||||||
if (msg.equals("chests")) {
|
if (msg.equals("chests")) {
|
||||||
System.out.println(baritone.getWorldProvider());
|
|
||||||
System.out.println(baritone.getWorldProvider().getCurrentWorld());
|
|
||||||
|
|
||||||
System.out.println(baritone.getWorldProvider().getCurrentWorld().getContainerMemory());
|
|
||||||
|
|
||||||
System.out.println(baritone.getWorldProvider().getCurrentWorld().getContainerMemory().getRememberedInventories());
|
|
||||||
|
|
||||||
System.out.println(baritone.getWorldProvider().getCurrentWorld().getContainerMemory().getRememberedInventories().entrySet());
|
|
||||||
|
|
||||||
System.out.println(baritone.getWorldProvider().getCurrentWorld().getContainerMemory().getRememberedInventories().entrySet());
|
|
||||||
for (Map.Entry<BlockPos, IRememberedInventory> entry : baritone.getWorldProvider().getCurrentWorld().getContainerMemory().getRememberedInventories().entrySet()) {
|
for (Map.Entry<BlockPos, IRememberedInventory> entry : baritone.getWorldProvider().getCurrentWorld().getContainerMemory().getRememberedInventories().entrySet()) {
|
||||||
logDirect(entry.getKey() + "");
|
logDirect(entry.getKey() + "");
|
||||||
log(entry.getValue().getContents());
|
log(entry.getValue().getContents());
|
||||||
@ -456,14 +454,27 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
logDirect("Exploring from " + centerX + "," + centerZ);
|
logDirect("Exploring from " + centerX + "," + centerZ);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (msg.equals("blacklist")) {
|
||||||
|
IGetToBlockProcess proc = baritone.getGetToBlockProcess();
|
||||||
|
if (!proc.isActive()) {
|
||||||
|
logDirect("GetToBlockProcess is not currently active");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (proc.blacklistClosest()) {
|
||||||
|
logDirect("Blacklisted closest instances");
|
||||||
|
} else {
|
||||||
|
logDirect("No known locations, unable to blacklist");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (msg.startsWith("find")) {
|
if (msg.startsWith("find")) {
|
||||||
String blockType = msg.substring(4).trim();
|
String blockType = msg.substring(4).trim();
|
||||||
ArrayList<BlockPos> locs = baritone.getWorldProvider().getCurrentWorld().getCachedWorld().getLocationsOf(blockType, 1, ctx.playerFeet().getX(), ctx.playerFeet().getZ(), 4);
|
ArrayList<BlockPos> locs = baritone.getWorldProvider().getCurrentWorld().getCachedWorld().getLocationsOf(blockType, 1, ctx.playerFeet().getX(), ctx.playerFeet().getZ(), 4);
|
||||||
logDirect("Have " + locs.size() + " locations");
|
logDirect("Have " + locs.size() + " locations");
|
||||||
for (BlockPos pos : locs) {
|
for (BlockPos pos : locs) {
|
||||||
Block actually = BlockStateInterface.get(ctx, pos).getBlock();
|
Block actually = ctx.world().getBlockState(pos).getBlock();
|
||||||
if (!ChunkPacker.blockToString(actually).equalsIgnoreCase(blockType)) {
|
if (!BlockUtils.blockToString(actually).equalsIgnoreCase(blockType)) {
|
||||||
System.out.println("Was looking for " + blockType + " but actually found " + actually + " " + ChunkPacker.blockToString(actually));
|
logDebug("Was looking for " + blockType + " but actually found " + actually + " " + BlockUtils.blockToString(actually));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -472,13 +483,13 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
String[] blockTypes = msg.substring(4).trim().split(" ");
|
String[] blockTypes = msg.substring(4).trim().split(" ");
|
||||||
try {
|
try {
|
||||||
int quantity = Integer.parseInt(blockTypes[1]);
|
int quantity = Integer.parseInt(blockTypes[1]);
|
||||||
Block block = ChunkPacker.stringToBlockRequired(blockTypes[0]);
|
Block block = BlockUtils.stringToBlockRequired(blockTypes[0]);
|
||||||
baritone.getMineProcess().mine(quantity, block);
|
baritone.getMineProcess().mine(quantity, block);
|
||||||
logDirect("Will mine " + quantity + " " + blockTypes[0]);
|
logDirect("Will mine " + quantity + " " + blockTypes[0]);
|
||||||
return true;
|
return true;
|
||||||
} catch (NumberFormatException | ArrayIndexOutOfBoundsException | NullPointerException ex) {}
|
} catch (NumberFormatException | ArrayIndexOutOfBoundsException | NullPointerException ex) {}
|
||||||
for (String s : blockTypes) {
|
for (String s : blockTypes) {
|
||||||
if (ChunkPacker.stringToBlockNullable(s) == null) {
|
if (BlockUtils.stringToBlockNullable(s) == null) {
|
||||||
logDirect(s + " isn't a valid block name");
|
logDirect(s + " isn't a valid block name");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -489,12 +500,7 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (msg.equals("click")) {
|
if (msg.equals("click")) {
|
||||||
new Thread(() -> {
|
baritone.openClick();
|
||||||
try {
|
|
||||||
Thread.sleep(100);
|
|
||||||
mc.addScheduledTask(() -> mc.displayGuiScreen(new GuiClick()));
|
|
||||||
} catch (Exception ignored) {}
|
|
||||||
}).start();
|
|
||||||
logDirect("aight dude");
|
logDirect("aight dude");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -514,9 +520,9 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
// for example, "show deaths"
|
// for example, "show deaths"
|
||||||
waypointType = waypointType.substring(0, waypointType.length() - 1);
|
waypointType = waypointType.substring(0, waypointType.length() - 1);
|
||||||
}
|
}
|
||||||
Waypoint.Tag tag = Waypoint.Tag.fromString(waypointType);
|
IWaypoint.Tag tag = IWaypoint.Tag.fromString(waypointType);
|
||||||
if (tag == null) {
|
if (tag == null) {
|
||||||
logDirect("Not a valid tag. Tags are: " + Arrays.asList(Waypoint.Tag.values()).toString().toLowerCase());
|
logDirect("Not a valid tag. Tags are: " + Arrays.asList(IWaypoint.Tag.values()).toString().toLowerCase());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
Set<IWaypoint> waypoints = baritone.getWorldProvider().getCurrentWorld().getWaypoints().getByTag(tag);
|
Set<IWaypoint> waypoints = baritone.getWorldProvider().getCurrentWorld().getWaypoints().getByTag(tag);
|
||||||
@ -547,21 +553,21 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
}
|
}
|
||||||
name = parts[0];
|
name = parts[0];
|
||||||
}
|
}
|
||||||
baritone.getWorldProvider().getCurrentWorld().getWaypoints().addWaypoint(new Waypoint(name, Waypoint.Tag.USER, pos));
|
baritone.getWorldProvider().getCurrentWorld().getWaypoints().addWaypoint(new Waypoint(name, IWaypoint.Tag.USER, pos));
|
||||||
logDirect("Saved user defined position " + pos + " under name '" + name + "'. Say 'goto " + name + "' to set goal, say 'list user' to list custom waypoints.");
|
logDirect("Saved user defined position " + pos + " under name '" + name + "'. Say 'goto " + name + "' to set goal, say 'list user' to list custom waypoints.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (msg.startsWith("goto")) {
|
if (msg.startsWith("goto")) {
|
||||||
String waypointType = msg.substring(4).trim();
|
String waypointType = msg.substring(4).trim();
|
||||||
if (waypointType.endsWith("s") && Waypoint.Tag.fromString(waypointType.substring(0, waypointType.length() - 1)) != null) {
|
if (waypointType.endsWith("s") && IWaypoint.Tag.fromString(waypointType.substring(0, waypointType.length() - 1)) != null) {
|
||||||
// for example, "show deaths"
|
// for example, "show deaths"
|
||||||
waypointType = waypointType.substring(0, waypointType.length() - 1);
|
waypointType = waypointType.substring(0, waypointType.length() - 1);
|
||||||
}
|
}
|
||||||
Waypoint.Tag tag = Waypoint.Tag.fromString(waypointType);
|
IWaypoint.Tag tag = IWaypoint.Tag.fromString(waypointType);
|
||||||
IWaypoint waypoint;
|
IWaypoint waypoint;
|
||||||
if (tag == null) {
|
if (tag == null) {
|
||||||
String mining = waypointType;
|
String mining = waypointType;
|
||||||
Block block = ChunkPacker.stringToBlockNullable(mining);
|
Block block = BlockUtils.stringToBlockNullable(mining);
|
||||||
//logDirect("Not a valid tag. Tags are: " + Arrays.asList(Waypoint.Tag.values()).toString().toLowerCase());
|
//logDirect("Not a valid tag. Tags are: " + Arrays.asList(Waypoint.Tag.values()).toString().toLowerCase());
|
||||||
if (block == null) {
|
if (block == null) {
|
||||||
waypoint = baritone.getWorldProvider().getCurrentWorld().getWaypoints().getAllWaypoints().stream().filter(w -> w.getName().equalsIgnoreCase(mining)).max(Comparator.comparingLong(IWaypoint::getCreationTimestamp)).orElse(null);
|
waypoint = baritone.getWorldProvider().getCurrentWorld().getWaypoints().getAllWaypoints().stream().filter(w -> w.getName().equalsIgnoreCase(mining)).max(Comparator.comparingLong(IWaypoint::getCreationTimestamp)).orElse(null);
|
||||||
@ -584,12 +590,12 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Goal goal = waypoint.getTag() == Waypoint.Tag.BED ? new GoalGetToBlock(waypoint.getLocation()) : new GoalBlock(waypoint.getLocation());
|
Goal goal = waypoint.getTag() == IWaypoint.Tag.BED ? new GoalGetToBlock(waypoint.getLocation()) : new GoalBlock(waypoint.getLocation());
|
||||||
customGoalProcess.setGoalAndPath(goal);
|
customGoalProcess.setGoalAndPath(goal);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (msg.equals("spawn") || msg.equals("bed")) {
|
if (msg.equals("spawn") || msg.equals("bed")) {
|
||||||
IWaypoint waypoint = baritone.getWorldProvider().getCurrentWorld().getWaypoints().getMostRecentByTag(Waypoint.Tag.BED);
|
IWaypoint waypoint = baritone.getWorldProvider().getCurrentWorld().getWaypoints().getMostRecentByTag(IWaypoint.Tag.BED);
|
||||||
if (waypoint == null) {
|
if (waypoint == null) {
|
||||||
BlockPos spawnPoint = ctx.player().getBedLocation();
|
BlockPos spawnPoint = ctx.player().getBedLocation();
|
||||||
// for some reason the default spawnpoint is underground sometimes
|
// for some reason the default spawnpoint is underground sometimes
|
||||||
@ -604,12 +610,12 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (msg.equals("sethome")) {
|
if (msg.equals("sethome")) {
|
||||||
baritone.getWorldProvider().getCurrentWorld().getWaypoints().addWaypoint(new Waypoint("", Waypoint.Tag.HOME, ctx.playerFeet()));
|
baritone.getWorldProvider().getCurrentWorld().getWaypoints().addWaypoint(new Waypoint("", IWaypoint.Tag.HOME, ctx.playerFeet()));
|
||||||
logDirect("Saved. Say home to set goal.");
|
logDirect("Saved. Say home to set goal.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (msg.equals("home")) {
|
if (msg.equals("home")) {
|
||||||
IWaypoint waypoint = baritone.getWorldProvider().getCurrentWorld().getWaypoints().getMostRecentByTag(Waypoint.Tag.HOME);
|
IWaypoint waypoint = baritone.getWorldProvider().getCurrentWorld().getWaypoints().getMostRecentByTag(IWaypoint.Tag.HOME);
|
||||||
if (waypoint == null) {
|
if (waypoint == null) {
|
||||||
logDirect("home not saved");
|
logDirect("home not saved");
|
||||||
} else {
|
} else {
|
||||||
@ -619,7 +625,8 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (msg.equals("costs")) {
|
// this is completely impossible from api
|
||||||
|
/*if (msg.equals("costs")) {
|
||||||
List<Movement> moves = Stream.of(Moves.values()).map(x -> x.apply0(new CalculationContext(baritone), ctx.playerFeet())).collect(Collectors.toCollection(ArrayList::new));
|
List<Movement> moves = Stream.of(Moves.values()).map(x -> x.apply0(new CalculationContext(baritone), ctx.playerFeet())).collect(Collectors.toCollection(ArrayList::new));
|
||||||
while (moves.contains(null)) {
|
while (moves.contains(null)) {
|
||||||
moves.remove(null);
|
moves.remove(null);
|
||||||
@ -635,7 +642,7 @@ public class ExampleBaritoneControl extends Behavior implements Helper {
|
|||||||
logDirect(parts[parts.length - 1] + " " + move.getDest().getX() + "," + move.getDest().getY() + "," + move.getDest().getZ() + " " + strCost);
|
logDirect(parts[parts.length - 1] + " " + move.getDest().getX() + "," + move.getDest().getY() + "," + move.getDest().getZ() + " " + strCost);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}*/
|
||||||
if (msg.equals("damn")) {
|
if (msg.equals("damn")) {
|
||||||
logDirect("daniel");
|
logDirect("daniel");
|
||||||
}
|
}
|
@ -15,9 +15,9 @@
|
|||||||
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
* along with Baritone. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package baritone.utils;
|
package baritone.api.utils;
|
||||||
|
|
||||||
import baritone.Baritone;
|
import baritone.api.BaritoneAPI;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.util.text.ITextComponent;
|
import net.minecraft.util.text.ITextComponent;
|
||||||
import net.minecraft.util.text.TextComponentString;
|
import net.minecraft.util.text.TextComponentString;
|
||||||
@ -50,7 +50,7 @@ public interface Helper {
|
|||||||
* @param message The message to display in chat
|
* @param message The message to display in chat
|
||||||
*/
|
*/
|
||||||
default void logDebug(String message) {
|
default void logDebug(String message) {
|
||||||
if (!Baritone.settings().chatDebug.value) {
|
if (!BaritoneAPI.getSettings().chatDebug.value) {
|
||||||
//System.out.println("Suppressed debug message:");
|
//System.out.println("Suppressed debug message:");
|
||||||
//System.out.println(message);
|
//System.out.println(message);
|
||||||
return;
|
return;
|
||||||
@ -67,6 +67,6 @@ public interface Helper {
|
|||||||
ITextComponent component = MESSAGE_PREFIX.createCopy();
|
ITextComponent component = MESSAGE_PREFIX.createCopy();
|
||||||
component.getStyle().setColor(TextFormatting.GRAY);
|
component.getStyle().setColor(TextFormatting.GRAY);
|
||||||
component.appendSibling(new TextComponentString(" " + message));
|
component.appendSibling(new TextComponentString(" " + message));
|
||||||
Minecraft.getMinecraft().addScheduledTask(() -> Baritone.settings().logger.value.accept(component));
|
Minecraft.getMinecraft().addScheduledTask(() -> BaritoneAPI.getSettings().logger.value.accept(component));
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -71,20 +71,26 @@ public interface IPlayerContext {
|
|||||||
* @return The position of the highlighted block
|
* @return The position of the highlighted block
|
||||||
*/
|
*/
|
||||||
default Optional<BlockPos> getSelectedBlock() {
|
default Optional<BlockPos> getSelectedBlock() {
|
||||||
if (objectMouseOver() != null && objectMouseOver().typeOfHit == RayTraceResult.Type.BLOCK) {
|
RayTraceResult result = objectMouseOver();
|
||||||
return Optional.of(objectMouseOver().getBlockPos());
|
if (result != null && result.typeOfHit == RayTraceResult.Type.BLOCK) {
|
||||||
|
return Optional.of(result.getBlockPos());
|
||||||
}
|
}
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default boolean isLookingAt(BlockPos pos) {
|
||||||
|
return getSelectedBlock().equals(Optional.of(pos));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the entity that the crosshair is currently placed over. Updated once per tick.
|
* Returns the entity that the crosshair is currently placed over. Updated once per tick.
|
||||||
*
|
*
|
||||||
* @return The entity
|
* @return The entity
|
||||||
*/
|
*/
|
||||||
default Optional<Entity> getSelectedEntity() {
|
default Optional<Entity> getSelectedEntity() {
|
||||||
if (objectMouseOver() != null && objectMouseOver().typeOfHit == RayTraceResult.Type.ENTITY) {
|
RayTraceResult result = objectMouseOver();
|
||||||
return Optional.of(objectMouseOver().entityHit);
|
if (result != null && result.typeOfHit == RayTraceResult.Type.ENTITY) {
|
||||||
|
return Optional.of(result.entityHit);
|
||||||
}
|
}
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
@ -147,12 +147,11 @@ public class SettingsUtil {
|
|||||||
FLOAT(Float.class, Float::parseFloat),
|
FLOAT(Float.class, Float::parseFloat),
|
||||||
LONG(Long.class, Long::parseLong),
|
LONG(Long.class, Long::parseLong),
|
||||||
|
|
||||||
ITEM_LIST(ArrayList.class, str -> Stream.of(str.split(",")).map(Item::getByNameOrId).collect(Collectors.toCollection(ArrayList::new)), list -> ((ArrayList<Item>) list).stream().map(Item.REGISTRY::getNameForObject).map(ResourceLocation::toString).collect(Collectors.joining(","))),
|
ITEM_LIST(ArrayList.class, str -> Stream.of(str.split(",")).map(String::trim).map(Item::getByNameOrId).collect(Collectors.toCollection(ArrayList::new)), list -> ((ArrayList<Item>) list).stream().map(Item.REGISTRY::getNameForObject).map(ResourceLocation::toString).collect(Collectors.joining(","))),
|
||||||
COLOR(Color.class, str -> new Color(Integer.parseInt(str.split(",")[0]), Integer.parseInt(str.split(",")[1]), Integer.parseInt(str.split(",")[2])), color -> color.getRed() + "," + color.getGreen() + "," + color.getBlue()),
|
COLOR(Color.class, str -> new Color(Integer.parseInt(str.split(",")[0]), Integer.parseInt(str.split(",")[1]), Integer.parseInt(str.split(",")[2])), color -> color.getRed() + "," + color.getGreen() + "," + color.getBlue()),
|
||||||
ENUMFACING(EnumFacing.class, EnumFacing::byName);
|
ENUMFACING(EnumFacing.class, EnumFacing::byName);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Class<?> klass;
|
Class<?> klass;
|
||||||
Function<String, Object> parser;
|
Function<String, Object> parser;
|
||||||
Function<Object, String> toString;
|
Function<Object, String> toString;
|
||||||
|
@ -21,6 +21,8 @@ import baritone.api.BaritoneAPI;
|
|||||||
import baritone.api.IBaritone;
|
import baritone.api.IBaritone;
|
||||||
import baritone.api.Settings;
|
import baritone.api.Settings;
|
||||||
import baritone.api.event.listener.IEventBus;
|
import baritone.api.event.listener.IEventBus;
|
||||||
|
import baritone.api.utils.ExampleBaritoneControl;
|
||||||
|
import baritone.api.utils.Helper;
|
||||||
import baritone.api.utils.IPlayerContext;
|
import baritone.api.utils.IPlayerContext;
|
||||||
import baritone.behavior.*;
|
import baritone.behavior.*;
|
||||||
import baritone.cache.WorldProvider;
|
import baritone.cache.WorldProvider;
|
||||||
@ -33,8 +35,6 @@ import net.minecraft.client.Minecraft;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
import java.util.concurrent.SynchronousQueue;
|
import java.util.concurrent.SynchronousQueue;
|
||||||
import java.util.concurrent.ThreadPoolExecutor;
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
@ -67,7 +67,6 @@ public class Baritone implements IBaritone {
|
|||||||
|
|
||||||
private GameEventHandler gameEventHandler;
|
private GameEventHandler gameEventHandler;
|
||||||
|
|
||||||
private List<Behavior> behaviors;
|
|
||||||
private PathingBehavior pathingBehavior;
|
private PathingBehavior pathingBehavior;
|
||||||
private LookBehavior lookBehavior;
|
private LookBehavior lookBehavior;
|
||||||
private MemoryBehavior memoryBehavior;
|
private MemoryBehavior memoryBehavior;
|
||||||
@ -81,6 +80,7 @@ public class Baritone implements IBaritone {
|
|||||||
private BuilderProcess builderProcess;
|
private BuilderProcess builderProcess;
|
||||||
private ExploreProcess exploreProcess;
|
private ExploreProcess exploreProcess;
|
||||||
private BackfillProcess backfillProcess;
|
private BackfillProcess backfillProcess;
|
||||||
|
private FarmProcess farmProcess;
|
||||||
|
|
||||||
private PathingControlManager pathingControlManager;
|
private PathingControlManager pathingControlManager;
|
||||||
|
|
||||||
@ -102,7 +102,6 @@ public class Baritone implements IBaritone {
|
|||||||
// Define this before behaviors try and get it, or else it will be null and the builds will fail!
|
// Define this before behaviors try and get it, or else it will be null and the builds will fail!
|
||||||
this.playerContext = PrimaryPlayerContext.INSTANCE;
|
this.playerContext = PrimaryPlayerContext.INSTANCE;
|
||||||
|
|
||||||
this.behaviors = new ArrayList<>();
|
|
||||||
{
|
{
|
||||||
// the Behavior constructor calls baritone.registerBehavior(this) so this populates the behaviors arraylist
|
// the Behavior constructor calls baritone.registerBehavior(this) so this populates the behaviors arraylist
|
||||||
pathingBehavior = new PathingBehavior(this);
|
pathingBehavior = new PathingBehavior(this);
|
||||||
@ -122,6 +121,7 @@ public class Baritone implements IBaritone {
|
|||||||
builderProcess = new BuilderProcess(this);
|
builderProcess = new BuilderProcess(this);
|
||||||
exploreProcess = new ExploreProcess(this);
|
exploreProcess = new ExploreProcess(this);
|
||||||
backfillProcess = new BackfillProcess(this);
|
backfillProcess = new BackfillProcess(this);
|
||||||
|
farmProcess = new FarmProcess(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.worldProvider = new WorldProvider();
|
this.worldProvider = new WorldProvider();
|
||||||
@ -138,12 +138,7 @@ public class Baritone implements IBaritone {
|
|||||||
return this.pathingControlManager;
|
return this.pathingControlManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Behavior> getBehaviors() {
|
|
||||||
return this.behaviors;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void registerBehavior(Behavior behavior) {
|
public void registerBehavior(Behavior behavior) {
|
||||||
this.behaviors.add(behavior);
|
|
||||||
this.gameEventHandler.registerEventListener(behavior);
|
this.gameEventHandler.registerEventListener(behavior);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -199,6 +194,10 @@ public class Baritone implements IBaritone {
|
|||||||
return this.mineProcess;
|
return this.mineProcess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public FarmProcess getFarmProcess() {
|
||||||
|
return this.farmProcess;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PathingBehavior getPathingBehavior() {
|
public PathingBehavior getPathingBehavior() {
|
||||||
return this.pathingBehavior;
|
return this.pathingBehavior;
|
||||||
@ -214,6 +213,16 @@ public class Baritone implements IBaritone {
|
|||||||
return this.gameEventHandler;
|
return this.gameEventHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void openClick() {
|
||||||
|
new Thread(() -> {
|
||||||
|
try {
|
||||||
|
Thread.sleep(100);
|
||||||
|
Helper.mc.addScheduledTask(() -> Helper.mc.displayGuiScreen(new GuiClick()));
|
||||||
|
} catch (Exception ignored) {}
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
|
||||||
public static Settings settings() {
|
public static Settings settings() {
|
||||||
return BaritoneAPI.getSettings();
|
return BaritoneAPI.getSettings();
|
||||||
}
|
}
|
||||||
|
@ -18,13 +18,13 @@
|
|||||||
package baritone.behavior;
|
package baritone.behavior;
|
||||||
|
|
||||||
import baritone.Baritone;
|
import baritone.Baritone;
|
||||||
|
import baritone.api.cache.Waypoint;
|
||||||
import baritone.api.event.events.BlockInteractEvent;
|
import baritone.api.event.events.BlockInteractEvent;
|
||||||
import baritone.api.event.events.PacketEvent;
|
import baritone.api.event.events.PacketEvent;
|
||||||
import baritone.api.event.events.PlayerUpdateEvent;
|
import baritone.api.event.events.PlayerUpdateEvent;
|
||||||
import baritone.api.event.events.TickEvent;
|
import baritone.api.event.events.TickEvent;
|
||||||
import baritone.api.event.events.type.EventState;
|
import baritone.api.event.events.type.EventState;
|
||||||
import baritone.cache.ContainerMemory;
|
import baritone.cache.ContainerMemory;
|
||||||
import baritone.cache.Waypoint;
|
|
||||||
import baritone.utils.BlockStateInterface;
|
import baritone.utils.BlockStateInterface;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockBed;
|
import net.minecraft.block.BlockBed;
|
||||||
|
@ -25,6 +25,7 @@ import baritone.api.pathing.goals.Goal;
|
|||||||
import baritone.api.pathing.goals.GoalXZ;
|
import baritone.api.pathing.goals.GoalXZ;
|
||||||
import baritone.api.process.PathingCommand;
|
import baritone.api.process.PathingCommand;
|
||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
|
import baritone.api.utils.Helper;
|
||||||
import baritone.api.utils.PathCalculationResult;
|
import baritone.api.utils.PathCalculationResult;
|
||||||
import baritone.api.utils.interfaces.IGoalRenderPos;
|
import baritone.api.utils.interfaces.IGoalRenderPos;
|
||||||
import baritone.pathing.calc.AStarPathFinder;
|
import baritone.pathing.calc.AStarPathFinder;
|
||||||
@ -32,7 +33,6 @@ import baritone.pathing.calc.AbstractNodeCostSearch;
|
|||||||
import baritone.pathing.movement.CalculationContext;
|
import baritone.pathing.movement.CalculationContext;
|
||||||
import baritone.pathing.movement.MovementHelper;
|
import baritone.pathing.movement.MovementHelper;
|
||||||
import baritone.pathing.path.PathExecutor;
|
import baritone.pathing.path.PathExecutor;
|
||||||
import baritone.utils.Helper;
|
|
||||||
import baritone.utils.PathRenderer;
|
import baritone.utils.PathRenderer;
|
||||||
import baritone.utils.PathingCommandContext;
|
import baritone.utils.PathingCommandContext;
|
||||||
import baritone.utils.pathing.Favoring;
|
import baritone.utils.pathing.Favoring;
|
||||||
@ -350,7 +350,8 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void forceCancel() { // NOT exposed on public api
|
@Override
|
||||||
|
public void forceCancel() { // exposed on public api because :sob:
|
||||||
cancelEverything();
|
cancelEverything();
|
||||||
secretInternalSegmentCancel();
|
secretInternalSegmentCancel();
|
||||||
synchronized (pathCalcLock) {
|
synchronized (pathCalcLock) {
|
||||||
@ -358,11 +359,11 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void secretCursedFunctionDoNotCall(IPath path) {
|
/*public void secretCursedFunctionDoNotCall(IPath path) {
|
||||||
synchronized (pathPlanLock) {
|
synchronized (pathPlanLock) {
|
||||||
current = new PathExecutor(this, path);
|
current = new PathExecutor(this, path);
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
public CalculationContext secretInternalGetCalculationContext() {
|
public CalculationContext secretInternalGetCalculationContext() {
|
||||||
return context;
|
return context;
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
package baritone.cache;
|
package baritone.cache;
|
||||||
|
|
||||||
|
import baritone.api.utils.BlockUtils;
|
||||||
import baritone.utils.pathing.PathingBlockType;
|
import baritone.utils.pathing.PathingBlockType;
|
||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
@ -177,7 +178,7 @@ public final class CachedChunk {
|
|||||||
if (special != null) {
|
if (special != null) {
|
||||||
String str = special.get(index);
|
String str = special.get(index);
|
||||||
if (str != null) {
|
if (str != null) {
|
||||||
return ChunkPacker.stringToBlockRequired(str).getDefaultState();
|
return BlockUtils.stringToBlockRequired(str).getDefaultState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ package baritone.cache;
|
|||||||
|
|
||||||
import baritone.Baritone;
|
import baritone.Baritone;
|
||||||
import baritone.api.cache.ICachedRegion;
|
import baritone.api.cache.ICachedRegion;
|
||||||
|
import baritone.api.utils.BlockUtils;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
|
||||||
@ -149,7 +150,7 @@ public final class CachedRegion implements ICachedRegion {
|
|||||||
for (int z = 0; z < 32; z++) {
|
for (int z = 0; z < 32; z++) {
|
||||||
if (chunks[x][z] != null) {
|
if (chunks[x][z] != null) {
|
||||||
for (int i = 0; i < 256; i++) {
|
for (int i = 0; i < 256; i++) {
|
||||||
out.writeUTF(ChunkPacker.blockToString(chunks[x][z].getOverview()[i].getBlock()));
|
out.writeUTF(BlockUtils.blockToString(chunks[x][z].getOverview()[i].getBlock()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -240,7 +241,7 @@ public final class CachedRegion implements ICachedRegion {
|
|||||||
for (int z = 0; z < 32; z++) {
|
for (int z = 0; z < 32; z++) {
|
||||||
if (present[x][z]) {
|
if (present[x][z]) {
|
||||||
for (int i = 0; i < 256; i++) {
|
for (int i = 0; i < 256; i++) {
|
||||||
overview[x][z][i] = ChunkPacker.stringToBlockRequired(in.readUTF()).getDefaultState();
|
overview[x][z][i] = BlockUtils.stringToBlockRequired(in.readUTF()).getDefaultState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -255,7 +256,7 @@ public final class CachedRegion implements ICachedRegion {
|
|||||||
int numSpecialBlockTypes = in.readShort() & 0xffff;
|
int numSpecialBlockTypes = in.readShort() & 0xffff;
|
||||||
for (int i = 0; i < numSpecialBlockTypes; i++) {
|
for (int i = 0; i < numSpecialBlockTypes; i++) {
|
||||||
String blockName = in.readUTF();
|
String blockName = in.readUTF();
|
||||||
ChunkPacker.stringToBlockRequired(blockName);
|
BlockUtils.stringToBlockRequired(blockName);
|
||||||
List<BlockPos> locs = new ArrayList<>();
|
List<BlockPos> locs = new ArrayList<>();
|
||||||
location[x][z].put(blockName, locs);
|
location[x][z].put(blockName, locs);
|
||||||
int numLocations = in.readShort() & 0xffff;
|
int numLocations = in.readShort() & 0xffff;
|
||||||
|
@ -22,7 +22,7 @@ import baritone.api.BaritoneAPI;
|
|||||||
import baritone.api.IBaritone;
|
import baritone.api.IBaritone;
|
||||||
import baritone.api.cache.ICachedWorld;
|
import baritone.api.cache.ICachedWorld;
|
||||||
import baritone.api.cache.IWorldData;
|
import baritone.api.cache.IWorldData;
|
||||||
import baritone.utils.Helper;
|
import baritone.api.utils.Helper;
|
||||||
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
|
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
|
||||||
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
@ -180,8 +180,8 @@ public final class CachedWorld implements ICachedWorld, Helper {
|
|||||||
if (region == null) {
|
if (region == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
int distX = (region.getX() << 9 + 256) - pruneCenter.getX();
|
int distX = ((region.getX() << 9) + 256) - pruneCenter.getX();
|
||||||
int distZ = (region.getZ() << 9 + 256) - pruneCenter.getZ();
|
int distZ = ((region.getZ() << 9) + 256) - pruneCenter.getZ();
|
||||||
double dist = Math.sqrt(distX * distX + distZ * distZ);
|
double dist = Math.sqrt(distX * distX + distZ * distZ);
|
||||||
if (dist > 1024) {
|
if (dist > 1024) {
|
||||||
logDebug("Deleting cached region " + region.getX() + "," + region.getZ() + " from ram");
|
logDebug("Deleting cached region " + region.getX() + "," + region.getZ() + " from ram");
|
||||||
@ -216,7 +216,7 @@ public final class CachedWorld implements ICachedWorld, Helper {
|
|||||||
if (mostRecentlyModified == null) {
|
if (mostRecentlyModified == null) {
|
||||||
return new BlockPos(0, 0, 0);
|
return new BlockPos(0, 0, 0);
|
||||||
}
|
}
|
||||||
return new BlockPos(mostRecentlyModified.x << 4 + 8, 0, mostRecentlyModified.z << 4 + 8);
|
return new BlockPos((mostRecentlyModified.x << 4) + 8, 0, (mostRecentlyModified.z << 4) + 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized List<CachedRegion> allRegions() {
|
private synchronized List<CachedRegion> allRegions() {
|
||||||
|
36
src/main/java/baritone/cache/ChunkPacker.java
vendored
36
src/main/java/baritone/cache/ChunkPacker.java
vendored
@ -17,12 +17,12 @@
|
|||||||
|
|
||||||
package baritone.cache;
|
package baritone.cache;
|
||||||
|
|
||||||
|
import baritone.api.utils.BlockUtils;
|
||||||
import baritone.pathing.movement.MovementHelper;
|
import baritone.pathing.movement.MovementHelper;
|
||||||
import baritone.utils.pathing.PathingBlockType;
|
import baritone.utils.pathing.PathingBlockType;
|
||||||
import net.minecraft.block.*;
|
import net.minecraft.block.*;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
import net.minecraft.util.ResourceLocation;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.chunk.BlockStateContainer;
|
import net.minecraft.world.chunk.BlockStateContainer;
|
||||||
import net.minecraft.world.chunk.Chunk;
|
import net.minecraft.world.chunk.Chunk;
|
||||||
@ -36,8 +36,6 @@ import java.util.*;
|
|||||||
*/
|
*/
|
||||||
public final class ChunkPacker {
|
public final class ChunkPacker {
|
||||||
|
|
||||||
private static final Map<String, Block> resourceCache = new HashMap<>();
|
|
||||||
|
|
||||||
private ChunkPacker() {}
|
private ChunkPacker() {}
|
||||||
|
|
||||||
public static CachedChunk pack(Chunk chunk) {
|
public static CachedChunk pack(Chunk chunk) {
|
||||||
@ -75,7 +73,7 @@ public final class ChunkPacker {
|
|||||||
bitSet.set(index + 1, bits[1]);
|
bitSet.set(index + 1, bits[1]);
|
||||||
Block block = state.getBlock();
|
Block block = state.getBlock();
|
||||||
if (CachedChunk.BLOCKS_TO_KEEP_TRACK_OF.contains(block)) {
|
if (CachedChunk.BLOCKS_TO_KEEP_TRACK_OF.contains(block)) {
|
||||||
String name = blockToString(block);
|
String name = BlockUtils.blockToString(block);
|
||||||
specialBlocks.computeIfAbsent(name, b -> new ArrayList<>()).add(new BlockPos(x, y, z));
|
specialBlocks.computeIfAbsent(name, b -> new ArrayList<>()).add(new BlockPos(x, y, z));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -105,25 +103,6 @@ public final class ChunkPacker {
|
|||||||
return new CachedChunk(chunk.x, chunk.z, bitSet, blocks, specialBlocks, System.currentTimeMillis());
|
return new CachedChunk(chunk.x, chunk.z, bitSet, blocks, specialBlocks, System.currentTimeMillis());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String blockToString(Block block) {
|
|
||||||
ResourceLocation loc = Block.REGISTRY.getNameForObject(block);
|
|
||||||
String name = loc.getPath(); // normally, only write the part after the minecraft:
|
|
||||||
if (!loc.getNamespace().equals("minecraft")) {
|
|
||||||
// Baritone is running on top of forge with mods installed, perhaps?
|
|
||||||
name = loc.toString(); // include the namespace with the colon
|
|
||||||
}
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Block stringToBlockRequired(String name) {
|
|
||||||
Block block = stringToBlockNullable(name);
|
|
||||||
Objects.requireNonNull(block);
|
|
||||||
return block;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Block stringToBlockNullable(String name) {
|
|
||||||
return resourceCache.computeIfAbsent(name, n -> Block.getBlockFromName(n.contains(":") ? n : "minecraft:" + n));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static PathingBlockType getPathingBlockType(IBlockState state, Chunk chunk, int x, int y, int z) {
|
private static PathingBlockType getPathingBlockType(IBlockState state, Chunk chunk, int x, int y, int z) {
|
||||||
Block block = state.getBlock();
|
Block block = state.getBlock();
|
||||||
@ -133,15 +112,20 @@ public final class ChunkPacker {
|
|||||||
if (MovementHelper.possiblyFlowing(state)) {
|
if (MovementHelper.possiblyFlowing(state)) {
|
||||||
return PathingBlockType.AVOID;
|
return PathingBlockType.AVOID;
|
||||||
}
|
}
|
||||||
|
if (
|
||||||
|
(x != 15 && MovementHelper.possiblyFlowing(chunk.getBlockState(x + 1, y, z)))
|
||||||
|
|| (x != 0 && MovementHelper.possiblyFlowing(chunk.getBlockState(x - 1, y, z)))
|
||||||
|
|| (z != 15 && MovementHelper.possiblyFlowing(chunk.getBlockState(x, y, z + 1)))
|
||||||
|
|| (z != 0 && MovementHelper.possiblyFlowing(chunk.getBlockState(x, y, z - 1)))
|
||||||
|
) {
|
||||||
|
return PathingBlockType.AVOID;
|
||||||
|
}
|
||||||
if (x == 0 || x == 15 || z == 0 || z == 15) {
|
if (x == 0 || x == 15 || z == 0 || z == 15) {
|
||||||
if (BlockLiquid.getSlopeAngle(chunk.getWorld(), new BlockPos(x + chunk.x << 4, y, z + chunk.z << 4), state.getMaterial(), state) == -1000.0F) {
|
if (BlockLiquid.getSlopeAngle(chunk.getWorld(), new BlockPos(x + chunk.x << 4, y, z + chunk.z << 4), state.getMaterial(), state) == -1000.0F) {
|
||||||
return PathingBlockType.WATER;
|
return PathingBlockType.WATER;
|
||||||
}
|
}
|
||||||
return PathingBlockType.AVOID;
|
return PathingBlockType.AVOID;
|
||||||
}
|
}
|
||||||
if (MovementHelper.possiblyFlowing(chunk.getBlockState(x + 1, y, z)) || MovementHelper.possiblyFlowing(chunk.getBlockState(x - 1, y, z)) || MovementHelper.possiblyFlowing(chunk.getBlockState(x, y, z + 1)) || MovementHelper.possiblyFlowing(chunk.getBlockState(x, y, z - 1))) {
|
|
||||||
return PathingBlockType.AVOID;
|
|
||||||
}
|
|
||||||
return PathingBlockType.WATER;
|
return PathingBlockType.WATER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ package baritone.cache;
|
|||||||
|
|
||||||
import baritone.api.cache.IWaypoint;
|
import baritone.api.cache.IWaypoint;
|
||||||
import baritone.api.cache.IWaypointCollection;
|
import baritone.api.cache.IWaypointCollection;
|
||||||
|
import baritone.api.cache.Waypoint;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
@ -19,7 +19,7 @@ package baritone.cache;
|
|||||||
|
|
||||||
import baritone.Baritone;
|
import baritone.Baritone;
|
||||||
import baritone.api.cache.IWorldProvider;
|
import baritone.api.cache.IWorldProvider;
|
||||||
import baritone.utils.Helper;
|
import baritone.api.utils.Helper;
|
||||||
import baritone.utils.accessor.IAnvilChunkLoader;
|
import baritone.utils.accessor.IAnvilChunkLoader;
|
||||||
import baritone.utils.accessor.IChunkProviderServer;
|
import baritone.utils.accessor.IChunkProviderServer;
|
||||||
import net.minecraft.server.integrated.IntegratedServer;
|
import net.minecraft.server.integrated.IntegratedServer;
|
||||||
|
@ -22,9 +22,9 @@ import baritone.api.event.events.*;
|
|||||||
import baritone.api.event.events.type.EventState;
|
import baritone.api.event.events.type.EventState;
|
||||||
import baritone.api.event.listener.IEventBus;
|
import baritone.api.event.listener.IEventBus;
|
||||||
import baritone.api.event.listener.IGameEventListener;
|
import baritone.api.event.listener.IGameEventListener;
|
||||||
|
import baritone.api.utils.Helper;
|
||||||
import baritone.cache.WorldProvider;
|
import baritone.cache.WorldProvider;
|
||||||
import baritone.utils.BlockStateInterface;
|
import baritone.utils.BlockStateInterface;
|
||||||
import baritone.utils.Helper;
|
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraft.world.chunk.Chunk;
|
import net.minecraft.world.chunk.Chunk;
|
||||||
|
|
||||||
|
@ -22,9 +22,9 @@ import baritone.api.pathing.calc.IPath;
|
|||||||
import baritone.api.pathing.calc.IPathFinder;
|
import baritone.api.pathing.calc.IPathFinder;
|
||||||
import baritone.api.pathing.goals.Goal;
|
import baritone.api.pathing.goals.Goal;
|
||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
|
import baritone.api.utils.Helper;
|
||||||
import baritone.api.utils.PathCalculationResult;
|
import baritone.api.utils.PathCalculationResult;
|
||||||
import baritone.pathing.movement.CalculationContext;
|
import baritone.pathing.movement.CalculationContext;
|
||||||
import baritone.utils.Helper;
|
|
||||||
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@ -186,7 +186,7 @@ public abstract class AbstractNodeCostSearch implements IPathFinder, Helper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected Optional<IPath> bestSoFar(boolean logInfo, int numNodes) {
|
protected Optional<IPath> bestSoFar(boolean logInfo, int numNodes) {
|
||||||
if (startNode == null || bestSoFar == null) {
|
if (startNode == null) {
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
double bestDist = 0;
|
double bestDist = 0;
|
||||||
|
@ -21,11 +21,11 @@ import baritone.api.pathing.calc.IPath;
|
|||||||
import baritone.api.pathing.goals.Goal;
|
import baritone.api.pathing.goals.Goal;
|
||||||
import baritone.api.pathing.movement.IMovement;
|
import baritone.api.pathing.movement.IMovement;
|
||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
|
import baritone.api.utils.Helper;
|
||||||
import baritone.pathing.movement.CalculationContext;
|
import baritone.pathing.movement.CalculationContext;
|
||||||
import baritone.pathing.movement.Movement;
|
import baritone.pathing.movement.Movement;
|
||||||
import baritone.pathing.movement.Moves;
|
import baritone.pathing.movement.Moves;
|
||||||
import baritone.pathing.path.CutoffPath;
|
import baritone.pathing.path.CutoffPath;
|
||||||
import baritone.utils.Helper;
|
|
||||||
import baritone.utils.pathing.PathBase;
|
import baritone.utils.pathing.PathBase;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -25,7 +25,6 @@ import baritone.api.utils.*;
|
|||||||
import baritone.api.utils.input.Input;
|
import baritone.api.utils.input.Input;
|
||||||
import baritone.pathing.movement.MovementState.MovementTarget;
|
import baritone.pathing.movement.MovementState.MovementTarget;
|
||||||
import baritone.utils.BlockStateInterface;
|
import baritone.utils.BlockStateInterface;
|
||||||
import baritone.utils.Helper;
|
|
||||||
import baritone.utils.ToolSet;
|
import baritone.utils.ToolSet;
|
||||||
import net.minecraft.block.*;
|
import net.minecraft.block.*;
|
||||||
import net.minecraft.block.properties.PropertyBool;
|
import net.minecraft.block.properties.PropertyBool;
|
||||||
@ -312,6 +311,10 @@ public interface MovementHelper extends ActionCosts, Helper {
|
|||||||
return canWalkOn(new BlockStateInterface(ctx), pos.x, pos.y, pos.z, state);
|
return canWalkOn(new BlockStateInterface(ctx), pos.x, pos.y, pos.z, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static boolean canWalkOn(IPlayerContext ctx, BlockPos pos) {
|
||||||
|
return canWalkOn(new BlockStateInterface(ctx), pos.getX(), pos.getY(), pos.getZ());
|
||||||
|
}
|
||||||
|
|
||||||
static boolean canWalkOn(IPlayerContext ctx, BetterBlockPos pos) {
|
static boolean canWalkOn(IPlayerContext ctx, BetterBlockPos pos) {
|
||||||
return canWalkOn(new BlockStateInterface(ctx), pos.x, pos.y, pos.z);
|
return canWalkOn(new BlockStateInterface(ctx), pos.x, pos.y, pos.z);
|
||||||
}
|
}
|
||||||
|
@ -197,7 +197,7 @@ public class MovementAscend extends Movement {
|
|||||||
if (headBonkClear()) {
|
if (headBonkClear()) {
|
||||||
return state.setInput(Input.JUMP, true);
|
return state.setInput(Input.JUMP, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flatDistToNext > 1.2 || sideDist > 0.2) {
|
if (flatDistToNext > 1.2 || sideDist > 0.2) {
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
@ -39,7 +39,6 @@ import net.minecraft.init.Items;
|
|||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.RayTraceResult;
|
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.util.math.Vec3i;
|
import net.minecraft.util.math.Vec3i;
|
||||||
|
|
||||||
@ -92,8 +91,7 @@ public class MovementFall extends Movement {
|
|||||||
|
|
||||||
targetRotation = new Rotation(toDest.getYaw(), 90.0F);
|
targetRotation = new Rotation(toDest.getYaw(), 90.0F);
|
||||||
|
|
||||||
RayTraceResult trace = ctx.objectMouseOver();
|
if (ctx.isLookingAt(dest) || ctx.isLookingAt(dest.down())) {
|
||||||
if (trace != null && trace.typeOfHit == RayTraceResult.Type.BLOCK && (trace.getBlockPos().equals(dest) || trace.getBlockPos().equals(dest.down()))) {
|
|
||||||
state.setInput(Input.CLICK_RIGHT, true);
|
state.setInput(Input.CLICK_RIGHT, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -106,7 +106,9 @@ public class MovementParkour extends Movement {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (MovementHelper.canWalkOn(context.bsi, x + xDiff * i, y - 1, z + zDiff * i)) {
|
IBlockState landingOn = context.bsi.get0(x + xDiff * i, y - 1, z + zDiff * i);
|
||||||
|
// farmland needs to be canwalkon otherwise farm can never work at all, but we want to specifically disallow ending a jumy on farmland haha
|
||||||
|
if (landingOn.getBlock() != Blocks.FARMLAND && MovementHelper.canWalkOn(context.bsi, x + xDiff * i, y - 1, z + zDiff * i, landingOn)) {
|
||||||
res.x = x + xDiff * i;
|
res.x = x + xDiff * i;
|
||||||
res.y = y;
|
res.y = y;
|
||||||
res.z = z + zDiff * i;
|
res.z = z + zDiff * i;
|
||||||
|
@ -246,12 +246,13 @@ public class MovementTraverse extends Movement {
|
|||||||
if (wasTheBridgeBlockAlwaysThere && (!MovementHelper.isLiquid(ctx, ctx.playerFeet()) || Baritone.settings().sprintInWater.value) && (!MovementHelper.avoidWalkingInto(intoBelow) || MovementHelper.isWater(intoBelow)) && !MovementHelper.avoidWalkingInto(intoAbove)) {
|
if (wasTheBridgeBlockAlwaysThere && (!MovementHelper.isLiquid(ctx, ctx.playerFeet()) || Baritone.settings().sprintInWater.value) && (!MovementHelper.avoidWalkingInto(intoBelow) || MovementHelper.isWater(intoBelow)) && !MovementHelper.avoidWalkingInto(intoAbove)) {
|
||||||
state.setInput(Input.SPRINT, true);
|
state.setInput(Input.SPRINT, true);
|
||||||
}
|
}
|
||||||
Block destDown = BlockStateInterface.get(ctx, dest.down()).getBlock();
|
|
||||||
if (whereAmI.getY() != dest.getY() && ladder && (destDown == Blocks.VINE || destDown == Blocks.LADDER)) {
|
IBlockState destDown = BlockStateInterface.get(ctx, dest.down());
|
||||||
new MovementPillar(baritone, dest.down(), dest).updateState(state); // i'm sorry
|
BlockPos against = positionsToBreak[0];
|
||||||
return state;
|
if (whereAmI.getY() != dest.getY() && ladder && (destDown.getBlock() == Blocks.VINE || destDown.getBlock() == Blocks.LADDER)) {
|
||||||
|
against = destDown.getBlock() == Blocks.VINE ? MovementPillar.getAgainst(new CalculationContext(baritone), dest.down()) : dest.offset(destDown.getValue(BlockLadder.FACING).getOpposite());
|
||||||
}
|
}
|
||||||
MovementHelper.moveTowards(ctx, state, positionsToBreak[0]);
|
MovementHelper.moveTowards(ctx, state, against);
|
||||||
return state;
|
return state;
|
||||||
} else {
|
} else {
|
||||||
wasTheBridgeBlockAlwaysThere = false;
|
wasTheBridgeBlockAlwaysThere = false;
|
||||||
|
@ -23,10 +23,7 @@ import baritone.api.pathing.movement.ActionCosts;
|
|||||||
import baritone.api.pathing.movement.IMovement;
|
import baritone.api.pathing.movement.IMovement;
|
||||||
import baritone.api.pathing.movement.MovementStatus;
|
import baritone.api.pathing.movement.MovementStatus;
|
||||||
import baritone.api.pathing.path.IPathExecutor;
|
import baritone.api.pathing.path.IPathExecutor;
|
||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.*;
|
||||||
import baritone.api.utils.IPlayerContext;
|
|
||||||
import baritone.api.utils.RotationUtils;
|
|
||||||
import baritone.api.utils.VecUtils;
|
|
||||||
import baritone.api.utils.input.Input;
|
import baritone.api.utils.input.Input;
|
||||||
import baritone.behavior.PathingBehavior;
|
import baritone.behavior.PathingBehavior;
|
||||||
import baritone.pathing.calc.AbstractNodeCostSearch;
|
import baritone.pathing.calc.AbstractNodeCostSearch;
|
||||||
@ -35,7 +32,6 @@ import baritone.pathing.movement.Movement;
|
|||||||
import baritone.pathing.movement.MovementHelper;
|
import baritone.pathing.movement.MovementHelper;
|
||||||
import baritone.pathing.movement.movements.*;
|
import baritone.pathing.movement.movements.*;
|
||||||
import baritone.utils.BlockStateInterface;
|
import baritone.utils.BlockStateInterface;
|
||||||
import baritone.utils.Helper;
|
|
||||||
import net.minecraft.block.BlockLiquid;
|
import net.minecraft.block.BlockLiquid;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
import net.minecraft.util.Tuple;
|
import net.minecraft.util.Tuple;
|
||||||
@ -441,7 +437,10 @@ public class PathExecutor implements IPathExecutor, Helper {
|
|||||||
IMovement prev = path.movements().get(pathPosition - 1);
|
IMovement prev = path.movements().get(pathPosition - 1);
|
||||||
if (prev instanceof MovementDescend && prev.getDirection().up().equals(current.getDirection().down())) {
|
if (prev instanceof MovementDescend && prev.getDirection().up().equals(current.getDirection().down())) {
|
||||||
BlockPos center = current.getSrc().up();
|
BlockPos center = current.getSrc().up();
|
||||||
if (ctx.player().posY >= center.getY()) { // playerFeet adds 0.1251 to account for soul sand
|
// playerFeet adds 0.1251 to account for soul sand
|
||||||
|
// farmland is 0.9375
|
||||||
|
// 0.07 is to account for farmland
|
||||||
|
if (ctx.player().posY >= center.getY() - 0.07) {
|
||||||
behavior.baritone.getInputOverrideHandler().setInputForceState(Input.JUMP, false);
|
behavior.baritone.getInputOverrideHandler().setInputForceState(Input.JUMP, false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -566,7 +565,10 @@ public class PathExecutor implements IPathExecutor, Helper {
|
|||||||
if (next instanceof MovementDescend && next.getDirection().equals(current.getDirection())) {
|
if (next instanceof MovementDescend && next.getDirection().equals(current.getDirection())) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (next instanceof MovementTraverse && next.getDirection().down().equals(current.getDirection()) && MovementHelper.canWalkOn(ctx, next.getDest().down())) {
|
if (!MovementHelper.canWalkOn(ctx, current.getDest().add(current.getDirection()))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (next instanceof MovementTraverse && next.getDirection().down().equals(current.getDirection())) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return next instanceof MovementDiagonal && Baritone.settings().allowOvershootDiagonalDescend.value;
|
return next instanceof MovementDiagonal && Baritone.settings().allowOvershootDiagonalDescend.value;
|
||||||
|
@ -36,7 +36,6 @@ import baritone.utils.PathingCommandContext;
|
|||||||
import baritone.utils.schematic.AirSchematic;
|
import baritone.utils.schematic.AirSchematic;
|
||||||
import baritone.utils.schematic.Schematic;
|
import baritone.utils.schematic.Schematic;
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
import net.minecraft.item.ItemBlock;
|
import net.minecraft.item.ItemBlock;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
@ -69,12 +68,6 @@ public class BuilderProcess extends BaritoneProcessHelper implements IBuilderPro
|
|||||||
super(baritone);
|
super(baritone);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean build(String schematicFile, BlockPos origin) {
|
|
||||||
File file = new File(new File(Minecraft.getMinecraft().gameDir, "schematics"), schematicFile);
|
|
||||||
System.out.println(file + " " + file.exists());
|
|
||||||
return build(schematicFile, file, origin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(String name, ISchematic schematic, Vec3i origin) {
|
public void build(String name, ISchematic schematic, Vec3i origin) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
@ -89,6 +82,10 @@ public class BuilderProcess extends BaritoneProcessHelper implements IBuilderPro
|
|||||||
paused = false;
|
paused = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void pause() {
|
||||||
|
paused = true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean build(String name, File schematic, Vec3i origin) {
|
public boolean build(String name, File schematic, Vec3i origin) {
|
||||||
NBTTagCompound tag;
|
NBTTagCompound tag;
|
||||||
@ -292,7 +289,7 @@ public class BuilderProcess extends BaritoneProcessHelper implements IBuilderPro
|
|||||||
}
|
}
|
||||||
baritone.getInputOverrideHandler().clearAllKeys();
|
baritone.getInputOverrideHandler().clearAllKeys();
|
||||||
if (paused) {
|
if (paused) {
|
||||||
return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE);
|
return new PathingCommand(null, PathingCommandType.CANCEL_AND_SET_GOAL);
|
||||||
}
|
}
|
||||||
if (Baritone.settings().buildInLayers.value) {
|
if (Baritone.settings().buildInLayers.value) {
|
||||||
if (realSchematic == null) {
|
if (realSchematic == null) {
|
||||||
@ -358,10 +355,10 @@ public class BuilderProcess extends BaritoneProcessHelper implements IBuilderPro
|
|||||||
// and is unable since it's unsneaked in the intermediary tick
|
// and is unable since it's unsneaked in the intermediary tick
|
||||||
baritone.getInputOverrideHandler().setInputForceState(Input.SNEAK, true);
|
baritone.getInputOverrideHandler().setInputForceState(Input.SNEAK, true);
|
||||||
}
|
}
|
||||||
if (Objects.equals(ctx.objectMouseOver().getBlockPos(), pos) || ctx.playerRotations().isReallyCloseTo(rot)) {
|
if (ctx.isLookingAt(pos) || ctx.playerRotations().isReallyCloseTo(rot)) {
|
||||||
baritone.getInputOverrideHandler().setInputForceState(Input.CLICK_LEFT, true);
|
baritone.getInputOverrideHandler().setInputForceState(Input.CLICK_LEFT, true);
|
||||||
}
|
}
|
||||||
return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE);
|
return new PathingCommand(null, PathingCommandType.CANCEL_AND_SET_GOAL);
|
||||||
}
|
}
|
||||||
List<IBlockState> desirableOnHotbar = new ArrayList<>();
|
List<IBlockState> desirableOnHotbar = new ArrayList<>();
|
||||||
Optional<Placement> toPlace = searchForPlacables(bcc, desirableOnHotbar);
|
Optional<Placement> toPlace = searchForPlacables(bcc, desirableOnHotbar);
|
||||||
@ -370,10 +367,10 @@ public class BuilderProcess extends BaritoneProcessHelper implements IBuilderPro
|
|||||||
baritone.getLookBehavior().updateTarget(rot, true);
|
baritone.getLookBehavior().updateTarget(rot, true);
|
||||||
ctx.player().inventory.currentItem = toPlace.get().hotbarSelection;
|
ctx.player().inventory.currentItem = toPlace.get().hotbarSelection;
|
||||||
baritone.getInputOverrideHandler().setInputForceState(Input.SNEAK, true);
|
baritone.getInputOverrideHandler().setInputForceState(Input.SNEAK, true);
|
||||||
if ((Objects.equals(ctx.objectMouseOver().getBlockPos(), toPlace.get().placeAgainst) && ctx.objectMouseOver().sideHit.equals(toPlace.get().side)) || ctx.playerRotations().isReallyCloseTo(rot)) {
|
if ((ctx.isLookingAt(toPlace.get().placeAgainst) && ctx.objectMouseOver().sideHit.equals(toPlace.get().side)) || ctx.playerRotations().isReallyCloseTo(rot)) {
|
||||||
baritone.getInputOverrideHandler().setInputForceState(Input.CLICK_RIGHT, true);
|
baritone.getInputOverrideHandler().setInputForceState(Input.CLICK_RIGHT, true);
|
||||||
}
|
}
|
||||||
return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE);
|
return new PathingCommand(null, PathingCommandType.CANCEL_AND_SET_GOAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<IBlockState> approxPlacable = placable(36);
|
List<IBlockState> approxPlacable = placable(36);
|
||||||
|
@ -22,6 +22,7 @@ import baritone.api.cache.ICachedWorld;
|
|||||||
import baritone.api.pathing.goals.Goal;
|
import baritone.api.pathing.goals.Goal;
|
||||||
import baritone.api.pathing.goals.GoalComposite;
|
import baritone.api.pathing.goals.GoalComposite;
|
||||||
import baritone.api.pathing.goals.GoalXZ;
|
import baritone.api.pathing.goals.GoalXZ;
|
||||||
|
import baritone.api.process.IExploreProcess;
|
||||||
import baritone.api.process.PathingCommand;
|
import baritone.api.process.PathingCommand;
|
||||||
import baritone.api.process.PathingCommandType;
|
import baritone.api.process.PathingCommandType;
|
||||||
import baritone.cache.CachedWorld;
|
import baritone.cache.CachedWorld;
|
||||||
@ -31,7 +32,7 @@ import net.minecraft.util.math.BlockPos;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class ExploreProcess extends BaritoneProcessHelper {
|
public class ExploreProcess extends BaritoneProcessHelper implements IExploreProcess {
|
||||||
|
|
||||||
private BlockPos explorationOrigin;
|
private BlockPos explorationOrigin;
|
||||||
|
|
||||||
@ -44,6 +45,7 @@ public class ExploreProcess extends BaritoneProcessHelper {
|
|||||||
return explorationOrigin != null;
|
return explorationOrigin != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void explore(int centerX, int centerZ) {
|
public void explore(int centerX, int centerZ) {
|
||||||
explorationOrigin = new BlockPos(centerX, 0, centerZ);
|
explorationOrigin = new BlockPos(centerX, 0, centerZ);
|
||||||
}
|
}
|
||||||
|
285
src/main/java/baritone/process/FarmProcess.java
Normal file
285
src/main/java/baritone/process/FarmProcess.java
Normal file
@ -0,0 +1,285 @@
|
|||||||
|
/*
|
||||||
|
* 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.process;
|
||||||
|
|
||||||
|
import baritone.Baritone;
|
||||||
|
import baritone.api.pathing.goals.Goal;
|
||||||
|
import baritone.api.pathing.goals.GoalBlock;
|
||||||
|
import baritone.api.pathing.goals.GoalComposite;
|
||||||
|
import baritone.api.process.IFarmProcess;
|
||||||
|
import baritone.api.process.PathingCommand;
|
||||||
|
import baritone.api.process.PathingCommandType;
|
||||||
|
import baritone.api.utils.Rotation;
|
||||||
|
import baritone.api.utils.RotationUtils;
|
||||||
|
import baritone.api.utils.input.Input;
|
||||||
|
import baritone.cache.WorldScanner;
|
||||||
|
import baritone.pathing.movement.MovementHelper;
|
||||||
|
import baritone.utils.BaritoneProcessHelper;
|
||||||
|
import net.minecraft.block.*;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
import net.minecraft.entity.Entity;
|
||||||
|
import net.minecraft.entity.item.EntityItem;
|
||||||
|
import net.minecraft.init.Blocks;
|
||||||
|
import net.minecraft.init.Items;
|
||||||
|
import net.minecraft.item.EnumDyeColor;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemDye;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.util.NonNullList;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
public class FarmProcess extends BaritoneProcessHelper implements IFarmProcess {
|
||||||
|
|
||||||
|
private boolean active;
|
||||||
|
|
||||||
|
private static final List<Item> FARMLAND_PLANTABLE = Arrays.asList(
|
||||||
|
Items.BEETROOT_SEEDS,
|
||||||
|
Items.MELON_SEEDS,
|
||||||
|
Items.WHEAT_SEEDS,
|
||||||
|
Items.PUMPKIN_SEEDS,
|
||||||
|
Items.POTATO,
|
||||||
|
Items.CARROT
|
||||||
|
);
|
||||||
|
|
||||||
|
private static final List<Item> PICKUP_DROPPED = Arrays.asList(
|
||||||
|
Items.BEETROOT_SEEDS,
|
||||||
|
Items.WHEAT,
|
||||||
|
Items.MELON_SEEDS,
|
||||||
|
Items.MELON,
|
||||||
|
Items.WHEAT_SEEDS,
|
||||||
|
Items.WHEAT,
|
||||||
|
Items.PUMPKIN_SEEDS,
|
||||||
|
Items.POTATO,
|
||||||
|
Items.CARROT,
|
||||||
|
Items.BEETROOT,
|
||||||
|
Item.getItemFromBlock(Blocks.PUMPKIN),
|
||||||
|
Item.getItemFromBlock(Blocks.MELON_BLOCK),
|
||||||
|
Items.NETHER_WART,
|
||||||
|
Items.REEDS,
|
||||||
|
Item.getItemFromBlock(Blocks.CACTUS)
|
||||||
|
);
|
||||||
|
|
||||||
|
public FarmProcess(Baritone baritone) {
|
||||||
|
super(baritone);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isActive() {
|
||||||
|
return active;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void farm() {
|
||||||
|
active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum Harvest {
|
||||||
|
WHEAT((BlockCrops) Blocks.WHEAT),
|
||||||
|
CARROTS((BlockCrops) Blocks.CARROTS),
|
||||||
|
POTATOES((BlockCrops) Blocks.POTATOES),
|
||||||
|
BEETROOT((BlockCrops) Blocks.BEETROOTS),
|
||||||
|
PUMPKIN(Blocks.PUMPKIN, state -> true),
|
||||||
|
MELON(Blocks.MELON_BLOCK, state -> true),
|
||||||
|
NETHERWART(Blocks.NETHER_WART, state -> state.getValue(BlockNetherWart.AGE) >= 3),
|
||||||
|
SUGARCANE(Blocks.REEDS, null) {
|
||||||
|
@Override
|
||||||
|
public boolean readyToHarvest(World world, BlockPos pos, IBlockState state) {
|
||||||
|
return world.getBlockState(pos.down()).getBlock() instanceof BlockReed;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
CACTUS(Blocks.CACTUS, null) {
|
||||||
|
@Override
|
||||||
|
public boolean readyToHarvest(World world, BlockPos pos, IBlockState state) {
|
||||||
|
return world.getBlockState(pos.down()).getBlock() instanceof BlockCactus;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
public final Block block;
|
||||||
|
public final Predicate<IBlockState> readyToHarvest;
|
||||||
|
|
||||||
|
Harvest(BlockCrops blockCrops) {
|
||||||
|
this(blockCrops, blockCrops::isMaxAge);
|
||||||
|
// max age is 7 for wheat, carrots, and potatoes, but 3 for beetroot
|
||||||
|
}
|
||||||
|
|
||||||
|
Harvest(Block block, Predicate<IBlockState> readyToHarvest) {
|
||||||
|
this.block = block;
|
||||||
|
this.readyToHarvest = readyToHarvest;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean readyToHarvest(World world, BlockPos pos, IBlockState state) {
|
||||||
|
return readyToHarvest.test(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean readyForHarvest(World world, BlockPos pos, IBlockState state) {
|
||||||
|
for (Harvest harvest : Harvest.values()) {
|
||||||
|
if (harvest.block == state.getBlock()) {
|
||||||
|
return harvest.readyToHarvest(world, pos, state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean selectFarmlandPlantable(boolean doSelect) {//EnumDyeColor.WHITE == EnumDyeColor.byDyeDamage(stack.getMetadata())
|
||||||
|
NonNullList<ItemStack> invy = ctx.player().inventory.mainInventory;
|
||||||
|
for (int i = 0; i < 9; i++) {
|
||||||
|
if (FARMLAND_PLANTABLE.contains(invy.get(i).getItem())) {
|
||||||
|
if (doSelect) {
|
||||||
|
ctx.player().inventory.currentItem = i;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean selectBoneMeal(boolean doSelect) {
|
||||||
|
if (isBoneMeal(ctx.player().inventory.offHandInventory.get(0))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
NonNullList<ItemStack> invy = ctx.player().inventory.mainInventory;
|
||||||
|
for (int i = 0; i < 9; i++) {
|
||||||
|
if (isBoneMeal(invy.get(i))) {
|
||||||
|
if (doSelect) {
|
||||||
|
ctx.player().inventory.currentItem = i;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isBoneMeal(ItemStack stack) {
|
||||||
|
return !stack.isEmpty() && stack.getItem() instanceof ItemDye && EnumDyeColor.byDyeDamage(stack.getMetadata()) == EnumDyeColor.WHITE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PathingCommand onTick(boolean calcFailed, boolean isSafeToCancel) {
|
||||||
|
ArrayList<Block> scan = new ArrayList<>();
|
||||||
|
for (Harvest harvest : Harvest.values()) {
|
||||||
|
scan.add(harvest.block);
|
||||||
|
}
|
||||||
|
scan.add(Blocks.FARMLAND);
|
||||||
|
|
||||||
|
List<BlockPos> locations = WorldScanner.INSTANCE.scanChunkRadius(ctx, scan, 256, 10, 4);
|
||||||
|
|
||||||
|
List<BlockPos> toBreak = new ArrayList<>();
|
||||||
|
List<BlockPos> openFarmland = new ArrayList<>();
|
||||||
|
List<BlockPos> bonemealable = new ArrayList<>();
|
||||||
|
for (BlockPos pos : locations) {
|
||||||
|
IBlockState state = ctx.world().getBlockState(pos);
|
||||||
|
if (state.getBlock() == Blocks.FARMLAND) {
|
||||||
|
if (ctx.world().getBlockState(pos.up()).getBlock() instanceof BlockAir) {
|
||||||
|
openFarmland.add(pos);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (readyForHarvest(ctx.world(), pos, state)) {
|
||||||
|
toBreak.add(pos);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (state.getBlock() instanceof IGrowable) {
|
||||||
|
IGrowable ig = (IGrowable) state.getBlock();
|
||||||
|
if (ig.canGrow(ctx.world(), pos, state, true) && ig.canUseBonemeal(ctx.world(), ctx.world().rand, pos, state)) {
|
||||||
|
bonemealable.add(pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
baritone.getInputOverrideHandler().clearAllKeys();
|
||||||
|
for (BlockPos pos : toBreak) {
|
||||||
|
Optional<Rotation> rot = RotationUtils.reachable(ctx, pos);
|
||||||
|
if (rot.isPresent() && isSafeToCancel) {
|
||||||
|
baritone.getLookBehavior().updateTarget(rot.get(), true);
|
||||||
|
MovementHelper.switchToBestToolFor(ctx, ctx.world().getBlockState(pos));
|
||||||
|
if (ctx.isLookingAt(pos)) {
|
||||||
|
baritone.getInputOverrideHandler().setInputForceState(Input.CLICK_LEFT, true);
|
||||||
|
}
|
||||||
|
return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (BlockPos pos : openFarmland) {
|
||||||
|
Optional<Rotation> rot = RotationUtils.reachableOffset(ctx.player(), pos, new Vec3d(pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5), ctx.playerController().getBlockReachDistance());
|
||||||
|
if (rot.isPresent() && isSafeToCancel && selectFarmlandPlantable(true)) {
|
||||||
|
baritone.getLookBehavior().updateTarget(rot.get(), true);
|
||||||
|
if (ctx.isLookingAt(pos)) {
|
||||||
|
baritone.getInputOverrideHandler().setInputForceState(Input.CLICK_RIGHT, true);
|
||||||
|
}
|
||||||
|
return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (BlockPos pos : bonemealable) {
|
||||||
|
Optional<Rotation> rot = RotationUtils.reachable(ctx, pos);
|
||||||
|
if (rot.isPresent() && isSafeToCancel && selectBoneMeal(true)) {
|
||||||
|
baritone.getLookBehavior().updateTarget(rot.get(), true);
|
||||||
|
if (ctx.isLookingAt(pos)) {
|
||||||
|
baritone.getInputOverrideHandler().setInputForceState(Input.CLICK_RIGHT, true);
|
||||||
|
}
|
||||||
|
return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (calcFailed) {
|
||||||
|
logDirect("Farm failed");
|
||||||
|
onLostControl();
|
||||||
|
return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Goal> goalz = new ArrayList<>();
|
||||||
|
for (BlockPos pos : toBreak) {
|
||||||
|
goalz.add(new BuilderProcess.GoalBreak(pos));
|
||||||
|
}
|
||||||
|
if (selectFarmlandPlantable(false)) {
|
||||||
|
for (BlockPos pos : openFarmland) {
|
||||||
|
goalz.add(new GoalBlock(pos.up()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (selectBoneMeal(false)) {
|
||||||
|
for (BlockPos pos : bonemealable) {
|
||||||
|
goalz.add(new GoalBlock(pos));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (Entity entity : ctx.world().loadedEntityList) {
|
||||||
|
if (entity instanceof EntityItem && entity.onGround) {
|
||||||
|
EntityItem ei = (EntityItem) entity;
|
||||||
|
if (PICKUP_DROPPED.contains(ei.getItem().getItem())) {
|
||||||
|
goalz.add(new GoalBlock(new BlockPos(entity.posX, entity.posY + 0.1, entity.posZ)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new PathingCommand(new GoalComposite(goalz.toArray(new Goal[0])), PathingCommandType.SET_GOAL_AND_PATH);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLostControl() {
|
||||||
|
active = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String displayName0() {
|
||||||
|
return "Farming";
|
||||||
|
}
|
||||||
|
}
|
@ -117,7 +117,7 @@ public class GetToBlockProcess extends BaritoneProcessHelper implements IGetToBl
|
|||||||
}
|
}
|
||||||
|
|
||||||
// blacklist the closest block and its adjacent blocks
|
// blacklist the closest block and its adjacent blocks
|
||||||
public synchronized void blacklistClosest() {
|
public synchronized boolean blacklistClosest() {
|
||||||
List<BlockPos> newBlacklist = new ArrayList<>();
|
List<BlockPos> newBlacklist = new ArrayList<>();
|
||||||
knownLocations.stream().min(Comparator.comparingDouble(ctx.player()::getDistanceSq)).ifPresent(newBlacklist::add);
|
knownLocations.stream().min(Comparator.comparingDouble(ctx.player()::getDistanceSq)).ifPresent(newBlacklist::add);
|
||||||
outer:
|
outer:
|
||||||
@ -140,6 +140,7 @@ public class GetToBlockProcess extends BaritoneProcessHelper implements IGetToBl
|
|||||||
}
|
}
|
||||||
logDebug("Blacklisting unreachable locations " + newBlacklist);
|
logDebug("Blacklisting unreachable locations " + newBlacklist);
|
||||||
blacklist.addAll(newBlacklist);
|
blacklist.addAll(newBlacklist);
|
||||||
|
return !newBlacklist.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
// safer than direct double comparison from distanceSq
|
// safer than direct double comparison from distanceSq
|
||||||
|
@ -22,16 +22,20 @@ import baritone.api.pathing.goals.*;
|
|||||||
import baritone.api.process.IMineProcess;
|
import baritone.api.process.IMineProcess;
|
||||||
import baritone.api.process.PathingCommand;
|
import baritone.api.process.PathingCommand;
|
||||||
import baritone.api.process.PathingCommandType;
|
import baritone.api.process.PathingCommandType;
|
||||||
|
import baritone.api.utils.BlockUtils;
|
||||||
import baritone.api.utils.IPlayerContext;
|
import baritone.api.utils.IPlayerContext;
|
||||||
|
import baritone.api.utils.Rotation;
|
||||||
import baritone.api.utils.RotationUtils;
|
import baritone.api.utils.RotationUtils;
|
||||||
|
import baritone.api.utils.input.Input;
|
||||||
import baritone.cache.CachedChunk;
|
import baritone.cache.CachedChunk;
|
||||||
import baritone.cache.ChunkPacker;
|
|
||||||
import baritone.cache.WorldScanner;
|
import baritone.cache.WorldScanner;
|
||||||
import baritone.pathing.movement.CalculationContext;
|
import baritone.pathing.movement.CalculationContext;
|
||||||
import baritone.pathing.movement.MovementHelper;
|
import baritone.pathing.movement.MovementHelper;
|
||||||
import baritone.utils.BaritoneProcessHelper;
|
import baritone.utils.BaritoneProcessHelper;
|
||||||
import baritone.utils.BlockStateInterface;
|
import baritone.utils.BlockStateInterface;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockAir;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.item.EntityItem;
|
import net.minecraft.entity.item.EntityItem;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
@ -94,14 +98,35 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
int mineGoalUpdateInterval = Baritone.settings().mineGoalUpdateInterval.value;
|
int mineGoalUpdateInterval = Baritone.settings().mineGoalUpdateInterval.value;
|
||||||
|
List<BlockPos> curr = new ArrayList<>(knownOreLocations);
|
||||||
if (mineGoalUpdateInterval != 0 && tickCount++ % mineGoalUpdateInterval == 0) { // big brain
|
if (mineGoalUpdateInterval != 0 && tickCount++ % mineGoalUpdateInterval == 0) { // big brain
|
||||||
List<BlockPos> curr = new ArrayList<>(knownOreLocations);
|
|
||||||
CalculationContext context = new CalculationContext(baritone, true);
|
CalculationContext context = new CalculationContext(baritone, true);
|
||||||
Baritone.getExecutor().execute(() -> rescan(curr, context));
|
Baritone.getExecutor().execute(() -> rescan(curr, context));
|
||||||
}
|
}
|
||||||
if (Baritone.settings().legitMine.value) {
|
if (Baritone.settings().legitMine.value) {
|
||||||
addNearby();
|
addNearby();
|
||||||
}
|
}
|
||||||
|
Optional<BlockPos> shaft = curr.stream()
|
||||||
|
.filter(pos -> pos.getX() == ctx.playerFeet().getX() && pos.getZ() == ctx.playerFeet().getZ())
|
||||||
|
.filter(pos -> pos.getY() > ctx.playerFeet().getY())
|
||||||
|
.filter(pos -> !(BlockStateInterface.get(ctx, pos).getBlock() instanceof BlockAir)) // after breaking a block, it takes mineGoalUpdateInterval ticks for it to actually update this list =(
|
||||||
|
.min(Comparator.comparingDouble(ctx.player()::getDistanceSq));
|
||||||
|
baritone.getInputOverrideHandler().clearAllKeys();
|
||||||
|
if (shaft.isPresent()) {
|
||||||
|
BlockPos pos = shaft.get();
|
||||||
|
IBlockState state = baritone.bsi.get0(pos);
|
||||||
|
if (!MovementHelper.avoidBreaking(baritone.bsi, pos.getX(), pos.getY(), pos.getZ(), state)) {
|
||||||
|
Optional<Rotation> rot = RotationUtils.reachable(ctx, pos);
|
||||||
|
if (rot.isPresent() && isSafeToCancel) {
|
||||||
|
baritone.getLookBehavior().updateTarget(rot.get(), true);
|
||||||
|
MovementHelper.switchToBestToolFor(ctx, ctx.world().getBlockState(pos));
|
||||||
|
if (ctx.isLookingAt(pos) || ctx.playerRotations().isReallyCloseTo(rot.get())) {
|
||||||
|
baritone.getInputOverrideHandler().setInputForceState(Input.CLICK_LEFT, true);
|
||||||
|
}
|
||||||
|
return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
PathingCommand command = updateGoal();
|
PathingCommand command = updateGoal();
|
||||||
if (command == null) {
|
if (command == null) {
|
||||||
// none in range
|
// none in range
|
||||||
@ -178,15 +203,63 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro
|
|||||||
knownOreLocations = locs;
|
knownOreLocations = locs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean internalMiningGoal(BlockPos pos, IPlayerContext ctx, List<BlockPos> locs) {
|
||||||
|
// Here, BlockStateInterface is used because the position may be in a cached chunk (the targeted block is one that is kept track of)
|
||||||
|
return locs.contains(pos) || (Baritone.settings().internalMiningAirException.value && BlockStateInterface.getBlock(ctx, pos) instanceof BlockAir);
|
||||||
|
}
|
||||||
|
|
||||||
private static Goal coalesce(IPlayerContext ctx, BlockPos loc, List<BlockPos> locs) {
|
private static Goal coalesce(IPlayerContext ctx, BlockPos loc, List<BlockPos> locs) {
|
||||||
if (!Baritone.settings().forceInternalMining.value) {
|
if (!Baritone.settings().forceInternalMining.value) {
|
||||||
return new GoalTwoBlocks(loc);
|
return new GoalThreeBlocks(loc);
|
||||||
|
}
|
||||||
|
boolean upwardGoal = internalMiningGoal(loc.up(), ctx, locs);
|
||||||
|
boolean downwardGoal = internalMiningGoal(loc.down(), ctx, locs);
|
||||||
|
boolean doubleDownwardGoal = internalMiningGoal(loc.down(2), ctx, locs);
|
||||||
|
if (upwardGoal == downwardGoal) { // symmetric
|
||||||
|
if (doubleDownwardGoal) {
|
||||||
|
// we have a checkerboard like pattern
|
||||||
|
// this one, and the one two below it
|
||||||
|
// therefore it's fine to path to immediately below this one, since your feet will be in the doubleDownwardGoal
|
||||||
|
return new GoalThreeBlocks(loc);
|
||||||
|
} else {
|
||||||
|
// this block has nothing interesting two below, but is symmetric vertically so we can get either feet or head into it
|
||||||
|
return new GoalTwoBlocks(loc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (upwardGoal) {
|
||||||
|
// downwardGoal known to be false
|
||||||
|
// ignore the gap then potential doubleDownward, because we want to path feet into this one and head into upwardGoal
|
||||||
|
return new GoalBlock(loc);
|
||||||
|
}
|
||||||
|
// upwardGoal known to be false, downwardGoal known to be true
|
||||||
|
if (doubleDownwardGoal) {
|
||||||
|
// this block and two below it are goals
|
||||||
|
// path into the center of the one below, because that includes directly below this one
|
||||||
|
return new GoalTwoBlocks(loc.down());
|
||||||
|
}
|
||||||
|
// upwardGoal false, downwardGoal true, doubleDownwardGoal false
|
||||||
|
// just this block and the one immediately below, no others
|
||||||
|
return new GoalBlock(loc.down());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class GoalThreeBlocks extends GoalTwoBlocks {
|
||||||
|
|
||||||
|
public GoalThreeBlocks(BlockPos pos) {
|
||||||
|
super(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Here, BlockStateInterface is used because the position may be in a cached chunk (the targeted block is one that is kept track of)
|
@Override
|
||||||
boolean upwardGoal = locs.contains(loc.up()) || (Baritone.settings().internalMiningAirException.value && BlockStateInterface.getBlock(ctx, loc.up()) == Blocks.AIR);
|
public boolean isInGoal(int x, int y, int z) {
|
||||||
boolean downwardGoal = locs.contains(loc.down()) || (Baritone.settings().internalMiningAirException.value && BlockStateInterface.getBlock(ctx, loc.down()) == Blocks.AIR);
|
return x == this.x && (y == this.y || y == this.y - 1 || y == this.y - 2) && z == this.z;
|
||||||
return upwardGoal == downwardGoal ? new GoalTwoBlocks(loc) : upwardGoal ? new GoalBlock(loc) : new GoalBlock(loc.down());
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double heuristic(int x, int y, int z) {
|
||||||
|
int xDiff = x - this.x;
|
||||||
|
int yDiff = y - this.y;
|
||||||
|
int zDiff = z - this.z;
|
||||||
|
return GoalBlock.calculate(xDiff, yDiff < -1 ? yDiff + 2 : yDiff == -1 ? 0 : yDiff, zDiff);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<BlockPos> droppedItemsScan(List<Block> mining, World world) {
|
public static List<BlockPos> droppedItemsScan(List<Block> mining, World world) {
|
||||||
@ -215,24 +288,20 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro
|
|||||||
public static List<BlockPos> searchWorld(CalculationContext ctx, List<Block> mining, int max, List<BlockPos> alreadyKnown, List<BlockPos> blacklist) {
|
public static List<BlockPos> searchWorld(CalculationContext ctx, List<Block> mining, int max, List<BlockPos> alreadyKnown, List<BlockPos> blacklist) {
|
||||||
List<BlockPos> locs = new ArrayList<>();
|
List<BlockPos> locs = new ArrayList<>();
|
||||||
List<Block> uninteresting = new ArrayList<>();
|
List<Block> uninteresting = new ArrayList<>();
|
||||||
//long b = System.currentTimeMillis();
|
|
||||||
for (Block m : mining) {
|
for (Block m : mining) {
|
||||||
if (CachedChunk.BLOCKS_TO_KEEP_TRACK_OF.contains(m)) {
|
if (CachedChunk.BLOCKS_TO_KEEP_TRACK_OF.contains(m)) {
|
||||||
// maxRegionDistanceSq 2 means adjacent directly or adjacent diagonally; nothing further than that
|
// maxRegionDistanceSq 2 means adjacent directly or adjacent diagonally; nothing further than that
|
||||||
locs.addAll(ctx.worldData.getCachedWorld().getLocationsOf(ChunkPacker.blockToString(m), Baritone.settings().maxCachedWorldScanCount.value, ctx.getBaritone().getPlayerContext().playerFeet().getX(), ctx.getBaritone().getPlayerContext().playerFeet().getZ(), 2));
|
locs.addAll(ctx.worldData.getCachedWorld().getLocationsOf(BlockUtils.blockToString(m), Baritone.settings().maxCachedWorldScanCount.value, ctx.getBaritone().getPlayerContext().playerFeet().getX(), ctx.getBaritone().getPlayerContext().playerFeet().getZ(), 2));
|
||||||
} else {
|
} else {
|
||||||
uninteresting.add(m);
|
uninteresting.add(m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
locs = prune(ctx, locs, mining, max, blacklist);
|
locs = prune(ctx, locs, mining, max, blacklist);
|
||||||
//System.out.println("Scan of cached chunks took " + (System.currentTimeMillis() - b) + "ms");
|
if (locs.isEmpty() || (Baritone.settings().extendCacheOnThreshold.value && locs.size() < max)) {
|
||||||
if (locs.isEmpty()) {
|
|
||||||
uninteresting = mining;
|
uninteresting = mining;
|
||||||
}
|
}
|
||||||
if (!uninteresting.isEmpty()) {
|
if (!uninteresting.isEmpty()) {
|
||||||
//long before = System.currentTimeMillis();
|
|
||||||
locs.addAll(WorldScanner.INSTANCE.scanChunkRadius(ctx.getBaritone().getPlayerContext(), uninteresting, max, 10, 32)); // maxSearchRadius is NOT sq
|
locs.addAll(WorldScanner.INSTANCE.scanChunkRadius(ctx.getBaritone().getPlayerContext(), uninteresting, max, 10, 32)); // maxSearchRadius is NOT sq
|
||||||
//System.out.println("Scan of loaded chunks took " + (System.currentTimeMillis() - before) + "ms");
|
|
||||||
}
|
}
|
||||||
locs.addAll(alreadyKnown);
|
locs.addAll(alreadyKnown);
|
||||||
return prune(ctx, locs, mining, max, blacklist);
|
return prune(ctx, locs, mining, max, blacklist);
|
||||||
@ -303,7 +372,7 @@ public final class MineProcess extends BaritoneProcessHelper implements IMinePro
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void mineByName(int quantity, String... blocks) {
|
public void mineByName(int quantity, String... blocks) {
|
||||||
mine(quantity, blocks == null || blocks.length == 0 ? null : Arrays.stream(blocks).map(ChunkPacker::stringToBlockRequired).toArray(Block[]::new));
|
mine(quantity, blocks == null || blocks.length == 0 ? null : Arrays.stream(blocks).map(BlockUtils::stringToBlockRequired).toArray(Block[]::new));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -22,6 +22,7 @@ import baritone.api.event.events.TickEvent;
|
|||||||
import baritone.api.event.listener.AbstractGameEventListener;
|
import baritone.api.event.listener.AbstractGameEventListener;
|
||||||
import baritone.api.pathing.goals.Goal;
|
import baritone.api.pathing.goals.Goal;
|
||||||
import baritone.api.pathing.goals.GoalBlock;
|
import baritone.api.pathing.goals.GoalBlock;
|
||||||
|
import baritone.api.utils.Helper;
|
||||||
import baritone.api.utils.IPlayerContext;
|
import baritone.api.utils.IPlayerContext;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.gui.GuiMainMenu;
|
import net.minecraft.client.gui.GuiMainMenu;
|
||||||
|
@ -19,6 +19,7 @@ package baritone.utils;
|
|||||||
|
|
||||||
import baritone.Baritone;
|
import baritone.Baritone;
|
||||||
import baritone.api.process.IBaritoneProcess;
|
import baritone.api.process.IBaritoneProcess;
|
||||||
|
import baritone.api.utils.Helper;
|
||||||
import baritone.api.utils.IPlayerContext;
|
import baritone.api.utils.IPlayerContext;
|
||||||
|
|
||||||
public abstract class BaritoneProcessHelper implements IBaritoneProcess, Helper {
|
public abstract class BaritoneProcessHelper implements IBaritoneProcess, Helper {
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
package baritone.utils;
|
package baritone.utils;
|
||||||
|
|
||||||
|
import baritone.api.utils.Helper;
|
||||||
import baritone.api.utils.IPlayerContext;
|
import baritone.api.utils.IPlayerContext;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.EnumHand;
|
import net.minecraft.util.EnumHand;
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
package baritone.utils;
|
package baritone.utils;
|
||||||
|
|
||||||
import baritone.Baritone;
|
import baritone.Baritone;
|
||||||
|
import baritone.api.utils.Helper;
|
||||||
import baritone.api.utils.IPlayerContext;
|
import baritone.api.utils.IPlayerContext;
|
||||||
import net.minecraft.util.EnumActionResult;
|
import net.minecraft.util.EnumActionResult;
|
||||||
import net.minecraft.util.EnumHand;
|
import net.minecraft.util.EnumHand;
|
||||||
|
@ -23,6 +23,7 @@ import baritone.api.event.events.RenderEvent;
|
|||||||
import baritone.api.pathing.calc.IPath;
|
import baritone.api.pathing.calc.IPath;
|
||||||
import baritone.api.pathing.goals.*;
|
import baritone.api.pathing.goals.*;
|
||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
|
import baritone.api.utils.Helper;
|
||||||
import baritone.api.utils.interfaces.IGoalRenderPos;
|
import baritone.api.utils.interfaces.IGoalRenderPos;
|
||||||
import baritone.behavior.PathingBehavior;
|
import baritone.behavior.PathingBehavior;
|
||||||
import baritone.pathing.path.PathExecutor;
|
import baritone.pathing.path.PathExecutor;
|
||||||
|
@ -19,6 +19,7 @@ package baritone.utils.pathing;
|
|||||||
|
|
||||||
import baritone.api.pathing.calc.IPath;
|
import baritone.api.pathing.calc.IPath;
|
||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
|
import baritone.api.utils.Helper;
|
||||||
import baritone.api.utils.IPlayerContext;
|
import baritone.api.utils.IPlayerContext;
|
||||||
import baritone.pathing.movement.CalculationContext;
|
import baritone.pathing.movement.CalculationContext;
|
||||||
import it.unimi.dsi.fastutil.longs.Long2DoubleOpenHashMap;
|
import it.unimi.dsi.fastutil.longs.Long2DoubleOpenHashMap;
|
||||||
@ -31,7 +32,7 @@ public final class Favoring {
|
|||||||
for (Avoidance avoid : Avoidance.create(ctx)) {
|
for (Avoidance avoid : Avoidance.create(ctx)) {
|
||||||
avoid.applySpherical(favorings);
|
avoid.applySpherical(favorings);
|
||||||
}
|
}
|
||||||
System.out.println("Favoring size: " + favorings.size());
|
Helper.HELPER.logDebug("Favoring size: " + favorings.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Favoring(IPath previous, CalculationContext context) { // create one just from previous path, no mob avoidances
|
public Favoring(IPath previous, CalculationContext context) { // create one just from previous path, no mob avoidances
|
||||||
|
@ -19,10 +19,10 @@ package baritone.utils.player;
|
|||||||
|
|
||||||
import baritone.api.BaritoneAPI;
|
import baritone.api.BaritoneAPI;
|
||||||
import baritone.api.cache.IWorldData;
|
import baritone.api.cache.IWorldData;
|
||||||
|
import baritone.api.utils.Helper;
|
||||||
import baritone.api.utils.IPlayerContext;
|
import baritone.api.utils.IPlayerContext;
|
||||||
import baritone.api.utils.IPlayerController;
|
import baritone.api.utils.IPlayerController;
|
||||||
import baritone.api.utils.RayTraceUtils;
|
import baritone.api.utils.RayTraceUtils;
|
||||||
import baritone.utils.Helper;
|
|
||||||
import net.minecraft.client.entity.EntityPlayerSP;
|
import net.minecraft.client.entity.EntityPlayerSP;
|
||||||
import net.minecraft.util.math.RayTraceResult;
|
import net.minecraft.util.math.RayTraceResult;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
@ -17,8 +17,8 @@
|
|||||||
|
|
||||||
package baritone.utils.player;
|
package baritone.utils.player;
|
||||||
|
|
||||||
|
import baritone.api.utils.Helper;
|
||||||
import baritone.api.utils.IPlayerController;
|
import baritone.api.utils.IPlayerController;
|
||||||
import baritone.utils.Helper;
|
|
||||||
import net.minecraft.client.entity.EntityPlayerSP;
|
import net.minecraft.client.entity.EntityPlayerSP;
|
||||||
import net.minecraft.client.multiplayer.WorldClient;
|
import net.minecraft.client.multiplayer.WorldClient;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
Loading…
Reference in New Issue
Block a user