e90c758a01
Add Lophine-specific configuration support (global and carpet configs) and a temporary config transform step during init. Introduce config-controlled command registrations (function, scoreboard, trigger, tick) and enable tick-rate/command tweaks and an entity raytracing tracker flag. Fix datapack command save/listing behavior. Integrate Leaves update-suppression handling broadly: catch and convert update-suppression exceptions across packet handling, ticking, neighbor updates, block state updates and more; add configurable shulker CCE behavior and redstone upward-update compatibility. Provide an option to reintroduce an InstantNeighborUpdater (instant block updater) and other small compatibility/rebrand adjustments.
47 lines
2.8 KiB
Diff
47 lines
2.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Helvetica Volubi <suisuroru@blue-millennium.fun>
|
|
Date: Tue, 18 Nov 2025 00:35:13 +0800
|
|
Subject: [PATCH] Leaves: Prevent loss of item drops due to update suppression
|
|
when breaking blocks
|
|
|
|
Co-authored by: violetc <58360096+s-yh-china@users.noreply.github.com>
|
|
As a part of : Leaves (https://github.com/LeavesMC/Leaves/blob/ea91106ae57fc4cc14e2e0225009cf9919072f7f/leaves-server/minecraft-patches/features/0090-Servux-Protocol.patch)
|
|
Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html)
|
|
|
|
diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java
|
|
index e1de10e1a0ec221a1109a03d86fddf47b1c06a5f..71cc37515c268abd698896d514b66cb49859691c 100644
|
|
--- a/net/minecraft/server/level/ServerPlayerGameMode.java
|
|
+++ b/net/minecraft/server/level/ServerPlayerGameMode.java
|
|
@@ -392,7 +392,18 @@ public class ServerPlayerGameMode {
|
|
this.level.getCurrentWorldData().captureDrops = new java.util.ArrayList<>(); // Folia - region threading
|
|
// CraftBukkit end
|
|
BlockState adjustedState = block.playerWillDestroy(this.level, pos, state, this.player);
|
|
- boolean changed = this.level.removeBlock(pos, false);
|
|
+ // Lophine start - preserve drops before update suppression
|
|
+ boolean changed;
|
|
+ org.leavesmc.leaves.util.UpdateSuppressionException updateSuppressionException = null;
|
|
+ try {
|
|
+ changed = this.level.removeBlock(pos, false);
|
|
+ } catch (org.leavesmc.leaves.util.UpdateSuppressionException exception) {
|
|
+ updateSuppressionException = exception;
|
|
+ updateSuppressionException.provideBlock(this.level, pos, block);
|
|
+ updateSuppressionException.providePlayer(this.player);
|
|
+ changed = false;
|
|
+ }
|
|
+ // Lophine end - preserve drops before update suppression
|
|
if (SharedConstants.DEBUG_BLOCK_BREAK) {
|
|
LOGGER.info("server broke {} {} -> {}", pos, adjustedState, this.level.getBlockState(pos));
|
|
}
|
|
@@ -424,6 +435,11 @@ public class ServerPlayerGameMode {
|
|
if (event.isDropItems()) {
|
|
org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockDropItemEvent(bblock, bState, this.player, itemsToDrop); // Paper - capture all item additions to the world
|
|
}
|
|
+ // Lophine start - preserve drops before update suppression
|
|
+ if (updateSuppressionException != null) {
|
|
+ throw updateSuppressionException;
|
|
+ }
|
|
+ // Lophine end - preserve drops before update suppression
|
|
|
|
// Drop event experience
|
|
if (changed) {
|