From 9e03c076aea752b54d5d6d5cf640d6259f9a8b09 Mon Sep 17 00:00:00 2001 From: Ap_Tx <3045929398@qq.com> Date: Mon, 5 Oct 2026 19:23:34 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=BD=BD=E5=85=B7=E5=A0=86=E5=8F=A0?= =?UTF-8?q?=E6=94=B9=E4=B8=BASlot=E5=B1=82=EF=BC=8C=E4=BB=85=E7=8E=A9?= =?UTF-8?q?=E5=AE=B6=E8=83=8C=E5=8C=85=E5=8F=AF=E5=8F=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除全局ItemInstanceMixin(会让所有容器都叠)。新增SlotMixin:仅当container是玩家Inventory且物品是矿车/船时返回64。 --- .../mixin/item/ItemInstanceMixin.java | 40 ----------------- .../mixin/item/SlotMixin.java | 45 +++++++++++++++++++ src/main/resources/slsaddition.mixins.json | 2 +- 3 files changed, 46 insertions(+), 41 deletions(-) delete mode 100644 src/main/java/com/github/zly2006/carpetslsaddition/mixin/item/ItemInstanceMixin.java create mode 100644 src/main/java/com/github/zly2006/carpetslsaddition/mixin/item/SlotMixin.java diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/item/ItemInstanceMixin.java b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/item/ItemInstanceMixin.java deleted file mode 100644 index e389256..0000000 --- a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/item/ItemInstanceMixin.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.github.zly2006.carpetslsaddition.mixin.item; - -import com.github.zly2006.carpetslsaddition.SLSCarpetSettings; -import net.minecraft.world.item.BoatItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemInstance; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.MinecartItem; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -/** - * 载具堆叠:让矿车/船的物品可以堆叠到 64。 - * - *

26.1.2 的堆叠上限来自 {@code ItemInstance.getMaxStackSize()} 的 default 实现: - * 读取 {@code DataComponents.MAX_STACK_SIZE} 组件,默认 1(故矿车/船默认不堆叠)。 - * - *

本 mixin 注入该 default 方法:规则 {@code stackableVehicles} 开启时, - * 若物品是矿车({@link MinecartItem})或船({@link BoatItem}),返回 64。 - * 由于堆叠上限变大,同类载具在拾取/整理时会自动合并,实现"自动堆叠"。 - */ -@Mixin(ItemInstance.class) -public interface ItemInstanceMixin { - - @Inject(method = "getMaxStackSize", at = @At("HEAD"), cancellable = true) - private void stackableVehicles(CallbackInfoReturnable cir) { - if (!SLSCarpetSettings.stackableVehicles) { - return; - } - if (!((Object) this instanceof ItemStack stack)) { - return; - } - Item item = stack.getItem(); - if (item instanceof MinecartItem || item instanceof BoatItem) { - cir.setReturnValue(64); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/item/SlotMixin.java b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/item/SlotMixin.java new file mode 100644 index 0000000..9ec79cb --- /dev/null +++ b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/item/SlotMixin.java @@ -0,0 +1,45 @@ +package com.github.zly2006.carpetslsaddition.mixin.item; + +import com.github.zly2006.carpetslsaddition.SLSCarpetSettings; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.BoatItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.MinecartItem; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +/** + * 载具堆叠(仅玩家背包):矿车/船在【玩家背包】内可堆叠到 64,其他容器不堆叠。 + * + *

原理:{@code Slot.getMaxStackSize(ItemStack)} = min(容器上限, 物品上限)。 + * 载具的物品上限全局为 1(默认不叠)。本 mixin 在【容器是玩家背包 Inventory】且物品是载具时, + * 直接返回 64,绕过 min 限制。 + * + *

这样只有玩家背包(物品栏 36 格)内能叠,箱子/漏斗/潜影盒等其他容器不受影响。 + */ +@Mixin(Slot.class) +public abstract class SlotMixin { + + @Inject(method = "getMaxStackSize(Lnet/minecraft/world/item/ItemStack;)I", at = @At("HEAD"), cancellable = true) + private void stackableVehiclesInPlayerInventory(ItemStack stack, CallbackInfoReturnable cir) { + if (!SLSCarpetSettings.stackableVehicles) { + return; + } + if (stack == null || stack.isEmpty()) { + return; + } + Slot self = (Slot) (Object) this; + // 仅玩家背包 + if (!(self.container instanceof Inventory)) { + return; + } + Item item = stack.getItem(); + if (item instanceof MinecartItem || item instanceof BoatItem) { + cir.setReturnValue(64); + } + } +} \ No newline at end of file diff --git a/src/main/resources/slsaddition.mixins.json b/src/main/resources/slsaddition.mixins.json index af27894..dc88159 100644 --- a/src/main/resources/slsaddition.mixins.json +++ b/src/main/resources/slsaddition.mixins.json @@ -12,7 +12,7 @@ "block.MixinDecoratedPotBlock", "block.MixinTrialSpawnerData", "block.MixinTrialSpawnerState", - "item.ItemInstanceMixin", + "item.SlotMixin", "carpet.MixinEntityPlayerMPFake", "carpet.MixinPlayerCommand", "elytra.ItemAccessor",