From 96a64b454ed62dab970afbe75e31f695ecd3b8a1 Mon Sep 17 00:00:00 2001 From: Babbaj Date: Sun, 9 Jul 2023 22:29:31 -0400 Subject: [PATCH] optimize uploading chunk data --- build.gradle | 4 +- .../elytra/NetherPathfinderContext.java | 60 ++++++++++++++++++- 2 files changed, 59 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 686f2bfbc..da0e2232b 100755 --- a/build.gradle +++ b/build.gradle @@ -175,9 +175,9 @@ dependencies { transitive = false } launchAnnotationProcessor 'org.spongepowered:mixin:0.8.4-SNAPSHOT:processor' - launchImplementation('dev.babbaj:nether-pathfinder:0.22') + launchImplementation('dev.babbaj:nether-pathfinder:0.24') + implementation 'dev.babbaj:nether-pathfinder:0.24' testImplementation 'junit:junit:4.12' - implementation 'dev.babbaj:nether-pathfinder:0.22' } mixin { diff --git a/src/main/java/baritone/behavior/elytra/NetherPathfinderContext.java b/src/main/java/baritone/behavior/elytra/NetherPathfinderContext.java index 3fd7987e5..ed179b5b4 100644 --- a/src/main/java/baritone/behavior/elytra/NetherPathfinderContext.java +++ b/src/main/java/baritone/behavior/elytra/NetherPathfinderContext.java @@ -17,10 +17,14 @@ package baritone.behavior.elytra; +import baritone.utils.accessor.IBitArray; +import baritone.utils.accessor.IBlockStateContainer; import dev.babbaj.pathfinder.NetherPathfinder; +import dev.babbaj.pathfinder.Octree; import dev.babbaj.pathfinder.PathSegment; -import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Blocks; +import net.minecraft.util.BitArray; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.chunk.BlockStateContainer; @@ -55,7 +59,8 @@ public final class NetherPathfinderContext { // and prune the oldest chunks per chunkPackerQueueMaxSize final Chunk chunk = ref.get(); if (chunk != null) { - NetherPathfinder.insertChunkData(this.context, chunk.x, chunk.z, pack(chunk)); + long ptr = NetherPathfinder.getOrCreateChunk(this.context, chunk.x, chunk.z); + writeChunkData(chunk, ptr); } }); } @@ -144,6 +149,8 @@ public final class NetherPathfinderContext { return this.seed; } + private static final IBlockState AIR_BLOCK_STATE = Blocks.AIR.getDefaultState(); + private static boolean[] pack(Chunk chunk) { try { boolean[] packed = new boolean[16 * 16 * 128]; @@ -160,7 +167,7 @@ public final class NetherPathfinderContext { for (int z = 0; z < 16; z++) { for (int x = 0; x < 16; x++) { IBlockState state = bsc.get(x, y1, z); - packed[x | (z << 4) | (y << 8)] = state.getMaterial() != Material.AIR; + packed[x | (z << 4) | (y << 8)] = state != AIR_BLOCK_STATE; } } } @@ -172,6 +179,53 @@ public final class NetherPathfinderContext { } } + private static void writeChunkData(Chunk chunk, long ptr) { + try { + ExtendedBlockStorage[] chunkInternalStorageArray = chunk.getBlockStorageArray(); + for (int y0 = 0; y0 < 8; y0++) { + final ExtendedBlockStorage extendedblockstorage = chunkInternalStorageArray[y0]; + if (extendedblockstorage == null) { + continue; + } + final BlockStateContainer bsc = extendedblockstorage.getData(); + final int airId = ((IBlockStateContainer) bsc).getPalette().idFor(AIR_BLOCK_STATE); + // pasted from FasterWorldScanner + final BitArray array = ((IBlockStateContainer) bsc).getStorage(); + if (array == null) continue; + final long[] longArray = array.getBackingLongArray(); + final int arraySize = array.size(); + final int bitsPerEntry = ((IBitArray) array).getBitsPerEntry(); + final long maxEntryValue = ((IBitArray) array).getMaxEntryValue(); + + final int yReal = y0 << 4; + for (int idx = 0, kl = bitsPerEntry - 1; idx < arraySize; idx++, kl += bitsPerEntry) { + final int i = idx * bitsPerEntry; + final int j = i >> 6; + final int l = i & 63; + final int k = kl >> 6; + final long jl = longArray[j] >>> l; + + final int id; + if (j == k) { + id = (int) (jl & maxEntryValue); + } else { + id = (int) ((jl | longArray[k] << (64 - l)) & maxEntryValue); + } + Octree.setBlock(ptr, + ((idx & 255) & 15), + yReal + (idx >> 8), + ((idx & 255) >> 4), + id != airId + ); + } + } + Octree.setIsFromJava(ptr); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + public static final class Visibility { public static final int ALL = 0;