mirror of
https://github.com/Samsuik/Sakura.git
synced 2025-12-23 08:49:25 +00:00
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
139 lines
9.0 KiB
Diff
139 lines
9.0 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Samsuik <kfian294ma4@gmail.com>
|
|
Date: Sun, 18 May 2025 20:42:03 +0100
|
|
Subject: [PATCH] Optimise block counting for cannon entities
|
|
|
|
|
|
diff --git a/ca/spottedleaf/moonrise/patches/collisions/CollisionUtil.java b/ca/spottedleaf/moonrise/patches/collisions/CollisionUtil.java
|
|
index 54d561e1b4069df7115457accb0763fa7586dddc..29f66ef8355a95b2869988187bf74536343f2ec8 100644
|
|
--- a/ca/spottedleaf/moonrise/patches/collisions/CollisionUtil.java
|
|
+++ b/ca/spottedleaf/moonrise/patches/collisions/CollisionUtil.java
|
|
@@ -1941,6 +1941,7 @@ public final class CollisionUtil {
|
|
final CollisionContext collisionShape = new LazyEntityCollisionContext(entity);
|
|
final boolean useEntityCollisionShape = LazyEntityCollisionContext.useEntityCollisionShape(world, entity);
|
|
final long gameTime = world.getGameTime(); // Sakura - load chunks on movement
|
|
+ final boolean cannonEntity = entity != null && (entity.isFallingBlock || entity.isPrimedTNT); // Sakura - optimise block counting for cannon entities
|
|
|
|
// special cases:
|
|
if (minBlockY > maxBlockY) {
|
|
@@ -2004,15 +2005,19 @@ public final class CollisionUtil {
|
|
|
|
final boolean hasSpecial = !fullBlocks && section.moonrise$hasSpecialCollidingBlocks(); // Sakura - collide with non-solid blocks
|
|
final int sectionAdjust = !hasSpecial ? 1 : 0;
|
|
+ // Sakura start - optimise block counting for cannon entities
|
|
+ final boolean hasMovingBlocks = section.hasMovingPistonBlocks();
|
|
+ final int sectionAdjustCE = cannonEntity && !hasMovingBlocks || !cannonEntity && !hasSpecial ? 1 : 0;
|
|
|
|
final PalettedContainer<BlockState> blocks = section.states;
|
|
|
|
- final int minXIterate = currChunkX == minChunkX ? (minBlockX & 15) + sectionAdjust : 0;
|
|
- final int maxXIterate = currChunkX == maxChunkX ? (maxBlockX & 15) - sectionAdjust : 15;
|
|
- final int minZIterate = currChunkZ == minChunkZ ? (minBlockZ & 15) + sectionAdjust : 0;
|
|
- final int maxZIterate = currChunkZ == maxChunkZ ? (maxBlockZ & 15) - sectionAdjust : 15;
|
|
+ final int minXIterate = currChunkX == minChunkX ? (minBlockX & 15) + sectionAdjustCE : 0;
|
|
+ final int maxXIterate = currChunkX == maxChunkX ? (maxBlockX & 15) - sectionAdjustCE : 15;
|
|
+ final int minZIterate = currChunkZ == minChunkZ ? (minBlockZ & 15) + sectionAdjustCE : 0;
|
|
+ final int maxZIterate = currChunkZ == maxChunkZ ? (maxBlockZ & 15) - sectionAdjustCE : 15;
|
|
final int minYIterate = currChunkY == minChunkY ? (minBlockY & 15) + sectionAdjust : 0;
|
|
- final int maxYIterate = currChunkY == maxChunkY ? (maxBlockY & 15) - sectionAdjust : 15;
|
|
+ final int maxYIterate = currChunkY == maxChunkY ? (maxBlockY & 15) - sectionAdjustCE : 15;
|
|
+ // Sakura end - optimise block counting for cannon entities
|
|
|
|
for (int currY = minYIterate; currY <= maxYIterate; ++currY) {
|
|
final int blockY = currY | (currChunkY << 4);
|
|
diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java
|
|
index 6804055e9344eb2ea0b2dd6318231963376791c2..3a3d22835df907a85c38cd178c1db9d96554b8e0 100644
|
|
--- a/net/minecraft/world/level/Level.java
|
|
+++ b/net/minecraft/world/level/Level.java
|
|
@@ -621,6 +621,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl
|
|
BlockPos selected = null;
|
|
double selectedDistance = Double.MAX_VALUE;
|
|
final Vec3 entityPos = entity.position();
|
|
+ final boolean cannonEntity = entity.isFallingBlock || entity.isPrimedTNT; // Sakura - optimise block counting for cannon entities
|
|
|
|
// special cases:
|
|
if (minBlockY > maxBlockY) {
|
|
@@ -663,15 +664,19 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl
|
|
|
|
final boolean hasSpecial = ((ca.spottedleaf.moonrise.patches.block_counting.BlockCountingChunkSection)section).moonrise$hasSpecialCollidingBlocks();
|
|
final int sectionAdjust = !hasSpecial ? 1 : 0;
|
|
+ // Sakura start - optimise block counting for cannon entities
|
|
+ final boolean hasMovingBlocks = section.hasMovingPistonBlocks();
|
|
+ final int sectionAdjustCE = cannonEntity && !hasMovingBlocks || !cannonEntity && !hasSpecial ? 1 : 0;
|
|
|
|
final net.minecraft.world.level.chunk.PalettedContainer<net.minecraft.world.level.block.state.BlockState> blocks = section.states;
|
|
|
|
- final int minXIterate = currChunkX == minChunkX ? (minBlockX & 15) + sectionAdjust : 0;
|
|
- final int maxXIterate = currChunkX == maxChunkX ? (maxBlockX & 15) - sectionAdjust : 15;
|
|
- final int minZIterate = currChunkZ == minChunkZ ? (minBlockZ & 15) + sectionAdjust : 0;
|
|
- final int maxZIterate = currChunkZ == maxChunkZ ? (maxBlockZ & 15) - sectionAdjust : 15;
|
|
+ final int minXIterate = currChunkX == minChunkX ? (minBlockX & 15) + sectionAdjustCE : 0;
|
|
+ final int maxXIterate = currChunkX == maxChunkX ? (maxBlockX & 15) - sectionAdjustCE : 15;
|
|
+ final int minZIterate = currChunkZ == minChunkZ ? (minBlockZ & 15) + sectionAdjustCE : 0;
|
|
+ final int maxZIterate = currChunkZ == maxChunkZ ? (maxBlockZ & 15) - sectionAdjustCE : 15;
|
|
final int minYIterate = currChunkY == minChunkY ? (minBlockY & 15) + sectionAdjust : 0;
|
|
- final int maxYIterate = currChunkY == maxChunkY ? (maxBlockY & 15) - sectionAdjust : 15;
|
|
+ final int maxYIterate = currChunkY == maxChunkY ? (maxBlockY & 15) - sectionAdjustCE : 15;
|
|
+ // Sakura end - optimise block counting for cannon entities
|
|
|
|
for (int currY = minYIterate; currY <= maxYIterate; ++currY) {
|
|
final int blockY = currY | (currChunkY << 4);
|
|
diff --git a/net/minecraft/world/level/chunk/LevelChunkSection.java b/net/minecraft/world/level/chunk/LevelChunkSection.java
|
|
index 029d224557613b46f015785a5bbffe49a6f39ec6..a13771119488202fa0ad27121616f82553be968c 100644
|
|
--- a/net/minecraft/world/level/chunk/LevelChunkSection.java
|
|
+++ b/net/minecraft/world/level/chunk/LevelChunkSection.java
|
|
@@ -43,6 +43,13 @@ public class LevelChunkSection implements ca.spottedleaf.moonrise.patches.block_
|
|
return this.tickingBlocks;
|
|
}
|
|
// Paper end - block counting
|
|
+ // Sakura start - optimise block counting for cannon entities
|
|
+ private short movingPistonBlocks;
|
|
+
|
|
+ public final boolean hasMovingPistonBlocks() {
|
|
+ return this.movingPistonBlocks != 0;
|
|
+ }
|
|
+ // Sakura end - optimise block counting for cannon entities
|
|
|
|
private LevelChunkSection(LevelChunkSection section) {
|
|
this.nonEmptyBlockCount = section.nonEmptyBlockCount;
|
|
@@ -113,6 +120,18 @@ public class LevelChunkSection implements ca.spottedleaf.moonrise.patches.block_
|
|
}
|
|
}
|
|
|
|
+ // Sakura start - optimise block counting for cannon entities
|
|
+ final boolean isMovingPistonOld = oldState.is(net.minecraft.world.level.block.Blocks.MOVING_PISTON);
|
|
+ final boolean isMovingPistonNew = newState.is(net.minecraft.world.level.block.Blocks.MOVING_PISTON);
|
|
+ if (isMovingPistonOld != isMovingPistonNew) {
|
|
+ if (isMovingPistonOld) {
|
|
+ --this.movingPistonBlocks;
|
|
+ } else {
|
|
+ ++this.movingPistonBlocks;
|
|
+ }
|
|
+ }
|
|
+ // Sakura end - optimise block counting for cannon entities
|
|
+
|
|
final boolean oldTicking = oldState.isRandomlyTicking();
|
|
final boolean newTicking = newState.isRandomlyTicking();
|
|
if (oldTicking != newTicking) {
|
|
@@ -188,6 +207,7 @@ public class LevelChunkSection implements ca.spottedleaf.moonrise.patches.block_
|
|
this.tickingBlockCount = (short)0;
|
|
this.tickingFluidCount = (short)0;
|
|
this.specialCollidingBlocks = (short)0;
|
|
+ this.movingPistonBlocks = (short) 0; // Sakura - optimise block counting for cannon entities
|
|
this.tickingBlocks.clear();
|
|
|
|
if (this.maybeHas((final BlockState state) -> !state.isAir())) {
|
|
@@ -216,6 +236,12 @@ public class LevelChunkSection implements ca.spottedleaf.moonrise.patches.block_
|
|
continue;
|
|
}
|
|
|
|
+ // Sakura start - optimise block counting for cannon entities
|
|
+ if (state.is(net.minecraft.world.level.block.Blocks.MOVING_PISTON)) {
|
|
+ this.movingPistonBlocks += (short) paletteCount;
|
|
+ }
|
|
+ // Sakura end - optimise block counting for cannon entities
|
|
+
|
|
if (ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.isSpecialCollidingBlock(state)) {
|
|
this.specialCollidingBlocks += (short)paletteCount;
|
|
}
|