diff --git a/src/main/java/adris/altoclef/tasks/resources/ShearAndCollectBlockTask.java b/src/main/java/adris/altoclef/tasks/resources/ShearAndCollectBlockTask.java index 4e93c23d8..430b4f7a8 100644 --- a/src/main/java/adris/altoclef/tasks/resources/ShearAndCollectBlockTask.java +++ b/src/main/java/adris/altoclef/tasks/resources/ShearAndCollectBlockTask.java @@ -5,6 +5,7 @@ import adris.altoclef.tasksystem.Task; import adris.altoclef.util.ItemTarget; import adris.altoclef.util.MiningRequirement; +import adris.altoclef.util.helpers.ItemHelper; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.Items; @@ -26,7 +27,9 @@ public ShearAndCollectBlockTask(Item item, int count, Block... blocksToMine) { @Override protected void onStart(AltoClef mod) { mod.getBehaviour().push(); - mod.getBehaviour().allowShears(true); + mod.getBehaviour().forceUseTool((blockState, itemStack) -> + itemStack.getItem() == Items.SHEARS && ItemHelper.areShearsEffective(blockState.getBlock()) + ); super.onStart(mod); } diff --git a/src/main/java/adris/altoclef/util/control/BotBehaviour.java b/src/main/java/adris/altoclef/util/control/BotBehaviour.java index b8552188a..2f3bc1749 100644 --- a/src/main/java/adris/altoclef/util/control/BotBehaviour.java +++ b/src/main/java/adris/altoclef/util/control/BotBehaviour.java @@ -5,13 +5,16 @@ import baritone.altoclef.AltoClefSettings; import baritone.api.Settings; import baritone.api.utils.RayTraceUtils; +import net.minecraft.block.BlockState; import net.minecraft.client.MinecraftClient; import net.minecraft.entity.Entity; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.RaycastContext; import java.util.*; +import java.util.function.BiPredicate; import java.util.function.Predicate; /** @@ -89,6 +92,11 @@ public void allowWalkingOn(Predicate pred) { current().applyState(); } + public void forceUseTool(BiPredicate pred) { + current().forceUseTools.add(pred); + current().applyState(); + } + public void setRayTracingFluidHandling(RaycastContext.FluidHandling fluidHandling) { current().rayFluidHandling = fluidHandling; //Debug.logMessage("OOF: " + fluidHandling); @@ -158,11 +166,6 @@ public boolean shouldAvoidDodgingProjectile(Entity entity) { return false; } - public void allowShears(boolean allow) { - current().allowShears = allow; - current().applyState(); - } - /// Stack management public void push() { if (_states.isEmpty()) { @@ -221,8 +224,8 @@ class State { public List> toAvoidBreaking = new ArrayList<>(); public List> toAvoidPlacing = new ArrayList<>(); public List> allowWalking = new ArrayList<>(); + public List> forceUseTools = new ArrayList<>(); public boolean _allowWalkThroughFlowingWater = false; - public boolean allowShears; // Minecraft config public boolean pauseOnLostFocus = true; @@ -280,11 +283,11 @@ private void readExtraState(AltoClefSettings settings) { protectedItems = new ArrayList<>(settings.getProtectedItems()); synchronized (settings.getPropertiesMutex()) { allowWalking = new ArrayList<>(settings.getForceWalkOnPredicates()); + forceUseTools = new ArrayList<>(settings.getForceUseToolPredicates()); } } } _allowWalkThroughFlowingWater = settings.isFlowingWaterPassAllowed(); - allowShears = settings.areShearsAllowed(); rayFluidHandling = RayTraceUtils.fluidHandling; } @@ -321,12 +324,13 @@ private void applyState(Settings s, AltoClefSettings sa) { synchronized (sa.getPropertiesMutex()) { sa.getForceWalkOnPredicates().clear(); sa.getForceWalkOnPredicates().addAll(allowWalking); + sa.getForceUseToolPredicates().clear(); + sa.getForceUseToolPredicates().addAll(forceUseTools); } } } sa.setFlowingWaterPass(_allowWalkThroughFlowingWater); - sa.allowShears(allowShears); sa.allowSwimThroughLava(swimThroughLava); // Extra / hard coded diff --git a/src/main/java/adris/altoclef/util/helpers/ItemHelper.java b/src/main/java/adris/altoclef/util/helpers/ItemHelper.java index f9b51d57f..53f1896e9 100644 --- a/src/main/java/adris/altoclef/util/helpers/ItemHelper.java +++ b/src/main/java/adris/altoclef/util/helpers/ItemHelper.java @@ -7,6 +7,7 @@ import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.Items; +import net.minecraft.tag.BlockTags; import net.minecraft.util.DyeColor; import java.util.ArrayList; @@ -73,7 +74,7 @@ static Block[] itemsToBlocks(Item[] items) { Block[] WOOD_SIGNS_ALL = new Block[]{Blocks.ACACIA_SIGN, Blocks.BIRCH_SIGN, Blocks.DARK_OAK_SIGN, Blocks.OAK_SIGN, Blocks.JUNGLE_SIGN, Blocks.SPRUCE_SIGN, Blocks.ACACIA_WALL_SIGN, Blocks.BIRCH_WALL_SIGN, Blocks.DARK_OAK_WALL_SIGN, Blocks.OAK_WALL_SIGN, Blocks.JUNGLE_WALL_SIGN, Blocks.SPRUCE_WALL_SIGN}; - Map _logToPlanks = new HashMap() { + Map _logToPlanks = new HashMap<>() { { put(Items.ACACIA_LOG, Items.ACACIA_PLANKS); put(Items.BIRCH_LOG, Items.BIRCH_PLANKS); @@ -196,6 +197,10 @@ static String trimItemName(String name) { return name; } + static boolean areShearsEffective(Block b) { + return BlockTags.LEAVES.contains(b) || b == Blocks.COBWEB || b == Blocks.GRASS || b == Blocks.TALL_GRASS || b == Blocks.LILY_PAD || b == Blocks.FERN || b == Blocks.DEAD_BUSH || b ==Blocks.VINE || b == Blocks.TRIPWIRE || BlockTags.WOOL.contains(b); + } + class ColorfulItems { public DyeColor color; public String colorName;