From e5aba7eb5cab37eaab4bb72529aa22d72d6d3248 Mon Sep 17 00:00:00 2001 From: MC_XiaoHei Date: Fri, 1 Aug 2025 13:41:00 +0800 Subject: [PATCH] feat: hopper counter unlimited speed(#625) (#639) * feat: hopper counter unlimited speed * fix: fix checkout err * fix: fix comment * chore: format --- .../features/0078-Wool-Hopper-Counter.patch | 45 +++++++++++++++++-- .../features/0095-Vanilla-hopper.patch | 4 +- .../0096-Old-hopper-suckin-behavior.patch | 4 +- .../0141-Lithium-Sleeping-Block-Entity.patch | 16 +++---- .../org/leavesmc/leaves/LeavesConfig.java | 13 +++++- .../command/subcommands/CounterCommand.java | 2 +- .../leavesmc/leaves/util/HopperCounter.java | 2 +- 7 files changed, 67 insertions(+), 19 deletions(-) diff --git a/leaves-server/minecraft-patches/features/0078-Wool-Hopper-Counter.patch b/leaves-server/minecraft-patches/features/0078-Wool-Hopper-Counter.patch index 85b9b0d3..579735ea 100644 --- a/leaves-server/minecraft-patches/features/0078-Wool-Hopper-Counter.patch +++ b/leaves-server/minecraft-patches/features/0078-Wool-Hopper-Counter.patch @@ -6,10 +6,41 @@ Subject: [PATCH] Wool Hopper Counter This patch is Powered by fabric-carpet(https://github.com/gnembon/fabric-carpet) diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index ea64414708d7034ccbc0e93a344d17c851f78add..47281ac61c6a462a47c60cc51f48440d3691effd 100644 +index d152ad88e8e873a0164b2394516bd10f23c7b263..f1388ad51b7549e881cae36a5a9bcd4229442f3e 100644 --- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -@@ -432,6 +432,13 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -205,8 +205,30 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + flag |= validator.getAsBoolean(); // Paper - note: this is not a validator, it's what adds/sucks in items + } + ++ // Leaves start - Wool hopper counter ++ if (org.leavesmc.leaves.LeavesConfig.modify.hopperCounter.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled()) { ++ net.minecraft.world.item.DyeColor woolColor = org.leavesmc.leaves.util.WoolUtils.getWoolColorAtPosition(level, blockEntity.getBlockPos().relative(state.getValue(HopperBlock.FACING))); ++ if (woolColor != null) { ++ for (int i = 0; i < Short.MAX_VALUE; i++) { ++ flag |= suckInItems(level, blockEntity); ++ if (!flag) { ++ break; ++ } else { ++ woolHopperCounter(level, pos, state, HopperBlockEntity.getContainerAt(level, pos)); ++ } ++ } ++ } ++ } ++ // Leaves end - Wool hopper counter ++ + if (flag) { + blockEntity.setCooldown(level.spigotConfig.hopperTransfer); // Spigot ++ // Leaves start - Wool hopper counter ++ if (org.leavesmc.leaves.LeavesConfig.modify.hopperCounter.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled() && woolHopperCounter(level, pos, state, HopperBlockEntity.getContainerAt(level, pos))) { ++ blockEntity.setCooldown(0); ++ return true; ++ } ++ // Leaves end - Wool hopper counter + setChanged(level, pos, state); + // Leaves start - pca + if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { +@@ -432,6 +454,13 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen // Paper end - Perf: Optimize Hoppers private static boolean ejectItems(Level level, BlockPos pos, HopperBlockEntity blockEntity) { @@ -23,7 +54,7 @@ index ea64414708d7034ccbc0e93a344d17c851f78add..47281ac61c6a462a47c60cc51f48440d Container attachedContainer = getAttachedContainer(level, pos, blockEntity); if (attachedContainer == null) { return false; -@@ -498,6 +505,26 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -498,6 +527,26 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen } } @@ -50,3 +81,11 @@ index ea64414708d7034ccbc0e93a344d17c851f78add..47281ac61c6a462a47c60cc51f48440d private static int[] getSlots(Container container, Direction direction) { if (container instanceof WorldlyContainer worldlyContainer) { return worldlyContainer.getSlotsForFace(direction); +@@ -632,6 +681,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + } + + public static boolean addItem(Container container, ItemEntity item) { ++ if (org.leavesmc.leaves.LeavesConfig.modify.hopperCounter.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled() && item.isRemoved()) return false; // Leaves - Wool hopper counter + boolean flag = false; + // CraftBukkit start + if (org.bukkit.event.inventory.InventoryPickupItemEvent.getHandlerList().getRegisteredListeners().length > 0) { // Paper - optimize hoppers diff --git a/leaves-server/minecraft-patches/features/0095-Vanilla-hopper.patch b/leaves-server/minecraft-patches/features/0095-Vanilla-hopper.patch index 8b75725c..490d7088 100644 --- a/leaves-server/minecraft-patches/features/0095-Vanilla-hopper.patch +++ b/leaves-server/minecraft-patches/features/0095-Vanilla-hopper.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Vanilla hopper This is a temporary solution designed to attempt to restore the vanilla behavior of the funnel while preserving optimizations as much as possible. It should ultimately be replaced by the optimization solution provided by lithium. diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index 47281ac61c6a462a47c60cc51f48440d3691effd..86d14299f7c3b0ba52adebdad07f14fc46f794dd 100644 +index f1388ad51b7549e881cae36a5a9bcd4229442f3e..b24945b48ecb1a610afa850de5dd833b61bda1d9 100644 --- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -@@ -285,36 +285,48 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -307,36 +307,48 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen ItemStack movedItem = origItemStack; final int originalItemCount = origItemStack.getCount(); final int movedItemCount = Math.min(level.spigotConfig.hopperAmount, originalItemCount); diff --git a/leaves-server/minecraft-patches/features/0096-Old-hopper-suckin-behavior.patch b/leaves-server/minecraft-patches/features/0096-Old-hopper-suckin-behavior.patch index e47b526e..2d791526 100644 --- a/leaves-server/minecraft-patches/features/0096-Old-hopper-suckin-behavior.patch +++ b/leaves-server/minecraft-patches/features/0096-Old-hopper-suckin-behavior.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Old hopper suckin behavior diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index 86d14299f7c3b0ba52adebdad07f14fc46f794dd..44f442c301dff256d7b328f87d6d9ff3a086fed0 100644 +index b24945b48ecb1a610afa850de5dd833b61bda1d9..f6df4c049ed3460eb437a4637c122a5880f2bdbc 100644 --- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -@@ -597,7 +597,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -619,7 +619,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen return false; } else { diff --git a/leaves-server/minecraft-patches/features/0141-Lithium-Sleeping-Block-Entity.patch b/leaves-server/minecraft-patches/features/0141-Lithium-Sleeping-Block-Entity.patch index 61e6bb9d..f9984fcd 100644 --- a/leaves-server/minecraft-patches/features/0141-Lithium-Sleeping-Block-Entity.patch +++ b/leaves-server/minecraft-patches/features/0141-Lithium-Sleeping-Block-Entity.patch @@ -1406,7 +1406,7 @@ index 363d85c96bd3fb1a1945595df36e30bd6dd2fa4e..542910b3d5faa85f2b14022932c058bc + // Leaves end - Lithium Sleeping Block Entity } diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index a900cde0d7e6ddd6faf961e7861c3cc499164d7a..4f87c15d5ffdb23c97bbeb68bc42c029eba06277 100644 +index d8eede6272ee712c81ed9429539837fdbd27bfcd..2bd773aafba7ad1bb66a4e77b45df281ead98dda 100644 --- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java @@ -27,8 +27,30 @@ import net.minecraft.world.level.block.state.BlockState; @@ -1458,7 +1458,7 @@ index a900cde0d7e6ddd6faf961e7861c3cc499164d7a..4f87c15d5ffdb23c97bbeb68bc42c029 if (!result && blockEntity.level.spigotConfig.hopperCheck > 1) { blockEntity.setCooldown(blockEntity.level.spigotConfig.hopperCheck); } -@@ -218,6 +242,14 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -240,6 +264,14 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(blockEntity); } // Leaves end - pca @@ -1473,7 +1473,7 @@ index a900cde0d7e6ddd6faf961e7861c3cc499164d7a..4f87c15d5ffdb23c97bbeb68bc42c029 return true; } } -@@ -456,11 +488,19 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -478,11 +510,19 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen } } // Leaves end - hopper counter @@ -1494,7 +1494,7 @@ index a900cde0d7e6ddd6faf961e7861c3cc499164d7a..4f87c15d5ffdb23c97bbeb68bc42c029 if (isFullContainer(attachedContainer, opposite)) { return false; } else { -@@ -589,9 +629,17 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -611,9 +651,17 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen public static boolean suckInItems(Level level, Hopper hopper) { BlockPos blockPos = BlockPos.containing(hopper.getLevelX(), hopper.getLevelY() + 1.0, hopper.getLevelZ()); BlockState blockState = level.getBlockState(blockPos); @@ -1513,7 +1513,7 @@ index a900cde0d7e6ddd6faf961e7861c3cc499164d7a..4f87c15d5ffdb23c97bbeb68bc42c029 skipPullModeEventFire = skipHopperEvents; // Paper - Perf: Optimize Hoppers for (int i : getSlots(sourceContainer, direction)) { -@@ -604,7 +652,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -626,7 +674,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen } else { boolean flag = hopper.isGridAligned() && (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldHopperSuckInBehavior && blockState.isCollisionShapeFullBlock(level, blockPos)) && !blockState.is(BlockTags.DOES_NOT_BLOCK_HOPPERS); // Leaves - oldHopperSuckInBehavior if (!flag) { @@ -1522,7 +1522,7 @@ index a900cde0d7e6ddd6faf961e7861c3cc499164d7a..4f87c15d5ffdb23c97bbeb68bc42c029 if (addItem(hopper, itemEntity)) { return true; } -@@ -900,6 +948,19 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -923,6 +971,19 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen } public void setCooldown(int cooldownTime) { @@ -1542,7 +1542,7 @@ index a900cde0d7e6ddd6faf961e7861c3cc499164d7a..4f87c15d5ffdb23c97bbeb68bc42c029 this.cooldownTime = cooldownTime; } -@@ -919,6 +980,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -942,6 +1003,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen @Override protected void setItems(NonNullList items) { this.items = items; @@ -1550,7 +1550,7 @@ index a900cde0d7e6ddd6faf961e7861c3cc499164d7a..4f87c15d5ffdb23c97bbeb68bc42c029 } public static void entityInside(Level level, BlockPos pos, BlockState state, Entity entity, HopperBlockEntity blockEntity) { -@@ -933,4 +995,731 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -956,4 +1018,731 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen protected AbstractContainerMenu createMenu(int id, Inventory player) { return new HopperMenu(id, player, this); } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/LeavesConfig.java b/leaves-server/src/main/java/org/leavesmc/leaves/LeavesConfig.java index 8385b86e..75d0b86a 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/LeavesConfig.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/LeavesConfig.java @@ -620,8 +620,17 @@ public final class LeavesConfig { @GlobalConfig("bow-infinity-fix") public boolean bowInfinityFix = false; - @GlobalConfig("hopper-counter") - public boolean hopperCounter = false; + public HopperCounterConfig hopperCounter = new HopperCounterConfig(); + + @GlobalConfigCategory("hopper-counter") + public static class HopperCounterConfig { + @RemovedConfig(name = "hopper-counter", category = "modify", transform = true) + @GlobalConfig("enabled") + public boolean enabled = false; + + @GlobalConfig("unlimited-speed") + public boolean unlimitedSpeed = false; + } @GlobalConfig(value = "spider-jockeys-drop-gapples", validator = JockeysDropGAppleValidator.class) public double spiderJockeysDropGapples = -1.0; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/CounterCommand.java b/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/CounterCommand.java index b0135c42..2782f799 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/CounterCommand.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/command/subcommands/CounterCommand.java @@ -101,6 +101,6 @@ public class CounterCommand implements LeavesSubcommand { @Override public boolean isEnabled() { - return LeavesConfig.modify.hopperCounter; + return LeavesConfig.modify.hopperCounter.enabled; } } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/util/HopperCounter.java b/leaves-server/src/main/java/org/leavesmc/leaves/util/HopperCounter.java index 2dac5712..9579966d 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/util/HopperCounter.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/util/HopperCounter.java @@ -339,6 +339,6 @@ public class HopperCounter { } public static boolean isEnabled() { - return LeavesConfig.modify.hopperCounter && enabled; + return LeavesConfig.modify.hopperCounter.enabled && enabled; } }