From 00743c841f8d61c37194930e826a1f2d26581098 Mon Sep 17 00:00:00 2001 From: Helvetica Volubi Date: Fri, 14 Nov 2025 22:27:06 +0800 Subject: [PATCH] Update Luminol --- gradle.properties | 2 +- .../0003-Leaves-Item-overstack-util.patch | 211 +++++------------- ...-config-to-enable-raytracing-tracker.patch | 6 +- .../0011-Leaves-Item-overstack-util.patch | 8 +- .../features/0022-Leaves-Fakeplayer.patch | 8 +- .../0029-Leaves-Wool-Hopper-Counter.patch | 10 +- 6 files changed, 67 insertions(+), 178 deletions(-) diff --git a/gradle.properties b/gradle.properties index 3ca4b04..79e4b5e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ mcVersion=1.21.8 release=2 # 0 for skip release, 1 for pre-release, 2 for release -luminolRef=a3c596e26bfdf197a1c0c7a536c8a2bf7f97c09d +luminolRef=48368770092c9bd039406fc058ad4aa516e3692b org.gradle.configuration-cache=true org.gradle.caching=true diff --git a/lophine-server/luminol-patches/features/0003-Leaves-Item-overstack-util.patch b/lophine-server/luminol-patches/features/0003-Leaves-Item-overstack-util.patch index c2c4e44..1a54c6a 100644 --- a/lophine-server/luminol-patches/features/0003-Leaves-Item-overstack-util.patch +++ b/lophine-server/luminol-patches/features/0003-Leaves-Item-overstack-util.patch @@ -8,180 +8,69 @@ As a part of : Leaves (https://github.com/LeavesMC/Leaves/blob/d93e9766d3797d130 Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/src/main/java/org/leavesmc/leaves/util/ItemOverstackUtils.java b/src/main/java/org/leavesmc/leaves/util/ItemOverstackUtils.java -index 3a6314ed7f62c6473ce9ddc9deeee2a32b9d2893..23a0f8100eb3162331161635e8051981c4e34aed 100644 +index 112dc08eb62c4c50fb4859f51a366cedf027ca00..b5f661fd20b382725ad117c56ce2c94ded32b1b7 100644 --- a/src/main/java/org/leavesmc/leaves/util/ItemOverstackUtils.java +++ b/src/main/java/org/leavesmc/leaves/util/ItemOverstackUtils.java -@@ -17,12 +17,173 @@ +@@ -17,6 +17,7 @@ package org.leavesmc.leaves.util; +import fun.bm.lophine.config.modules.function.ContainerExpansionConfig; -+import net.minecraft.core.component.DataComponents; -+import net.minecraft.nbt.CompoundTag; -+import net.minecraft.world.entity.item.ItemEntity; -+import net.minecraft.world.item.BlockItem; - import net.minecraft.world.item.ItemStack; -+import net.minecraft.world.item.component.CustomData; -+import net.minecraft.world.item.component.ItemContainerContents; -+import net.minecraft.world.level.block.ShulkerBoxBlock; -+import org.jetbrains.annotations.NotNull; -+ -+import java.util.List; -+import java.util.Objects; -+import java.util.Optional; + import io.papermc.paper.datacomponent.DataComponentTypes; + import io.papermc.paper.datacomponent.item.ItemEnchantments; + import net.minecraft.core.component.DataComponents; +@@ -135,9 +136,9 @@ public class ItemOverstackUtils { - // Only the used part is retained - public class ItemOverstackUtils { -+ private static final List overstackUtils = List.of( -+ new ShulkerBox() -+ ); -+ -+ public static int getItemStackMaxCount(ItemStack stack) { -+ int size; -+ for (ItemUtil util : overstackUtils) { -+ if ((size = util.getMaxServerStackCount(stack)) != -1) { -+ return size; -+ } -+ } -+ return stack.getMaxStackSize(); -+ } -+ -+ public static int getNetworkMaxCount(ItemStack stack) { -+ int size; -+ for (ItemUtil util : overstackUtils) { -+ if ((size = util.getMaxClientStackCount(stack)) != -1) { -+ return size; -+ } -+ } -+ return stack.getMaxStackSize(); -+ } -+ -+ public static boolean tryStackItems(ItemEntity self, ItemEntity other) { -+ for (ItemUtil util : overstackUtils) { -+ if (util.tryStackItems(self, other)) { -+ return true; -+ } -+ } -+ return false; -+ } -+ -+ public static boolean hasOverstackingItem() { -+ return overstackUtils.stream().anyMatch(ItemUtil::isEnabled); -+ } -+ -+ public static int getItemStackMaxCountReal(ItemStack stack) { -+ CompoundTag nbt = Optional.ofNullable(stack.get(DataComponents.CUSTOM_DATA)).orElse(CustomData.EMPTY).copyTag(); -+ return nbt.getInt("Leaves.RealStackSize").orElse(stack.getMaxStackSize()); -+ } -+ -+ public static ItemStack encodeMaxStackSize(ItemStack itemStack) { -+ int realMaxStackSize = getItemStackMaxCountReal(itemStack); -+ int modifiedMaxStackSize = getNetworkMaxCount(itemStack); -+ if (itemStack.getMaxStackSize() != modifiedMaxStackSize) { -+ itemStack.set(DataComponents.MAX_STACK_SIZE, modifiedMaxStackSize); -+ CompoundTag nbt = itemStack.getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY).copyTag(); -+ nbt.putInt("Leaves.RealStackSize", realMaxStackSize); -+ itemStack.set(DataComponents.CUSTOM_DATA, CustomData.of(nbt)); -+ } -+ return itemStack; -+ } -+ -+ public static ItemStack decodeMaxStackSize(ItemStack itemStack) { -+ int realMaxStackSize = getItemStackMaxCountReal(itemStack); -+ if (itemStack.getMaxStackSize() != realMaxStackSize) { -+ itemStack.set(DataComponents.MAX_STACK_SIZE, realMaxStackSize); -+ CompoundTag nbt = itemStack.getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY).copyTag(); -+ nbt.remove("Leaves.RealStackSize"); -+ if (nbt.isEmpty()) { -+ itemStack.remove(DataComponents.CUSTOM_DATA); -+ } else { -+ itemStack.set(DataComponents.CUSTOM_DATA, CustomData.of(nbt)); -+ } -+ } -+ return itemStack; -+ } -+ - public static float getItemStackSignalStrength(int maxStackSize, ItemStack itemStack) { - float result = (float) itemStack.getCount() / Math.min(maxStackSize, itemStack.getMaxStackSize()); - return Math.clamp(result, 0f, 1f); - } -+ -+ public static boolean isStackable(ItemStack itemStack) { -+ return getItemStackMaxCount(itemStack) > 1 && (!itemStack.isDamageableItem() || !itemStack.isDamaged()); -+ } -+ -+ -+ private interface ItemUtil { -+ boolean isEnabled(); -+ -+ boolean tryStackItems(ItemEntity self, ItemEntity other); -+ -+ // number -> modified count, -1 -> I don't care -+ int getMaxServerStackCount(ItemStack stack); -+ -+ // number -> modified count, -1 -> I don't care -+ default int getMaxClientStackCount(ItemStack stack) { -+ return getMaxServerStackCount(stack); -+ } -+ } -+ -+ private static class ShulkerBox implements ItemUtil { -+ public static boolean shulkerBoxCheck(@NotNull ItemStack stack1, @NotNull ItemStack stack2) { + private static class ShulkerBox implements ItemUtil { + public static boolean shulkerBoxCheck(@NotNull ItemStack stack1, @NotNull ItemStack stack2) { +- /*if (LeavesConfig.modify.shulkerBox.sameNbtStackable) { + if (ContainerExpansionConfig.nbtShulkerStackable) { -+ return Objects.equals(stack1.getComponents(), stack2.getComponents()); + return Objects.equals(stack1.getComponents(), stack2.getComponents()); +- }*/ // Luminol + } -+ return shulkerBoxNoItem(stack1) && shulkerBoxNoItem(stack2) && Objects.equals(stack1.getComponents(), stack2.getComponents()); -+ } -+ -+ public static boolean shulkerBoxNoItem(@NotNull ItemStack stack) { -+ return stack.getComponents().getOrDefault(DataComponents.CONTAINER, ItemContainerContents.EMPTY).stream().findAny().isEmpty(); -+ } -+ -+ @Override -+ public boolean isEnabled() { + return shulkerBoxNoItem(stack1) && shulkerBoxNoItem(stack2) && Objects.equals(stack1.getComponents(), stack2.getComponents()); + } + +@@ -147,16 +148,15 @@ public class ItemOverstackUtils { + + @Override + public boolean isEnabled() { +- // return LeavesConfig.modify.shulkerBox.stackableShulkerBoxes > 1; // Luminol +- return false; // Luminol + return ContainerExpansionConfig.shulkerCount > 1; -+ } -+ -+ @Override -+ public boolean tryStackItems(ItemEntity self, ItemEntity other) { -+ ItemStack selfStack = self.getItem(); -+ if (!isEnabled() || + } + + @Override + public boolean tryStackItems(ItemEntity self, ItemEntity other) { + ItemStack selfStack = self.getItem(); + if (!isEnabled() || +- !(selfStack.getItem() instanceof net.minecraft.world.item.BlockItem blockItem) || +- !(blockItem.getBlock() instanceof net.minecraft.world.level.block.ShulkerBoxBlock) + !(selfStack.getItem() instanceof BlockItem blockItem) || + !(blockItem.getBlock() instanceof ShulkerBoxBlock) -+ ) { -+ return false; -+ } -+ -+ ItemStack otherStack = other.getItem(); -+ if (selfStack.getItem() == otherStack.getItem() -+ && shulkerBoxCheck(selfStack, otherStack) + ) { + return false; + } +@@ -164,8 +164,8 @@ public class ItemOverstackUtils { + ItemStack otherStack = other.getItem(); + if (selfStack.getItem() == otherStack.getItem() + && shulkerBoxCheck(selfStack, otherStack) +- && selfStack.getCount() != /*org.leavesmc.leaves.LeavesConfig.modify.shulkerBox.stackableShulkerBoxes*/ 1) { // Luminol +- int amount = Math.min(otherStack.getCount(), /*org.leavesmc.leaves.LeavesConfig.modify.shulkerBox.stackableShulkerBoxes*/1 - selfStack.getCount()); // Luminol + && selfStack.getCount() != ContainerExpansionConfig.shulkerCount) { + int amount = Math.min(otherStack.getCount(), ContainerExpansionConfig.shulkerCount - selfStack.getCount()); -+ -+ selfStack.grow(amount); -+ self.setItem(selfStack); -+ -+ self.pickupDelay = Math.max(other.pickupDelay, self.pickupDelay); -+ self.age = Math.min(other.getAge(), self.age); -+ -+ otherStack.shrink(amount); -+ if (otherStack.isEmpty()) { -+ other.discard(); -+ } else { -+ other.setItem(otherStack); -+ } -+ return true; -+ } -+ return false; -+ } -+ -+ @Override -+ public int getMaxServerStackCount(ItemStack stack) { -+ if (isEnabled() && stack.getItem() instanceof BlockItem bi && + + selfStack.grow(amount); + self.setItem(selfStack); +@@ -187,9 +187,8 @@ public class ItemOverstackUtils { + @Override + public int getMaxServerStackCount(ItemStack stack) { + if (isEnabled() && stack.getItem() instanceof BlockItem bi && +- bi.getBlock() instanceof ShulkerBoxBlock && (/*LeavesConfig.modify.shulkerBox.sameNbtStackable ||*/ shulkerBoxNoItem(stack))) { // Luminol +- // return LeavesConfig.modify.shulkerBox.stackableShulkerBoxes; // Luminol +- return 1; // Luminol + bi.getBlock() instanceof ShulkerBoxBlock && (ContainerExpansionConfig.nbtShulkerStackable || shulkerBoxNoItem(stack))) { + return ContainerExpansionConfig.shulkerCount; -+ } -+ return -1; -+ } -+ } - } + } + return -1; + } diff --git a/lophine-server/minecraft-patches/features/0003-Add-config-to-enable-raytracing-tracker.patch b/lophine-server/minecraft-patches/features/0003-Add-config-to-enable-raytracing-tracker.patch index 8aba0e9..4d83769 100644 --- a/lophine-server/minecraft-patches/features/0003-Add-config-to-enable-raytracing-tracker.patch +++ b/lophine-server/minecraft-patches/features/0003-Add-config-to-enable-raytracing-tracker.patch @@ -18,10 +18,10 @@ index 6868b915bf3deb85783a638d4441a15fea6da2dc..70740381c6501c1a518c52b24381edd1 double rangeY = level.paperConfig().entities.trackingRangeY.get(this.entity, -1); if (rangeY != -1) { diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index f5539ca5964abb18124522a8aa7ce940517b2011..1258591aae1b926ee8085b1984d553b8d3a1df7e 100644 +index ea177b8ad7ebb25e3e2967c8ff3d36dc3dda6a1d..861684a36e3277c31842f30c82ffd9d85e2fe3f8 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -147,7 +147,7 @@ import net.minecraft.world.waypoints.WaypointTransmitter; +@@ -146,7 +146,7 @@ import net.minecraft.world.waypoints.WaypointTransmitter; import org.jetbrains.annotations.Contract; import org.slf4j.Logger; @@ -30,7 +30,7 @@ index f5539ca5964abb18124522a8aa7ce940517b2011..1258591aae1b926ee8085b1984d553b8 // CraftBukkit start private static final int CURRENT_LEVEL = 2; public boolean preserveMotion = true; // Paper - Fix Entity Teleportation and cancel velocity if teleported; keep initial motion on first snapTo -@@ -6482,4 +6482,46 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -6462,4 +6462,46 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess // Paper end - Expose entity id counter public boolean shouldTickHot() { return this.tickCount > 20 * 10 && this.isAlive(); } // KioCG diff --git a/lophine-server/minecraft-patches/features/0011-Leaves-Item-overstack-util.patch b/lophine-server/minecraft-patches/features/0011-Leaves-Item-overstack-util.patch index 92475d5..20eb284 100644 --- a/lophine-server/minecraft-patches/features/0011-Leaves-Item-overstack-util.patch +++ b/lophine-server/minecraft-patches/features/0011-Leaves-Item-overstack-util.patch @@ -446,10 +446,10 @@ index 10b2cc20bbf3b70e4e09dbbe14b90506e6366158..1535bb8cec8692e8d26eaff090288f1b } diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index 699bb3cc2b680a4ee438a88c05854e5ab05ea910..d4fe03fd766caca1d7693a5317460ca1a9b9fa4f 100644 +index 3fd172f82216fa35c36e5f563819a6f01ffd4ea4..419bc939e19a306b33d4d387007c6acbae73fba3 100644 --- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -@@ -148,7 +148,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -144,7 +144,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen public void setItem(int index, ItemStack stack) { this.unpackLootTable(null); this.getItems().set(index, stack); @@ -458,7 +458,7 @@ index 699bb3cc2b680a4ee438a88c05854e5ab05ea910..d4fe03fd766caca1d7693a5317460ca1 } @Override -@@ -743,9 +743,9 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -740,9 +740,9 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen if (item.isEmpty()) { // Spigot start - SPIGOT-6693, SimpleContainer#setItem ItemStack leftover = ItemStack.EMPTY; // Paper - Make hoppers respect inventory max stack size @@ -469,4 +469,4 @@ index 699bb3cc2b680a4ee438a88c05854e5ab05ea910..d4fe03fd766caca1d7693a5317460ca1 + stack = stack.split(Math.min(destination.getMaxStackSize(), stack.getMaxStackSize())); // Leaves - item over-stack util } // Spigot end - //IGNORE_TILE_UPDATES.set(Boolean.TRUE); // Paper - Perf: Optimize Hoppers // Folia - region threading // Luminol - Use vanilla hopper logic + //IGNORE_TILE_UPDATES.set(Boolean.TRUE); // Paper - Perf: Optimize Hoppers // Folia - region threading // Luminol - vanilla hopper diff --git a/lophine-server/minecraft-patches/features/0022-Leaves-Fakeplayer.patch b/lophine-server/minecraft-patches/features/0022-Leaves-Fakeplayer.patch index a868dd9..01d18f3 100644 --- a/lophine-server/minecraft-patches/features/0022-Leaves-Fakeplayer.patch +++ b/lophine-server/minecraft-patches/features/0022-Leaves-Fakeplayer.patch @@ -266,7 +266,7 @@ index 70740381c6501c1a518c52b24381edd16792507f..5e31b499a894113b4be1982a1071348f } } diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 4f1976c47a087bf4f36687124ef29ca7b664f682..96aafe4d63446b3d212f21f14091858f72bb081f 100644 +index d1a799199a68771ae3130a30a59625587c11b0b0..edf29b1a8a6cbadff6a65f0483e28ec72a78594d 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -207,6 +207,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @@ -548,10 +548,10 @@ index 52fd730998535ea071bfc99b7cc2c254b9b656d7..0abf6f0265fcb916f2c2c76fb1313bd1 for (WaypointTransmitter waypointTransmitter : this.waypoints) { diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 1258591aae1b926ee8085b1984d553b8d3a1df7e..365cb2aed3d0f428ba33d4debdf3c3a3c494882d 100644 +index 861684a36e3277c31842f30c82ffd9d85e2fe3f8..da1b004c1f66437534f3180b6d3f3a054b7c6945 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -1225,7 +1225,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -1224,7 +1224,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess BlockPos onPosLegacy = this.getOnPosLegacy(); BlockState blockState = this.level().getBlockState(onPosLegacy); @@ -560,7 +560,7 @@ index 1258591aae1b926ee8085b1984d553b8d3a1df7e..365cb2aed3d0f428ba33d4debdf3c3a3 this.checkFallDamage(vec3.y, this.onGround(), blockState, onPosLegacy); } -@@ -1539,7 +1539,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -1538,7 +1538,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } // Paper start - optimise collisions diff --git a/lophine-server/minecraft-patches/features/0029-Leaves-Wool-Hopper-Counter.patch b/lophine-server/minecraft-patches/features/0029-Leaves-Wool-Hopper-Counter.patch index 06d6f74..2082017 100644 --- a/lophine-server/minecraft-patches/features/0029-Leaves-Wool-Hopper-Counter.patch +++ b/lophine-server/minecraft-patches/features/0029-Leaves-Wool-Hopper-Counter.patch @@ -10,10 +10,10 @@ 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 d4fe03fd766caca1d7693a5317460ca1a9b9fa4f..a821deaa5c076151336762d17a8da45abb4c43cd 100644 +index 419bc939e19a306b33d4d387007c6acbae73fba3..96445438c5b4202e3fc93bece778ad0d7312d41c 100644 --- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -@@ -232,8 +232,30 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -228,8 +228,30 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen flag |= validator.getAsBoolean(); // Paper - note: this is not a validator, it's what adds/sucks in items } @@ -44,7 +44,7 @@ index d4fe03fd766caca1d7693a5317460ca1a9b9fa4f..a821deaa5c076151336762d17a8da45a setChanged(level, pos, state); // Leaves start - Lithium Sleeping Block Entity if (me.earthme.luminol.config.modules.optimizations.LeavesSleepingBlockEntityConfig.enabled -@@ -465,6 +487,13 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -461,6 +483,13 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen // Paper end - Perf: Optimize Hoppers private static boolean ejectItems(Level level, BlockPos pos, HopperBlockEntity blockEntity) { @@ -58,7 +58,7 @@ index d4fe03fd766caca1d7693a5317460ca1a9b9fa4f..a821deaa5c076151336762d17a8da45a Container attachedContainer = me.earthme.luminol.config.modules.optimizations.LeavesSleepingBlockEntityConfig.enabled ? blockEntity.getInsertInventory(level) : getAttachedContainer(level, pos, blockEntity); // Leaves - Lithium Sleeping Block Entity if (attachedContainer == null) { return false; -@@ -541,6 +570,26 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -536,6 +565,26 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen } } @@ -85,7 +85,7 @@ index d4fe03fd766caca1d7693a5317460ca1a9b9fa4f..a821deaa5c076151336762d17a8da45a private static int[] getSlots(Container container, Direction direction) { if (container instanceof WorldlyContainer worldlyContainer) { return worldlyContainer.getSlotsForFace(direction); -@@ -683,6 +732,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -680,6 +729,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen } public static boolean addItem(Container container, ItemEntity item) {