From 0236cb35d9a792816e5fd55ef2b80b2cf6134530 Mon Sep 17 00:00:00 2001 From: Leijurv Date: Mon, 3 Dec 2018 14:49:16 -0800 Subject: [PATCH] overhaul memory --- src/api/java/baritone/api/IBaritone.java | 7 - .../IContainerMemory.java} | 5 +- .../IRememberedInventory.java | 2 +- .../java/baritone/api/cache/IWorldData.java | 6 + src/main/java/baritone/Baritone.java | 5 - .../baritone/behavior/MemoryBehavior.java | 131 ++++++------------ .../java/baritone/cache/ContainerMemory.java | 106 ++++++++++++++ src/main/java/baritone/cache/WorldData.java | 8 ++ 8 files changed, 169 insertions(+), 101 deletions(-) rename src/api/java/baritone/api/{behavior/IMemoryBehavior.java => cache/IContainerMemory.java} (90%) rename src/api/java/baritone/api/{behavior/memory => cache}/IRememberedInventory.java (96%) create mode 100644 src/main/java/baritone/cache/ContainerMemory.java diff --git a/src/api/java/baritone/api/IBaritone.java b/src/api/java/baritone/api/IBaritone.java index 5ca54a25b..bbff9f9bf 100644 --- a/src/api/java/baritone/api/IBaritone.java +++ b/src/api/java/baritone/api/IBaritone.java @@ -18,7 +18,6 @@ package baritone.api; import baritone.api.behavior.ILookBehavior; -import baritone.api.behavior.IMemoryBehavior; import baritone.api.behavior.IPathingBehavior; import baritone.api.cache.IWorldProvider; import baritone.api.event.listener.IEventBus; @@ -47,12 +46,6 @@ public interface IBaritone { */ ILookBehavior getLookBehavior(); - /** - * @return The {@link IMemoryBehavior} instance - * @see IMemoryBehavior - */ - IMemoryBehavior getMemoryBehavior(); - /** * @return The {@link IMineProcess} instance * @see IMineProcess diff --git a/src/api/java/baritone/api/behavior/IMemoryBehavior.java b/src/api/java/baritone/api/cache/IContainerMemory.java similarity index 90% rename from src/api/java/baritone/api/behavior/IMemoryBehavior.java rename to src/api/java/baritone/api/cache/IContainerMemory.java index 6b6df1ddd..5c19d43b9 100644 --- a/src/api/java/baritone/api/behavior/IMemoryBehavior.java +++ b/src/api/java/baritone/api/cache/IContainerMemory.java @@ -15,9 +15,8 @@ * along with Baritone. If not, see . */ -package baritone.api.behavior; +package baritone.api.cache; -import baritone.api.behavior.memory.IRememberedInventory; import net.minecraft.util.math.BlockPos; import java.util.Map; @@ -26,7 +25,7 @@ import java.util.Map; * @author Brady * @since 9/23/2018 */ -public interface IMemoryBehavior extends IBehavior { +public interface IContainerMemory { /** * Gets a remembered inventory by its block position. diff --git a/src/api/java/baritone/api/behavior/memory/IRememberedInventory.java b/src/api/java/baritone/api/cache/IRememberedInventory.java similarity index 96% rename from src/api/java/baritone/api/behavior/memory/IRememberedInventory.java rename to src/api/java/baritone/api/cache/IRememberedInventory.java index c57ded918..a7890fe3a 100644 --- a/src/api/java/baritone/api/behavior/memory/IRememberedInventory.java +++ b/src/api/java/baritone/api/cache/IRememberedInventory.java @@ -15,7 +15,7 @@ * along with Baritone. If not, see . */ -package baritone.api.behavior.memory; +package baritone.api.cache; import net.minecraft.item.ItemStack; diff --git a/src/api/java/baritone/api/cache/IWorldData.java b/src/api/java/baritone/api/cache/IWorldData.java index 1031ba929..3543dd397 100644 --- a/src/api/java/baritone/api/cache/IWorldData.java +++ b/src/api/java/baritone/api/cache/IWorldData.java @@ -36,4 +36,10 @@ public interface IWorldData { * @return The waypoint collection for this world */ IWaypointCollection getWaypoints(); + + /** + * @return The {@link IContainerMemory} instance + * @see IContainerMemory + */ + IContainerMemory getContainerMemory(); } diff --git a/src/main/java/baritone/Baritone.java b/src/main/java/baritone/Baritone.java index 42403e844..3f7748423 100755 --- a/src/main/java/baritone/Baritone.java +++ b/src/main/java/baritone/Baritone.java @@ -174,11 +174,6 @@ public class Baritone implements IBaritone { return this.lookBehavior; } - @Override - public MemoryBehavior getMemoryBehavior() { - return this.memoryBehavior; - } - @Override public MineProcess getMineProcess() { return this.mineProcess; diff --git a/src/main/java/baritone/behavior/MemoryBehavior.java b/src/main/java/baritone/behavior/MemoryBehavior.java index 845073676..d084eedce 100644 --- a/src/main/java/baritone/behavior/MemoryBehavior.java +++ b/src/main/java/baritone/behavior/MemoryBehavior.java @@ -18,17 +18,17 @@ package baritone.behavior; import baritone.Baritone; -import baritone.api.behavior.IMemoryBehavior; -import baritone.api.behavior.memory.IRememberedInventory; -import baritone.api.cache.IWorldData; import baritone.api.event.events.BlockInteractEvent; import baritone.api.event.events.PacketEvent; import baritone.api.event.events.PlayerUpdateEvent; import baritone.api.event.events.type.EventState; +import baritone.cache.ContainerMemory; import baritone.cache.Waypoint; +import baritone.pathing.movement.CalculationContext; import baritone.utils.BlockStateInterface; +import net.minecraft.block.Block; import net.minecraft.block.BlockBed; -import net.minecraft.item.ItemStack; +import net.minecraft.init.Blocks; import net.minecraft.network.Packet; import net.minecraft.network.play.client.CPacketCloseWindow; import net.minecraft.network.play.client.CPacketPlayerTryUseItemOnBlock; @@ -36,17 +36,19 @@ import net.minecraft.network.play.server.SPacketCloseWindow; import net.minecraft.network.play.server.SPacketOpenWindow; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityLockable; +import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; -import java.util.*; +import java.util.ArrayList; +import java.util.List; /** * @author Brady * @since 8/6/2018 */ -public final class MemoryBehavior extends Behavior implements IMemoryBehavior { +public final class MemoryBehavior extends Behavior { - private final Map worldDataContainers = new HashMap<>(); + private final List futureInventories = new ArrayList<>(); // this is per-bot public MemoryBehavior(Baritone baritone) { super(baritone); @@ -68,14 +70,27 @@ public final class MemoryBehavior extends Behavior implements IMemoryBehavior { CPacketPlayerTryUseItemOnBlock packet = event.cast(); TileEntity tileEntity = ctx.world().getTileEntity(packet.getPos()); + if (tileEntity != null) { + System.out.println(tileEntity.getPos() + " " + packet.getPos()); + System.out.println(tileEntity); + } // Ensure the TileEntity is a container of some sort if (tileEntity instanceof TileEntityLockable) { TileEntityLockable lockable = (TileEntityLockable) tileEntity; int size = lockable.getSizeInventory(); + BlockPos position = tileEntity.getPos(); + BlockPos adj = neighboringConnectedBlock(position); + System.out.println(position + " " + adj); + if (adj != null) { + size *= 2; // double chest or double trapped chest + if (adj.getX() < position.getX() || adj.getZ() < position.getZ()) { + position = adj; // standardize on the lower coordinate, regardless of which side of the large chest we right clicked + } + } - this.getCurrentContainer().futureInventories.add(new FutureInventory(System.nanoTime() / 1000000L, size, lockable.getGuiID(), tileEntity.getPos())); + this.futureInventories.add(new FutureInventory(System.nanoTime() / 1000000L, size, lockable.getGuiID(), position)); } } @@ -92,22 +107,19 @@ public final class MemoryBehavior extends Behavior implements IMemoryBehavior { if (event.getState() == EventState.PRE) { if (p instanceof SPacketOpenWindow) { SPacketOpenWindow packet = event.cast(); - - WorldDataContainer container = this.getCurrentContainer(); - // Remove any entries that were created over a second ago, this should make up for INSANE latency - container.futureInventories.removeIf(i -> System.nanoTime() / 1000000L - i.time > 1000); + futureInventories.removeIf(i -> System.nanoTime() / 1000000L - i.time > 1000); - container.futureInventories.stream() + System.out.println("Received packet " + packet.getGuiId() + " " + packet.getEntityId() + " " + packet.getSlotCount() + " " + packet.getWindowId()); + + futureInventories.stream() .filter(i -> i.type.equals(packet.getGuiId()) && i.slots == packet.getSlotCount()) .findFirst().ifPresent(matched -> { // Remove the future inventory - container.futureInventories.remove(matched); + futureInventories.remove(matched); // Setup the remembered inventory - RememberedInventory inventory = container.rememberedInventories.computeIfAbsent(matched.pos, pos -> new RememberedInventory()); - inventory.windowId = packet.getWindowId(); - inventory.size = packet.getSlotCount(); + getCurrentContainer().setup(matched.pos, packet.getWindowId(), packet.getSlotCount()); }); } @@ -129,43 +141,28 @@ public final class MemoryBehavior extends Behavior implements IMemoryBehavior { baritone.getWorldProvider().getCurrentWorld().getWaypoints().addWaypoint(new Waypoint("death", Waypoint.Tag.DEATH, ctx.playerFeet())); } - private Optional getInventoryFromWindow(int windowId) { - return this.getCurrentContainer().rememberedInventories.values().stream().filter(i -> i.windowId == windowId).findFirst(); - } private void updateInventory() { - getInventoryFromWindow(ctx.player().openContainer.windowId).ifPresent(inventory -> { - inventory.items.clear(); - inventory.items.addAll(ctx.player().openContainer.getInventory().subList(0, inventory.size)); - }); + getCurrentContainer().getInventoryFromWindow(ctx.player().openContainer.windowId).ifPresent(inventory -> inventory.updateFromOpenWindow(ctx)); } - private WorldDataContainer getCurrentContainer() { - return this.worldDataContainers.computeIfAbsent(baritone.getWorldProvider().getCurrentWorld(), data -> new WorldDataContainer()); + private ContainerMemory getCurrentContainer() { + return (ContainerMemory) baritone.getWorldProvider().getCurrentWorld().getContainerMemory(); } - @Override - public final synchronized RememberedInventory getInventoryByPos(BlockPos pos) { - return this.getCurrentContainer().rememberedInventories.get(pos); - } - - @Override - public final synchronized Map getRememberedInventories() { - // make a copy since this map is modified from the packet thread - return new HashMap<>(this.getCurrentContainer().rememberedInventories); - } - - private static final class WorldDataContainer { - - /** - * Possible future inventories that we will be able to remember - */ - private final List futureInventories = new ArrayList<>(); - - /** - * The current remembered inventories - */ - private final Map rememberedInventories = new HashMap<>(); + private BlockPos neighboringConnectedBlock(BlockPos in) { + BlockStateInterface bsi = new CalculationContext(baritone).bsi(); + Block block = bsi.get0(in).getBlock(); + if (block != Blocks.TRAPPED_CHEST && block != Blocks.CHEST) { + return null; // other things that have contents, but can be placed adjacent without combining + } + for (int i = 0; i < 4; i++) { + BlockPos adj = in.offset(EnumFacing.byHorizontalIndex(i)); + if (bsi.get0(adj).getBlock() == block) { + return adj; + } + } + return null; } /** @@ -198,43 +195,7 @@ public final class MemoryBehavior extends Behavior implements IMemoryBehavior { this.slots = slots; this.type = type; this.pos = pos; - } - } - - /** - * An inventory that we are aware of. - *

- * Associated with a {@link BlockPos} in {@link WorldDataContainer#rememberedInventories}. - */ - public static class RememberedInventory implements IRememberedInventory { - - /** - * The list of items in the inventory - */ - private final List items; - - /** - * The last known window ID of the inventory - */ - private int windowId; - - /** - * The size of the inventory - */ - private int size; - - private RememberedInventory() { - this.items = new ArrayList<>(); - } - - @Override - public final List getContents() { - return Collections.unmodifiableList(this.items); - } - - @Override - public final int getSize() { - return this.size; + System.out.println("Future inventory created " + time + " " + slots + " " + type + " " + pos); } } } diff --git a/src/main/java/baritone/cache/ContainerMemory.java b/src/main/java/baritone/cache/ContainerMemory.java new file mode 100644 index 000000000..30f2480b5 --- /dev/null +++ b/src/main/java/baritone/cache/ContainerMemory.java @@ -0,0 +1,106 @@ +/* + * 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.cache; + +import baritone.api.cache.IContainerMemory; +import baritone.api.cache.IRememberedInventory; +import baritone.api.utils.IPlayerContext; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; + +import java.nio.file.Path; +import java.util.*; + +public class ContainerMemory implements IContainerMemory { + public ContainerMemory(Path saveTo) { + // eventually + } + + /** + * The current remembered inventories + */ + private final Map inventories = new HashMap<>(); + + public synchronized void setup(BlockPos pos, int windowId, int slotCount) { + RememberedInventory inventory = inventories.computeIfAbsent(pos, x -> new RememberedInventory()); + inventory.windowId = windowId; + inventory.size = slotCount; + } + + public synchronized Optional getInventoryFromWindow(int windowId) { + return inventories.values().stream().filter(i -> i.windowId == windowId).findFirst(); + } + + @Override + public final synchronized RememberedInventory getInventoryByPos(BlockPos pos) { + return inventories.get(pos); + } + + @Override + public final synchronized Map getRememberedInventories() { + // make a copy since this map is modified from the packet thread + return new HashMap<>(inventories); + } + + /** + * An inventory that we are aware of. + *

+ * Associated with a {@link BlockPos} in {@link WorldDataContainer#rememberedInventories}. + */ + public static class RememberedInventory implements IRememberedInventory { + + /** + * The list of items in the inventory + */ + private final List items; + + /** + * The last known window ID of the inventory + */ + private int windowId; + + /** + * The size of the inventory + */ + private int size; + + private RememberedInventory() { + this.items = new ArrayList<>(); + } + + @Override + public final List getContents() { + return Collections.unmodifiableList(this.items); + } + + @Override + public final int getSize() { + return this.size; + } + + public int getWindowId() { + return this.windowId; + } + + public void updateFromOpenWindow(IPlayerContext ctx) { + items.clear(); + items.addAll(ctx.player().openContainer.getInventory().subList(0, size)); + System.out.println("Saved " + items); + } + } +} diff --git a/src/main/java/baritone/cache/WorldData.java b/src/main/java/baritone/cache/WorldData.java index 897a0d87c..84fd6ff1a 100644 --- a/src/main/java/baritone/cache/WorldData.java +++ b/src/main/java/baritone/cache/WorldData.java @@ -19,6 +19,7 @@ package baritone.cache; import baritone.Baritone; import baritone.api.cache.ICachedWorld; +import baritone.api.cache.IContainerMemory; import baritone.api.cache.IWaypointCollection; import baritone.api.cache.IWorldData; @@ -33,6 +34,7 @@ public class WorldData implements IWorldData { public final CachedWorld cache; private final Waypoints waypoints; + private final ContainerMemory containerMemory; //public final MapData map; public final Path directory; public final int dimension; @@ -41,6 +43,7 @@ public class WorldData implements IWorldData { this.directory = directory; this.cache = new CachedWorld(directory.resolve("cache"), dimension); this.waypoints = new Waypoints(directory.resolve("waypoints")); + this.containerMemory = new ContainerMemory(directory.resolve("containers")); this.dimension = dimension; } @@ -60,4 +63,9 @@ public class WorldData implements IWorldData { public IWaypointCollection getWaypoints() { return this.waypoints; } + + @Override + public IContainerMemory getContainerMemory() { + return this.containerMemory; + } }