Add beginning of surface block caching

This commit is contained in:
Howard Stark 2018-08-22 10:03:02 -07:00 committed by Leijurv
parent 45f69a0f33
commit 56975c0e0f
No known key found for this signature in database
GPG Key ID: 44A3EA646EADAC6A
4 changed files with 42 additions and 8 deletions

View File

@ -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

View File

@ -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;

View File

@ -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();

View File

@ -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();