9
0
mirror of https://github.com/Samsuik/Sakura.git synced 2025-12-19 14:59:30 +00:00
Files
SakuraMC/sakura-server/minecraft-patches/features/0001-Track-block-changes-and-level-tick-scheduler.patch
Samsuik f194568a55 Updated Upstream (Paper)
Upstream has released updates that appear to apply and compile correctly

Paper Changes:
PaperMC/Paper@e0ba395 Add missing plugin ticket comparator fixes #13130
PaperMC/Paper@21b4930 Fix diff in FlowingFluid#canPassThroughWall
PaperMC/Paper@dcd7847 Improve server tick loop
PaperMC/Paper@a4a7461 Rebase fixups
PaperMC/Paper@dc66e8c Return Server#getTPS over minute intervals instead of seconds
PaperMC/Paper@b63dc92 Restore currentTick counter increment as temp feature patch
PaperMC/Paper@523efa4 Flatten currentTick incr into file patches
PaperMC/Paper@4dcd837 Add CommandSourceStack to UnknownCommandEvent (#13083)
PaperMC/Paper@ffd5158 Update 1.21.9 reobf mappings data (#13135)
PaperMC/Paper@b4b1f11 [ci skip] Add docs for virtual createMerchant in MerchantInventoryViewBuilder#merchant (#13125)
PaperMC/Paper@b3d2158 Disable javadoc.io links
PaperMC/Paper@8483163 Yield millis from Bukkit#getAverageTickTime
2025-10-06 20:35:12 +01:00

81 lines
4.9 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Samsuik <kfian294ma4@gmail.com>
Date: Sun, 9 Feb 2025 17:52:59 +0000
Subject: [PATCH] Track block changes and level tick scheduler
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
index 9d5d30f70fc348ca31ca88e7d8650ea5e338732d..bb53b16be00c0cbb2f16f749d41aad28b70da872 100644
--- a/net/minecraft/server/MinecraftServer.java
+++ b/net/minecraft/server/MinecraftServer.java
@@ -1793,6 +1793,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
profilerFiller.pop();
profilerFiller.pop();
serverLevel.explosionDensityCache.clear(); // Paper - Optimize explosions
+ serverLevel.levelTickScheduler.tick(); // Sakura - level tick and block change listeners
}
this.isIteratingOverLevels = false; // Paper - Throw exception on world create while being ticked
diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java
index 24f43dd7d3ffa060409c96882c0416f59dc571cc..4b2ea3c99bcd5452840b26c2ba607a4f034ba367 100644
--- a/net/minecraft/world/level/Level.java
+++ b/net/minecraft/world/level/Level.java
@@ -829,6 +829,10 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl
return chunk != null ? chunk.getNoiseBiome(x, y, z) : this.getUncachedNoiseBiome(x, y, z);
}
// Paper end - optimise random ticking
+ // Sakura start - track block changes and tick scheduler
+ public final me.samsuik.sakura.listener.LevelTickScheduler levelTickScheduler = new me.samsuik.sakura.listener.LevelTickScheduler(this);
+ public final me.samsuik.sakura.listener.BlockChangeTracker blockChangeTracker = new me.samsuik.sakura.listener.BlockChangeTracker(this);
+ // Sakura end - track block changes and tick scheduler
protected Level(
WritableLevelData levelData,
diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java
index 4dcec2e8a3120a3dfa078e8cf6857ba99ca01a2d..4a274798077c4ee0a504a784449a1aef1d89d325 100644
--- a/net/minecraft/world/level/chunk/LevelChunk.java
+++ b/net/minecraft/world/level/chunk/LevelChunk.java
@@ -136,6 +136,21 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot
return this.getBlockStateFinal(x, y, z);
}
// Paper end - get block chunk optimisation
+ // Sakura start - track block changes and tick scheduler
+ private java.util.List<me.samsuik.sakura.listener.BlockChangeTracker.Listener> blockChangeListeners;
+
+ public final void updateBlockChangeListeners(final java.util.List<me.samsuik.sakura.listener.BlockChangeTracker.Listener> listeners) {
+ this.blockChangeListeners = listeners;
+ }
+
+ private void blockChange(final BlockPos pos, final BlockState newBlock, final BlockState oldBlock) {
+ for (final me.samsuik.sakura.listener.BlockChangeTracker.Listener listener : this.blockChangeListeners) {
+ if (listener.test(this.level, pos, newBlock, oldBlock)) {
+ listener.call();
+ }
+ }
+ }
+ // Sakura end - track block changes and tick scheduler
public LevelChunk(Level level, ChunkPos pos) {
this(level, pos, UpgradeData.EMPTY, new LevelChunkTicks<>(), new LevelChunkTicks<>(), 0L, null, null, null);
@@ -173,6 +188,7 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot
this.debug = !empty && this.level.isDebug();
this.defaultBlockState = empty ? VOID_AIR_BLOCKSTATE : AIR_BLOCKSTATE;
// Paper end - get block chunk optimisation
+ this.blockChangeListeners = level.blockChangeTracker.getListenersForChunk(pos); // Sakura - track block changes and tick scheduler
}
public LevelChunk(ServerLevel level, ProtoChunk chunk, @Nullable LevelChunk.PostLoadProcessor postLoad) {
@@ -421,6 +437,12 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot
if (!section.getBlockState(i, i1, i2).is(block)) {
return null;
} else {
+ // Sakura start - track block changes and tick scheduler
+ if (state.getBlock() != blockState.getBlock()) {
+ this.blockChange(pos, state, blockState);
+ }
+ // Sakura end - track block changes and tick scheduler
+
if (!this.level.isClientSide() && (flags & 512) == 0 && (!this.level.captureBlockStates || block instanceof net.minecraft.world.level.block.BaseEntityBlock)) { // CraftBukkit - Don't place while processing the BlockPlaceEvent, unless it's a BlockContainer. Prevents blocks such as TNT from activating when cancelled.
state.onPlace(this.level, pos, blockState, flag1);
}