From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Helvetica Volubi Date: Mon, 27 Oct 2025 15:38:29 +0800 Subject: [PATCH] Leaves: Wool Hopper Counter Co-authored by: violetc <58360096+s-yh-china@users.noreply.github.com> As a part of : Leaves (https://github.com/LeavesMC/Leaves) Licensed under: MIT 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 7d35b299533640338aeea6e5617942e89269d048..569f96a1b0b8a03b6a70775f4b7f58a66feed939 100644 --- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java @@ -240,8 +240,30 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen changed |= action.getAsBoolean(); } + // Leaves start - Wool hopper counter + if (fun.bm.lophine.config.modules.function.WoolHopperCounterConfig.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled()) { + net.minecraft.world.item.DyeColor woolColor = org.leavesmc.leaves.util.WoolUtils.getWoolColorAtPosition(level, entity.getBlockPos().relative(state.getValue(HopperBlock.FACING))); + if (woolColor != null) { + for (int i = 0; i < Short.MAX_VALUE; i++) { + changed |= suckInItems(level, entity); + if (!changed) { + break; + } else { + woolHopperCounter(level, pos, state, HopperBlockEntity.getContainerAt(level, pos)); + } + } + } + } + // Leaves end - Wool hopper counter + if (changed) { entity.setCooldown(level.spigotConfig.hopperTransfer); // Spigot + // Leaves start - Wool hopper counter + if (fun.bm.lophine.config.modules.function.WoolHopperCounterConfig.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled() && woolHopperCounter(level, pos, state, HopperBlockEntity.getContainerAt(level, pos))) { + entity.setCooldown(0); + return true; + } + // Leaves end - Wool hopper counter setChanged(level, pos, state); // Leaves start - Lithium Sleeping Block Entity if (me.earthme.luminol.config.modules.optimizations.LeavesSleepingBlockEntityConfig.enabled @@ -491,6 +513,13 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen // Paper end - Perf: Optimize Hoppers private static boolean ejectItems(final Level level, final BlockPos blockPos, final HopperBlockEntity self) { + // Leaves start - hopper counter + if (org.leavesmc.leaves.util.HopperCounter.isEnabled()) { + if (woolHopperCounter(level, blockPos, level.getBlockState(blockPos), HopperBlockEntity.getContainerAt(level, blockPos))) { + return true; + } + } + // Leaves end - hopper counter Container container = me.earthme.luminol.config.modules.optimizations.LeavesSleepingBlockEntityConfig.enabled ? self.getInsertInventory(level) : getAttachedContainer(level, blockPos, self); // Leaves - Lithium Sleeping Block Entity if (container == null) { return false; @@ -512,6 +541,26 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen return hopperPush(level, container, direction, self); // Paper - Perf: Optimize Hoppers } + // Leaves start - hopper counter + private static boolean woolHopperCounter(Level level, BlockPos blockPos, BlockState state, @Nullable Container container) { + if (container == null) { + return false; + } + net.minecraft.world.item.DyeColor woolColor = org.leavesmc.leaves.util.WoolUtils.getWoolColorAtPosition(level, blockPos.relative(state.getValue(HopperBlock.FACING))); + if (woolColor != null) { + for (int i = 0; i < container.getContainerSize(); ++i) { + if (!container.getItem(i).isEmpty()) { + ItemStack itemstack = container.getItem(i); + org.leavesmc.leaves.util.HopperCounter.getCounter(woolColor).add(level.getServer(), itemstack); + container.setItem(i, ItemStack.EMPTY); + } + } + return true; + } + return false; + } + // Leaves end - hopper counter + private static int[] getSlots(final Container container, final Direction direction) { if (container instanceof WorldlyContainer worldlyContainer) { return worldlyContainer.getSlotsForFace(direction); @@ -606,6 +655,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen } public static boolean addItem(final Container container, final ItemEntity entity) { + if (fun.bm.lophine.config.modules.function.WoolHopperCounterConfig.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled() && entity.isRemoved()) return false; // Leaves - Wool hopper counter boolean changed = false; // CraftBukkit start if (org.bukkit.event.inventory.InventoryPickupItemEvent.getHandlerList().getRegisteredListeners().length > 0) { // Paper - optimize hoppers