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 40897f76f7 Updated Upstream (Paper 1.21.9)
Upstream has released updates that appear to apply and compile correctly

Paper Changes:
PaperMC/Paper@7e70636 Initial 1.21.9 update (squashed)
PaperMC/Paper@0a28816 Add Server#getRespawnWorld and Server#setRespawnWorld(World)
PaperMC/Paper@b67fa6d move todos txt content into tracking issue
PaperMC/Paper@68f26a1 Drop no-longer-needed packet diffs
PaperMC/Paper@f9434d2 Use pitch when setting spawn position with Location
PaperMC/Paper@810b3c6 Deprecate the Conversation API (for removal), Metadata API, and PlayerSpawnLocationEvent (for removal)
PaperMC/Paper@1870261 Update Moonrise to 1.21.9-pre1
PaperMC/Paper@1141058 Shift feature patch #s for Moonrise being first
PaperMC/Paper@510aa9b Update 'Optimize Network Manager and add advanced packet support'
PaperMC/Paper@89cc24a Update 'Allow Saving of Oversized Chunks'
PaperMC/Paper@bcd75d8 Update EAR 2.0 patch and enable oldPaperCommit for better 3-way merges
PaperMC/Paper@6b44820 Update 'Use Velocity compression and cipher natives'
PaperMC/Paper@87f3e2f Update 'Optimize GoalSelector Goal.Flag Set operations'
PaperMC/Paper@5323486 Update 'Optimize Voxel Shape Merging'
PaperMC/Paper@5aac8b4 Update 'Handle Oversized block entities in chunks'
PaperMC/Paper@f0b3d62 Update 'optimize dirt and snow spreading' and drop 'Optimise getChunkAt calls for loaded chunks' patch to code replaced by Moonrise
PaperMC/Paper@92f822d Update 'Optimize Bit Operations by inlining', 'Remove streams from hot code'
PaperMC/Paper@98e745a Update 'Optimize Pathfinder - Remove Streams / Optimized collections'
PaperMC/Paper@49e49d0 Update 'Fix entity tracker desync when new players are added to the tracker'
PaperMC/Paper@87e0525 Update alternate redstone impls
PaperMC/Paper@35e973d Update 'Improve exact choice recipe ingredients', 'Only write chunk data to disk if it serializes without throwing'
PaperMC/Paper@181f9bb Update 'Entity load/save limit per chunk', 'Attempt to recalculate regionfile header if it is corrupt'
PaperMC/Paper@b31ca18 Update 'Incremental chunk and player saving', 'Optimise general POI access'
PaperMC/Paper@9b69cc5 Add some more Mannequin API
PaperMC/Paper@8bb12cb Fix compile
PaperMC/Paper@e3aca92 Replace ConcurrentUtil's Validate with Objects
PaperMC/Paper@9a626dd Rewrite ticket counter system
PaperMC/Paper@65250cb Drop "Optimize Collision to not load chunks"
PaperMC/Paper@55d56d9 Apply "Flush regionfiles on save configuration option"
PaperMC/Paper@920e8d3 Apply "Optimise collision checking in player move packet handling"
PaperMC/Paper@ec492d3 Apply "Improve keepalive ping system"
PaperMC/Paper@8f65947 Apply "Optimise EntityScheduler ticking"
PaperMC/Paper@086b4fd Apply "Optional per player mob spawns"
PaperMC/Paper@2f4211e Apply "Improve cancelling PreCreatureSpawnEvent with per player mob spawns"
PaperMC/Paper@b6d9557 Apply "Optimize Hoppers"
PaperMC/Paper@388e693 update generator
PaperMC/Paper@a3c89a8 add javadocs for new api
PaperMC/Paper@fcc763a Call BlockRedstoneEvent for the shelf
PaperMC/Paper@03eb18b replace requireNonNull by checkArgument and deprecate MCUtil#toLocation
PaperMC/Paper@6b7bf01 bump built-in datapack version
PaperMC/Paper@2779a53 deprecate #lanterns material tag in favour of vanilla tag
PaperMC/Paper@6f9957e Mannequin#createDefaultProfile -> Mannequin#defaultProfile
PaperMC/Paper@24874e5 Also rename Mannequin profile getter/setters for consistency
PaperMC/Paper@bc2ae10 Fix default respawn dimension being null for new worlds
PaperMC/Paper@eb42158 Use 0.0.4 release of ConcurrentUtil
PaperMC/Paper@bb01745 1.21.9-pre2
PaperMC/Paper@0249204 1.21.9-pre2 feature patches
PaperMC/Paper@9360ba4 Identifying comments for MinecraftServer
PaperMC/Paper@5d3aa53 Some diff improvements in prepare spawn task
PaperMC/Paper@22ad451 Move some stuff to ATs
PaperMC/Paper@0ea15c9 Drop no longer applicable ATs
PaperMC/Paper@cf78f2a bump api-version/datapack format and add a copper torch tag
PaperMC/Paper@60cb0df generate ClientOption enums and mark CraftBlockData impl as null marked
PaperMC/Paper@4025289 Add pre2 to api version
PaperMC/Paper@f2cb073 Set build channel to alpha
PaperMC/Paper@90b29c4 Port most of the anti-xray patch
PaperMC/Paper@4a8e88d Disable oldPaperCommit to fix CI build
PaperMC/Paper@121ac2e Port the last Anti-XRay hunk
PaperMC/Paper@f43641f Use ConcurrentUtil 0.0.5
PaperMC/Paper@1f79388 fix end portal teleportation
PaperMC/Paper@2efb400 [ci skip] Adjust spawn location event docs
PaperMC/Paper@cb9fc05 simplify overloads
PaperMC/Paper@25ecc59 Enable Anti-Xray
PaperMC/Paper@4d7185f Add AsyncPlayerSpawnLocationEvent#isNewPlayer (#13081)
PaperMC/Paper@dc474a8 Fixup vanilla code for Anti-Xray changes
PaperMC/Paper@0e23b02 Add back null check for chunkPacketBlockController
PaperMC/Paper@e6f1483 Update to 1.21.9-pre3
PaperMC/Paper@44259ea Add ResolvableProfile.SkinPatch (#13091)
PaperMC/Paper@634f51e Update to 1.21.9-pre4
PaperMC/Paper@fada3a7 Update DataConverter to 1.21.9-pre4
PaperMC/Paper@037179f Update Starlight stored version
PaperMC/Paper@6b0b29a Update publishing endpoint
PaperMC/Paper@f6fabc5 Call EntityChangeBlockEvent for copper golem statue changes (#13090)
PaperMC/Paper@1d6ee7d Update adventure
PaperMC/Paper@404e49f Update to 1.21.9-rc1
PaperMC/Paper@4055274 Fix empty SkinPatch initialization and swapped dynamic/static heuristic in ResolvableProfile build method
PaperMC/Paper@51fe7aa Fixed modern forwarding support (#13098)
PaperMC/Paper@5613a35 fix PlayerGameModeChangeEvent#cancelMessage
PaperMC/Paper@673abf4 use PlayerShieldDisableEvent#getCooldown
PaperMC/Paper@3a0dc7f Fix a couple PlayerProfile mutability issues
PaperMC/Paper@e97fb40 Remove parallel generation config option
PaperMC/Paper@c3a60b8 Use ThreadLocal for Starlight and ticket level propagator cache
PaperMC/Paper@e16b369 Resize propagator queues less aggressively
2025-09-29 01:59:24 +01:00

167 lines
9.9 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 259faa131f4aec7db565c78c38aa058d20ef3d28..efdf41c42320ac9defd5d0eb206df5aaed012363 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
@@ -710,6 +710,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
this.getCraftServer().addWorld(this.getWorld()); // CraftBukkit
this.levelTickScheduler.repeatingTask(this.explosionPositions::clear, 0); // Sakura - client visibility settings
this.levelTickScheduler.repeatingTask(this.mergeHandler::expire, 200); // Sakura - merge cannon entities
+ this.levelTickScheduler.repeatingTask(this.densityCache::expire, 0); // Sakura - explosion density cache
}
// Paper start
diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java
index 93ff0fdaee21ac493833640b5f620f9bec1a69c8..e807aafed0295d8db7ba0782bb1e462561e9e1ec 100644
--- a/net/minecraft/world/level/Level.java
+++ b/net/minecraft/world/level/Level.java
@@ -834,6 +834,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl
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(this); // Sakura - optimise explosion density cache
protected Level(
WritableLevelData levelData,
diff --git a/net/minecraft/world/level/ServerExplosion.java b/net/minecraft/world/level/ServerExplosion.java
index a3e47902098331ce1dfcbb96909e4a8cd5d7da78..39a4f8ffb7c0e61d94c4384c4a3f77550fefe16f 100644
--- a/net/minecraft/world/level/ServerExplosion.java
+++ b/net/minecraft/world/level/ServerExplosion.java
@@ -296,7 +296,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;
}
}
@@ -354,8 +359,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++;
}
@@ -597,6 +610,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
@@ -765,14 +783,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.getBlockDensity(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 f9c1c5a7f0602c225d18005e7161384cc1d3c604..a43dfc0ebd28d42d4334021ac7255e496f78c6b7 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 f87d0bd3d65155fbc206a0dae8de67a9184436f3..da90795ce9d4589ee9a4b5ab10f3af59c772547b 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 containsInclusive(final AABB other) {
+ return this.minX <= other.minX && this.maxX >= other.maxX
+ && this.minY <= other.minY && this.maxY >= other.maxY
+ && this.minZ <= other.minZ && this.maxZ >= other.maxZ;
+ }
+
+ public final boolean containsInclusive(final Vec3 pos) {
+ return this.minX <= pos.x && this.maxX >= pos.x
+ && this.minY <= pos.y && this.maxY >= pos.y
+ && this.minZ <= pos.z && this.maxZ >= pos.z;
+ }
+
+ public final AABB expand(final Vec3 pos) {
+ final double minX = Math.min(this.minX, pos.x);
+ final double minY = Math.min(this.minY, pos.y);
+ final double minZ = Math.min(this.minZ, pos.z);
+ final double maxX = Math.max(this.maxX, pos.x);
+ final double maxY = Math.max(this.maxY, pos.y);
+ final 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);