From 7b87ab65480cd9360a43fd91fa68e6d3f971a1a2 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 22 Dec 2013 10:41:48 +1100 Subject: [PATCH] Add the getCubes patch back. Turns out the user with lockups had 23k+ entities in a single chunk. --- .../0082-More-Efficient-GetCubes.patch | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 CraftBukkit-Patches/0082-More-Efficient-GetCubes.patch diff --git a/CraftBukkit-Patches/0082-More-Efficient-GetCubes.patch b/CraftBukkit-Patches/0082-More-Efficient-GetCubes.patch new file mode 100644 index 0000000000..f494aba7ed --- /dev/null +++ b/CraftBukkit-Patches/0082-More-Efficient-GetCubes.patch @@ -0,0 +1,68 @@ +From fbf76761d5c951b22f128a1555dcd7d0eece12a7 Mon Sep 17 00:00:00 2001 +From: md_5 +Date: Tue, 11 Jun 2013 12:17:37 +1000 +Subject: [PATCH] More Efficient GetCubes + + +diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java +index 1aca7f6..04f5ed1 100644 +--- a/src/main/java/net/minecraft/server/World.java ++++ b/src/main/java/net/minecraft/server/World.java +@@ -1063,23 +1063,42 @@ public abstract class World implements IBlockAccess { + int i1 = MathHelper.floor(axisalignedbb.c); + int j1 = MathHelper.floor(axisalignedbb.f + 1.0D); + +- for (int k1 = i; k1 < j; ++k1) { +- for (int l1 = i1; l1 < j1; ++l1) { +- if (this.isLoaded(k1, 64, l1)) { +- for (int i2 = k - 1; i2 < l; ++i2) { +- Block block; +- +- if (k1 >= -30000000 && k1 < 30000000 && l1 >= -30000000 && l1 < 30000000) { +- block = this.getType(k1, i2, l1); +- } else { +- block = Blocks.STONE; ++ // Spigot start ++ int ystart = ( ( k - 1 ) < 0 ) ? 0 : ( k - 1 ); ++ for ( int chunkx = ( i >> 4 ); chunkx <= ( ( j - 1 ) >> 4 ); chunkx++ ) ++ { ++ int cx = chunkx << 4; ++ for ( int chunkz = ( i1 >> 4 ); chunkz <= ( ( j1 - 1 ) >> 4 ); chunkz++ ) ++ { ++ if ( !this.isChunkLoaded( chunkx, chunkz ) ) ++ { ++ continue; ++ } ++ int cz = chunkz << 4; ++ Chunk chunk = this.getChunkAt( chunkx, chunkz ); ++ // Compute ranges within chunk ++ int xstart = ( i < cx ) ? cx : i; ++ int xend = ( j < ( cx + 16 ) ) ? j : ( cx + 16 ); ++ int zstart = ( i1 < cz ) ? cz : i1; ++ int zend = ( j1 < ( cz + 16 ) ) ? j1 : ( cz + 16 ); ++ // Loop through blocks within chunk ++ for ( int x = xstart; x < xend; x++ ) ++ { ++ for ( int z = zstart; z < zend; z++ ) ++ { ++ for ( int y = ystart; y < l; y++ ) ++ { ++ Block block = chunk.getType(x - cx, y, z - cz ); ++ if ( block != null ) ++ { ++ block.a( this, x, y, z, axisalignedbb, this.M, entity ); ++ } + } +- +- block.a(this, k1, i2, l1, axisalignedbb, this.M, entity); + } + } + } + } ++ // Spigot end + + double d0 = 0.25D; + List list = this.getEntities(entity, axisalignedbb.grow(d0, d0, d0)); +-- +1.8.3.2 +