From 56975c0e0f5c08e0a0eb676616de5d3683b0c149 Mon Sep 17 00:00:00 2001 From: Howard Stark Date: Wed, 22 Aug 2018 10:03:02 -0700 Subject: [PATCH] Add beginning of surface block caching --- .../java/baritone/bot/chunk/CachedChunk.java | 8 ++++++- .../java/baritone/bot/chunk/CachedRegion.java | 12 ++++++---- .../java/baritone/bot/chunk/CachedWorld.java | 7 +++--- .../java/baritone/bot/chunk/ChunkPacker.java | 23 +++++++++++++++++++ 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/main/java/baritone/bot/chunk/CachedChunk.java b/src/main/java/baritone/bot/chunk/CachedChunk.java index 8316345fb..e9f98873c 100644 --- a/src/main/java/baritone/bot/chunk/CachedChunk.java +++ b/src/main/java/baritone/bot/chunk/CachedChunk.java @@ -57,12 +57,18 @@ public final class CachedChunk implements IBlockTypeAccess { */ private final BitSet data; - CachedChunk(int x, int z, BitSet data) { + /** + * The block names of each surface level block for generating an overview + */ + private final String[] overview; + + CachedChunk(int x, int z, BitSet data, String[] overview) { validateSize(data); this.x = x; this.z = z; this.data = data; + this.overview = overview; } @Override diff --git a/src/main/java/baritone/bot/chunk/CachedRegion.java b/src/main/java/baritone/bot/chunk/CachedRegion.java index 8f2dfc9bb..2c220e852 100644 --- a/src/main/java/baritone/bot/chunk/CachedRegion.java +++ b/src/main/java/baritone/bot/chunk/CachedRegion.java @@ -77,12 +77,12 @@ public final class CachedRegion implements IBlockTypeAccess { return null; } - final void updateCachedChunk(int chunkX, int chunkZ, BitSet data) { + final void updateCachedChunk(int chunkX, int chunkZ, BitSet chunkData, String[] chunkOverview) { CachedChunk chunk = this.getChunk(chunkX, chunkZ); if (chunk == null) { - this.chunks[chunkX][chunkZ] = new CachedChunk(chunkX, chunkZ, data); + this.chunks[chunkX][chunkZ] = new CachedChunk(chunkX, chunkZ, chunkData, chunkOverview); } else { - chunk.updateContents(data); + chunk.updateContents(chunkData); } hasUnsavedChanges = true; } @@ -176,7 +176,11 @@ public final class CachedRegion implements IBlockTypeAccess { byte[] bytes = new byte[CachedChunk.SIZE_IN_BYTES]; in.readFully(bytes); BitSet bits = BitSet.valueOf(bytes); - updateCachedChunk(x, z, bits); + String[] overview = new String[256]; + for(int i = 0; i < 256; i++) { + overview[i] = in.readUTF(); + } + updateCachedChunk(x, z, bits, overview); break; case CHUNK_NOT_PRESENT: this.chunks[x][z] = null; diff --git a/src/main/java/baritone/bot/chunk/CachedWorld.java b/src/main/java/baritone/bot/chunk/CachedWorld.java index d3900f6fd..670cd38cb 100644 --- a/src/main/java/baritone/bot/chunk/CachedWorld.java +++ b/src/main/java/baritone/bot/chunk/CachedWorld.java @@ -73,7 +73,7 @@ public final class CachedWorld implements IBlockTypeAccess { private void updateCachedChunk(int chunkX, int chunkZ, BitSet data) { CachedRegion region = getOrCreateRegion(chunkX >> 5, chunkZ >> 5); - region.updateCachedChunk(chunkX & 31, chunkZ & 31, data); + region.updateCachedChunk(chunkX & 31, chunkZ & 31, data, ); } public final void save() { @@ -155,8 +155,9 @@ public final class CachedWorld implements IBlockTypeAccess { } try { Chunk chunk = queue.take(); - BitSet packed = ChunkPacker.createPackedChunk(chunk); - CachedWorld.this.updateCachedChunk(chunk.x, chunk.z, packed); + BitSet packedChunk = ChunkPacker.createPackedChunk(chunk); + String[] packedOverview = ChunkPacker.createPackedOverview(chunk); + CachedWorld.this.updateCachedChunk(chunk.x, chunk.z, packedChunk); //System.out.println("Processed chunk at " + chunk.x + "," + chunk.z); } catch (InterruptedException e) { e.printStackTrace(); diff --git a/src/main/java/baritone/bot/chunk/ChunkPacker.java b/src/main/java/baritone/bot/chunk/ChunkPacker.java index de8f3179e..d2fd5d6ed 100644 --- a/src/main/java/baritone/bot/chunk/ChunkPacker.java +++ b/src/main/java/baritone/bot/chunk/ChunkPacker.java @@ -20,11 +20,14 @@ package baritone.bot.chunk; import baritone.bot.pathing.movement.MovementHelper; import baritone.bot.utils.BlockStateInterface; import baritone.bot.utils.Helper; +import baritone.bot.utils.pathing.BetterBlockPos; import baritone.bot.utils.pathing.PathingBlockType; import net.minecraft.block.Block; import net.minecraft.block.BlockAir; import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Blocks; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.MutableBlockPos; import net.minecraft.world.chunk.Chunk; import java.util.BitSet; @@ -59,6 +62,26 @@ public final class ChunkPacker implements Helper { return bitSet; } + public static String[] createPackedOverview(Chunk chunk) { + long start = System.currentTimeMillis(); + String[] blockNames = new String[256]; + for(int z = 0; z < 16; z++) { + for(int x = 0; x < 16; x++) { + int height = chunk.getHeightValue(x, z); + IBlockState blockState = chunk.getBlockState(x, height, z); + for(int y = height; y > 0; y--) { + blockState = chunk.getBlockState(x, y, z); + if(blockState.getBlock() != Blocks.AIR) { + break; + } + } + blockNames[z << 4 | x] = blockState.getBlock().getLocalizedName(); + } + } + long end = System.currentTimeMillis(); + return blockNames; + } + private static PathingBlockType getPathingBlockType(BlockPos pos, IBlockState state) { Block block = state.getBlock();