From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Samsuik Date: Mon, 22 Apr 2024 23:01:26 +0100 Subject: [PATCH] Replace explosion density cache diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java index a4428a3c23db6f795b5ff0ead634e2e21468e3a6..ae0b6d506f0344249bdc238fff0f5a3306d05334 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -688,6 +688,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe this.getCraftServer().addWorld(this.getWorld()); // CraftBukkit this.levelTickScheduler.registerNewTask(this.explosionPositions::clear, 0); // Sakura - client visibility settings this.levelTickScheduler.registerNewTask(this.mergeHandler::expire, 200); // Sakura - merge cannon entities + this.levelTickScheduler.registerNewTask(this.densityCache::invalidate, 0); // Sakura - explosion density cache } // Paper start diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java index 37271a9e9d3d16a01c437629806508accefa1b9c..d111bd5546613cefd8b4070788679901b7e5b8f4 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java @@ -829,6 +829,7 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl public final me.samsuik.sakura.listener.BlockChangeTracker blockChangeTracker = new me.samsuik.sakura.listener.BlockChangeTracker(this); // Sakura end - track block changes and tick scheduler public final me.samsuik.sakura.entity.merge.EntityMergeHandler mergeHandler = new me.samsuik.sakura.entity.merge.EntityMergeHandler(); // Sakura - merge cannon entities + public final me.samsuik.sakura.explosion.density.BlockDensityCache densityCache = new me.samsuik.sakura.explosion.density.BlockDensityCache(); // Sakura - explosion density cache protected Level( WritableLevelData levelData, diff --git a/net/minecraft/world/level/ServerExplosion.java b/net/minecraft/world/level/ServerExplosion.java index 71d79a1204d9335c98a63ecda9782755a964b22f..cc337b1656b5bf86da9125a3a1c2da06cc2814ba 100644 --- a/net/minecraft/world/level/ServerExplosion.java +++ b/net/minecraft/world/level/ServerExplosion.java @@ -294,7 +294,12 @@ public class ServerExplosion implements Explosion { Math.fma(dz, diffZ, offZ) ); - if (!this.clipsAnything(from, source, context, blockCache, blockPos)) { + // Sakura start - replace density cache + final float density = this.level.densityCache.getKnownDensity(from); + if (density != me.samsuik.sakura.explosion.density.BlockDensityCache.UNKNOWN_DENSITY) { + missedRays += (int) density; + } else if (!this.clipsAnything(from, source, context, blockCache, blockPos)) { + // Sakura end - replace density cache ++missedRays; } } @@ -382,8 +387,16 @@ public class ServerExplosion implements Explosion { double d9 = Mth.lerp(d6, boundingBox.minY, boundingBox.maxY); double d10 = Mth.lerp(d7, boundingBox.minZ, boundingBox.maxZ); Vec3 vec3 = new Vec3(d8 + d3, d9, d10 + d4); - if (entity.level().clip(new ClipContext(vec3, explosionVector, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, entity)).getType() - == HitResult.Type.MISS) { + // Sakura start - replace density cache + final net.minecraft.world.phys.HitResult.Type hitResult; + final float density = entity.level().densityCache.getKnownDensity(vec3); + if (density != me.samsuik.sakura.explosion.density.BlockDensityCache.UNKNOWN_DENSITY) { + hitResult = density != 0.0f ? net.minecraft.world.phys.HitResult.Type.MISS : net.minecraft.world.phys.HitResult.Type.BLOCK; + } else { + hitResult = entity.level().clip(new ClipContext(vec3, explosionVector, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, entity)).getType(); + } + if (hitResult == HitResult.Type.MISS) { + // Sakura end - replace density cache i++; } @@ -679,6 +692,11 @@ public class ServerExplosion implements Explosion { return; } // CraftBukkit end + // Sakura start - explosion density cache + if (!blocks.isEmpty() && !this.level.paperConfig().environment.optimizeExplosions) { + this.level.densityCache.invalidate(); + } + // Sakura end - explosion density cache for (BlockPos blockPos : blocks) { // CraftBukkit start - TNTPrimeEvent @@ -851,14 +869,12 @@ public class ServerExplosion implements Explosion { // Paper start - Optimize explosions protected float getBlockDensity(Vec3 vec3d, Entity entity) { - if (!this.level.paperConfig().environment.optimizeExplosions) { - return this.getSeenFraction(vec3d, entity, this.directMappedBlockCache, this.mutablePos); // Paper - collision optimisations - } - CacheKey key = new CacheKey(this, entity.getBoundingBox()); - Float blockDensity = this.level.explosionDensityCache.get(key); - if (blockDensity == null) { + // Sakura start - replace density cache + float blockDensity = this.level.densityCache.getDensity(vec3d, entity); + if (blockDensity == me.samsuik.sakura.explosion.density.BlockDensityCache.UNKNOWN_DENSITY) { blockDensity = this.getSeenFraction(vec3d, entity, this.directMappedBlockCache, this.mutablePos); // Paper - collision optimisations - this.level.explosionDensityCache.put(key, blockDensity); + this.level.densityCache.putDensity(vec3d, entity, blockDensity); + // Sakura end - replace density cache } return blockDensity; diff --git a/net/minecraft/world/level/block/BasePressurePlateBlock.java b/net/minecraft/world/level/block/BasePressurePlateBlock.java index 96c977df11c660ccb9a9b32e61c865084e3776ce..dc110835679dbfcb232c58c91ddac343c85ee3ab 100644 --- a/net/minecraft/world/level/block/BasePressurePlateBlock.java +++ b/net/minecraft/world/level/block/BasePressurePlateBlock.java @@ -107,6 +107,11 @@ public abstract class BasePressurePlateBlock extends Block { // CraftBukkit end if (currentSignal != signalStrength) { BlockState blockState = this.setSignalForState(state, signalStrength); + // Sakura start - explosion density cache + if (!level.paperConfig().environment.optimizeExplosions) { + level.densityCache.invalidate(); + } + // Sakura end - explosion density cache level.setBlock(pos, blockState, 2); this.updateNeighbours(level, pos); level.setBlocksDirty(pos, state, blockState); diff --git a/net/minecraft/world/level/block/TripWireHookBlock.java b/net/minecraft/world/level/block/TripWireHookBlock.java index 8a3a8b0fdf9545a41501dc992c6982d9c8ce7b66..5e2576a8b90de8a829c6136cc384f3fe5a49603c 100644 --- a/net/minecraft/world/level/block/TripWireHookBlock.java +++ b/net/minecraft/world/level/block/TripWireHookBlock.java @@ -168,6 +168,11 @@ public class TripWireHookBlock extends Block { if (!cancelledReceiverHook) { // always trigger two events even when the first hook current change is cancelled // Paper end - Call BlockRedstoneEvent Direction opposite = direction.getOpposite(); + // Sakura start - explosion density cache + if (!level.paperConfig().environment.optimizeExplosions) { + level.densityCache.invalidate(); + } + // Sakura end - explosion density cache level.setBlock(blockPosx, blockState1.setValue(FACING, opposite), 3); notifyNeighbors(block, level, blockPosx, opposite); emitState(level, blockPosx, flag2, flag3, flag, flag1); diff --git a/net/minecraft/world/phys/AABB.java b/net/minecraft/world/phys/AABB.java index c22acc8889fbb3c9ee698624189c195ee4b5eefb..b08ab87278023e50c56a381240712cc2e18a0440 100644 --- a/net/minecraft/world/phys/AABB.java +++ b/net/minecraft/world/phys/AABB.java @@ -19,6 +19,30 @@ public class AABB { public final double maxY; public final double maxZ; + // Sakura start - explosion density cache + public final boolean isAABBInBounds(AABB bb) { + return this.minX <= bb.minX && this.maxX >= bb.maxX + && this.minY <= bb.minY && this.maxY >= bb.maxY + && this.minZ <= bb.minZ && this.maxZ >= bb.maxZ; + } + + public final boolean isVec3InBounds(Vec3 p) { + return this.minX <= p.x && this.maxX >= p.x + && this.minY <= p.y && this.maxY >= p.y + && this.minZ <= p.z && this.maxZ >= p.z; + } + + public final AABB expand(Vec3 pos) { + double minX = Math.min(this.minX, pos.x); + double minY = Math.min(this.minY, pos.y); + double minZ = Math.min(this.minZ, pos.z); + double maxX = Math.max(this.maxX, pos.x); + double maxY = Math.max(this.maxY, pos.y); + double maxZ = Math.max(this.maxZ, pos.z); + return new AABB(minX, minY, minZ, maxX, maxY, maxZ); + } + // Sakura end - explosion density cache + public AABB(double x1, double y1, double z1, double x2, double y2, double z2) { this.minX = Math.min(x1, x2); this.minY = Math.min(y1, y2);