Skip to content
This repository was archived by the owner on Jun 28, 2024. It is now read-only.

Commit

Permalink
Merge pull request #183 from gaucho-matrero/v0.3.3-hotfixes1
Browse files Browse the repository at this point in the history
V0.3.3 hotfixes 1
  • Loading branch information
TacoTechnica authored Jan 22, 2022
2 parents 06fbbd6 + bdcd8b9 commit a268acf
Show file tree
Hide file tree
Showing 33 changed files with 380 additions and 146 deletions.
18 changes: 14 additions & 4 deletions src/main/java/adris/altoclef/AltoClef.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
import adris.altoclef.butler.Butler;
import adris.altoclef.chains.*;
import adris.altoclef.commandsystem.CommandExecutor;
import adris.altoclef.control.InputControls;
import adris.altoclef.control.PlayerExtraController;
import adris.altoclef.control.SlotHandler;
import adris.altoclef.tasksystem.Task;
import adris.altoclef.tasksystem.TaskRunner;
import adris.altoclef.trackers.*;
Expand All @@ -11,9 +14,6 @@
import adris.altoclef.ui.CommandStatusOverlay;
import adris.altoclef.ui.MessagePriority;
import adris.altoclef.ui.MessageSender;
import adris.altoclef.control.InputControls;
import adris.altoclef.control.PlayerExtraController;
import adris.altoclef.control.SlotHandler;
import adris.altoclef.util.csharpisbetter.Action;
import adris.altoclef.util.csharpisbetter.ActionListener;
import adris.altoclef.util.helpers.InputHelper;
Expand All @@ -27,14 +27,18 @@
import net.minecraft.client.network.ClientPlayerInteractionManager;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.item.Item;
import net.minecraft.item.Items;
import net.minecraft.util.math.ChunkPos;
import net.minecraft.world.chunk.WorldChunk;
import org.lwjgl.glfw.GLFW;

import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.List;
import java.util.Queue;
import java.util.function.Consumer;
import java.util.stream.Collectors;

/**
* Central access point for AltoClef
Expand Down Expand Up @@ -141,7 +145,10 @@ public void onInitializeLoad() {
adris.altoclef.Settings.load(newSettings -> {
_settings = newSettings;
// Baritone's `acceptableThrowawayItems` should match our own.
getClientBaritoneSettings().acceptableThrowawayItems.value.addAll(Arrays.asList(_settings.getThrowawayItems(this, true)));
List<Item> baritoneCanPlace = Arrays.stream(_settings.getThrowawayItems(this, true))
.filter(item -> item != Items.SOUL_SAND) // Don't place soul sand, that messes us up.
.collect(Collectors.toList());
getClientBaritoneSettings().acceptableThrowawayItems.value.addAll(baritoneCanPlace);
// If we should run an idle command...
if ((!getUserTaskChain().isActive() || getUserTaskChain().isRunningIdleTask()) && getModSettings().shouldRunIdleCommandWhenNotActive()) {
getUserTaskChain().signalNextTaskToBeIdleTask();
Expand All @@ -162,6 +169,9 @@ public void onClientTick() {
// Cancel shortcut
if (InputHelper.isKeyPressed(GLFW.GLFW_KEY_LEFT_CONTROL) && InputHelper.isKeyPressed(GLFW.GLFW_KEY_K)) {
_userTaskChain.cancel(this);
if (_taskRunner.getCurrentTaskChain() != null) {
_taskRunner.getCurrentTaskChain().stop(this);
}
}

// TODO: should this go here?
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/adris/altoclef/Settings.java
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,14 @@ public class Settings implements IFailableConfigFile {
*/
private boolean avoidDrowning = true;

/**
* If enabled, the bot will close the open screen (furnace/crafting/chest/whatever) when the bot detects
* that its look direction has changed OR that it is mining something.
*
* This is here to stop the bot from getting stuck in a screen container.
*/
private boolean autoCloseScreenWhenLookingOrMining = true;

/**
* If enabled, will attempt to extinguish ourselves when on fire (and not immune to fire)
*/
Expand Down Expand Up @@ -474,6 +482,10 @@ public boolean shouldAvoidDrowning() {
return avoidDrowning;
}

public boolean shouldCloseScreenWhenLookingOrMining() {
return autoCloseScreenWhenLookingOrMining;
}

public boolean shouldExtinguishSelfWithWater() {
return extinguishSelfWithWater;
}
Expand Down
82 changes: 40 additions & 42 deletions src/main/java/adris/altoclef/chains/DeathMenuChain.java
Original file line number Diff line number Diff line change
Expand Up @@ -67,54 +67,52 @@ public float getPriority(AltoClef mod) {
} else {
_deathRetryTimer.reset();
}
// Keep track of the last server we were on so we can re-connect.
if (AltoClef.inGame()) {
_prevServerEntry = MinecraftClient.getInstance().getCurrentServerEntry();
}

if (screen != null && screen.getClass() != _prevScreen) {

// Keep track of the last server we were on so we can re-connect.
if (AltoClef.inGame()) {
_prevServerEntry = MinecraftClient.getInstance().getCurrentServerEntry();
if (screen instanceof DeathScreen) {
if (_waitOnDeathScreenBeforeRespawnTimer.elapsed()) {
_waitOnDeathScreenBeforeRespawnTimer.reset();
if (shouldAutoRespawn(mod)) {
_deathCount++;
Debug.logMessage("RESPAWNING... (this is death #" + _deathCount + ")");
assert MinecraftClient.getInstance().player != null;
MinecraftClient.getInstance().player.requestRespawn();
MinecraftClient.getInstance().setScreen(null);
} else {
// Cancel if we die and are not auto-respawning.
mod.cancelUserTask();
}
}

if (screen instanceof DeathScreen) {
if (_waitOnDeathScreenBeforeRespawnTimer.elapsed()) {
if (shouldAutoRespawn(mod)) {
_deathCount++;
Debug.logMessage("RESPAWNING... (this is death #" + _deathCount + ")");
assert MinecraftClient.getInstance().player != null;
MinecraftClient.getInstance().player.requestRespawn();
MinecraftClient.getInstance().setScreen(null);
} else {
// Cancel if we die and are not auto-respawning.
mod.cancelUserTask();
}
} else {
_waitOnDeathScreenBeforeRespawnTimer.reset();
if (screen instanceof DisconnectedScreen) {
if (shouldAutoReconnect(mod)) {
Debug.logMessage("RECONNECTING: Going to Multiplayer Screen");
_reconnecting = true;
MinecraftClient.getInstance().setScreen(new MultiplayerScreen(new TitleScreen()));
} else {
// Cancel if we disconnect and are not auto-reconnecting.
mod.cancelUserTask();
}
} else {
_waitOnDeathScreenBeforeRespawnTimer.reset();
if (screen instanceof DisconnectedScreen) {
if (shouldAutoReconnect(mod)) {
Debug.logMessage("RECONNECTING: Going to Multiplayer Screen");
_reconnecting = true;
MinecraftClient.getInstance().setScreen(new MultiplayerScreen(new TitleScreen()));
} else {
// Cancel if we disconnect and are not auto-reconnecting.
mod.cancelUserTask();
}
} else if (screen instanceof MultiplayerScreen && _reconnecting && _reconnectTimer.elapsed()) {
_reconnectTimer.reset();
Debug.logMessage("RECONNECTING: Going ");
_reconnecting = false;

if (_prevServerEntry == null) {
Debug.logWarning("Failed to re-connect to server, no server entry cached.");
} else {
MinecraftClient client = MinecraftClient.getInstance();
ConnectScreen.connect(screen, client, ServerAddress.parse(_prevServerEntry.address), _prevServerEntry);
//client.setScreen(new ConnectScreen(screen, client, _prevServerEntry));
}
} else if (screen instanceof MultiplayerScreen && _reconnecting && _reconnectTimer.elapsed()) {
_reconnectTimer.reset();
Debug.logMessage("RECONNECTING: Going ");
_reconnecting = false;

if (_prevServerEntry == null) {
Debug.logWarning("Failed to re-connect to server, no server entry cached.");
} else {
MinecraftClient client = MinecraftClient.getInstance();
ConnectScreen.connect(screen, client, ServerAddress.parse(_prevServerEntry.address), _prevServerEntry);
//client.setScreen(new ConnectScreen(screen, client, _prevServerEntry));
}
}
_prevScreen = screen.getClass();
}
if (screen != null)
_prevScreen = screen.getClass();
return Float.NEGATIVE_INFINITY;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,17 @@
import adris.altoclef.tasksystem.TaskChain;
import adris.altoclef.tasksystem.TaskRunner;
import adris.altoclef.util.csharpisbetter.TimerGame;
import adris.altoclef.util.helpers.LookHelper;
import adris.altoclef.util.helpers.StorageHelper;
import adris.altoclef.util.slots.PlayerInventorySlot;
import adris.altoclef.util.slots.Slot;
import adris.altoclef.util.slots.PlayerSlot;
import baritone.api.utils.Rotation;
import baritone.api.utils.input.Input;
import net.minecraft.block.BlockState;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.ChatScreen;
import net.minecraft.client.gui.screen.GameMenuScreen;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.item.ItemStack;
import net.minecraft.screen.slot.SlotActionType;

Expand All @@ -22,8 +27,12 @@ public class PlayerInteractionFixChain extends TaskChain {
private final TimerGame _generalDuctTapeSwapTimeout = new TimerGame(30);
private final TimerGame _shiftDepressTimeout = new TimerGame(10);
private final TimerGame _betterToolTimer = new TimerGame(0.5);
private final TimerGame _mouseMovingButScreenOpenTimeout = new TimerGame(0.2);
private ItemStack _lastHandStack = null;

private Screen _lastScreen;
private Rotation _lastLookRotation;

public PlayerInteractionFixChain(TaskRunner runner) {
super(runner);
}
Expand Down Expand Up @@ -125,9 +134,44 @@ public float getPriority(AltoClef mod) {
}
}

if (shouldCloseOpenScreen(mod)) {
Debug.logMessage("Closed screen since we changed our look.");
StorageHelper.closeScreen();
return Float.NEGATIVE_INFINITY;
}

return Float.NEGATIVE_INFINITY;
}

private boolean shouldCloseOpenScreen(AltoClef mod) {
if (!mod.getModSettings().shouldCloseScreenWhenLookingOrMining())
return false;
// Only check look if we've had the same screen open for a while
Screen openScreen = MinecraftClient.getInstance().currentScreen;
if (openScreen != _lastScreen) {
_mouseMovingButScreenOpenTimeout.reset();
}
// We're in the player screen/a screen we DON'T want to cancel out of
if (openScreen == null || openScreen instanceof ChatScreen || openScreen instanceof GameMenuScreen) {
_mouseMovingButScreenOpenTimeout.reset();
return false;
}
// Check for rotation change
Rotation look = LookHelper.getLookRotation();
if (_lastLookRotation != null && _mouseMovingButScreenOpenTimeout.elapsed()) {
Rotation delta = look.subtract(_lastLookRotation);
if (Math.abs(delta.getYaw()) > 0.1f || Math.abs(delta.getPitch()) > 0.1f) {
_lastLookRotation = look;
return true;
}
// do NOT update our last look rotation, just because we want to measure long term rotation.
} else {
_lastLookRotation = look;
}
_lastScreen = openScreen;
return false;
}

@Override
public boolean isActive() {
return true;
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/adris/altoclef/chains/SingleTaskChain.java
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ public void onInterrupt(AltoClef mod, TaskChain other) {
}
}

protected boolean isCurrentlyRunning(AltoClef mod) {
return !_interrupted && _mainTask.isActive() && !_mainTask.isFinished(mod);
}

public Task getCurrentTask() {
return _mainTask;
}
Expand Down
38 changes: 15 additions & 23 deletions src/main/java/adris/altoclef/chains/WorldSurvivalChain.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
import adris.altoclef.tasks.DoToClosestBlockTask;
import adris.altoclef.tasks.InteractWithBlockTask;
import adris.altoclef.tasks.construction.PutOutFireTask;
import adris.altoclef.tasks.movement.EscapeFromLavaTask;
import adris.altoclef.tasks.movement.GetToBlockTask;
import adris.altoclef.tasks.movement.SafeRandomShimmyTask;
import adris.altoclef.tasks.movement.*;
import adris.altoclef.tasksystem.TaskRunner;
import adris.altoclef.util.ItemTarget;
import adris.altoclef.util.csharpisbetter.TimerGame;
Expand All @@ -17,11 +15,8 @@
import net.minecraft.block.AbstractFireBlock;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.effect.StatusEffects;
import net.minecraft.item.Items;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;

Expand All @@ -31,8 +26,7 @@ public class WorldSurvivalChain extends SingleTaskChain {

private final TimerGame _wasInLavaTimer = new TimerGame(1);
private boolean _wasAvoidingDrowning;
private boolean _wasStuckInPortal;
private int _portalStuckTimer;
private TimerGame _portalStuckTimer = new TimerGame(5);

private BlockPos _extinguishWaterPosition;

Expand Down Expand Up @@ -66,7 +60,7 @@ public float getPriority(AltoClef mod) {

// Extinguish with water
if (mod.getModSettings().shouldExtinguishSelfWithWater()) {
if (!(_mainTask instanceof EscapeFromLavaTask) && mod.getPlayer().isOnFire() && !mod.getPlayer().hasStatusEffect(StatusEffects.FIRE_RESISTANCE) && !mod.getWorld().getDimension().isUltrawarm()) {
if (!(_mainTask instanceof EscapeFromLavaTask && isCurrentlyRunning(mod)) && mod.getPlayer().isOnFire() && !mod.getPlayer().hasStatusEffect(StatusEffects.FIRE_RESISTANCE) && !mod.getWorld().getDimension().isUltrawarm()) {
// Extinguish ourselves
if (mod.getItemStorage().hasItem(Items.WATER_BUCKET)) {
BlockPos targetWaterPos = mod.getPlayer().getBlockPos();
Expand Down Expand Up @@ -98,18 +92,19 @@ public float getPriority(AltoClef mod) {

// Portal stuck
if (isStuckInNetherPortal(mod)) {
_portalStuckTimer++;
_wasStuckInPortal = true;
// We can't break or place while inside a portal (not really)
mod.getExtraBaritoneSettings().setInteractionPaused(true);
} else {
_portalStuckTimer = 0;
// We're no longer stuck, but we might want to move AWAY from our stuck position.
_portalStuckTimer.reset();
mod.getExtraBaritoneSettings().setInteractionPaused(false);
}
if (_portalStuckTimer > 10) {
if (_portalStuckTimer.elapsed()) {
// We're stuck inside a portal, so get out.
// Don't allow breaking while we're inside the portal.
setTask(new SafeRandomShimmyTask());
return 60;
}
_wasStuckInPortal = false;

return Float.NEGATIVE_INFINITY;
}
Expand Down Expand Up @@ -156,15 +151,7 @@ private boolean isInFire(AltoClef mod) {
}

private boolean isStuckInNetherPortal(AltoClef mod) {
// We're stuck if we're inside a portal, are breaking it and can ONLY look at the portal.
boolean inPortal = mod.getBlockTracker().blockIsValid(mod.getPlayer().getBlockPos(), Blocks.NETHER_PORTAL);
boolean breakingPortal = mod.getControllerExtras().isBreakingBlock() && mod.getBlockTracker().blockIsValid(mod.getControllerExtras().getBreakingBlockPos(), Blocks.NETHER_PORTAL);
if (MinecraftClient.getInstance().crosshairTarget != null && MinecraftClient.getInstance().crosshairTarget.getType() == HitResult.Type.BLOCK) {
BlockHitResult currentLook = (BlockHitResult) MinecraftClient.getInstance().crosshairTarget;
boolean collidingWithportal = (currentLook != null && mod.getBlockTracker().blockIsValid(currentLook.getBlockPos(), Blocks.NETHER_PORTAL));
return inPortal && collidingWithportal && (breakingPortal || _wasStuckInPortal);
}
return false;
return WorldHelper.isInNetherPortal(mod) && !mod.getUserTaskChain().getCurrentTask().thisOrChildSatisfies(task -> task instanceof EnterNetherPortalTask);
}

@Override
Expand All @@ -177,4 +164,9 @@ public boolean isActive() {
// Always check for survival.
return true;
}

@Override
protected void onStop(AltoClef mod) {
super.onStop(mod);
}
}
11 changes: 11 additions & 0 deletions src/main/java/adris/altoclef/mixins/EntityAccessor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package adris.altoclef.mixins;

import net.minecraft.entity.Entity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

@Mixin(Entity.class)
public interface EntityAccessor {
@Accessor("inNetherPortal")
boolean isInNetherPortal();
}
8 changes: 6 additions & 2 deletions src/main/java/adris/altoclef/tasks/InteractWithBlockTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -225,10 +225,14 @@ private ClickResponse rightClick(AltoClef mod) {
// Don't interact if baritone can't interact.
if (mod.getExtraBaritoneSettings().isInteractionPaused()) return ClickResponse.WAIT_FOR_CLICK;

// We can't interact while a screen is open.
if (!StorageHelper.isPlayerInventoryOpen()) {
StorageHelper.closeScreen();
}

Optional<Rotation> reachable = getCurrentReach();
if (reachable.isPresent()) {
//Debug.logMessage("Reachable: UPDATE");
mod.getClientBaritone().getLookBehavior().updateTarget(reachable.get(), true);
LookHelper.lookAt(mod, reachable.get());
if (mod.getClientBaritone().getPlayerContext().isLookingAt(_target)) {
if (_toUse != null) {
mod.getSlotHandler().forceEquipItem(_toUse, false);
Expand Down
Loading

0 comments on commit a268acf

Please sign in to comment.