From c96b9cb6af3c6428e51377ee8f4234e658370ad0 Mon Sep 17 00:00:00 2001 From: Brady Date: Tue, 21 Aug 2018 18:19:20 -0500 Subject: [PATCH] Added free look option --- src/main/java/baritone/bot/Settings.java | 10 +++- .../bot/behavior/impl/LookBehavior.java | 42 ++++++++++++-- .../baritone/bot/event/GameEventHandler.java | 11 +++- .../bot/event/events/PlayerUpdateEvent.java | 1 - .../bot/event/events/RelativeMoveEvent.java | 43 ++++++++++++++ .../listener/AbstractGameEventListener.java | 3 + .../event/listener/IGameEventListener.java | 11 +++- .../bot/pathing/movement/Movement.java | 8 ++- .../baritone/launch/mixins/MixinEntity.java | 56 +++++++++++++++++++ src/main/resources/mixins.baritone.json | 1 + 10 files changed, 174 insertions(+), 12 deletions(-) create mode 100644 src/main/java/baritone/bot/event/events/RelativeMoveEvent.java create mode 100644 src/main/java/baritone/launch/mixins/MixinEntity.java diff --git a/src/main/java/baritone/bot/Settings.java b/src/main/java/baritone/bot/Settings.java index f3069051..479c86cd 100644 --- a/src/main/java/baritone/bot/Settings.java +++ b/src/main/java/baritone/bot/Settings.java @@ -202,6 +202,11 @@ public class Settings { */ public Setting fadePath = new Setting<>(false); + /** + * Move without having to force the client-sided rotations + */ + public Setting freeLook = new Setting<>(true); + public final Map> byLowerName; public final List> allSettings; @@ -210,6 +215,7 @@ public class Settings { private String name; private final Class klass; + @SuppressWarnings("unchecked") private Setting(T value) { if (value == null) { throw new IllegalArgumentException("Cannot determine value type class from null"); @@ -218,6 +224,7 @@ public class Settings { this.klass = (Class) value.getClass(); } + @SuppressWarnings("unchecked") public final K get() { return (K) value; } @@ -244,7 +251,7 @@ public class Settings { try { for (Field field : temp) { if (field.getType().equals(Setting.class)) { - Setting setting = (Setting) field.get(this); + Setting setting = (Setting) field.get(this); String name = field.getName(); setting.name = name; name = name.toLowerCase(); @@ -262,6 +269,7 @@ public class Settings { allSettings = Collections.unmodifiableList(tmpAll); } + @SuppressWarnings("unchecked") public List> getByValueType(Class klass) { ArrayList> result = new ArrayList<>(); for (Setting setting : allSettings) { diff --git a/src/main/java/baritone/bot/behavior/impl/LookBehavior.java b/src/main/java/baritone/bot/behavior/impl/LookBehavior.java index 36fc0e33..2b470362 100644 --- a/src/main/java/baritone/bot/behavior/impl/LookBehavior.java +++ b/src/main/java/baritone/bot/behavior/impl/LookBehavior.java @@ -17,8 +17,11 @@ package baritone.bot.behavior.impl; +import baritone.bot.Baritone; +import baritone.bot.Settings; import baritone.bot.behavior.Behavior; import baritone.bot.event.events.PlayerUpdateEvent; +import baritone.bot.event.events.RelativeMoveEvent; import baritone.bot.event.events.type.EventState; import baritone.bot.utils.Rotation; @@ -36,21 +39,50 @@ public class LookBehavior extends Behavior { */ private Rotation target; - public void updateTarget(Rotation target) { + /** + * Whether or not rotations are currently being forced + */ + private boolean force; + + /** + * The last player yaw angle. Used when free looking + * + * @see Settings#freeLook + */ + private float lastYaw; + + public void updateTarget(Rotation target, boolean force) { this.target = target; + this.force = force || !Baritone.settings().freeLook.get(); } @Override public void onPlayerUpdate(PlayerUpdateEvent event) { - if (event.getState() == EventState.PRE && target != null) { - player().rotationYaw = target.getFirst(); + if (event.getState() == EventState.PRE && this.target != null && this.force) { + player().rotationYaw = this.target.getFirst(); float oldPitch = player().rotationPitch; - float desiredPitch = target.getSecond(); + float desiredPitch = this.target.getSecond(); player().rotationPitch = desiredPitch; if (desiredPitch == oldPitch) { nudgeToLevel(); } - target = null; + this.target = null; + } + } + + @Override + public void onPlayerRelativeMove(RelativeMoveEvent event) { + if (this.target != null && !force) { + switch (event.getState()) { + case PRE: + this.lastYaw = player().rotationYaw; + player().rotationYaw = this.target.getFirst(); + break; + case POST: + player().rotationYaw = this.lastYaw; + this.target = null; + break; + } } } diff --git a/src/main/java/baritone/bot/event/GameEventHandler.java b/src/main/java/baritone/bot/event/GameEventHandler.java index 1ffe9861..72917145 100644 --- a/src/main/java/baritone/bot/event/GameEventHandler.java +++ b/src/main/java/baritone/bot/event/GameEventHandler.java @@ -156,17 +156,22 @@ public final class GameEventHandler implements IGameEventListener, Helper { @Override public final void onSendPacket(PacketEvent event) { - dispatch(behavior -> behavior.onSendPacket(event)); + dispatch(listener -> listener.onSendPacket(event)); } @Override public final void onReceivePacket(PacketEvent event) { - dispatch(behavior -> behavior.onReceivePacket(event)); + dispatch(listener -> listener.onReceivePacket(event)); } @Override public final void onQueryItemSlotForBlocks(ItemSlotEvent event) { - dispatch(behavior -> behavior.onQueryItemSlotForBlocks(event)); + dispatch(listener -> listener.onQueryItemSlotForBlocks(event)); + } + + @Override + public void onPlayerRelativeMove(RelativeMoveEvent event) { + dispatch(listener -> listener.onPlayerRelativeMove(event)); } public final void registerEventListener(IGameEventListener listener) { diff --git a/src/main/java/baritone/bot/event/events/PlayerUpdateEvent.java b/src/main/java/baritone/bot/event/events/PlayerUpdateEvent.java index 1046c060..b1b703fb 100644 --- a/src/main/java/baritone/bot/event/events/PlayerUpdateEvent.java +++ b/src/main/java/baritone/bot/event/events/PlayerUpdateEvent.java @@ -40,5 +40,4 @@ public final class PlayerUpdateEvent { public final EventState getState() { return this.state; } - } diff --git a/src/main/java/baritone/bot/event/events/RelativeMoveEvent.java b/src/main/java/baritone/bot/event/events/RelativeMoveEvent.java new file mode 100644 index 00000000..cf7f03ad --- /dev/null +++ b/src/main/java/baritone/bot/event/events/RelativeMoveEvent.java @@ -0,0 +1,43 @@ +/* + * This file is part of Baritone. + * + * Baritone is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Baritone. If not, see . + */ + +package baritone.bot.event.events; + +import baritone.bot.event.events.type.EventState; + +/** + * @author Brady + * @since 8/21/2018 + */ +public final class RelativeMoveEvent { + + /** + * The state of the event + */ + private final EventState state; + + public RelativeMoveEvent(EventState state) { + this.state = state; + } + + /** + * @return The state of the event + */ + public final EventState getState() { + return this.state; + } +} diff --git a/src/main/java/baritone/bot/event/listener/AbstractGameEventListener.java b/src/main/java/baritone/bot/event/listener/AbstractGameEventListener.java index 09534fdc..91bb183e 100644 --- a/src/main/java/baritone/bot/event/listener/AbstractGameEventListener.java +++ b/src/main/java/baritone/bot/event/listener/AbstractGameEventListener.java @@ -77,4 +77,7 @@ public interface AbstractGameEventListener extends IGameEventListener { @Override default void onQueryItemSlotForBlocks(ItemSlotEvent event) {} + + @Override + default void onPlayerRelativeMove(RelativeMoveEvent event) {} } diff --git a/src/main/java/baritone/bot/event/listener/IGameEventListener.java b/src/main/java/baritone/bot/event/listener/IGameEventListener.java index 31b549fc..260e6e9e 100644 --- a/src/main/java/baritone/bot/event/listener/IGameEventListener.java +++ b/src/main/java/baritone/bot/event/listener/IGameEventListener.java @@ -42,6 +42,7 @@ import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.renderer.EntityRenderer; import net.minecraft.client.settings.GameSettings; +import net.minecraft.entity.Entity; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; @@ -60,7 +61,8 @@ public interface IGameEventListener { void onTick(TickEvent event); /** - * Run once per game tick from before the player rotation is sent to the server. + * Run once per game tick from before and after the player rotation is sent to the server. + * * @see EntityPlayerSP#onUpdate() */ void onPlayerUpdate(PlayerUpdateEvent event); @@ -123,4 +125,11 @@ public interface IGameEventListener { * @see InventoryPlayer#canHarvestBlock(IBlockState) */ void onQueryItemSlotForBlocks(ItemSlotEvent event); + + /** + * Run once per game tick from before and after the player's moveRelative method is called + * + * @see Entity#moveRelative(float, float, float, float) + */ + void onPlayerRelativeMove(RelativeMoveEvent event); } diff --git a/src/main/java/baritone/bot/pathing/movement/Movement.java b/src/main/java/baritone/bot/pathing/movement/Movement.java index 5b31c147..b2c77a8f 100644 --- a/src/main/java/baritone/bot/pathing/movement/Movement.java +++ b/src/main/java/baritone/bot/pathing/movement/Movement.java @@ -105,7 +105,13 @@ public abstract class Movement implements Helper, MovementHelper { if (BlockStateInterface.isLiquid(playerFeet())) { latestState.setInput(Input.JUMP, true); } - latestState.getTarget().getRotation().ifPresent(LookBehavior.INSTANCE::updateTarget); + + // If the movement target has to force the new rotations, or we aren't using silent move, then force the rotations + latestState.getTarget().getRotation().ifPresent(rotation -> + LookBehavior.INSTANCE.updateTarget( + rotation, + latestState.getTarget().hasToForceRotations())); + // TODO: calculate movement inputs from latestState.getGoal().position // latestState.getTarget().position.ifPresent(null); NULL CONSUMER REALLY SHOULDN'T BE THE FINAL THING YOU SHOULD REALLY REPLACE THIS WITH ALMOST ACTUALLY ANYTHING ELSE JUST PLEASE DON'T LEAVE IT AS IT IS THANK YOU KANYE latestState.getInputStates().forEach((input, forced) -> { diff --git a/src/main/java/baritone/launch/mixins/MixinEntity.java b/src/main/java/baritone/launch/mixins/MixinEntity.java new file mode 100644 index 00000000..0901f295 --- /dev/null +++ b/src/main/java/baritone/launch/mixins/MixinEntity.java @@ -0,0 +1,56 @@ +/* + * This file is part of Baritone. + * + * Baritone is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Baritone. If not, see . + */ + +package baritone.launch.mixins; + +import baritone.bot.Baritone; +import baritone.bot.event.events.RelativeMoveEvent; +import baritone.bot.event.events.type.EventState; +import baritone.bot.utils.Helper; +import net.minecraft.entity.Entity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * @author Brady + * @since 8/21/2018 + */ +@Mixin(Entity.class) +public class MixinEntity { + + @Inject( + method = "moveRelative", + at = @At("HEAD") + ) + private void preMoveRelative(float strafe, float up, float forward, float friction, CallbackInfo ci) { + Entity _this = (Entity) (Object) this; + if (_this == Helper.mc.player) + Baritone.INSTANCE.getGameEventHandler().onPlayerRelativeMove(new RelativeMoveEvent(EventState.PRE)); + } + + @Inject( + method = "moveRelative", + at = @At("RETURN") + ) + private void postMoveRelative(float strafe, float up, float forward, float friction, CallbackInfo ci) { + Entity _this = (Entity) (Object) this; + if (_this == Helper.mc.player) + Baritone.INSTANCE.getGameEventHandler().onPlayerRelativeMove(new RelativeMoveEvent(EventState.POST)); + } +} diff --git a/src/main/resources/mixins.baritone.json b/src/main/resources/mixins.baritone.json index 86521c33..025d42f8 100755 --- a/src/main/resources/mixins.baritone.json +++ b/src/main/resources/mixins.baritone.json @@ -8,6 +8,7 @@ "maxShiftBy": 2 }, "client": [ + "MixinEntity", "MixinEntityPlayerSP", "MixinEntityRenderer", "MixinGameSettings",