Search in sources :

Example 16 with Rotation

use of baritone.api.utils.Rotation in project Spark-Client by Spark-Client-Development.

the class BuilderProcess method toBreakNearPlayer.

private Optional<Tuple<BetterBlockPos, Rotation>> toBreakNearPlayer(BuilderCalculationContext bcc) {
    BetterBlockPos center = ctx.playerFeet();
    BetterBlockPos pathStart = baritone.getPathingBehavior().pathStart();
    for (int dx = -5; dx <= 5; dx++) {
        for (int dy = Baritone.settings().breakFromAbove.getValue() ? -1 : 0; dy <= 5; dy++) {
            for (int dz = -5; dz <= 5; dz++) {
                int x = center.x + dx;
                int y = center.y + dy;
                int z = center.z + dz;
                if (dy == -1 && x == pathStart.x && z == pathStart.z) {
                    // dont mine what we're supported by, but not directly standing on
                    continue;
                }
                IBlockState desired = bcc.getSchematic(x, y, z, bcc.bsi.get0(x, y, z));
                if (desired == null) {
                    // irrelevant
                    continue;
                }
                IBlockState curr = bcc.bsi.get0(x, y, z);
                if (curr.getBlock() != Blocks.AIR && !(curr.getBlock() instanceof BlockLiquid) && !valid(curr, desired, false)) {
                    BetterBlockPos pos = new BetterBlockPos(x, y, z);
                    Optional<Rotation> rot = RotationUtils.reachable(ctx.player(), pos, ctx.playerController().getBlockReachDistance());
                    if (rot.isPresent()) {
                        return Optional.of(new Tuple<>(pos, rot.get()));
                    }
                }
            }
        }
    }
    return Optional.empty();
}
Also used : IBlockState(net.minecraft.block.state.IBlockState) BlockLiquid(net.minecraft.block.BlockLiquid) BetterBlockPos(baritone.api.utils.BetterBlockPos) Rotation(baritone.api.utils.Rotation)

Example 17 with Rotation

use of baritone.api.utils.Rotation in project Spark-Client by Spark-Client-Development.

the class BuilderProcess method possibleToPlace.

private Optional<Placement> possibleToPlace(IBlockState toPlace, int x, int y, int z, BlockStateInterface bsi) {
    for (EnumFacing against : EnumFacing.values()) {
        BetterBlockPos placeAgainstPos = new BetterBlockPos(x, y, z).offset(against);
        IBlockState placeAgainstState = bsi.get0(placeAgainstPos);
        if (MovementHelper.isReplaceable(placeAgainstPos.x, placeAgainstPos.y, placeAgainstPos.z, placeAgainstState, bsi)) {
            continue;
        }
        if (!ctx.world().mayPlace(toPlace.getBlock(), new BetterBlockPos(x, y, z), false, against, null)) {
            continue;
        }
        AxisAlignedBB aabb = placeAgainstState.getBoundingBox(ctx.world(), placeAgainstPos);
        for (Vec3d placementMultiplier : aabbSideMultipliers(against)) {
            double placeX = placeAgainstPos.x + aabb.minX * placementMultiplier.x + aabb.maxX * (1 - placementMultiplier.x);
            double placeY = placeAgainstPos.y + aabb.minY * placementMultiplier.y + aabb.maxY * (1 - placementMultiplier.y);
            double placeZ = placeAgainstPos.z + aabb.minZ * placementMultiplier.z + aabb.maxZ * (1 - placementMultiplier.z);
            Rotation rot = RotationUtils.calcRotationFromVec3d(RayTraceUtils.inferSneakingEyePosition(ctx.player()), new Vec3d(placeX, placeY, placeZ), ctx.playerRotations());
            RayTraceResult result = RayTraceUtils.rayTraceTowards(ctx.player(), rot, ctx.playerController().getBlockReachDistance(), true);
            if (result != null && result.typeOfHit == RayTraceResult.Type.BLOCK && result.getBlockPos().equals(placeAgainstPos) && result.sideHit == against.getOpposite()) {
                OptionalInt hotbar = hasAnyItemThatWouldPlace(toPlace, result, rot);
                if (hotbar.isPresent()) {
                    return Optional.of(new Placement(hotbar.getAsInt(), placeAgainstPos, against.getOpposite(), rot));
                }
            }
        }
    }
    return Optional.empty();
}
Also used : IBlockState(net.minecraft.block.state.IBlockState) EnumFacing(net.minecraft.util.EnumFacing) BetterBlockPos(baritone.api.utils.BetterBlockPos) Rotation(baritone.api.utils.Rotation)

Example 18 with Rotation

use of baritone.api.utils.Rotation in project Spark-Client by Spark-Client-Development.

the class FarmProcess method onTick.

@Override
public PathingCommand onTick(boolean calcFailed, boolean isSafeToCancel) {
    ArrayList<Block> scan = new ArrayList<>();
    for (Harvest harvest : Harvest.values()) {
        scan.add(harvest.block);
    }
    if (Baritone.settings().replantCrops.getValue()) {
        scan.add(Blocks.FARMLAND);
        if (Baritone.settings().replantNetherWart.getValue()) {
            scan.add(Blocks.SOUL_SAND);
        }
    }
    if (Baritone.settings().mineGoalUpdateInterval.getValue() != 0 && tickCount++ % Baritone.settings().mineGoalUpdateInterval.getValue() == 0) {
        Baritone.getExecutor().execute(() -> locations = WorldScanner.INSTANCE.scanChunkRadius(ctx, scan, 256, 10, 10));
    }
    if (locations == null) {
        return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE);
    }
    List<BlockPos> toBreak = new ArrayList<>();
    List<BlockPos> openFarmland = new ArrayList<>();
    List<BlockPos> bonemealable = new ArrayList<>();
    List<BlockPos> openSoulsand = new ArrayList<>();
    for (BlockPos pos : locations) {
        // check if the target block is out of range.
        if (range != 0 && pos.getDistance(center.getX(), center.getY(), center.getZ()) > range) {
            continue;
        }
        IBlockState state = ctx.world().getBlockState(pos);
        boolean airAbove = ctx.world().getBlockState(pos.up()).getBlock() instanceof BlockAir;
        if (state.getBlock() == Blocks.FARMLAND) {
            if (airAbove) {
                openFarmland.add(pos);
            }
            continue;
        }
        if (state.getBlock() == Blocks.SOUL_SAND) {
            if (airAbove) {
                openSoulsand.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);
        }
    }
    ArrayList<BlockPos> both = new ArrayList<>(openFarmland);
    both.addAll(openSoulsand);
    for (BlockPos pos : both) {
        boolean soulsand = openSoulsand.contains(pos);
        Optional<Rotation> rot = RotationUtils.reachableOffset(ctx.player(), pos, new Vec3d(pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5), ctx.playerController().getBlockReachDistance(), false);
        if (rot.isPresent() && isSafeToCancel && baritone.getInventoryBehavior().throwaway(true, soulsand ? this::isNetherWart : this::isPlantable)) {
            RayTraceResult result = RayTraceUtils.rayTraceTowards(ctx.player(), rot.get(), ctx.playerController().getBlockReachDistance());
            if (result.typeOfHit == RayTraceResult.Type.BLOCK && result.sideHit == EnumFacing.UP) {
                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 && baritone.getInventoryBehavior().throwaway(true, this::isBoneMeal)) {
            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");
        if (Baritone.settings().desktopNotifications.getValue() && Baritone.settings().notificationOnFarmFail.getValue()) {
            NotificationHelper.notify("Farm failed", true);
        }
        onLostControl();
        return new PathingCommand(null, PathingCommandType.REQUEST_PAUSE);
    }
    List<Goal> goalz = new ArrayList<>();
    for (BlockPos pos : toBreak) {
        goalz.add(new BuilderProcess.GoalBreak(pos));
    }
    if (baritone.getInventoryBehavior().throwaway(false, this::isPlantable)) {
        for (BlockPos pos : openFarmland) {
            goalz.add(new GoalBlock(pos.up()));
        }
    }
    if (baritone.getInventoryBehavior().throwaway(false, this::isNetherWart)) {
        for (BlockPos pos : openSoulsand) {
            goalz.add(new GoalBlock(pos.up()));
        }
    }
    if (baritone.getInventoryBehavior().throwaway(false, this::isBoneMeal)) {
        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())) {
                // +0.1 because of farmland's 0.9375 dummy height lol
                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);
}
Also used : Entity(net.minecraft.entity.Entity) IBlockState(net.minecraft.block.state.IBlockState) GoalBlock(baritone.api.pathing.goals.GoalBlock) ArrayList(java.util.ArrayList) RayTraceResult(net.minecraft.util.math.RayTraceResult) Rotation(baritone.api.utils.Rotation) Vec3d(net.minecraft.util.math.Vec3d) GoalComposite(baritone.api.pathing.goals.GoalComposite) Goal(baritone.api.pathing.goals.Goal) PathingCommand(baritone.api.process.PathingCommand) GoalBlock(baritone.api.pathing.goals.GoalBlock) BlockPos(net.minecraft.util.math.BlockPos) EntityItem(net.minecraft.entity.item.EntityItem)

Aggregations

Rotation (baritone.api.utils.Rotation)18 BetterBlockPos (baritone.api.utils.BetterBlockPos)14 IBlockState (net.minecraft.block.state.IBlockState)12 BlockPos (net.minecraft.util.math.BlockPos)12 Vec3d (net.minecraft.util.math.Vec3d)10 Goal (baritone.api.pathing.goals.Goal)4 PathingCommand (baritone.api.process.PathingCommand)4 CalculationContext (baritone.pathing.movement.CalculationContext)4 MovementState (baritone.pathing.movement.MovementState)4 Baritone (baritone.Baritone)2 IBaritone (baritone.api.IBaritone)2 GoalBlock (baritone.api.pathing.goals.GoalBlock)2 GoalComposite (baritone.api.pathing.goals.GoalComposite)2 MovementStatus (baritone.api.pathing.movement.MovementStatus)2 ISchematic (baritone.api.schematic.ISchematic)2 RotationUtils (baritone.api.utils.RotationUtils)2 VecUtils (baritone.api.utils.VecUtils)2 Input (baritone.api.utils.input.Input)2 Movement (baritone.pathing.movement.Movement)2 MovementHelper (baritone.pathing.movement.MovementHelper)2