summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTravis Watkins <amaranth@ubuntu.com>2013-04-11 18:08:44 -0500
committerWesley Wolfe <weswolf@aol.com>2013-04-13 00:30:16 -0500
commitce5b97ea831816056d759ef707b6f53f396b16c7 (patch)
tree39cde6a9ce3a320c5cb8255becb04931cd1973c7 /src
parent70a778f475aae04cdd8eaa73359f1099b85f86d2 (diff)
downloadcraftbukkit-ce5b97ea831816056d759ef707b6f53f396b16c7.tar
craftbukkit-ce5b97ea831816056d759ef707b6f53f396b16c7.tar.gz
craftbukkit-ce5b97ea831816056d759ef707b6f53f396b16c7.tar.lz
craftbukkit-ce5b97ea831816056d759ef707b6f53f396b16c7.tar.xz
craftbukkit-ce5b97ea831816056d759ef707b6f53f396b16c7.zip
Fetch tile entities from chunks instead of world. Fixes BUKKIT-4055
When looking up tile entities for a chunk to send to a player we currently loop through every tile entity in the world checking if it is within the bounds of the relevant chunk. Instead of doing this we can just use the tile entities list stored in the chunk to avoid this costly searching. As a further optimization, we also modify the generic range-based lookup to use chunks as well. For most lookups this will give a smaller search pool which will result in faster lookups. Thanks to @mikeprimm for the idea and most of the implementation.
Diffstat (limited to 'src')
-rw-r--r--src/main/java/net/minecraft/server/EntityPlayer.java7
-rw-r--r--src/main/java/net/minecraft/server/WorldServer.java21
2 files changed, 19 insertions, 9 deletions
diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
index eb07d8e0..e1589354 100644
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
@@ -173,8 +173,11 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
iterator1.remove();
if (chunkcoordintpair != null && this.world.isLoaded(chunkcoordintpair.x << 4, 0, chunkcoordintpair.z << 4)) {
- arraylist.add(this.world.getChunkAt(chunkcoordintpair.x, chunkcoordintpair.z));
- arraylist1.addAll(((WorldServer) this.world).getTileEntities(chunkcoordintpair.x * 16, 0, chunkcoordintpair.z * 16, chunkcoordintpair.x * 16 + 16, 256, chunkcoordintpair.z * 16 + 16));
+ // CraftBukkit start - Get tile entities directly from the chunk instead of the world
+ Chunk chunk = this.world.getChunkAt(chunkcoordintpair.x, chunkcoordintpair.z);
+ arraylist.add(chunk);
+ arraylist1.addAll(chunk.tileEntities.values());
+ // CraftBukkit end
}
}
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index 13f67da5..6d8495fa 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -643,17 +643,24 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
public List getTileEntities(int i, int j, int k, int l, int i1, int j1) {
ArrayList arraylist = new ArrayList();
- // CraftBukkit start - Use iterator
- Iterator iterator = this.tileEntityList.iterator();
- while (iterator.hasNext()) {
- TileEntity tileentity = (TileEntity) iterator.next();
- // CraftBukkit end
+ // CraftBukkit start - Get tile entities from chunks instead of world
+ for (int chunkX = (i >> 4); chunkX <= ((l - 1) >> 4); chunkX++) {
+ for (int chunkZ = (k >> 4); chunkZ <= ((j1 - 1) >> 4); chunkZ++) {
+ Chunk chunk = getChunkAt(chunkX, chunkZ);
+ if (chunk == null) {
+ continue;
+ }
- if (tileentity.x >= i && tileentity.y >= j && tileentity.z >= k && tileentity.x < l && tileentity.y < i1 && tileentity.z < j1) {
- arraylist.add(tileentity);
+ for (Object te : chunk.tileEntities.values()) {
+ TileEntity tileentity = (TileEntity) te;
+ if ((tileentity.x >= i) && (tileentity.y >= j) && (tileentity.z >= k) && (tileentity.x < l) && (tileentity.y < i1) && (tileentity.z < j1)) {
+ arraylist.add(tileentity);
+ }
+ }
}
}
+ // CraftBukkit end
return arraylist;
}