1
0
mirror of https://github.com/cabaletta/baritone synced 2025-01-02 20:52:09 +00:00

Add crop whitelist to #farm (farming and pickup)

This commit is contained in:
Avtera 2024-11-19 02:52:58 +07:00
parent 71aa05c58d
commit 4848d05c5e
No known key found for this signature in database
GPG Key ID: 57D9043A3A34965F
2 changed files with 117 additions and 41 deletions

View File

@ -982,26 +982,44 @@ public final class Settings {
public final Setting<Integer> farmMaxScanSize = new Setting<>(256);
/**
* Prioritize gathering farm related drops
* Prioritize pickup crop drops before another farm task
*/
public final Setting<Boolean> farmPrioritizeGather = new Setting<>(false);
public final Setting<Boolean> farmPrioritizePickup = new Setting<>(false);
/**
* true = farm farm farm, i don't want to stop!
* false = allow farm to stop or fail
* false = allow farm to stop or fail
*/
public final Setting<Boolean> farmContinuously = new Setting<>(false);
/**
* How much farming task is enough for the Continuous Farm to resume?
* How much farm task queue is enough for Baritone to resume the continuous farm?
* {@link #farmContinuously}
*/
public final Setting<Integer> farmContinuouslyThreshold = new Setting<>(16);
/**
* Time interval (in seconds) for the Continuous Farm to check if threshold is fulfilled?
* How long Baritone should wait (in seconds) to check if continuous farm threshold is fulfilled?
* {@link #farmContinuously}
*/
public final Setting<Long> farmContinuouslyIntervalSecs = new Setting<>(TimeUnit.MINUTES.toSeconds(2));
/**
* Farm whitelist, only interact with crop that is on the {@link #farmWhitelist} list
*/
public final Setting<Boolean> farmEnableWhitelist = new Setting<>(false);
/**
* Crop block that Baritone is allowed to farm and collect
* {@link #farmEnableWhitelist}
*/
public final Setting<List<Block>> farmWhitelist = new Setting<>(new ArrayList<>(Arrays.asList(
Blocks.WHEAT,
Blocks.POTATOES,
Blocks.CARROTS
)));
/**
* When the cache scan gives less blocks than the maximum threshold (but still above zero), scan the main world too.
* <p>

View File

@ -56,10 +56,7 @@ import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.*;
import java.util.function.Predicate;
public final class FarmProcess extends BaritoneProcessHelper implements IFarmProcess {
@ -102,6 +99,31 @@ public final class FarmProcess extends BaritoneProcessHelper implements IFarmPro
Blocks.CACTUS.asItem()
);
private static final Map<Block, Item> CROP_TO_PLANTABLE = new HashMap<>();
static {
CROP_TO_PLANTABLE.put(Blocks.BEETROOTS, Items.BEETROOT_SEEDS);
CROP_TO_PLANTABLE.put(Blocks.WHEAT, Items.WHEAT_SEEDS);
CROP_TO_PLANTABLE.put(Blocks.CARROTS, Items.CARROT);
CROP_TO_PLANTABLE.put(Blocks.POTATOES, Items.POTATO);
CROP_TO_PLANTABLE.put(Blocks.MELON, Items.MELON_SEEDS);
CROP_TO_PLANTABLE.put(Blocks.PUMPKIN, Items.PUMPKIN_SEEDS);
}
private static final Map<Block, List<Item>> CROP_TO_DROPPED = new HashMap<>();
static {
CROP_TO_DROPPED.put(Blocks.BEETROOTS, Arrays.asList(Items.BEETROOT, Items.BEETROOT_SEEDS));
CROP_TO_DROPPED.put(Blocks.WHEAT, Arrays.asList(Items.WHEAT, Items.WHEAT_SEEDS));
CROP_TO_DROPPED.put(Blocks.CARROTS, List.of(Items.CARROT));
CROP_TO_DROPPED.put(Blocks.POTATOES, List.of(Items.POTATO));
CROP_TO_DROPPED.put(Blocks.MELON, Arrays.asList(Items.MELON_SEEDS, Items.MELON_SLICE));
CROP_TO_DROPPED.put(Blocks.PUMPKIN, Arrays.asList(Items.PUMPKIN, Items.PUMPKIN_SEEDS));
CROP_TO_DROPPED.put(Blocks.NETHER_WART, List.of(Items.NETHER_WART));
CROP_TO_DROPPED.put(Blocks.COCOA, List.of(Items.COCOA_BEANS));
CROP_TO_DROPPED.put(Blocks.SUGAR_CANE, List.of(Items.SUGAR_CANE));
CROP_TO_DROPPED.put(Blocks.BAMBOO, List.of(Items.BAMBOO));
CROP_TO_DROPPED.put(Blocks.CACTUS, List.of(Items.CACTUS));
}
public FarmProcess(Baritone baritone) {
super(baritone);
}
@ -202,14 +224,35 @@ public final class FarmProcess extends BaritoneProcessHelper implements IFarmPro
private boolean readyForHarvest(Level world, BlockPos pos, BlockState state) {
for (Harvest harvest : Harvest.values()) {
if (harvest.block == state.getBlock()) {
return harvest.readyToHarvest(world, pos, state);
if (!Baritone.settings().farmEnableWhitelist.value) {
return harvest.readyToHarvest(world, pos, state);
} else {
for (Block whitelist : Baritone.settings().farmWhitelist.value) {
if ((harvest.block.equals(whitelist)) && (harvest.block == state.getBlock())) {
return harvest.readyToHarvest(world, pos, state);
}
}
}
}
}
return false;
}
private boolean isPlantable(ItemStack stack) {
return FARMLAND_PLANTABLE.contains(stack.getItem());
if (!Baritone.settings().farmEnableWhitelist.value) {
return FARMLAND_PLANTABLE.contains(stack.getItem());
}
if (!FARMLAND_PLANTABLE.contains(stack.getItem())) {
return false;
} else {
List<Item> whitelistedFarmlandPlantable = new ArrayList<>();
for (Block whitelist : Baritone.settings().farmWhitelist.value) {
if (!(CROP_TO_PLANTABLE.get(whitelist) == null) && (CROP_TO_PLANTABLE.get(whitelist)).equals(stack.getItem())) {
whitelistedFarmlandPlantable.add(CROP_TO_PLANTABLE.get(whitelist));
}
}
return whitelistedFarmlandPlantable.contains(stack.getItem());
}
}
private boolean isBoneMeal(ItemStack stack) {
@ -217,11 +260,46 @@ public final class FarmProcess extends BaritoneProcessHelper implements IFarmPro
}
private boolean isNetherWart(ItemStack stack) {
return !stack.isEmpty() && stack.getItem().equals(Items.NETHER_WART);
if (!Baritone.settings().farmEnableWhitelist.value) {
return !stack.isEmpty() && stack.getItem().equals(Items.NETHER_WART);
} else {
return !stack.isEmpty() && stack.getItem().equals(Items.NETHER_WART) && Baritone.settings().farmWhitelist.value.contains(Blocks.NETHER_WART);
}
}
private boolean isCocoa(ItemStack stack) {
return !stack.isEmpty() && stack.getItem().equals(Items.COCOA_BEANS);
if (!Baritone.settings().farmEnableWhitelist.value) {
return !stack.isEmpty() && stack.getItem().equals(Items.COCOA_BEANS);
} else {
return !stack.isEmpty() && stack.getItem().equals(Items.COCOA_BEANS) && Baritone.settings().farmWhitelist.value.contains(Blocks.COCOA);
}
}
private List<Goal> whereAreTheDrops() {
List<Goal> pickup = new ArrayList<>();
for (Entity entity : ctx.entities()) {
//check if the pickupGoals is out of range.
if (range != 0 && entity.blockPosition().distSqr(center) > range * range) {
continue;
}
if (entity instanceof ItemEntity && entity.onGround()) {
ItemEntity ei = (ItemEntity) entity;
if (PICKUP_DROPPED.contains(ei.getItem().getItem())) {
if (!Baritone.settings().farmEnableWhitelist.value) {
// +0.1 because of farmland's 0.9375 and soulsand's 0.875 dummy height lol
pickup.add(new GoalBlock(new BetterBlockPos(entity.position().x, entity.position().y + 0.125, entity.position().z)));
} else {
for (Block whitelist : Baritone.settings().farmWhitelist.value) {
if (!(CROP_TO_DROPPED.get(whitelist) == null) && (CROP_TO_DROPPED.get(whitelist)).contains(ei.getItem().getItem())) {
// +0.1 because of farmland's 0.9375 and soulsand's 0.875 dummy height lol
pickup.add(new GoalBlock(new BetterBlockPos(entity.position().x, entity.position().y + 0.125, entity.position().z)));
}
}
}
}
}
}
return pickup;
}
@Override
@ -297,23 +375,11 @@ public final class FarmProcess extends BaritoneProcessHelper implements IFarmPro
// Farm Continuously: Block input while paused
if (!isPaused()) {
// Check if item gather is prioritized
if (Baritone.settings().farmPrioritizeGather.value) {
List<Goal> pickupGoals = new ArrayList<>();
for (Entity entity : ctx.entities()) {
//check if the pickupGoals is out of range.
if (range != 0 && entity.blockPosition().distSqr(center) > range * range) {
continue;
}
if (entity instanceof ItemEntity && entity.onGround()) {
ItemEntity ei = (ItemEntity) entity;
if (PICKUP_DROPPED.contains(ei.getItem().getItem())) {
// +0.1 because of farmland's 0.9375 and soulsand's 0.875 dummy height lol
pickupGoals.add(new GoalBlock(new BetterBlockPos(entity.position().x, entity.position().y + 0.125, entity.position().z)));
}
}
}
if (Baritone.settings().farmPrioritizePickup.value) {
List<Goal> pickupGoals = whereAreTheDrops();
if (!(pickupGoals.isEmpty())) {
return new PathingCommand(new GoalComposite(pickupGoals.toArray(new Goal[0])), PathingCommandType.SET_GOAL_AND_PATH);
GoalComposite pickupGoalComposite = new GoalComposite(pickupGoals.toArray(new Goal[0]));
return new PathingCommand(pickupGoalComposite, PathingCommandType.SET_GOAL_AND_PATH);
}
}
baritone.getInputOverrideHandler().clearAllKeys();
@ -428,18 +494,10 @@ public final class FarmProcess extends BaritoneProcessHelper implements IFarmPro
goalz.add(new GoalBlock(pos));
}
}
for (Entity entity : ctx.entities()) {
//check if the pickupGoals is out of range.
if (range != 0 && entity.blockPosition().distSqr(center) > range * range) {
continue;
}
if (entity instanceof ItemEntity && entity.onGround()) {
ItemEntity ei = (ItemEntity) entity;
if (PICKUP_DROPPED.contains(ei.getItem().getItem())) {
// +0.1 because of farmland's 0.9375 and soulsand's 0.875 dummy height lol
goalz.add(new GoalBlock(new BetterBlockPos(entity.position().x, entity.position().y + 0.125, entity.position().z)));
}
}
List<Goal> pickupGoals = whereAreTheDrops();
if (!(pickupGoals.isEmpty())) {
GoalComposite pickupGoalComposite = new GoalComposite(pickupGoals.toArray(new Goal[0]));
goalz.add(pickupGoalComposite);
}
if (goalz.isEmpty() && !isPaused()) {
if (!Baritone.settings().farmContinuously.value) {