diff --git a/src/api/java/baritone/api/Settings.java b/src/api/java/baritone/api/Settings.java index d0181366..a95d30d2 100644 --- a/src/api/java/baritone/api/Settings.java +++ b/src/api/java/baritone/api/Settings.java @@ -248,6 +248,11 @@ public final class Settings { */ public final Setting rightClickSpeed = new Setting<>(4); + /** + * How many degrees to randomize the pitch and yaw every tick. Set to 0 to disable + */ + public final Setting randomLooking = new Setting<>(0.01d); + /** * This is the big A* setting. * As long as your cost heuristic is an *underestimate*, it's guaranteed to find you the best path. diff --git a/src/launch/java/baritone/launch/mixins/MixinPlayerControllerMP.java b/src/launch/java/baritone/launch/mixins/MixinPlayerControllerMP.java new file mode 100644 index 00000000..c0294355 --- /dev/null +++ b/src/launch/java/baritone/launch/mixins/MixinPlayerControllerMP.java @@ -0,0 +1,40 @@ +/* + * 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 . + */ + +package baritone.launch.mixins; + +import baritone.utils.accessor.IPlayerControllerMP; +import net.minecraft.client.multiplayer.PlayerControllerMP; +import net.minecraft.util.math.BlockPos; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(PlayerControllerMP.class) +public abstract class MixinPlayerControllerMP implements IPlayerControllerMP { + @Accessor + @Override + public abstract void setIsHittingBlock(boolean isHittingBlock); + + @Accessor + @Override + public abstract BlockPos getCurrentBlock(); + + @Invoker + @Override + public abstract void callSyncCurrentPlayItem(); +} diff --git a/src/launch/resources/mixins.baritone.json b/src/launch/resources/mixins.baritone.json index 2a38a317..669b64cb 100644 --- a/src/launch/resources/mixins.baritone.json +++ b/src/launch/resources/mixins.baritone.json @@ -19,6 +19,7 @@ "MixinMinecraft", "MixinNetHandlerPlayClient", "MixinNetworkManager", + "MixinPlayerControllerMP", "MixinRenderChunk", "MixinRenderList", "MixinVboRenderList", diff --git a/src/main/java/baritone/behavior/LookBehavior.java b/src/main/java/baritone/behavior/LookBehavior.java index de131d12..32e5c22f 100644 --- a/src/main/java/baritone/behavior/LookBehavior.java +++ b/src/main/java/baritone/behavior/LookBehavior.java @@ -72,6 +72,8 @@ public final class LookBehavior extends Behavior implements ILookBehavior { float oldPitch = ctx.player().rotationPitch; float desiredPitch = this.target.getPitch(); ctx.player().rotationPitch = desiredPitch; + ctx.player().rotationYaw += (Math.random() - 0.5) * Baritone.settings().randomLooking.value; + ctx.player().rotationPitch += (Math.random() - 0.5) * Baritone.settings().randomLooking.value; if (desiredPitch == oldPitch && !Baritone.settings().freeLook.value) { nudgeToLevel(); } diff --git a/src/main/java/baritone/utils/BlockBreakHelper.java b/src/main/java/baritone/utils/BlockBreakHelper.java index 95d021c2..7f8ada84 100644 --- a/src/main/java/baritone/utils/BlockBreakHelper.java +++ b/src/main/java/baritone/utils/BlockBreakHelper.java @@ -19,6 +19,8 @@ package baritone.utils; import baritone.api.utils.Helper; import baritone.api.utils.IPlayerContext; +import baritone.utils.accessor.IPlayerControllerMP; +import net.minecraft.client.Minecraft; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; @@ -46,8 +48,13 @@ public final class BlockBreakHelper implements Helper { public void stopBreakingBlock() { // The player controller will never be null, but the player can be - if (playerContext.player() != null) { + if (playerContext.player() != null && didBreakLastTick) { + if (((IPlayerControllerMP) mc.playerController).getCurrentBlock().getY() != -1) { + // insane bypass to check breaking succeeded + ((IPlayerControllerMP) mc.playerController).setIsHittingBlock(true); + } playerContext.playerController().resetBlockRemoving(); + didBreakLastTick = false; } } @@ -57,11 +64,17 @@ public final class BlockBreakHelper implements Helper { boolean isBlockTrace = trace != null && trace.typeOfHit == RayTraceResult.Type.BLOCK; if (isLeftClick && isBlockTrace) { + if (!didBreakLastTick) { + ((IPlayerControllerMP) Minecraft.getMinecraft().playerController).callSyncCurrentPlayItem(); + Minecraft.getMinecraft().playerController.clickBlock(trace.getBlockPos(), trace.sideHit); + playerContext.player().swingArm(EnumHand.MAIN_HAND); + } tryBreakBlock(trace.getBlockPos(), trace.sideHit); didBreakLastTick = true; } else if (didBreakLastTick) { stopBreakingBlock(); didBreakLastTick = false; } + ((IPlayerControllerMP) Minecraft.getMinecraft().playerController).setIsHittingBlock(false); } } diff --git a/src/main/java/baritone/utils/accessor/IPlayerControllerMP.java b/src/main/java/baritone/utils/accessor/IPlayerControllerMP.java new file mode 100644 index 00000000..58959d6d --- /dev/null +++ b/src/main/java/baritone/utils/accessor/IPlayerControllerMP.java @@ -0,0 +1,28 @@ +/* + * 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 . + */ + +package baritone.utils.accessor; + +import net.minecraft.util.math.BlockPos; + +public interface IPlayerControllerMP { + void setIsHittingBlock(boolean isHittingBlock); + + BlockPos getCurrentBlock(); + + void callSyncCurrentPlayItem(); +}