diff --git a/patches/server/0003-Sakura-Configuration-Files.patch b/patches/server/0003-Sakura-Configuration-Files.patch index 0332d6e..1a834c7 100644 --- a/patches/server/0003-Sakura-Configuration-Files.patch +++ b/patches/server/0003-Sakura-Configuration-Files.patch @@ -647,10 +647,10 @@ index 0000000000000000000000000000000000000000..f8770f97e3ad6c2746bc436b2b2c895c +} diff --git a/src/main/java/me/samsuik/sakura/configuration/WorldConfiguration.java b/src/main/java/me/samsuik/sakura/configuration/WorldConfiguration.java new file mode 100644 -index 0000000000000000000000000000000000000000..12cbf3e424a0d3218d7e8c5ea37c32ff3bad4e98 +index 0000000000000000000000000000000000000000..33ead866ae736fd191ed97ed8e9b8e30292e6fe6 --- /dev/null +++ b/src/main/java/me/samsuik/sakura/configuration/WorldConfiguration.java -@@ -0,0 +1,204 @@ +@@ -0,0 +1,205 @@ +package me.samsuik.sakura.configuration; + +import com.mojang.logging.LogUtils; @@ -745,6 +745,7 @@ index 0000000000000000000000000000000000000000..12cbf3e424a0d3218d7e8c5ea37c32ff + public boolean consistentRadius = false; + public boolean explosionsHurtPlayers = true; + public boolean explosionsDropItems = true; ++ public boolean useBlockCacheAcrossExplosions = false; + } + + public Mechanics mechanics = new Mechanics(); diff --git a/patches/server/0021-Specialised-Explosions.patch b/patches/server/0021-Specialised-Explosions.patch index 0d15879..6f8de4f 100644 --- a/patches/server/0021-Specialised-Explosions.patch +++ b/patches/server/0021-Specialised-Explosions.patch @@ -23,10 +23,10 @@ index 0fd814f1d65c111266a2b20f86561839a4cef755..932f7a0d030d2d4932e6e6d4a5805e9b if (index >= 0) { diff --git a/src/main/java/me/samsuik/sakura/explosion/special/SpecialisedExplosion.java b/src/main/java/me/samsuik/sakura/explosion/special/SpecialisedExplosion.java new file mode 100644 -index 0000000000000000000000000000000000000000..d741021bb53d56383ea751441163c7ff7223b16a +index 0000000000000000000000000000000000000000..0611555b4afb461e2045585e3d81601420792c7c --- /dev/null +++ b/src/main/java/me/samsuik/sakura/explosion/special/SpecialisedExplosion.java -@@ -0,0 +1,197 @@ +@@ -0,0 +1,199 @@ +package me.samsuik.sakura.explosion.special; + +import io.papermc.paper.util.WorldUtil; @@ -119,9 +119,11 @@ index 0000000000000000000000000000000000000000..d741021bb53d56383ea751441163c7ff + } + + protected void postExplosion(List foundBlocks, boolean destroyedBlocks) { -+ // The purpose of this is to make sure papers blockCache doesn't become outdated -+ // by removing stale entries from the block cache map and the recent cache array. -+ if (!foundBlocks.isEmpty() && !destroyedBlocks) { ++ // optimisation: Keep the block cache across explosions and invalidate any found blocks. ++ // This can help reduce block retrievals while block searching when there's a durable block, ++ // and when ray tracing for obstructions. This is disabled by default because plugins can ++ // change blocks in the explosion event. ++ if (this.level.sakuraConfig().cannons.explosion.useBlockCacheAcrossExplosions && !foundBlocks.isEmpty() && !destroyedBlocks) { + this.markBlocksInCacheAsExplodable(foundBlocks); + } else { + super.blockCache.clear(); @@ -477,7 +479,7 @@ index 4f695305794c2564517d99b4edd3180d7ea07845..8acef487b0579febb3497cc88b23c4fc @Override diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java -index c9cf9373d3eae4e54ae27fbb8993f858e91e98cc..8e80e602368d784a64c68a061505d4e08997566b 100644 +index c9cf9373d3eae4e54ae27fbb8993f858e91e98cc..5ab0de07b1da8c14b62044747bf6e4288ecc7506 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java @@ -55,9 +55,11 @@ public class Explosion { @@ -535,6 +537,15 @@ index c9cf9373d3eae4e54ae27fbb8993f858e91e98cc..8e80e602368d784a64c68a061505d4e0 final long key, final boolean calculateResistance) { ExplosionBlockCache ret = this.blockCache.get(key); if (ret != null) { +@@ -310,7 +334,7 @@ public class Explosion { + (currZ & BLOCK_EXPLOSION_CACHE_MASK) << (BLOCK_EXPLOSION_CACHE_SHIFT + BLOCK_EXPLOSION_CACHE_SHIFT); + ExplosionBlockCache cachedBlock = blockCache[cacheKey]; + if (cachedBlock == null || cachedBlock.key != key) { +- blockCache[cacheKey] = cachedBlock = this.getOrCacheExplosionBlock(currX, currY, currZ, key, false); ++ blockCache[cacheKey] = cachedBlock = this.getOrCacheExplosionBlock(currX, currY, currZ, key, this.level.sakuraConfig().cannons.explosion.useBlockCacheAcrossExplosions); // Sakura - specialised explosions + } + + final BlockState blockState = cachedBlock.blockState; @@ -501,14 +525,7 @@ public class Explosion { int j; diff --git a/patches/server/0041-Configure-cannon-physics-by-version.patch b/patches/server/0041-Configure-cannon-physics-by-version.patch index 4ec95da..2aa3339 100644 --- a/patches/server/0041-Configure-cannon-physics-by-version.patch +++ b/patches/server/0041-Configure-cannon-physics-by-version.patch @@ -68,10 +68,10 @@ index 19086bbfdf3a015eafec5ca868c8d2451f554ef0..510d722fffd4bdcee2db42aefa662c49 if (xSmaller && z != 0.0) { z = performAABBCollisionsZ(axisalignedbb, z, aabbs); diff --git a/src/main/java/me/samsuik/sakura/explosion/special/SpecialisedExplosion.java b/src/main/java/me/samsuik/sakura/explosion/special/SpecialisedExplosion.java -index d741021bb53d56383ea751441163c7ff7223b16a..2e83f0efc47ddabbd2aa5ec8f95c40f95e6e76e0 100644 +index 0611555b4afb461e2045585e3d81601420792c7c..ed492ba7df4ea041a1b5916a14eb2944a2b69187 100644 --- a/src/main/java/me/samsuik/sakura/explosion/special/SpecialisedExplosion.java +++ b/src/main/java/me/samsuik/sakura/explosion/special/SpecialisedExplosion.java -@@ -169,9 +169,15 @@ public abstract class SpecialisedExplosion extends Explosion { +@@ -171,9 +171,15 @@ public abstract class SpecialisedExplosion extends Explosion { if (distanceFromBottom <= 1.0) { double x = entity.getX() - pos.x; @@ -487,7 +487,7 @@ index f5d391ae2a9b015f4dd753f7658ac359bc5db43e..c65e178206041600b09b238214440ed6 // Paper end - Option to prevent TNT from moving in water } diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java -index 71c2e458673372a8a332c49ab3cb0cf8560b970e..b52270ce23eb67d7b9acac53a4332191bb88f057 100644 +index d441e7d5e2ef15a2d719bae6bbc8ada116787416..ae350482fe2eff621dc32c6ed8f28d9bbe2fbd16 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java @@ -74,6 +74,7 @@ public class Explosion {