diff --git a/Spigot-Server-Patches/0380-Optimize-Light-Recalculations.patch b/Spigot-Server-Patches/0380-Optimize-Light-Recalculations.patch index 1faf9b857..8d51c12ef 100644 --- a/Spigot-Server-Patches/0380-Optimize-Light-Recalculations.patch +++ b/Spigot-Server-Patches/0380-Optimize-Light-Recalculations.patch @@ -1,4 +1,4 @@ -From bfe4057567647862f7f8c377acc4bff3788e42d5 Mon Sep 17 00:00:00 2001 +From 4f23ede23ade4b6f09398c7b12f6044ad88914d7 Mon Sep 17 00:00:00 2001 From: Aikar Date: Fri, 28 Sep 2018 20:46:29 -0400 Subject: [PATCH] Optimize Light Recalculations @@ -10,38 +10,21 @@ do not impact light calculations. So the only way light should change, is if the block itself changes from 1 block to another. -Additionally, as of 1.13, water now only blocks 1 light level -instead of 3, meaning that light level decreasing is the same as air. - -This means, transitions between water and air also do not need -to recalculate light, which saves a TON of updates caused by -fluids flowing. - diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java -index 53aab97866..dad294ecbe 100644 +index 53aab97866..e4bda70bb9 100644 --- a/src/main/java/net/minecraft/server/Chunk.java +++ b/src/main/java/net/minecraft/server/Chunk.java -@@ -103,6 +103,9 @@ public class Chunk implements IChunkAccess { - // Keep this synced with entitySlices.add() and entitySlices.remove() - private final int[] itemCounts = new int[16]; - private final int[] inventoryEntityCounts = new int[16]; -+ public static boolean shouldRecheckLight(Block block, Block block1) { -+ return !(block == block1 || (block1 == Blocks.WATER && block == Blocks.AIR) || (block == Blocks.WATER && block1 == Blocks.AIR)); -+ } - // Paper end - public boolean areNeighborsLoaded(final int radius) { - switch (radius) { -@@ -578,7 +581,7 @@ public class Chunk implements IChunkAccess { +@@ -578,7 +578,7 @@ public class Chunk implements IChunkAccess { } else { if (flag1) { this.initLighting(); - } else { -+ } else if (shouldRecheckLight(block, block1)) { // Paper - Optimize light recalculations ++ } else if (block != block1) { // Paper - Optimize light recalculations this.runOrQueueLightUpdate(() -> { // Paper - Queue light update int i1 = iblockdata.b(this.world, blockposition); int j1 = iblockdata1.b(this.world, blockposition); diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index 13f69f1b82..cd25bf3d9e 100644 +index 13f69f1b82..763401835d 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -444,7 +444,7 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc @@ -49,7 +32,7 @@ index 13f69f1b82..cd25bf3d9e 100644 IBlockData iblockdata2 = this.getType(blockposition); - if (iblockdata2.b(this, blockposition) != iblockdata1.b(this, blockposition) || iblockdata2.e() != iblockdata1.e()) { -+ if (Chunk.shouldRecheckLight(iblockdata.getBlock(), iblockdata2.getBlock()) && iblockdata2.b(this, blockposition) != iblockdata1.b(this, blockposition) || iblockdata2.e() != iblockdata1.e()) { // Paper - optimize light recalculations ++ if (iblockdata.getBlock() != iblockdata2.getBlock() && iblockdata2.b(this, blockposition) != iblockdata1.b(this, blockposition) || iblockdata2.e() != iblockdata1.e()) { // Paper - optimize light recalculations this.methodProfiler.a("checkLight"); chunk.runOrQueueLightUpdate(() -> this.r(blockposition)); // Paper - Queue light update this.methodProfiler.e();