From c15dac3582f988da85fb57063aaeb8a1992e62ba Mon Sep 17 00:00:00 2001 From: Leijurv Date: Fri, 7 Dec 2018 16:57:12 -0800 Subject: [PATCH] simple inventory management --- src/api/java/baritone/api/Settings.java | 5 + src/main/java/baritone/Baritone.java | 6 +- .../baritone/behavior/InventoryBehavior.java | 98 +++++++++++++++++++ src/main/java/baritone/utils/ToolSet.java | 2 +- 4 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 src/main/java/baritone/behavior/InventoryBehavior.java diff --git a/src/api/java/baritone/api/Settings.java b/src/api/java/baritone/api/Settings.java index e65ce88e..fe28da51 100644 --- a/src/api/java/baritone/api/Settings.java +++ b/src/api/java/baritone/api/Settings.java @@ -50,6 +50,11 @@ public class Settings { */ public Setting allowPlace = new Setting<>(true); + /** + * Allow Baritone to move items in your inventory to your hotbar + */ + public Setting allowInventory = new Setting<>(false); + /** * It doesn't actually take twenty ticks to place a block, this cost is so high * because we want to generally conserve blocks which might be limited diff --git a/src/main/java/baritone/Baritone.java b/src/main/java/baritone/Baritone.java index 1353dcc6..41fa36c5 100755 --- a/src/main/java/baritone/Baritone.java +++ b/src/main/java/baritone/Baritone.java @@ -22,10 +22,7 @@ import baritone.api.IBaritone; import baritone.api.Settings; import baritone.api.event.listener.IEventBus; import baritone.api.utils.IPlayerContext; -import baritone.behavior.Behavior; -import baritone.behavior.LookBehavior; -import baritone.behavior.MemoryBehavior; -import baritone.behavior.PathingBehavior; +import baritone.behavior.*; import baritone.cache.WorldProvider; import baritone.event.GameEventHandler; import baritone.process.CustomGoalProcess; @@ -110,6 +107,7 @@ public class Baritone implements IBaritone { pathingBehavior = new PathingBehavior(this); lookBehavior = new LookBehavior(this); memoryBehavior = new MemoryBehavior(this); + new InventoryBehavior(this); inputOverrideHandler = new InputOverrideHandler(this); new ExampleBaritoneControl(this); } diff --git a/src/main/java/baritone/behavior/InventoryBehavior.java b/src/main/java/baritone/behavior/InventoryBehavior.java new file mode 100644 index 00000000..9b191204 --- /dev/null +++ b/src/main/java/baritone/behavior/InventoryBehavior.java @@ -0,0 +1,98 @@ +/* + * 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.behavior; + +import baritone.Baritone; +import baritone.api.event.events.TickEvent; +import baritone.utils.ToolSet; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.inventory.GuiInventory; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.ClickType; +import net.minecraft.item.ItemPickaxe; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemTool; +import net.minecraft.util.NonNullList; + +public class InventoryBehavior extends Behavior { + public InventoryBehavior(Baritone baritone) { + super(baritone); + } + + @Override + public void onTick(TickEvent event) { + if (!Baritone.settings().allowInventory.get()) { + return; + } + if (event.getType() == TickEvent.Type.OUT) { + return; + } + if (Minecraft.getMinecraft().currentScreen != null && !(Minecraft.getMinecraft().currentScreen instanceof GuiInventory)) { + // we have chat or a chest or something open + return; + } + if (firstValidThrowaway() >= 9) { // aka there are none on the hotbar, but there are some in main inventory + swapWithHotBar(firstValidThrowaway(), 8); + } + int pick = bestToolAgainst(Blocks.STONE, ItemPickaxe.class); + if (pick >= 9) { + swapWithHotBar(pick, 0); + } + } + + private void swapWithHotBar(int inInventory, int inHotbar) { + int windowId = ctx.player().inventoryContainer.windowId; + // aaaaaaaaaaaaaaaaaaaaaaaaaaaa + // aaaaaaaaAAAAAAaaaaaAAaaaAAAAaaAAA + if (inInventory < 9) { + inInventory += 36; + } + ctx.playerController().windowClick(windowId, inInventory, inHotbar, ClickType.SWAP, ctx.player()); + } + + private int firstValidThrowaway() { // TODO offhand idk + NonNullList invy = ctx.player().inventory.mainInventory; + for (int i = 0; i < invy.size(); i++) { + if (Baritone.settings().acceptableThrowawayItems.get().contains(invy.get(i).getItem())) { + return i; + } + } + return -1; + } + + private int bestToolAgainst(Block against, Class klass) { + NonNullList invy = ctx.player().inventory.mainInventory; + int bestInd = -1; + double bestSpeed = -1; + for (int i = 0; i < invy.size(); i++) { + ItemStack stack = invy.get(i); + if (stack.isEmpty()) { + continue; + } + if (klass.isInstance(stack.getItem())) { + double speed = ToolSet.calculateStrVsBlock(stack, against.getDefaultState()); // takes into account enchants + if (speed > bestSpeed) { + bestSpeed = speed; + bestInd = i; + } + } + } + return bestInd; + } +} diff --git a/src/main/java/baritone/utils/ToolSet.java b/src/main/java/baritone/utils/ToolSet.java index 026ec199..880517a0 100644 --- a/src/main/java/baritone/utils/ToolSet.java +++ b/src/main/java/baritone/utils/ToolSet.java @@ -138,7 +138,7 @@ public class ToolSet { * @param state the blockstate to be mined * @return how long it would take in ticks */ - private double calculateStrVsBlock(ItemStack item, IBlockState state) { + public static double calculateStrVsBlock(ItemStack item, IBlockState state) { float hardness = state.getBlockHardness(null, null); if (hardness < 0) { return -1;