9
0
mirror of https://github.com/Samsuik/Sakura.git synced 2026-01-04 15:31:43 +00:00
Files
SakuraMC/sakura-server/minecraft-patches/features/0009-Replace-explosion-density-cache.patch
Samsuik 991f961f38 Updated Upstream (Paper 1.21.6)
Upstream has released updates that appear to apply and compile correctly

Paper Changes:
PaperMC/Paper@a24f9b2 1.21.6 dev
PaperMC/Paper@457a0a6 Bump version string and protocol version to 1.21.6 release
PaperMC/Paper@245b547 Update base to 1.21.6
PaperMC/Paper@b28d77b Update Moonrise to 1.21.6
PaperMC/Paper@8318dcb Update DataConverter to 1.21.6-rc1
PaperMC/Paper@d2b1158 Set correct world access on BSL snapshots
PaperMC/Paper@023e6c2 Ensure waypoints are per world
PaperMC/Paper@40d5d31 Fix recursively converting JSON Text Components
PaperMC/Paper@1fcc416 Implement FeatureHooks#isChunkSent for Moonrise chunk system
PaperMC/Paper@e4d7178 Implement WaypointTransmitter#isChunkVisible
PaperMC/Paper@8980ead Directly walk text component after converting from JSON
PaperMC/Paper@5613ed6 Provide env environment variable and copy spigots sys prop for overriding default repository
PaperMC/Paper@62b7f86 Avoid and discourage use of Maven Central as a CDN (#12689)
PaperMC/Paper@f5534cb [ci skip] Run generators (#12691)
PaperMC/Paper@4781d28 Re-add Log4j Javadocs (#12693)
PaperMC/Paper@74fbcce Check type of Material in get/set stats (#12607)
PaperMC/Paper@4b3f967 Improve Fix MC-44654 (#12703)
PaperMC/Paper@a7dd263 Enable spigot obfuscation support (#12695)
PaperMC/Paper@6a51c44 Cleanup Primed TNT Fix (#12704)
PaperMC/Paper@839c6a1 Fix #11169 (#12706)
PaperMC/Paper@c77d5f9 Fix MC-297591
PaperMC/Paper@219f86e Implement chunk unload delay config option
PaperMC/Paper@e4eb69b Do not allow ticket level decreases to be processed asynchronously
PaperMC/Paper@71b0c76 Adds support for vanilla negative explosions (#12705)
PaperMC/Paper@3750927 [ci skip] Fix PermissionManager#clearPermissions() docs bad wording (#12657)
PaperMC/Paper@d61a51e Add ItemType#getBurnDuration() (#12604)
PaperMC/Paper@29fc853 Allow empty paths in namespaced keys (#12687)
PaperMC/Paper@4419afb fix: Safely handle nanosecond overflow in ClickCallback (#12686)
PaperMC/Paper@5652882 Add `isProxyEnabled` method to ServerConfiguration (#12664)
PaperMC/Paper@c0dda0e Add `isForceDefaultGameMode` method (#12673)
PaperMC/Paper@e714de6 Fix excess slot updates
PaperMC/Paper@6d0821d [ci skip] Fix docs for Spawner class and cleanup (#12710)
PaperMC/Paper@cceffe3 Release ItemType and BlockType (#12708)
PaperMC/Paper@186e9e3 Relocate CommandMap#registerServerAliases() call to after lifecycle events have been run (#12601)
PaperMC/Paper@5edcf6d Cleanup/command dispatching (#12713)
PaperMC/Paper@803baf0 Support hidden entities in Waypoints (#12715)
PaperMC/Paper@1814d8b build: publish to fill (#12717)
PaperMC/Paper@e454fef Add support for private constructors in plugin main classes (#12652)
PaperMC/Paper@d0e808f Move player to correct position in vehicle move packet handler
PaperMC/Paper@46b4b0b Improve keepalive ping system
PaperMC/Paper@38c1ddb Add and use FeatureHooks.getAllEntities
PaperMC/Paper@2f083ac Ensure player entity schedulers are ticked when they are dead
PaperMC/Paper@7c90c7c Optimise EntityScheduler ticking
PaperMC/Paper@aa6ee44 Re-add global region scheduler tick erroneously removed in last commit
PaperMC/Paper@d7510ef Fix #12722 (#12726)
PaperMC/Paper@0caf75f Fix #12721 (#12725)
PaperMC/Paper@bee2879 Adventure 4.23.0 (#12690)
PaperMC/Paper@692e93a Fix MC-299110
PaperMC/Paper@ea10fa4 Don't mutate the position of Items for MC-4 Fix (#12702)
PaperMC/Paper@aa6cd74 Remove unnecesary item check for ServerboundPlayerActionPacket RELEASE_USE_ITEM (#12668)
PaperMC/Paper@c9e89f4 Expose arrow velocity in EntityShootBowEvent for mobs (#12688)
PaperMC/Paper@7ec3174 Jump out of experimental phase
PaperMC/Paper@4e1a255 Update try catch for command handling
2025-06-26 14:47:59 +01:00

167 lines
9.8 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Samsuik <kfian294ma4@gmail.com>
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 5ddfbddbef13b58bf509e4c60bbd72cde2a7f59d..39cf9a8af79ce4c3f1d47eaf7cf3205199b35eb6 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
@@ -692,6 +692,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 19788e29f796efd7b1fe79c398c5532eb99add58..c24f09cf9959310353bd0fc5a5ff7498c6ea47a0 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<Entity>, 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 1e9b92454edae054c6c3c50dc844c8fc3689f6f8..37721d49fbb5c8914866be4a2bde29a64e3f172e 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;
}
}
@@ -385,8 +390,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++;
}
@@ -682,6 +695,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
@@ -848,14 +866,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 84f3073444ae9e11e5d11224d6af6474ced925e2..281366d8b256a2414e20872c0cb54c9d08501887 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);