Merge branch 'master' into builder
This commit is contained in:
commit
4dd922f1b5
@ -36,9 +36,6 @@ public interface AbstractGameEventListener extends IGameEventListener {
|
|||||||
@Override
|
@Override
|
||||||
default void onPlayerUpdate(PlayerUpdateEvent event) {}
|
default void onPlayerUpdate(PlayerUpdateEvent event) {}
|
||||||
|
|
||||||
@Override
|
|
||||||
default void onProcessKeyBinds() {}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default void onSendChatMessage(ChatEvent event) {}
|
default void onSendChatMessage(ChatEvent event) {}
|
||||||
|
|
||||||
|
@ -49,11 +49,6 @@ public interface IGameEventListener {
|
|||||||
*/
|
*/
|
||||||
void onPlayerUpdate(PlayerUpdateEvent event);
|
void onPlayerUpdate(PlayerUpdateEvent event);
|
||||||
|
|
||||||
/**
|
|
||||||
* Run once per game tick from before keybinds are processed.
|
|
||||||
*/
|
|
||||||
void onProcessKeyBinds();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Runs whenever the client player sends a message to the server.
|
* Runs whenever the client player sends a message to the server.
|
||||||
*
|
*
|
||||||
|
@ -27,9 +27,7 @@ import net.minecraft.client.settings.KeyBinding;
|
|||||||
*/
|
*/
|
||||||
public interface IInputOverrideHandler extends IBehavior {
|
public interface IInputOverrideHandler extends IBehavior {
|
||||||
|
|
||||||
default boolean isInputForcedDown(KeyBinding key) {
|
Boolean isInputForcedDown(KeyBinding key);
|
||||||
return isInputForcedDown(Input.getInputForBind(key));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean isInputForcedDown(Input input);
|
boolean isInputForcedDown(Input input);
|
||||||
|
|
||||||
|
@ -18,8 +18,10 @@
|
|||||||
package baritone.launch.mixins;
|
package baritone.launch.mixins;
|
||||||
|
|
||||||
import baritone.api.BaritoneAPI;
|
import baritone.api.BaritoneAPI;
|
||||||
|
import baritone.utils.Helper;
|
||||||
import net.minecraft.client.settings.KeyBinding;
|
import net.minecraft.client.settings.KeyBinding;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
@ -31,6 +33,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|||||||
@Mixin(KeyBinding.class)
|
@Mixin(KeyBinding.class)
|
||||||
public class MixinKeyBinding {
|
public class MixinKeyBinding {
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
public int pressTime;
|
||||||
|
|
||||||
@Inject(
|
@Inject(
|
||||||
method = "isKeyDown",
|
method = "isKeyDown",
|
||||||
at = @At("HEAD"),
|
at = @At("HEAD"),
|
||||||
@ -38,8 +43,26 @@ public class MixinKeyBinding {
|
|||||||
)
|
)
|
||||||
private void isKeyDown(CallbackInfoReturnable<Boolean> cir) {
|
private void isKeyDown(CallbackInfoReturnable<Boolean> cir) {
|
||||||
// only the primary baritone forces keys
|
// only the primary baritone forces keys
|
||||||
if (BaritoneAPI.getProvider().getPrimaryBaritone().getInputOverrideHandler().isInputForcedDown((KeyBinding) (Object) this)) {
|
Boolean force = BaritoneAPI.getProvider().getPrimaryBaritone().getInputOverrideHandler().isInputForcedDown((KeyBinding) (Object) this);
|
||||||
cir.setReturnValue(true);
|
if (force != null) {
|
||||||
|
cir.setReturnValue(force); // :sunglasses:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(
|
||||||
|
method = "isPressed",
|
||||||
|
at = @At("HEAD"),
|
||||||
|
cancellable = true
|
||||||
|
)
|
||||||
|
private void isPressed(CallbackInfoReturnable<Boolean> cir) {
|
||||||
|
// only the primary baritone forces keys
|
||||||
|
Boolean force = BaritoneAPI.getProvider().getPrimaryBaritone().getInputOverrideHandler().isInputForcedDown((KeyBinding) (Object) this);
|
||||||
|
if (force != null && force == false) { // <-- cursed
|
||||||
|
if (pressTime > 0) {
|
||||||
|
Helper.HELPER.logDirect("You're trying to press this mouse button but I won't let you");
|
||||||
|
pressTime--;
|
||||||
|
}
|
||||||
|
cir.setReturnValue(force); // :sunglasses:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -96,15 +96,6 @@ public class MixinMinecraft {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(
|
|
||||||
method = "processKeyBinds",
|
|
||||||
at = @At("HEAD")
|
|
||||||
)
|
|
||||||
private void runTickKeyboard(CallbackInfo ci) {
|
|
||||||
// keyboard input is only the primary baritone
|
|
||||||
BaritoneAPI.getProvider().getPrimaryBaritone().getGameEventHandler().onProcessKeyBinds();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(
|
@Inject(
|
||||||
method = "loadWorld(Lnet/minecraft/client/multiplayer/WorldClient;Ljava/lang/String;)V",
|
method = "loadWorld(Lnet/minecraft/client/multiplayer/WorldClient;Ljava/lang/String;)V",
|
||||||
at = @At("HEAD")
|
at = @At("HEAD")
|
||||||
|
@ -54,11 +54,6 @@ public final class GameEventHandler implements IEventBus, Helper {
|
|||||||
listeners.forEach(l -> l.onPlayerUpdate(event));
|
listeners.forEach(l -> l.onPlayerUpdate(event));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public final void onProcessKeyBinds() {
|
|
||||||
listeners.forEach(IGameEventListener::onProcessKeyBinds);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void onSendChatMessage(ChatEvent event) {
|
public final void onSendChatMessage(ChatEvent event) {
|
||||||
listeners.forEach(l -> l.onSendChatMessage(event));
|
listeners.forEach(l -> l.onSendChatMessage(event));
|
||||||
|
@ -46,7 +46,6 @@ public class CalculationContext {
|
|||||||
|
|
||||||
public final boolean safeForThreadedUse;
|
public final boolean safeForThreadedUse;
|
||||||
public final IBaritone baritone;
|
public final IBaritone baritone;
|
||||||
public final EntityPlayerSP player;
|
|
||||||
public final World world;
|
public final World world;
|
||||||
public final WorldData worldData;
|
public final WorldData worldData;
|
||||||
public final BlockStateInterface bsi;
|
public final BlockStateInterface bsi;
|
||||||
@ -77,7 +76,7 @@ public class CalculationContext {
|
|||||||
public CalculationContext(IBaritone baritone, boolean forUseOnAnotherThread) {
|
public CalculationContext(IBaritone baritone, boolean forUseOnAnotherThread) {
|
||||||
this.safeForThreadedUse = forUseOnAnotherThread;
|
this.safeForThreadedUse = forUseOnAnotherThread;
|
||||||
this.baritone = baritone;
|
this.baritone = baritone;
|
||||||
this.player = baritone.getPlayerContext().player();
|
EntityPlayerSP player = baritone.getPlayerContext().player();
|
||||||
this.world = baritone.getPlayerContext().world();
|
this.world = baritone.getPlayerContext().world();
|
||||||
this.worldData = (WorldData) baritone.getWorldProvider().getCurrentWorld();
|
this.worldData = (WorldData) baritone.getWorldProvider().getCurrentWorld();
|
||||||
this.bsi = new BlockStateInterface(world, worldData, forUseOnAnotherThread);
|
this.bsi = new BlockStateInterface(world, worldData, forUseOnAnotherThread);
|
||||||
|
@ -380,7 +380,8 @@ public class PathExecutor implements IPathExecutor, Helper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// if the movement requested sprinting, then we're done
|
// if the movement requested sprinting, then we're done
|
||||||
if (behavior.baritone.getInputOverrideHandler().isInputForcedDown(mc.gameSettings.keyBindSprint)) {
|
if (behavior.baritone.getInputOverrideHandler().isInputForcedDown(Input.SPRINT)) {
|
||||||
|
behavior.baritone.getInputOverrideHandler().setInputForceState(Input.SPRINT, false);
|
||||||
if (!ctx.player().isSprinting()) {
|
if (!ctx.player().isSprinting()) {
|
||||||
ctx.player().setSprinting(true);
|
ctx.player().setSprinting(true);
|
||||||
}
|
}
|
||||||
|
@ -17,8 +17,6 @@
|
|||||||
|
|
||||||
package baritone.utils;
|
package baritone.utils;
|
||||||
|
|
||||||
import baritone.Baritone;
|
|
||||||
import baritone.api.BaritoneAPI;
|
|
||||||
import baritone.api.utils.IPlayerContext;
|
import baritone.api.utils.IPlayerContext;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraft.util.EnumHand;
|
import net.minecraft.util.EnumHand;
|
||||||
@ -52,26 +50,8 @@ public final class BlockBreakHelper implements Helper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean fakeBreak() {
|
|
||||||
if (playerContext != BaritoneAPI.getProvider().getPrimaryBaritone().getPlayerContext()) {
|
|
||||||
// for a non primary player, we need to fake break always, CLICK_LEFT has no effect
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!Baritone.settings().leftClickWorkaround.get()) {
|
|
||||||
// if this setting is false, we CLICK_LEFT regardless of gui status
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return mc.currentScreen != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean tick(boolean isLeftClick) {
|
|
||||||
if (!fakeBreak()) {
|
|
||||||
if (didBreakLastTick) {
|
|
||||||
stopBreakingBlock();
|
|
||||||
}
|
|
||||||
return isLeftClick;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
public void tick(boolean isLeftClick) {
|
||||||
RayTraceResult trace = playerContext.objectMouseOver();
|
RayTraceResult trace = playerContext.objectMouseOver();
|
||||||
boolean isBlockTrace = trace != null && trace.typeOfHit == RayTraceResult.Type.BLOCK;
|
boolean isBlockTrace = trace != null && trace.typeOfHit == RayTraceResult.Type.BLOCK;
|
||||||
|
|
||||||
@ -82,6 +62,5 @@ public final class BlockBreakHelper implements Helper {
|
|||||||
stopBreakingBlock();
|
stopBreakingBlock();
|
||||||
didBreakLastTick = false;
|
didBreakLastTick = false;
|
||||||
}
|
}
|
||||||
return false; // fakeBreak is true so no matter what we aren't forcing CLICK_LEFT
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,12 +18,15 @@
|
|||||||
package baritone.utils;
|
package baritone.utils;
|
||||||
|
|
||||||
import baritone.Baritone;
|
import baritone.Baritone;
|
||||||
|
import baritone.api.BaritoneAPI;
|
||||||
import baritone.api.event.events.TickEvent;
|
import baritone.api.event.events.TickEvent;
|
||||||
import baritone.api.utils.IInputOverrideHandler;
|
import baritone.api.utils.IInputOverrideHandler;
|
||||||
import baritone.api.utils.input.Input;
|
import baritone.api.utils.input.Input;
|
||||||
import baritone.behavior.Behavior;
|
import baritone.behavior.Behavior;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.settings.KeyBinding;
|
import net.minecraft.client.settings.KeyBinding;
|
||||||
import org.lwjgl.input.Keyboard;
|
import net.minecraft.util.MovementInput;
|
||||||
|
import net.minecraft.util.MovementInputFromOptions;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -57,8 +60,18 @@ public final class InputOverrideHandler extends Behavior implements IInputOverri
|
|||||||
* @return Whether or not it is being forced down
|
* @return Whether or not it is being forced down
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public final boolean isInputForcedDown(KeyBinding key) {
|
public final Boolean isInputForcedDown(KeyBinding key) {
|
||||||
return isInputForcedDown(Input.getInputForBind(key));
|
Input input = Input.getInputForBind(key);
|
||||||
|
if (input == null || !inControl()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (input == Input.CLICK_LEFT) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (input == Input.CLICK_RIGHT) {
|
||||||
|
return isInputForcedDown(Input.CLICK_RIGHT);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -91,29 +104,25 @@ public final class InputOverrideHandler extends Behavior implements IInputOverri
|
|||||||
this.inputForceStateMap.clear();
|
this.inputForceStateMap.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public final void onProcessKeyBinds() {
|
|
||||||
// Simulate the key being held down this tick
|
|
||||||
for (Input input : Input.values()) {
|
|
||||||
KeyBinding keyBinding = input.getKeyBinding();
|
|
||||||
|
|
||||||
if (isInputForcedDown(keyBinding) && !keyBinding.isKeyDown()) {
|
|
||||||
int keyCode = keyBinding.getKeyCode();
|
|
||||||
|
|
||||||
if (keyCode < Keyboard.KEYBOARD_SIZE) {
|
|
||||||
KeyBinding.onTick(keyCode < 0 ? keyCode + 100 : keyCode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void onTick(TickEvent event) {
|
public final void onTick(TickEvent event) {
|
||||||
if (event.getType() == TickEvent.Type.OUT) {
|
if (event.getType() == TickEvent.Type.OUT) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
boolean stillClick = blockBreakHelper.tick(isInputForcedDown(Input.CLICK_LEFT));
|
blockBreakHelper.tick(isInputForcedDown(Input.CLICK_LEFT));
|
||||||
setInputForceState(Input.CLICK_LEFT, stillClick);
|
|
||||||
|
MovementInput desired = inControl()
|
||||||
|
? new PlayerMovementInput(this)
|
||||||
|
: new MovementInputFromOptions(Minecraft.getMinecraft().gameSettings);
|
||||||
|
|
||||||
|
if (ctx.player().movementInput.getClass() != desired.getClass()) {
|
||||||
|
ctx.player().movementInput = desired; // only set it if it was previously incorrect
|
||||||
|
// gotta do it this way, or else it constantly thinks you're beginning a double tap W sprint lol
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean inControl() {
|
||||||
|
return baritone.getPathingBehavior().isPathing() || baritone != BaritoneAPI.getProvider().getPrimaryBaritone();
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlockBreakHelper getBlockBreakHelper() {
|
public BlockBreakHelper getBlockBreakHelper() {
|
||||||
|
@ -29,7 +29,7 @@ import baritone.pathing.path.PathExecutor;
|
|||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public class PathingControlManager implements IPathingControlManager {
|
public class PathingControlManager implements IPathingControlManager {
|
||||||
private final Baritone baritone;
|
private final Baritone baritone;
|
||||||
@ -83,7 +83,7 @@ public class PathingControlManager implements IPathingControlManager {
|
|||||||
public void preTick() {
|
public void preTick() {
|
||||||
inControlLastTick = inControlThisTick;
|
inControlLastTick = inControlThisTick;
|
||||||
PathingBehavior p = baritone.getPathingBehavior();
|
PathingBehavior p = baritone.getPathingBehavior();
|
||||||
command = doTheStuff();
|
command = executeProcesses();
|
||||||
if (command == null) {
|
if (command == null) {
|
||||||
p.cancelSegmentIfSafe();
|
p.cancelSegmentIfSafe();
|
||||||
return;
|
return;
|
||||||
@ -170,32 +170,30 @@ public class PathingControlManager implements IPathingControlManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public PathingCommand doTheStuff() {
|
public PathingCommand executeProcesses() {
|
||||||
List<IBaritoneProcess> inContention = processes.stream().filter(IBaritoneProcess::isActive).sorted(Comparator.comparingDouble(IBaritoneProcess::priority)).collect(Collectors.toList());
|
Stream<IBaritoneProcess> inContention = processes.stream()
|
||||||
boolean found = false;
|
.filter(IBaritoneProcess::isActive)
|
||||||
boolean cancelOthers = false;
|
.sorted(Comparator.comparingDouble(IBaritoneProcess::priority).reversed());
|
||||||
PathingCommand exec = null;
|
|
||||||
for (int i = inContention.size() - 1; i >= 0; --i) { // truly a gamer moment
|
|
||||||
IBaritoneProcess proc = inContention.get(i);
|
Iterator<IBaritoneProcess> iterator = inContention.iterator();
|
||||||
if (found) {
|
while (iterator.hasNext()) {
|
||||||
if (cancelOthers) {
|
IBaritoneProcess proc = iterator.next();
|
||||||
proc.onLostControl();
|
|
||||||
|
PathingCommand exec = proc.onTick(Objects.equals(proc, inControlLastTick) && baritone.getPathingBehavior().calcFailedLastTick(), baritone.getPathingBehavior().isSafeToCancel());
|
||||||
|
if (exec == null) {
|
||||||
|
if (proc.isActive()) {
|
||||||
|
throw new IllegalStateException(proc.displayName() + " returned null PathingCommand");
|
||||||
}
|
}
|
||||||
|
proc.onLostControl();
|
||||||
} else {
|
} else {
|
||||||
exec = proc.onTick(Objects.equals(proc, inControlLastTick) && baritone.getPathingBehavior().calcFailedLastTick(), baritone.getPathingBehavior().isSafeToCancel());
|
|
||||||
if (exec == null) {
|
|
||||||
if (proc.isActive()) {
|
|
||||||
throw new IllegalStateException(proc.displayName());
|
|
||||||
}
|
|
||||||
proc.onLostControl();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
//System.out.println("Executing command " + exec.commandType + " " + exec.goal + " from " + proc.displayName());
|
|
||||||
inControlThisTick = proc;
|
inControlThisTick = proc;
|
||||||
found = true;
|
if (!proc.isTemporary()) {
|
||||||
cancelOthers = !proc.isTemporary();
|
iterator.forEachRemaining(IBaritoneProcess::onLostControl);
|
||||||
|
}
|
||||||
|
return exec;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return exec;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
57
src/main/java/baritone/utils/PlayerMovementInput.java
Normal file
57
src/main/java/baritone/utils/PlayerMovementInput.java
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package baritone.utils;
|
||||||
|
|
||||||
|
import baritone.api.utils.input.Input;
|
||||||
|
import net.minecraft.util.MovementInput;
|
||||||
|
|
||||||
|
public class PlayerMovementInput extends MovementInput {
|
||||||
|
private final InputOverrideHandler handler;
|
||||||
|
|
||||||
|
public PlayerMovementInput(InputOverrideHandler handler) {
|
||||||
|
this.handler = handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updatePlayerMoveState() {
|
||||||
|
this.moveStrafe = 0.0F;
|
||||||
|
this.moveForward = 0.0F;
|
||||||
|
|
||||||
|
jump = handler.isInputForcedDown(Input.JUMP); // oppa
|
||||||
|
|
||||||
|
if (this.forwardKeyDown = handler.isInputForcedDown(Input.MOVE_FORWARD)) {
|
||||||
|
this.moveForward++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.backKeyDown = handler.isInputForcedDown(Input.MOVE_BACK)) {
|
||||||
|
this.moveForward--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.leftKeyDown = handler.isInputForcedDown(Input.MOVE_LEFT)) {
|
||||||
|
this.moveStrafe++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.rightKeyDown = handler.isInputForcedDown(Input.MOVE_RIGHT)) {
|
||||||
|
this.moveStrafe--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.sneak = handler.isInputForcedDown(Input.SNEAK)) {
|
||||||
|
this.moveStrafe *= 0.3D;
|
||||||
|
this.moveForward *= 0.3D;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user