diff --git a/Spigot-Server-Patches/0042-Configurable-async-light-updates.patch b/Spigot-Server-Patches/0042-Configurable-async-light-updates.patch index de7f0c5df..893801e7b 100644 --- a/Spigot-Server-Patches/0042-Configurable-async-light-updates.patch +++ b/Spigot-Server-Patches/0042-Configurable-async-light-updates.patch @@ -1,11 +1,61 @@ -From 95ec45d55c70af957d01dcea841bdf8d9ef02b35 Mon Sep 17 00:00:00 2001 -From: Roman Alexander -Date: Wed, 25 Mar 2015 20:27:13 -0500 +From cc4cc3c5874b1cdd1f1a1e5488d6b729f3b303ec Mon Sep 17 00:00:00 2001 +From: Byteflux +Date: Wed, 1 Jul 2015 00:18:10 -0700 Subject: [PATCH] Configurable async light updates +diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java +index 7242d45..ab4de94 100644 +--- a/src/main/java/net/minecraft/server/Chunk.java ++++ b/src/main/java/net/minecraft/server/Chunk.java +@@ -11,6 +11,8 @@ import java.util.Map; + import java.util.Random; + import java.util.concurrent.Callable; + import java.util.concurrent.ConcurrentLinkedQueue; ++import java.util.concurrent.atomic.AtomicInteger; // PaperSpigot ++ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + +@@ -43,6 +45,10 @@ public class Chunk { + private int v; + private ConcurrentLinkedQueue w; + protected gnu.trove.map.hash.TObjectIntHashMap entityCount = new gnu.trove.map.hash.TObjectIntHashMap(); // Spigot ++ // PaperSpigot start - Asynchronous light updates ++ public AtomicInteger pendingLightUpdates = new AtomicInteger(); ++ public long lightUpdateTime; ++ // PaperSpigot end + + // CraftBukkit start - Neighbor loaded cache for chunk lighting and entity ticking + private int neighbors = 0x1 << 12; +@@ -274,7 +280,7 @@ public class Chunk { + private void a(int i, int j, int k, int l) { + if (l > k && this.world.areChunksLoaded(new BlockPosition(i, 0, j), 16)) { + for (int i1 = k; i1 < l; ++i1) { +- this.world.c(EnumSkyBlock.SKY, new BlockPosition(i, i1, j)); ++ this.world.updateLight(EnumSkyBlock.SKY, new BlockPosition(i, i1, j)); // PaperSpigot - Asynchronous lighting updates + } + + this.q = true; +diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java +index 975d666..ae0f276 100644 +--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java ++++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java +@@ -53,6 +53,12 @@ public class ChunkProviderServer implements IChunkProvider { + } + + public void queueUnload(int i, int j) { ++ // PaperSpigot start - Asynchronous lighting updates ++ Chunk chunk = chunks.get(LongHash.toLong(i, j)); ++ if (chunk != null && chunk.world.paperSpigotConfig.useAsyncLighting && (chunk.pendingLightUpdates.get() > 0 || chunk.world.getTime() - chunk.lightUpdateTime < 20)) { ++ return; ++ } ++ // PaperSpigot end + if (this.world.worldProvider.e()) { + if (!this.world.c(i, j)) { + // CraftBukkit start diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index b681a9f..f507134 100644 +index b681a9f..8ee0cec 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -18,6 +18,12 @@ import org.bukkit.generator.ChunkGenerator; @@ -21,317 +71,117 @@ index b681a9f..f507134 100644 // CraftBukkit start // CraftBukkit end -@@ -714,22 +720,26 @@ public abstract class World implements IBlockAccess { - blockposition = new BlockPosition(blockposition.getX(), 0, blockposition.getZ()); - } +@@ -126,6 +132,7 @@ public abstract class World implements IBlockAccess { + public static boolean haveWeSilencedAPhysicsCrash; + public static String blockLocation; + private int tileTickPosition; ++ private ExecutorService lightingExecutor; // PaperSpigot - Asynchronous lighting updates -+ // PaperSpigot start - configurable async light updates - if (!this.isValidLocation(blockposition)) { - return enumskyblock.c; -- } else if (!this.isLoaded(blockposition)) { -+ } -+ -+ Chunk chunk = this.getChunkIfLoaded(blockposition.getX() >> 4, blockposition.getZ() >> 4); -+ if (chunk == null) { - return enumskyblock.c; - } else { -- Chunk chunk = this.getChunkAtWorldCoords(blockposition); -- -+ // PaperSpigot end - return chunk.getBrightness(enumskyblock, blockposition); - } - } + public static long chunkToKey(int x, int z) + { +@@ -493,7 +500,7 @@ public abstract class World implements IBlockAccess { - public void a(EnumSkyBlock enumskyblock, BlockPosition blockposition, int i) { - if (this.isValidLocation(blockposition)) { -- if (this.isLoaded(blockposition)) { -- Chunk chunk = this.getChunkAtWorldCoords(blockposition); -- -+ // PaperSpigot start - Configurable async light updates -+ Chunk chunk = this.getChunkIfLoaded(blockposition.getX() >> 4, blockposition.getZ() >> 4); -+ if (chunk != null) { -+ // PaperSpigot end - chunk.a(enumskyblock, blockposition, i); - this.n(blockposition); + if (!this.worldProvider.o()) { + for (i1 = k; i1 <= l; ++i1) { +- this.c(EnumSkyBlock.SKY, new BlockPosition(i, i1, j)); ++ this.updateLight(EnumSkyBlock.SKY, new BlockPosition(i, i1, j)); // PaperSpigot - Asynchronous lighting updates } -@@ -2316,10 +2326,13 @@ public abstract class World implements IBlockAccess { + } + +@@ -2308,10 +2315,10 @@ public abstract class World implements IBlockAccess { + boolean flag = false; + + if (!this.worldProvider.o()) { +- flag |= this.c(EnumSkyBlock.SKY, blockposition); ++ flag |= this.updateLight(EnumSkyBlock.SKY, blockposition); // PaperSpigot - Asynchronous lighting updates + } + +- flag |= this.c(EnumSkyBlock.BLOCK, blockposition); ++ flag |= this.updateLight(EnumSkyBlock.BLOCK, blockposition); // PaperSpigot - Asynchronous lighting updates + return flag; } - private int a(BlockPosition blockposition, EnumSkyBlock enumskyblock) { -- if (enumskyblock == EnumSkyBlock.SKY && this.i(blockposition)) { -+ // PaperSpigot start - Configurable async light updates -+ Chunk chunk = this.getChunkIfLoaded(blockposition.getX() >> 4, blockposition.getZ() >> 4); -+ if (chunk == null || (enumskyblock == EnumSkyBlock.SKY && chunk.d(blockposition))) { -+ // PaperSpigot end - return 15; - } else { -- Block block = this.getType(blockposition).getBlock(); -+ Block block = chunk.getType(blockposition); // PaperSpigot - Configurable async light updates - int i = enumskyblock == EnumSkyBlock.SKY ? 0 : block.r(); - int j = block.p(); - -@@ -2358,131 +2371,154 @@ public abstract class World implements IBlockAccess { +@@ -2358,10 +2365,10 @@ public abstract class World implements IBlockAccess { } } - public boolean c(EnumSkyBlock enumskyblock, BlockPosition blockposition) { -- // CraftBukkit start - Use neighbor cache instead of looking up ++ public boolean c(EnumSkyBlock enumskyblock, BlockPosition blockposition, Chunk chunk, List neighbors) { // PaperSpigot + // CraftBukkit start - Use neighbor cache instead of looking up - Chunk chunk = this.getChunkIfLoaded(blockposition.getX() >> 4, blockposition.getZ() >> 4); - if (chunk == null || !chunk.areNeighborsLoaded(1) /*!this.areChunksLoaded(blockposition, 17, false)*/) { -- // CraftBukkit end -- return false; -- } else { -- int i = 0; -- int j = 0; -- -- this.methodProfiler.a("getBrightness"); -- int k = this.b(enumskyblock, blockposition); -- int l = this.a(blockposition, enumskyblock); -- int i1 = blockposition.getX(); -- int j1 = blockposition.getY(); -- int k1 = blockposition.getZ(); -- int l1; -- int i2; -- int j2; -- int k2; -- int l2; -- int i3; -- int j3; -- int k3; -- -- if (l > k) { -- this.H[j++] = 133152; -- } else if (l < k) { -- this.H[j++] = 133152 | k << 18; -- -- while (i < j) { -- l1 = this.H[i++]; -- i2 = (l1 & 63) - 32 + i1; -- j2 = (l1 >> 6 & 63) - 32 + j1; -- k2 = (l1 >> 12 & 63) - 32 + k1; -- int l3 = l1 >> 18 & 15; -- BlockPosition blockposition1 = new BlockPosition(i2, j2, k2); -- -- l2 = this.b(enumskyblock, blockposition1); -- if (l2 == l3) { -- this.a(enumskyblock, blockposition1, 0); -- if (l3 > 0) { -- i3 = MathHelper.a(i2 - i1); -- j3 = MathHelper.a(j2 - j1); -- k3 = MathHelper.a(k2 - k1); -- if (i3 + j3 + k3 < 17) { -- BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition(); -- EnumDirection[] aenumdirection = EnumDirection.values(); -- int i4 = aenumdirection.length; -- -- for (int j4 = 0; j4 < i4; ++j4) { -- EnumDirection enumdirection = aenumdirection[j4]; -- int k4 = i2 + enumdirection.getAdjacentX(); -- int l4 = j2 + enumdirection.getAdjacentY(); -- int i5 = k2 + enumdirection.getAdjacentZ(); -- -- blockposition_mutableblockposition.c(k4, l4, i5); -- int j5 = Math.max(1, this.getType(blockposition_mutableblockposition).getBlock().p()); -- -- l2 = this.b(enumskyblock, (BlockPosition) blockposition_mutableblockposition); -- if (l2 == l3 - j5 && j < this.H.length) { -- this.H[j++] = k4 - i1 + 32 | l4 - j1 + 32 << 6 | i5 - k1 + 32 << 12 | l3 - j5 << 18; -+ // PaperSpigot start - Configurable async light updates -+ private ExecutorService service = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat("PaperSpigot - Lighting Thread").build()); -+ public boolean c(final EnumSkyBlock enumskyblock, final BlockPosition blockposition) { -+ Callable callable = new Callable() { -+ @Override -+ public Boolean call() throws Exception { -+ // CraftBukkit start - Use neighbor cache instead of looking up -+ Chunk chunk = World.this.getChunkIfLoaded(blockposition.getX() >> 4, blockposition.getZ() >> 4); -+ if (chunk == null || !chunk.areNeighborsLoaded(1) /*!this.areChunksLoaded(blockposition, 17, false)*/) { -+ // CraftBukkit end -+ return false; -+ } else { -+ int i = 0; -+ int j = 0; -+ -+ World.this.methodProfiler.a("getBrightness"); -+ int k = World.this.b(enumskyblock, blockposition); -+ int l = World.this.a(blockposition, enumskyblock); -+ int i1 = blockposition.getX(); -+ int j1 = blockposition.getY(); -+ int k1 = blockposition.getZ(); -+ int l1; -+ int i2; -+ int j2; -+ int k2; -+ int l2; -+ int i3; -+ int j3; -+ int k3; -+ -+ if (l > k) { -+ World.this.H[j++] = 133152; -+ } else if (l < k) { -+ World.this.H[j++] = 133152 | k << 18; -+ -+ while (i < j) { -+ l1 = World.this.H[i++]; -+ i2 = (l1 & 63) - 32 + i1; -+ j2 = (l1 >> 6 & 63) - 32 + j1; -+ k2 = (l1 >> 12 & 63) - 32 + k1; -+ int l3 = l1 >> 18 & 15; -+ BlockPosition blockposition1 = new BlockPosition(i2, j2, k2); -+ -+ l2 = World.this.b(enumskyblock, blockposition1); -+ if (l2 == l3) { -+ World.this.a(enumskyblock, blockposition1, 0); -+ if (l3 > 0) { -+ i3 = MathHelper.a(i2 - i1); -+ j3 = MathHelper.a(j2 - j1); -+ k3 = MathHelper.a(k2 - k1); -+ if (i3 + j3 + k3 < 17) { -+ BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition(); -+ EnumDirection[] aenumdirection = EnumDirection.values(); -+ int i4 = aenumdirection.length; -+ -+ for (int j4 = 0; j4 < i4; ++j4) { -+ EnumDirection enumdirection = aenumdirection[j4]; -+ int k4 = i2 + enumdirection.getAdjacentX(); -+ int l4 = j2 + enumdirection.getAdjacentY(); -+ int i5 = k2 + enumdirection.getAdjacentZ(); -+ -+ blockposition_mutableblockposition.c(k4, l4, i5); -+ Chunk lightChunk = World.this.getChunkIfLoaded(blockposition_mutableblockposition.getX() >> 4, blockposition_mutableblockposition.getZ() >> 4); -+ int j5; -+ if (lightChunk != null) { -+ j5 = Math.max(1, lightChunk.getType(blockposition_mutableblockposition).p()); -+ } else { -+ j5 = 255; -+ } -+ -+ l2 = World.this.b(enumskyblock, (BlockPosition) blockposition_mutableblockposition); -+ if (l2 == l3 - j5 && j < World.this.H.length) { -+ World.this.H[j++] = k4 - i1 + 32 | l4 - j1 + 32 << 6 | i5 - k1 + 32 << 12 | l3 - j5 << 18; -+ } -+ } - } - } - } - } -- } -- } - -- i = 0; -- } -+ i = 0; -+ } - -- this.methodProfiler.b(); -- this.methodProfiler.a("checkedPosition < toCheckCount"); -- -- while (i < j) { -- l1 = this.H[i++]; -- i2 = (l1 & 63) - 32 + i1; -- j2 = (l1 >> 6 & 63) - 32 + j1; -- k2 = (l1 >> 12 & 63) - 32 + k1; -- BlockPosition blockposition2 = new BlockPosition(i2, j2, k2); -- int k5 = this.b(enumskyblock, blockposition2); -- -- l2 = this.a(blockposition2, enumskyblock); -- if (l2 != k5) { -- this.a(enumskyblock, blockposition2, l2); -- if (l2 > k5) { -- i3 = Math.abs(i2 - i1); -- j3 = Math.abs(j2 - j1); -- k3 = Math.abs(k2 - k1); -- boolean flag = j < this.H.length - 6; -- -- if (i3 + j3 + k3 < 17 && flag) { -- if (this.b(enumskyblock, blockposition2.west()) < l2) { -- this.H[j++] = i2 - 1 - i1 + 32 + (j2 - j1 + 32 << 6) + (k2 - k1 + 32 << 12); -- } -+ World.this.methodProfiler.b(); -+ World.this.methodProfiler.a("checkedPosition < toCheckCount"); -+ -+ while (i < j) { -+ l1 = World.this.H[i++]; -+ i2 = (l1 & 63) - 32 + i1; -+ j2 = (l1 >> 6 & 63) - 32 + j1; -+ k2 = (l1 >> 12 & 63) - 32 + k1; -+ BlockPosition blockposition2 = new BlockPosition(i2, j2, k2); -+ int k5 = World.this.b(enumskyblock, blockposition2); -+ -+ l2 = World.this.a(blockposition2, enumskyblock); -+ if (l2 != k5) { -+ World.this.a(enumskyblock, blockposition2, l2); -+ if (l2 > k5) { -+ i3 = Math.abs(i2 - i1); -+ j3 = Math.abs(j2 - j1); -+ k3 = Math.abs(k2 - k1); -+ boolean flag = j < World.this.H.length - 6; -+ -+ if (i3 + j3 + k3 < 17 && flag) { -+ if (World.this.b(enumskyblock, blockposition2.west()) < l2) { -+ World.this.H[j++] = i2 - 1 - i1 + 32 + (j2 - j1 + 32 << 6) + (k2 - k1 + 32 << 12); -+ } - -- if (this.b(enumskyblock, blockposition2.east()) < l2) { -- this.H[j++] = i2 + 1 - i1 + 32 + (j2 - j1 + 32 << 6) + (k2 - k1 + 32 << 12); -- } -+ if (World.this.b(enumskyblock, blockposition2.east()) < l2) { -+ World.this.H[j++] = i2 + 1 - i1 + 32 + (j2 - j1 + 32 << 6) + (k2 - k1 + 32 << 12); -+ } - -- if (this.b(enumskyblock, blockposition2.down()) < l2) { -- this.H[j++] = i2 - i1 + 32 + (j2 - 1 - j1 + 32 << 6) + (k2 - k1 + 32 << 12); -- } -+ if (World.this.b(enumskyblock, blockposition2.down()) < l2) { -+ World.this.H[j++] = i2 - i1 + 32 + (j2 - 1 - j1 + 32 << 6) + (k2 - k1 + 32 << 12); -+ } - -- if (this.b(enumskyblock, blockposition2.up()) < l2) { -- this.H[j++] = i2 - i1 + 32 + (j2 + 1 - j1 + 32 << 6) + (k2 - k1 + 32 << 12); -- } -+ if (World.this.b(enumskyblock, blockposition2.up()) < l2) { -+ World.this.H[j++] = i2 - i1 + 32 + (j2 + 1 - j1 + 32 << 6) + (k2 - k1 + 32 << 12); -+ } - -- if (this.b(enumskyblock, blockposition2.north()) < l2) { -- this.H[j++] = i2 - i1 + 32 + (j2 - j1 + 32 << 6) + (k2 - 1 - k1 + 32 << 12); -- } -+ if (World.this.b(enumskyblock, blockposition2.north()) < l2) { -+ World.this.H[j++] = i2 - i1 + 32 + (j2 - j1 + 32 << 6) + (k2 - 1 - k1 + 32 << 12); -+ } - -- if (this.b(enumskyblock, blockposition2.south()) < l2) { -- this.H[j++] = i2 - i1 + 32 + (j2 - j1 + 32 << 6) + (k2 + 1 - k1 + 32 << 12); -+ if (World.this.b(enumskyblock, blockposition2.south()) < l2) { -+ World.this.H[j++] = i2 - i1 + 32 + (j2 - j1 + 32 << 6) + (k2 + 1 - k1 + 32 << 12); -+ } -+ } - } - } - } -+ -+ World.this.methodProfiler.b(); -+ return true; ++ //Chunk chunk = this.getChunkIfLoaded(blockposition.getX() >> 4, blockposition.getZ() >> 4); ++ if (chunk == null /*|| !chunk.areNeighborsLoaded(1)*/ /*!this.areChunksLoaded(blockposition, 17, false)*/) { + // CraftBukkit end + return false; + } else { +@@ -2479,11 +2486,66 @@ public abstract class World implements IBlockAccess { } } -- -- this.methodProfiler.b(); -- return true; -+ }; -+ if (paperSpigotConfig.useAsyncLighting) { -+ service.submit(callable); -+ } else { -+ try { -+ return callable.call(); -+ } catch(Exception ignore) { -+ } - } -+ return true; - } -+ // PaperSpigot end ++ // PaperSpigot start - Asynchronous light updates ++ if (chunk.world.paperSpigotConfig.useAsyncLighting) { ++ chunk.pendingLightUpdates.decrementAndGet(); ++ if (neighbors != null) { ++ for (Chunk neighbor : neighbors) { ++ neighbor.pendingLightUpdates.decrementAndGet(); ++ } ++ } ++ } ++ // PaperSpigot end + this.methodProfiler.b(); + return true; + } + } + ++ /** ++ * PaperSpigot - Asynchronous lighting updates ++ */ ++ public boolean updateLight(final EnumSkyBlock enumskyblock, final BlockPosition position) { ++ int x = position.getX(); ++ int z = position.getZ(); ++ final Chunk chunk = this.getChunkIfLoaded(x >> 4, z >> 4); ++ if (chunk == null || (!chunk.world.paperSpigotConfig.useAsyncLighting && !chunk.areNeighborsLoaded(1))) { ++ return false; ++ } ++ ++ if (!chunk.world.paperSpigotConfig.useAsyncLighting) { ++ return this.c(enumskyblock, position, chunk, null); ++ } ++ ++ if (lightingExecutor == null) { ++ lightingExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat("PaperSpigot - Lighting Thread").build()); ++ } ++ ++ chunk.pendingLightUpdates.incrementAndGet(); ++ chunk.lightUpdateTime = chunk.world.getTime(); ++ ++ final List neighbors = new ArrayList(); ++ for (int cx = (x >> 4) - 1; cx < (x >> 4) + 1; ++cx) { ++ for (int cz = (z >> 4) - 1; cz < (z >> 4) + 1; ++cz) { ++ if (this.chunkProvider.isChunkLoaded(cx, cz)) { ++ Chunk neighbor = this.getChunkAt(cx, cz); ++ if (neighbor != chunk) { ++ neighbor.pendingLightUpdates.incrementAndGet(); ++ neighbor.lightUpdateTime = chunk.world.getTime(); ++ neighbors.add(neighbor); ++ } ++ } ++ } ++ } ++ ++ lightingExecutor.submit(new Runnable() { ++ @Override ++ public void run() { ++ World.this.c(enumskyblock, position, chunk, neighbors); ++ } ++ }); ++ return true; ++ } ++ public boolean a(boolean flag) { return false; + } diff --git a/src/main/java/org/github/paperspigot/PaperSpigotWorldConfig.java b/src/main/java/org/github/paperspigot/PaperSpigotWorldConfig.java index bcd8b65..fa9ae6c 100644 --- a/src/main/java/org/github/paperspigot/PaperSpigotWorldConfig.java diff --git a/Spigot-Server-Patches/0048-Force-load-chunks-for-specific-entities-that-fly-thr.patch b/Spigot-Server-Patches/0048-Force-load-chunks-for-specific-entities-that-fly-thr.patch index f409f87c4..599c9eefd 100644 --- a/Spigot-Server-Patches/0048-Force-load-chunks-for-specific-entities-that-fly-thr.patch +++ b/Spigot-Server-Patches/0048-Force-load-chunks-for-specific-entities-that-fly-thr.patch @@ -1,19 +1,18 @@ -From 5044c22415ac2f084b90a5c0e5cdad1ffa7cec63 Mon Sep 17 00:00:00 2001 +From bd0b3dc6c20a561d4ad962f80153766bcca49032 Mon Sep 17 00:00:00 2001 From: Byteflux Date: Tue, 30 Jun 2015 20:45:24 -0700 Subject: [PATCH] Force load chunks for specific entities that fly through diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java -index 975d666..f2e13ad 100644 +index ae0f276..0e6a37f 100644 --- a/src/main/java/net/minecraft/server/ChunkProviderServer.java +++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java -@@ -53,6 +53,18 @@ public class ChunkProviderServer implements IChunkProvider { - } - - public void queueUnload(int i, int j) { +@@ -59,6 +59,17 @@ public class ChunkProviderServer implements IChunkProvider { + return; + } + // PaperSpigot end + // PaperSpigot start - Don't unload chunk if it contains an entity that loads chunks -+ Chunk chunk = chunks.get(LongHash.toLong(i, j)); + if (chunk != null) { + for (List entities : chunk.entitySlices) { + for (Entity entity : entities) { @@ -138,10 +137,10 @@ index 1daba4e..3e16472 100644 protected void b(NBTTagCompound nbttagcompound) { diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index f507134..a7b5062 100644 +index 8ee0cec..6712fbf 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java -@@ -1634,6 +1634,7 @@ public abstract class World implements IBlockAccess { +@@ -1631,6 +1631,7 @@ public abstract class World implements IBlockAccess { int i1 = MathHelper.floor(entity.locZ / 16.0D); if (!entity.ad || entity.ae != k || entity.af != l || entity.ag != i1) { diff --git a/Spigot-Server-Patches/0049-Teleport-passenger-vehicle-with-player.patch b/Spigot-Server-Patches/0049-Teleport-passenger-vehicle-with-player.patch index 24bb83a9b..f1160e990 100644 --- a/Spigot-Server-Patches/0049-Teleport-passenger-vehicle-with-player.patch +++ b/Spigot-Server-Patches/0049-Teleport-passenger-vehicle-with-player.patch @@ -1,11 +1,11 @@ -From 92fdbc3acf9242e72da544a63dcd1b7efb93f6ff Mon Sep 17 00:00:00 2001 +From f5631af64117c643683738ea863b7ccadd89313c Mon Sep 17 00:00:00 2001 From: Aikar Date: Sun, 31 May 2015 01:44:02 -0500 Subject: [PATCH] Teleport passenger/vehicle with player diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 2611007..16dbc20 100644 +index f76c67d..70ac612 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -41,6 +41,15 @@ public abstract class Entity implements ICommandListener { @@ -24,7 +24,7 @@ index 2611007..16dbc20 100644 private static final AxisAlignedBB a = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D); private static int entityCount; private int id; -@@ -1953,7 +1962,7 @@ public abstract class Entity implements ICommandListener { +@@ -1966,7 +1975,7 @@ public abstract class Entity implements ICommandListener { // minecraftserver.getPlayerList().changeWorld(this, j, worldserver, worldserver1); boolean before = worldserver1.chunkProviderServer.forceChunkLoad; worldserver1.chunkProviderServer.forceChunkLoad = true; @@ -33,7 +33,7 @@ index 2611007..16dbc20 100644 worldserver1.chunkProviderServer.forceChunkLoad = before; // CraftBukkit end this.world.methodProfiler.c("reloading"); -@@ -1961,6 +1970,12 @@ public abstract class Entity implements ICommandListener { +@@ -1974,6 +1983,12 @@ public abstract class Entity implements ICommandListener { if (entity != null) { entity.n(this); @@ -47,7 +47,7 @@ index 2611007..16dbc20 100644 if (j == 1 && i == 1) { BlockPosition blockposition = this.world.r(worldserver1.getSpawn()); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 68f18d1..269a891 100644 +index 5b99842..23753bb 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -449,7 +449,27 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -97,5 +97,5 @@ index 68f18d1..269a891 100644 } -- -2.4.2.windows.1 +1.9.5.msysgit.1 diff --git a/Spigot-Server-Patches/0053-Configurable-TNT-cannon-fix.patch b/Spigot-Server-Patches/0053-Configurable-TNT-cannon-fix.patch index 21f317c96..cf38d2cd9 100644 --- a/Spigot-Server-Patches/0053-Configurable-TNT-cannon-fix.patch +++ b/Spigot-Server-Patches/0053-Configurable-TNT-cannon-fix.patch @@ -1,4 +1,4 @@ -From 972c16bba62bcb2570fadb20544d2335fe082276 Mon Sep 17 00:00:00 2001 +From c88d7ecef2b00d2f2c9f649eba69cc58eba8c628 Mon Sep 17 00:00:00 2001 From: Iceee Date: Thu, 4 Jun 2015 13:55:02 -0700 Subject: [PATCH] Configurable TNT cannon fix @@ -172,10 +172,10 @@ index 950db4d..8700ab1 100644 world.getServer().getPluginManager().callEvent(event); } diff --git a/src/main/java/net/minecraft/server/EntityFallingBlock.java b/src/main/java/net/minecraft/server/EntityFallingBlock.java -index a0452ac..8a3fd44 100644 +index 34627c6..cf02997 100644 --- a/src/main/java/net/minecraft/server/EntityFallingBlock.java +++ b/src/main/java/net/minecraft/server/EntityFallingBlock.java -@@ -291,4 +291,22 @@ public class EntityFallingBlock extends Entity { +@@ -278,4 +278,22 @@ public class EntityFallingBlock extends Entity { public IBlockData getBlock() { return this.block; } @@ -199,10 +199,10 @@ index a0452ac..8a3fd44 100644 + // PaperSpigot end } diff --git a/src/main/java/net/minecraft/server/EntityTNTPrimed.java b/src/main/java/net/minecraft/server/EntityTNTPrimed.java -index db33c98..5290767 100644 +index 3e16472..2df3921 100644 --- a/src/main/java/net/minecraft/server/EntityTNTPrimed.java +++ b/src/main/java/net/minecraft/server/EntityTNTPrimed.java -@@ -36,6 +36,7 @@ public class EntityTNTPrimed extends Entity { +@@ -37,6 +37,7 @@ public class EntityTNTPrimed extends Entity { this.lastY = d1; this.lastZ = d2; this.source = entityliving; @@ -210,7 +210,7 @@ index db33c98..5290767 100644 } protected void h() {} -@@ -156,7 +157,64 @@ public class EntityTNTPrimed extends Entity { +@@ -141,7 +142,64 @@ public class EntityTNTPrimed extends Entity { return this.source; } diff --git a/Spigot-Server-Patches/0054-FallingBlock-and-TNT-entities-collide-with-specific-.patch b/Spigot-Server-Patches/0054-FallingBlock-and-TNT-entities-collide-with-specific-.patch index 4a747d170..13257fd6b 100644 --- a/Spigot-Server-Patches/0054-FallingBlock-and-TNT-entities-collide-with-specific-.patch +++ b/Spigot-Server-Patches/0054-FallingBlock-and-TNT-entities-collide-with-specific-.patch @@ -1,14 +1,14 @@ -From f1793ad4101a53ae77153a2bd31594d457222b6a Mon Sep 17 00:00:00 2001 +From c3b9b48c6c9c8580777de737a78f621ef7b3cd60 Mon Sep 17 00:00:00 2001 From: Byteflux Date: Fri, 5 Jun 2015 00:43:17 -0700 Subject: [PATCH] FallingBlock and TNT entities collide with specific blocks diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index aec39a8..8258c25 100644 +index 6712fbf..04bc301 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java -@@ -1200,7 +1200,16 @@ public abstract class World implements IBlockAccess { +@@ -1197,7 +1197,16 @@ public abstract class World implements IBlockAccess { } if ( block != null ) { diff --git a/Spigot-Server-Patches/0055-Do-not-filter-out-large-getEntities-call.patch b/Spigot-Server-Patches/0055-Do-not-filter-out-large-getEntities-call.patch index c113065fb..ea60a91d8 100644 --- a/Spigot-Server-Patches/0055-Do-not-filter-out-large-getEntities-call.patch +++ b/Spigot-Server-Patches/0055-Do-not-filter-out-large-getEntities-call.patch @@ -1,14 +1,14 @@ -From 7779fb3770e1782d9a81243e025eb085ad168ff5 Mon Sep 17 00:00:00 2001 +From 37e0a3b799d2042d620798f658a4b1d073b528d4 Mon Sep 17 00:00:00 2001 From: Byteflux Date: Tue, 16 Jun 2015 05:30:44 -0700 Subject: [PATCH] Do not filter out large getEntities call diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index 8258c25..480a6d8 100644 +index 04bc301..3ece597 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java -@@ -2563,13 +2563,6 @@ public abstract class World implements IBlockAccess { +@@ -2579,13 +2579,6 @@ public abstract class World implements IBlockAccess { int k = MathHelper.floor((axisalignedbb.c - 2.0D) / 16.0D); int l = MathHelper.floor((axisalignedbb.f + 2.0D) / 16.0D); diff --git a/Spigot-Server-Patches/0056-Optimize-explosions.patch b/Spigot-Server-Patches/0056-Optimize-explosions.patch index edc001b1d..ca8fd2f29 100644 --- a/Spigot-Server-Patches/0056-Optimize-explosions.patch +++ b/Spigot-Server-Patches/0056-Optimize-explosions.patch @@ -1,4 +1,4 @@ -From a33575012a7e963a20618af399f8b60e0d4c4dc0 Mon Sep 17 00:00:00 2001 +From 5e1ec44c0676857eedf38547f4750d98cdb700e8 Mon Sep 17 00:00:00 2001 From: Byteflux Date: Tue, 16 Jun 2015 05:52:58 -0700 Subject: [PATCH] Optimize explosions @@ -122,13 +122,13 @@ index 77fe950..a3fb54b 100644 // this.i[i][this.ticks % 100] = System.nanoTime() - j; // CraftBukkit diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index 480a6d8..26091b1 100644 +index 3ece597..c306035 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java -@@ -132,6 +132,7 @@ public abstract class World implements IBlockAccess { - public static boolean haveWeSilencedAPhysicsCrash; +@@ -133,6 +133,7 @@ public abstract class World implements IBlockAccess { public static String blockLocation; private int tileTickPosition; + private ExecutorService lightingExecutor; // PaperSpigot - Asynchronous lighting updates + public final Map explosionDensityCache = new HashMap(); // PaperSpigot - Optimize explosions public static long chunkToKey(int x, int z)