From 704fd70d0c03c7d5cdd76e62155544a75a210610 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Mon, 14 Sep 2026 11:16:25 +0700 Subject: [PATCH 01/33] add new mixin recreating brewing stand shift click behavior --- .../v1_3_2/MixinBrewingStandMenu.java | 54 +++++++++++++++++++ .../v1_6_1/MixinAbstractContainerScreen.java | 40 -------------- src/main/resources/viafabricplus.mixins.json | 2 +- 3 files changed, 55 insertions(+), 41 deletions(-) create mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinBrewingStandMenu.java delete mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_6_1/MixinAbstractContainerScreen.java diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinBrewingStandMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinBrewingStandMenu.java new file mode 100644 index 000000000..4abfd95c0 --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinBrewingStandMenu.java @@ -0,0 +1,54 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus + * Copyright (C) 2021-2026 the original authors + * - Florian Reuth + * - RK_01/RaphiMC + * Copyright (C) 2023-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.viaversion.viafabricplus.injection.mixin.features.v1_3_2; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.viaversion.viafabricplus.ViaFabricPlus; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.BrewingStandMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.raphimc.vialegacy.api.LegacyProtocolVersion; +import org.jspecify.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(BrewingStandMenu.class) +public abstract class MixinBrewingStandMenu extends AbstractContainerMenu { + + protected MixinBrewingStandMenu(@Nullable final MenuType menuType, final int containerId) { + super(menuType, containerId); + } + + @WrapOperation(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;mayPlace(Lnet/minecraft/world/item/ItemStack;)Z")) + private boolean disableShiftClickIngredientSlot(Slot instance, ItemStack itemStack, Operation original) { + return original.call(instance, itemStack) && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2); + } + + @WrapOperation(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/BrewingStandMenu$PotionSlot;mayPlaceItem(Lnet/minecraft/world/item/ItemStack;)Z")) + private boolean disableShiftClickPotionSlot(ItemStack itemStack, Operation original) { + return original.call(itemStack) && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2); + } +} diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_6_1/MixinAbstractContainerScreen.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_6_1/MixinAbstractContainerScreen.java deleted file mode 100644 index 7af719768..000000000 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_6_1/MixinAbstractContainerScreen.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus - * Copyright (C) 2021-2026 the original authors - * - Florian Reuth - * - RK_01/RaphiMC - * Copyright (C) 2023-2026 ViaVersion and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.viaversion.viafabricplus.injection.mixin.features.v1_6_1; - -import com.viaversion.viafabricplus.ViaFabricPlus; -import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; -import net.minecraft.client.input.MouseButtonEvent; -import net.raphimc.vialegacy.api.LegacyProtocolVersion; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(AbstractContainerScreen.class) -public abstract class MixinAbstractContainerScreen { - - @Redirect(method = {"mouseClicked", "mouseReleased"}, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/input/MouseButtonEvent;hasShiftDown()Z")) - private boolean disableShiftClickItems(final MouseButtonEvent instance) { - return instance.hasShiftDown() && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_6_1); - } - -} diff --git a/src/main/resources/viafabricplus.mixins.json b/src/main/resources/viafabricplus.mixins.json index 5bd10b01f..cd1b55126 100644 --- a/src/main/resources/viafabricplus.mixins.json +++ b/src/main/resources/viafabricplus.mixins.json @@ -337,13 +337,13 @@ "features.v1_21_9.movement.MixinLocalPlayer", "features.v1_2_1.MixinAbstractFurnaceMenu", "features.v1_3_1.MixinServerRedirectHandler", + "features.v1_3_2.MixinBrewingStandMenu", "features.v1_4_2.MixinAbstractContainerScreen", "features.v1_4_2.MixinChestBlock", "features.v1_4_2.MixinEnderChestBlock", "features.v1_4_6.MixinBlockBehaviour", "features.v1_5.MixinAbstractContainerScreen", "features.v1_5_2.MixinLocalPlayer", - "features.v1_6_1.MixinAbstractContainerScreen", "features.v1_6_4.MixinEntityPacketRewriter1_20_5", "features.v1_7_6.MixinCarpetBlock", "features.v1_7_6.MixinMinecraft", From 0736c16231c934412d0ea06ee99d23734d174db7 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Mon, 14 Sep 2026 11:42:57 +0700 Subject: [PATCH 02/33] add new mixin recreating armor slots shift click behavior on pre 1.3.2 --- .../v1_3_2/MixinBrewingStandMenu.java | 1 - .../features/v1_3_2/MixinInventoryMenu.java | 46 +++++++++++++++++++ src/main/resources/viafabricplus.mixins.json | 1 + 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinInventoryMenu.java diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinBrewingStandMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinBrewingStandMenu.java index 4abfd95c0..a13039c2c 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinBrewingStandMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinBrewingStandMenu.java @@ -33,7 +33,6 @@ import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(BrewingStandMenu.class) public abstract class MixinBrewingStandMenu extends AbstractContainerMenu { diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinInventoryMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinInventoryMenu.java new file mode 100644 index 000000000..4bf0d2d68 --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinInventoryMenu.java @@ -0,0 +1,46 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus + * Copyright (C) 2021-2026 the original authors + * - Florian Reuth + * - RK_01/RaphiMC + * Copyright (C) 2023-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.viaversion.viafabricplus.injection.mixin.features.v1_3_2; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.viaversion.viafabricplus.ViaFabricPlus; +import net.minecraft.world.inventory.AbstractCraftingMenu; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.Slot; +import net.raphimc.vialegacy.api.LegacyProtocolVersion; +import org.jspecify.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(InventoryMenu.class) +public abstract class MixinInventoryMenu extends AbstractCraftingMenu { + public MixinInventoryMenu(final MenuType menuType, final int containerId, final int width, final int height) { + super(menuType, containerId, width, height); + } + + @WrapOperation(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z", ordinal = 1)) + private boolean disableShiftClickArmor(Slot instance, Operation original) { + return ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2) || original.call(instance); + } +} diff --git a/src/main/resources/viafabricplus.mixins.json b/src/main/resources/viafabricplus.mixins.json index cd1b55126..0608fe055 100644 --- a/src/main/resources/viafabricplus.mixins.json +++ b/src/main/resources/viafabricplus.mixins.json @@ -338,6 +338,7 @@ "features.v1_2_1.MixinAbstractFurnaceMenu", "features.v1_3_1.MixinServerRedirectHandler", "features.v1_3_2.MixinBrewingStandMenu", + "features.v1_3_2.MixinInventoryMenu", "features.v1_4_2.MixinAbstractContainerScreen", "features.v1_4_2.MixinChestBlock", "features.v1_4_2.MixinEnderChestBlock", From 67fac608b0a6bdf90756923313cb147b815a77f4 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Mon, 14 Sep 2026 11:56:04 +0700 Subject: [PATCH 03/33] remove unnecessary extends and fix styling? --- .../mixin/features/v1_3_2/MixinBrewingStandMenu.java | 1 + .../mixin/features/v1_3_2/MixinInventoryMenu.java | 7 ++----- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinBrewingStandMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinBrewingStandMenu.java index a13039c2c..07f1ba501 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinBrewingStandMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinBrewingStandMenu.java @@ -50,4 +50,5 @@ private boolean disableShiftClickIngredientSlot(Slot instance, ItemStack itemSta private boolean disableShiftClickPotionSlot(ItemStack itemStack, Operation original) { return original.call(itemStack) && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2); } + } diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinInventoryMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinInventoryMenu.java index 4bf0d2d68..4cf660752 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinInventoryMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinInventoryMenu.java @@ -29,18 +29,15 @@ import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.Slot; import net.raphimc.vialegacy.api.LegacyProtocolVersion; -import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @Mixin(InventoryMenu.class) -public abstract class MixinInventoryMenu extends AbstractCraftingMenu { - public MixinInventoryMenu(final MenuType menuType, final int containerId, final int width, final int height) { - super(menuType, containerId, width, height); - } +public class MixinInventoryMenu { @WrapOperation(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z", ordinal = 1)) private boolean disableShiftClickArmor(Slot instance, Operation original) { return ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2) || original.call(instance); } + } From 5ed2fdd594a51ec1a1fb8f6bfb4195744403db43 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Mon, 14 Sep 2026 11:56:22 +0700 Subject: [PATCH 04/33] remove unused imports --- .../injection/mixin/features/v1_3_2/MixinInventoryMenu.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinInventoryMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinInventoryMenu.java index 4cf660752..9cff3c2e3 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinInventoryMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinInventoryMenu.java @@ -24,9 +24,7 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.viaversion.viafabricplus.ViaFabricPlus; -import net.minecraft.world.inventory.AbstractCraftingMenu; import net.minecraft.world.inventory.InventoryMenu; -import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.Slot; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import org.spongepowered.asm.mixin.Mixin; From ba8adb68762470a6be1746d06f7ba89d15aeaf5a Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Mon, 14 Sep 2026 12:05:12 +0700 Subject: [PATCH 05/33] add mixins that recreates chest shift click behavior before b1.5 --- .../mixin/features/b1_5/MixinChestMenu.java | 41 +++++++++++++++++++ src/main/resources/viafabricplus.mixins.json | 1 + 2 files changed, 42 insertions(+) create mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java new file mode 100644 index 000000000..7e61923e1 --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java @@ -0,0 +1,41 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus + * Copyright (C) 2021-2026 the original authors + * - Florian Reuth + * - RK_01/RaphiMC + * Copyright (C) 2023-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.viaversion.viafabricplus.injection.mixin.features.b1_5; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.viaversion.viafabricplus.ViaFabricPlus; +import net.minecraft.world.inventory.ChestMenu; +import net.minecraft.world.inventory.Slot; +import net.raphimc.vialegacy.api.LegacyProtocolVersion; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(ChestMenu.class) +public class MixinChestMenu { + + @WrapOperation(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z")) + private boolean disableShiftClickInChests(Slot instance, Operation original) { + return original.call(instance) && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.b1_5tob1_5_2); + } + +} diff --git a/src/main/resources/viafabricplus.mixins.json b/src/main/resources/viafabricplus.mixins.json index 0608fe055..03d2d3bc0 100644 --- a/src/main/resources/viafabricplus.mixins.json +++ b/src/main/resources/viafabricplus.mixins.json @@ -38,6 +38,7 @@ "core.integration.event.MixinMinecraft", "core.integration.sync_tasks.MixinClientCommonPacketListenerImpl", "core.performance.MixinServerStatusPinger", + "features.b1_5.MixinChestMenu", "features.b1_5.MixinLivingEntity", "features.b1_7.MixinBowItem", "features.b1_7.MixinHud", From 5e928ad06705de3783e1f648a9c35b9a8066f1ab Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Mon, 14 Sep 2026 12:26:20 +0700 Subject: [PATCH 06/33] move the 1.3.2 mixins to the 1.3.1 folder + add a mixin recreating the creative tab menu shift click behavior pre 1.3.2 --- .../MixinBrewingStandMenu.java | 2 +- .../MixinInventoryMenu.java | 2 +- .../features/v1_3_1/MixinItemPickerMenu.java | 41 +++++++++++++++++++ src/main/resources/viafabricplus.mixins.json | 5 ++- 4 files changed, 46 insertions(+), 4 deletions(-) rename src/main/java/com/viaversion/viafabricplus/injection/mixin/features/{v1_3_2 => v1_3_1}/MixinBrewingStandMenu.java (99%) rename src/main/java/com/viaversion/viafabricplus/injection/mixin/features/{v1_3_2 => v1_3_1}/MixinInventoryMenu.java (99%) create mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinItemPickerMenu.java diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinBrewingStandMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinBrewingStandMenu.java similarity index 99% rename from src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinBrewingStandMenu.java rename to src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinBrewingStandMenu.java index 07f1ba501..c98f3b1aa 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinBrewingStandMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinBrewingStandMenu.java @@ -19,7 +19,7 @@ * along with this program. If not, see . */ -package com.viaversion.viafabricplus.injection.mixin.features.v1_3_2; +package com.viaversion.viafabricplus.injection.mixin.features.v1_3_1; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinInventoryMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinInventoryMenu.java similarity index 99% rename from src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinInventoryMenu.java rename to src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinInventoryMenu.java index 9cff3c2e3..1d923949e 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_2/MixinInventoryMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinInventoryMenu.java @@ -19,7 +19,7 @@ * along with this program. If not, see . */ -package com.viaversion.viafabricplus.injection.mixin.features.v1_3_2; +package com.viaversion.viafabricplus.injection.mixin.features.v1_3_1; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinItemPickerMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinItemPickerMenu.java new file mode 100644 index 000000000..74ca1a6a7 --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinItemPickerMenu.java @@ -0,0 +1,41 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus + * Copyright (C) 2021-2026 the original authors + * - Florian Reuth + * - RK_01/RaphiMC + * Copyright (C) 2023-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.viaversion.viafabricplus.injection.mixin.features.v1_3_1; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.viaversion.viafabricplus.ViaFabricPlus; +import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen; +import net.minecraft.world.inventory.Slot; +import net.raphimc.vialegacy.api.LegacyProtocolVersion; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(CreativeModeInventoryScreen.ItemPickerMenu.class) +public class MixinItemPickerMenu { + + @WrapOperation(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z")) + private boolean disableShiftClickCreativeItemPicker(Slot instance, Operation original) { + return ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2) && original.call(instance); + } + +} diff --git a/src/main/resources/viafabricplus.mixins.json b/src/main/resources/viafabricplus.mixins.json index 03d2d3bc0..87fb452fc 100644 --- a/src/main/resources/viafabricplus.mixins.json +++ b/src/main/resources/viafabricplus.mixins.json @@ -338,8 +338,9 @@ "features.v1_21_9.movement.MixinLocalPlayer", "features.v1_2_1.MixinAbstractFurnaceMenu", "features.v1_3_1.MixinServerRedirectHandler", - "features.v1_3_2.MixinBrewingStandMenu", - "features.v1_3_2.MixinInventoryMenu", + "features.v1_3_1.MixinBrewingStandMenu", + "features.v1_3_1.MixinInventoryMenu", + "features.v1_3_1.MixinItemPickerMenu", "features.v1_4_2.MixinAbstractContainerScreen", "features.v1_4_2.MixinChestBlock", "features.v1_4_2.MixinEnderChestBlock", From a565369293928b6a2ed32351f9085a0f7d6c6d51 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Mon, 14 Sep 2026 12:27:57 +0700 Subject: [PATCH 07/33] make my mixins abstract (forgot, sorry) --- .../injection/mixin/features/b1_5/MixinChestMenu.java | 2 +- .../injection/mixin/features/v1_3_1/MixinInventoryMenu.java | 2 +- .../injection/mixin/features/v1_3_1/MixinItemPickerMenu.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java index 7e61923e1..a2eafe7e6 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java @@ -31,7 +31,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(ChestMenu.class) -public class MixinChestMenu { +public abstract class MixinChestMenu { @WrapOperation(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z")) private boolean disableShiftClickInChests(Slot instance, Operation original) { diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinInventoryMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinInventoryMenu.java index 1d923949e..edbebb350 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinInventoryMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinInventoryMenu.java @@ -31,7 +31,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(InventoryMenu.class) -public class MixinInventoryMenu { +public abstract class MixinInventoryMenu { @WrapOperation(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z", ordinal = 1)) private boolean disableShiftClickArmor(Slot instance, Operation original) { diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinItemPickerMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinItemPickerMenu.java index 74ca1a6a7..6ff8664d0 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinItemPickerMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinItemPickerMenu.java @@ -31,7 +31,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(CreativeModeInventoryScreen.ItemPickerMenu.class) -public class MixinItemPickerMenu { +public abstract class MixinItemPickerMenu { @WrapOperation(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z")) private boolean disableShiftClickCreativeItemPicker(Slot instance, Operation original) { From c49a4d8b193cde7cfc2dfd252f663115f166a30c Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Mon, 14 Sep 2026 13:33:46 +0700 Subject: [PATCH 08/33] styling + rename MixinItemPickerMenu to MixinCreativeModeInventoryScreen_ItemPickerMenu --- ...a => MixinCreativeModeInventoryScreen_ItemPickerMenu.java} | 4 ++-- .../injection/mixin/features/v1_3_1/MixinInventoryMenu.java | 2 +- src/main/resources/viafabricplus.mixins.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/{MixinItemPickerMenu.java => MixinCreativeModeInventoryScreen_ItemPickerMenu.java} (89%) diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinItemPickerMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinCreativeModeInventoryScreen_ItemPickerMenu.java similarity index 89% rename from src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinItemPickerMenu.java rename to src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinCreativeModeInventoryScreen_ItemPickerMenu.java index 6ff8664d0..ab2e03cec 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinItemPickerMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinCreativeModeInventoryScreen_ItemPickerMenu.java @@ -31,11 +31,11 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(CreativeModeInventoryScreen.ItemPickerMenu.class) -public abstract class MixinItemPickerMenu { +public abstract class MixinCreativeModeInventoryScreen_ItemPickerMenu { @WrapOperation(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z")) private boolean disableShiftClickCreativeItemPicker(Slot instance, Operation original) { - return ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2) && original.call(instance); + return original.call(instance) && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2); } } diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinInventoryMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinInventoryMenu.java index edbebb350..dc53b5071 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinInventoryMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinInventoryMenu.java @@ -35,7 +35,7 @@ public abstract class MixinInventoryMenu { @WrapOperation(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z", ordinal = 1)) private boolean disableShiftClickArmor(Slot instance, Operation original) { - return ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2) || original.call(instance); + return original.call(instance) || ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2); } } diff --git a/src/main/resources/viafabricplus.mixins.json b/src/main/resources/viafabricplus.mixins.json index 87fb452fc..b8737932a 100644 --- a/src/main/resources/viafabricplus.mixins.json +++ b/src/main/resources/viafabricplus.mixins.json @@ -339,8 +339,8 @@ "features.v1_2_1.MixinAbstractFurnaceMenu", "features.v1_3_1.MixinServerRedirectHandler", "features.v1_3_1.MixinBrewingStandMenu", + "features.v1_3_1.MixinCreativeModeInventoryScreen_ItemPickerMenu", "features.v1_3_1.MixinInventoryMenu", - "features.v1_3_1.MixinItemPickerMenu", "features.v1_4_2.MixinAbstractContainerScreen", "features.v1_4_2.MixinChestBlock", "features.v1_4_2.MixinEnderChestBlock", From 197b349a453b024ad20f742e1a6191ff450ca4ee Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Mon, 14 Sep 2026 13:52:01 +0700 Subject: [PATCH 09/33] add a mixin replicating shift clicking item behavior in enchantment table menu pre 1.3.2 --- .../features/v1_3_1/MixinEnchantmentMenu.java | 41 +++++++++++++++++++ src/main/resources/viafabricplus.mixins.json | 1 + 2 files changed, 42 insertions(+) create mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinEnchantmentMenu.java diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinEnchantmentMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinEnchantmentMenu.java new file mode 100644 index 000000000..b37a4f1ac --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinEnchantmentMenu.java @@ -0,0 +1,41 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus + * Copyright (C) 2021-2026 the original authors + * - Florian Reuth + * - RK_01/RaphiMC + * Copyright (C) 2023-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.viaversion.viafabricplus.injection.mixin.features.v1_3_1; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.viaversion.viafabricplus.ViaFabricPlus; +import net.minecraft.world.inventory.EnchantmentMenu; +import net.minecraft.world.inventory.Slot; +import net.raphimc.vialegacy.api.LegacyProtocolVersion; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(EnchantmentMenu.class) +public abstract class MixinEnchantmentMenu { + + @WrapOperation(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z", ordinal = 1)) + private boolean disableShiftClickEnchantmentSlot(Slot instance, Operation original) { + return original.call(instance) || ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2); + } + +} diff --git a/src/main/resources/viafabricplus.mixins.json b/src/main/resources/viafabricplus.mixins.json index b8737932a..514aa6e24 100644 --- a/src/main/resources/viafabricplus.mixins.json +++ b/src/main/resources/viafabricplus.mixins.json @@ -340,6 +340,7 @@ "features.v1_3_1.MixinServerRedirectHandler", "features.v1_3_1.MixinBrewingStandMenu", "features.v1_3_1.MixinCreativeModeInventoryScreen_ItemPickerMenu", + "features.v1_3_1.MixinEnchantmentMenu", "features.v1_3_1.MixinInventoryMenu", "features.v1_4_2.MixinAbstractContainerScreen", "features.v1_4_2.MixinChestBlock", From 2c1a92eabc069c4bd39a60b6ec8c132da6e28f5f Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Mon, 14 Sep 2026 15:48:21 +0700 Subject: [PATCH 10/33] wrapops begone --- .../mixin/features/b1_5/MixinChestMenu.java | 9 ++++----- .../features/v1_3_1/MixinBrewingStandMenu.java | 15 +++++++-------- ...reativeModeInventoryScreen_ItemPickerMenu.java | 9 ++++----- .../features/v1_3_1/MixinEnchantmentMenu.java | 9 ++++----- .../mixin/features/v1_3_1/MixinInventoryMenu.java | 9 ++++----- src/main/resources/viafabricplus.accesswidener | 1 + 6 files changed, 24 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java index a2eafe7e6..f22998b27 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java @@ -21,21 +21,20 @@ package com.viaversion.viafabricplus.injection.mixin.features.b1_5; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.viaversion.viafabricplus.ViaFabricPlus; import net.minecraft.world.inventory.ChestMenu; import net.minecraft.world.inventory.Slot; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(ChestMenu.class) public abstract class MixinChestMenu { - @WrapOperation(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z")) - private boolean disableShiftClickInChests(Slot instance, Operation original) { - return original.call(instance) && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.b1_5tob1_5_2); + @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z")) + private boolean disableShiftClickInChests(Slot instance) { + return instance.hasItem() && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.b1_5tob1_5_2); } } diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinBrewingStandMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinBrewingStandMenu.java index c98f3b1aa..54a8aa649 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinBrewingStandMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinBrewingStandMenu.java @@ -21,8 +21,6 @@ package com.viaversion.viafabricplus.injection.mixin.features.v1_3_1; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.viaversion.viafabricplus.ViaFabricPlus; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.BrewingStandMenu; @@ -33,6 +31,7 @@ import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(BrewingStandMenu.class) public abstract class MixinBrewingStandMenu extends AbstractContainerMenu { @@ -41,14 +40,14 @@ protected MixinBrewingStandMenu(@Nullable final MenuType menuType, final int super(menuType, containerId); } - @WrapOperation(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;mayPlace(Lnet/minecraft/world/item/ItemStack;)Z")) - private boolean disableShiftClickIngredientSlot(Slot instance, ItemStack itemStack, Operation original) { - return original.call(instance, itemStack) && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2); + @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;mayPlace(Lnet/minecraft/world/item/ItemStack;)Z")) + private boolean disableShiftClickIngredientSlot(Slot instance, ItemStack itemStack) { + return instance.mayPlace(itemStack) && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2); } - @WrapOperation(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/BrewingStandMenu$PotionSlot;mayPlaceItem(Lnet/minecraft/world/item/ItemStack;)Z")) - private boolean disableShiftClickPotionSlot(ItemStack itemStack, Operation original) { - return original.call(itemStack) && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2); + @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/BrewingStandMenu$PotionSlot;mayPlaceItem(Lnet/minecraft/world/item/ItemStack;)Z")) + private boolean disableShiftClickPotionSlot(ItemStack itemStack) { + return BrewingStandMenu.PotionSlot.mayPlaceItem(itemStack) && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2); } } diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinCreativeModeInventoryScreen_ItemPickerMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinCreativeModeInventoryScreen_ItemPickerMenu.java index ab2e03cec..d16ca7ab8 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinCreativeModeInventoryScreen_ItemPickerMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinCreativeModeInventoryScreen_ItemPickerMenu.java @@ -21,21 +21,20 @@ package com.viaversion.viafabricplus.injection.mixin.features.v1_3_1; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.viaversion.viafabricplus.ViaFabricPlus; import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen; import net.minecraft.world.inventory.Slot; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(CreativeModeInventoryScreen.ItemPickerMenu.class) public abstract class MixinCreativeModeInventoryScreen_ItemPickerMenu { - @WrapOperation(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z")) - private boolean disableShiftClickCreativeItemPicker(Slot instance, Operation original) { - return original.call(instance) && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2); + @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z")) + private boolean disableShiftClickCreativeItemPicker(Slot instance) { + return instance.hasItem() && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2); } } diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinEnchantmentMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinEnchantmentMenu.java index b37a4f1ac..398cb9d1d 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinEnchantmentMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinEnchantmentMenu.java @@ -21,21 +21,20 @@ package com.viaversion.viafabricplus.injection.mixin.features.v1_3_1; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.viaversion.viafabricplus.ViaFabricPlus; import net.minecraft.world.inventory.EnchantmentMenu; import net.minecraft.world.inventory.Slot; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(EnchantmentMenu.class) public abstract class MixinEnchantmentMenu { - @WrapOperation(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z", ordinal = 1)) - private boolean disableShiftClickEnchantmentSlot(Slot instance, Operation original) { - return original.call(instance) || ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2); + @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z", ordinal = 1)) + private boolean disableShiftClickEnchantmentSlot(Slot instance) { + return instance.hasItem() || ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2); } } diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinInventoryMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinInventoryMenu.java index dc53b5071..1fdb451c1 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinInventoryMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinInventoryMenu.java @@ -21,21 +21,20 @@ package com.viaversion.viafabricplus.injection.mixin.features.v1_3_1; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.viaversion.viafabricplus.ViaFabricPlus; import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.inventory.Slot; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(InventoryMenu.class) public abstract class MixinInventoryMenu { - @WrapOperation(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z", ordinal = 1)) - private boolean disableShiftClickArmor(Slot instance, Operation original) { - return original.call(instance) || ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2); + @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z", ordinal = 1)) + private boolean disableShiftClickArmor(Slot instance) { + return instance.hasItem() || ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2); } } diff --git a/src/main/resources/viafabricplus.accesswidener b/src/main/resources/viafabricplus.accesswidener index 8eb92e6da..f3b9b5bc9 100644 --- a/src/main/resources/viafabricplus.accesswidener +++ b/src/main/resources/viafabricplus.accesswidener @@ -57,3 +57,4 @@ accessible class net/minecraft/client/multiplayer/ClientPacketListener$CommandCh accessible class net/minecraft/world/entity/EntityFluidInteraction$Tracker accessible class net/minecraft/client/gui/screens/debug/GameModeSwitcherScreen$GameModeIcon accessible class net/minecraft/client/gui/Font$PreparedTextBuilder +accessible class net/minecraft/world/inventory/BrewingStandMenu$PotionSlot From 0eec380a399c655627ecd4af8d080bf04348b3e2 Mon Sep 17 00:00:00 2001 From: Socketlike <36399055+Socketlike@users.noreply.github.com> Date: Tue, 15 Sep 2026 05:52:20 +0700 Subject: [PATCH 11/33] remove itempickermenu mixin --- ...iveModeInventoryScreen_ItemPickerMenu.java | 40 ------------------- src/main/resources/viafabricplus.mixins.json | 1 - 2 files changed, 41 deletions(-) delete mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinCreativeModeInventoryScreen_ItemPickerMenu.java diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinCreativeModeInventoryScreen_ItemPickerMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinCreativeModeInventoryScreen_ItemPickerMenu.java deleted file mode 100644 index d16ca7ab8..000000000 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinCreativeModeInventoryScreen_ItemPickerMenu.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus - * Copyright (C) 2021-2026 the original authors - * - Florian Reuth - * - RK_01/RaphiMC - * Copyright (C) 2023-2026 ViaVersion and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.viaversion.viafabricplus.injection.mixin.features.v1_3_1; - -import com.viaversion.viafabricplus.ViaFabricPlus; -import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen; -import net.minecraft.world.inventory.Slot; -import net.raphimc.vialegacy.api.LegacyProtocolVersion; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(CreativeModeInventoryScreen.ItemPickerMenu.class) -public abstract class MixinCreativeModeInventoryScreen_ItemPickerMenu { - - @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z")) - private boolean disableShiftClickCreativeItemPicker(Slot instance) { - return instance.hasItem() && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2); - } - -} diff --git a/src/main/resources/viafabricplus.mixins.json b/src/main/resources/viafabricplus.mixins.json index 514aa6e24..85ccbf3ce 100644 --- a/src/main/resources/viafabricplus.mixins.json +++ b/src/main/resources/viafabricplus.mixins.json @@ -339,7 +339,6 @@ "features.v1_2_1.MixinAbstractFurnaceMenu", "features.v1_3_1.MixinServerRedirectHandler", "features.v1_3_1.MixinBrewingStandMenu", - "features.v1_3_1.MixinCreativeModeInventoryScreen_ItemPickerMenu", "features.v1_3_1.MixinEnchantmentMenu", "features.v1_3_1.MixinInventoryMenu", "features.v1_4_2.MixinAbstractContainerScreen", From 1c76573128cd5672a3218bd52045c7fc71cbe404 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Wed, 16 Sep 2026 16:45:41 +0700 Subject: [PATCH 12/33] comment out the b1.5- click action canceler (for now) --- .../mixin/features/v1_15_2/MixinMultiPlayerGameMode.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_15_2/MixinMultiPlayerGameMode.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_15_2/MixinMultiPlayerGameMode.java index 815e3f3fb..a7c25e56a 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_15_2/MixinMultiPlayerGameMode.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_15_2/MixinMultiPlayerGameMode.java @@ -59,9 +59,10 @@ private boolean checkFireBlock(MultiPlayerGameMode instance, BlockPos pos, @Loca @Inject(method = "handleContainerInput", at = @At("HEAD"), cancellable = true) private void removeClickActions(int containerId, int slotNum, int buttonNum, ContainerInput containerInput, Player player, CallbackInfo ci) { - if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.b1_5tob1_5_2) && !containerInput.equals(ContainerInput.PICKUP)) { - ci.cancel(); - } else if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_4_6tor1_4_7) && !containerInput.equals(ContainerInput.PICKUP) && !containerInput.equals(ContainerInput.QUICK_MOVE) && !containerInput.equals(ContainerInput.SWAP) && !containerInput.equals(ContainerInput.CLONE)) { +// if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.b1_5tob1_5_2) && !containerInput.equals(ContainerInput.PICKUP)) { +// ci.cancel(); +// } else + if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_4_6tor1_4_7) && !containerInput.equals(ContainerInput.PICKUP) && !containerInput.equals(ContainerInput.QUICK_MOVE) && !containerInput.equals(ContainerInput.SWAP) && !containerInput.equals(ContainerInput.CLONE)) { ci.cancel(); } if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(ProtocolVersion.v1_15_2) && containerInput == ContainerInput.SWAP && buttonNum == 40) { // Pressing 'F' in inventory From 2477805b0a080485f33cda8e88ccbd43a617ddbe Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Wed, 16 Sep 2026 17:07:28 +0700 Subject: [PATCH 13/33] disable shift clicking in furnace, crafting menu and player inventory in b1.5-, dispensers in b1.7- reverse shift click item placement order for b1.5 --- .../mixin/features/b1_4/MixinChestMenu.java | 40 +++++++++++++++++++ .../b1_5/MixinAbstractFurnaceMenu.java | 40 +++++++++++++++++++ .../mixin/features/b1_5/MixinChestMenu.java | 21 +++++++--- .../features/b1_5/MixinCraftingMenu.java | 40 +++++++++++++++++++ .../features/b1_5/MixinInventoryMenu.java | 40 +++++++++++++++++++ .../features/b1_7/MixinDispenserMenu.java | 40 +++++++++++++++++++ src/main/resources/viafabricplus.mixins.json | 7 +++- 7 files changed, 222 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_4/MixinChestMenu.java create mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinAbstractFurnaceMenu.java create mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinCraftingMenu.java create mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinInventoryMenu.java create mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_7/MixinDispenserMenu.java diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_4/MixinChestMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_4/MixinChestMenu.java new file mode 100644 index 000000000..3456409a0 --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_4/MixinChestMenu.java @@ -0,0 +1,40 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus + * Copyright (C) 2021-2026 the original authors + * - Florian Reuth + * - RK_01/RaphiMC + * Copyright (C) 2023-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.viaversion.viafabricplus.injection.mixin.features.b1_4; + +import com.viaversion.viafabricplus.ViaFabricPlus; +import net.minecraft.world.inventory.ChestMenu; +import net.minecraft.world.inventory.Slot; +import net.raphimc.vialegacy.api.LegacyProtocolVersion; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(ChestMenu.class) +public abstract class MixinChestMenu { + + @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z")) + private boolean disableShiftClickInChests(Slot instance) { + return instance.hasItem() && ViaFabricPlus.api().targetVersion().newerThan(LegacyProtocolVersion.b1_4tob1_4_1); + } + +} diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinAbstractFurnaceMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinAbstractFurnaceMenu.java new file mode 100644 index 000000000..32c4ef40a --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinAbstractFurnaceMenu.java @@ -0,0 +1,40 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus + * Copyright (C) 2021-2026 the original authors + * - Florian Reuth + * - RK_01/RaphiMC + * Copyright (C) 2023-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.viaversion.viafabricplus.injection.mixin.features.b1_5; + +import com.viaversion.viafabricplus.ViaFabricPlus; +import net.minecraft.world.inventory.AbstractFurnaceMenu; +import net.minecraft.world.inventory.Slot; +import net.raphimc.vialegacy.api.LegacyProtocolVersion; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(AbstractFurnaceMenu.class) +public abstract class MixinAbstractFurnaceMenu { + + @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z")) + private boolean disableShiftClickInFurnace(Slot instance) { + return instance.hasItem() && ViaFabricPlus.api().targetVersion().newerThan(LegacyProtocolVersion.b1_5tob1_5_2); + } + +} diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java index f22998b27..068b560e2 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java @@ -22,19 +22,30 @@ package com.viaversion.viafabricplus.injection.mixin.features.b1_5; import com.viaversion.viafabricplus.ViaFabricPlus; +import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.ChestMenu; -import net.minecraft.world.inventory.Slot; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.ItemStack; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(ChestMenu.class) -public abstract class MixinChestMenu { +public abstract class MixinChestMenu extends AbstractContainerMenu { - @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z")) - private boolean disableShiftClickInChests(Slot instance) { - return instance.hasItem() && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.b1_5tob1_5_2); + public MixinChestMenu(final MenuType menuType, final int containerId) { + super(menuType, containerId); + } + + /** + * b1.5 is the first version to have chest shift clicking + * and the only version to have reversed item placement ordering + * when shift clicking an item to player inventory + */ + @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/ChestMenu;moveItemStackTo(Lnet/minecraft/world/item/ItemStack;IIZ)Z", ordinal = 0)) + private boolean reverseShiftClickItemPlacementOrdering(ChestMenu instance, ItemStack itemStack, int startSlot, int endSlot, boolean backwards) { + return this.moveItemStackTo(itemStack, startSlot, endSlot, ViaFabricPlus.api().targetVersion().equalTo(LegacyProtocolVersion.b1_5tob1_5_2) && backwards); } } diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinCraftingMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinCraftingMenu.java new file mode 100644 index 000000000..43bcceccf --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinCraftingMenu.java @@ -0,0 +1,40 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus + * Copyright (C) 2021-2026 the original authors + * - Florian Reuth + * - RK_01/RaphiMC + * Copyright (C) 2023-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.viaversion.viafabricplus.injection.mixin.features.b1_5; + +import com.viaversion.viafabricplus.ViaFabricPlus; +import net.minecraft.world.inventory.CraftingMenu; +import net.minecraft.world.inventory.Slot; +import net.raphimc.vialegacy.api.LegacyProtocolVersion; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(CraftingMenu.class) +public abstract class MixinCraftingMenu { + + @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z")) + private boolean disableShiftClickInCraftingMenu(Slot instance) { + return instance.hasItem() && ViaFabricPlus.api().targetVersion().newerThan(LegacyProtocolVersion.b1_5tob1_5_2); + } + +} diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinInventoryMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinInventoryMenu.java new file mode 100644 index 000000000..ea1ff7a2a --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinInventoryMenu.java @@ -0,0 +1,40 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus + * Copyright (C) 2021-2026 the original authors + * - Florian Reuth + * - RK_01/RaphiMC + * Copyright (C) 2023-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.viaversion.viafabricplus.injection.mixin.features.b1_5; + +import com.viaversion.viafabricplus.ViaFabricPlus; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.inventory.Slot; +import net.raphimc.vialegacy.api.LegacyProtocolVersion; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(InventoryMenu.class) +public abstract class MixinInventoryMenu { + + @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z", ordinal = 0)) + private boolean disableShiftClickInInventory(Slot instance) { + return instance.hasItem() && ViaFabricPlus.api().targetVersion().newerThan(LegacyProtocolVersion.b1_5tob1_5_2); + } + +} diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_7/MixinDispenserMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_7/MixinDispenserMenu.java new file mode 100644 index 000000000..2da2c77a2 --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_7/MixinDispenserMenu.java @@ -0,0 +1,40 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus + * Copyright (C) 2021-2026 the original authors + * - Florian Reuth + * - RK_01/RaphiMC + * Copyright (C) 2023-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.viaversion.viafabricplus.injection.mixin.features.b1_7; + +import com.viaversion.viafabricplus.ViaFabricPlus; +import net.minecraft.world.inventory.DispenserMenu; +import net.minecraft.world.inventory.Slot; +import net.raphimc.vialegacy.api.LegacyProtocolVersion; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(DispenserMenu.class) +public abstract class MixinDispenserMenu { + + @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/Slot;hasItem()Z")) + private boolean disableShiftClickInDispensers(Slot instance) { + return instance.hasItem() && ViaFabricPlus.api().targetVersion().newerThan(LegacyProtocolVersion.b1_7tob1_7_3); + } + +} diff --git a/src/main/resources/viafabricplus.mixins.json b/src/main/resources/viafabricplus.mixins.json index 85ccbf3ce..d7d65a45c 100644 --- a/src/main/resources/viafabricplus.mixins.json +++ b/src/main/resources/viafabricplus.mixins.json @@ -38,8 +38,13 @@ "core.integration.event.MixinMinecraft", "core.integration.sync_tasks.MixinClientCommonPacketListenerImpl", "core.performance.MixinServerStatusPinger", - "features.b1_5.MixinChestMenu", + "features.b1_4.MixinChestMenu", "features.b1_5.MixinLivingEntity", + "features.b1_5.MixinAbstractFurnaceMenu", + "features.b1_5.MixinChestMenu", + "features.b1_5.MixinInventoryMenu", + "features.b1_5.MixinCraftingMenu", + "features.b1_7.MixinDispenserMenu", "features.b1_7.MixinBowItem", "features.b1_7.MixinHud", "features.b1_7.MixinMultiPlayerGameMode", From dadb387ec74264f9aff84b6dea0b7a7a4274df37 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Thu, 17 Sep 2026 01:11:08 +0700 Subject: [PATCH 14/33] furnace fuel shift click whitelist for certain version ranges --- .../features/FeaturesLoading.java | 2 + .../features/global/FurnaceFuels.java | 213 ++++++++++++++++++ .../v1_2_1/MixinAbstractFurnaceMenu.java | 15 +- 3 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/viaversion/viafabricplus/features/global/FurnaceFuels.java diff --git a/src/main/java/com/viaversion/viafabricplus/features/FeaturesLoading.java b/src/main/java/com/viaversion/viafabricplus/features/FeaturesLoading.java index d4c06cf2f..77b8d932f 100644 --- a/src/main/java/com/viaversion/viafabricplus/features/FeaturesLoading.java +++ b/src/main/java/com/viaversion/viafabricplus/features/FeaturesLoading.java @@ -27,6 +27,7 @@ import com.viaversion.viafabricplus.features.global.CollisionShapes; import com.viaversion.viafabricplus.features.global.ClassiCubeAccount; import com.viaversion.viafabricplus.features.c0_30cpe.CPEAdditions; +import com.viaversion.viafabricplus.features.global.FurnaceFuels; import com.viaversion.viafabricplus.features.v1_20_5.EnchantmentAttributesEmulation1_20_6; import com.viaversion.viafabricplus.features.global.EntityDimensionDiff; import com.viaversion.viafabricplus.features.global.FontCacheReload; @@ -81,6 +82,7 @@ public static void onPostGameLoading() { Recipes1_11_2.init(); ArmorHudEmulation1_8.init(); CPEAdditions.postInit(); + FurnaceFuels.init(); } } diff --git a/src/main/java/com/viaversion/viafabricplus/features/global/FurnaceFuels.java b/src/main/java/com/viaversion/viafabricplus/features/global/FurnaceFuels.java new file mode 100644 index 000000000..fff27db20 --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/features/global/FurnaceFuels.java @@ -0,0 +1,213 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus + * Copyright (C) 2021-2026 the original authors + * - Florian Reuth + * - RK_01/RaphiMC + * Copyright (C) 2023-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.viaversion.viafabricplus.features.global; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.Registries; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Blocks; +import java.util.ArrayList; + +public class FurnaceFuels { + public static FurnaceFuels FUELS_1_11 = null; + public static FurnaceFuels FUELS_1_3_1 = null; + public static FurnaceFuels FUELS_1_2_5 = null; + + private static Minecraft client = null; + + public static void init() { + client = Minecraft.getInstance(); + } + + private final ArrayList values; + + private FurnaceFuels(final ArrayList values) { + this.values = values; + } + + public boolean isFuel(final ItemStack itemStack) { + return this.values.contains(itemStack.getItem()); + } + + public static FurnaceFuels fuels_1_11() { + if (FUELS_1_11 == null) + FUELS_1_11 = new FurnaceFuels.Builder(client.level.registryAccess()) + .add(Items.LAVA_BUCKET) + .add(Blocks.COAL_BLOCK) + .add(Items.BLAZE_ROD) + .add(Items.COAL) + .add(Items.CHARCOAL) + .add(ItemTags.LOGS) + .add(ItemTags.PLANKS) + .add(ItemTags.WOODEN_STAIRS) + .add(ItemTags.WOODEN_TRAPDOORS) + .add(ItemTags.WOODEN_PRESSURE_PLATES) + .add(ItemTags.WOODEN_FENCES) + .add(ItemTags.FENCE_GATES) + .add(Blocks.NOTE_BLOCK) + .add(Blocks.BOOKSHELF) + .add(Blocks.JUKEBOX) + .add(Blocks.CHEST) + .add(Blocks.TRAPPED_CHEST) + .add(Blocks.CRAFTING_TABLE) + .add(Blocks.DAYLIGHT_DETECTOR) + .add(ItemTags.BANNERS) + .add(Items.BOW) + .add(Items.FISHING_ROD) + .add(Blocks.LADDER) + .add(Blocks.OAK_SIGN) + .add(Items.WOODEN_SHOVEL) + .add(Items.WOODEN_SWORD) + .add(Items.WOODEN_SPEAR) + .add(Items.WOODEN_HOE) + .add(Items.WOODEN_AXE) + .add(Items.WOODEN_PICKAXE) + .add(ItemTags.WOODEN_DOORS) + .add(ItemTags.BOATS) + .add(ItemTags.WOOL) + .add(ItemTags.WOODEN_BUTTONS) + .add(Items.STICK) + .add(ItemTags.SAPLINGS) + .add(Items.BOWL) + .add(ItemTags.WOOL_CARPETS) + .remove(ItemTags.NON_FLAMMABLE_WOOD) + .build(); + + return FUELS_1_11; + } + + public static FurnaceFuels fuels_1_3_1() { + if (FUELS_1_3_1 == null) + FUELS_1_3_1 = new FurnaceFuels.Builder(client.level.registryAccess()) + .add(Items.LAVA_BUCKET) + .add(Blocks.COAL_BLOCK) + .add(Items.BLAZE_ROD) + .add(Items.COAL) + .add(Items.CHARCOAL) + .add(ItemTags.LOGS) + .add(ItemTags.PLANKS) + .add(ItemTags.WOODEN_STAIRS) + .add(ItemTags.WOODEN_TRAPDOORS) + .add(ItemTags.WOODEN_PRESSURE_PLATES) + .add(ItemTags.WOODEN_FENCES) + .add(ItemTags.FENCE_GATES) + .add(Blocks.NOTE_BLOCK) + .add(Blocks.BOOKSHELF) + .add(Blocks.JUKEBOX) + .add(Blocks.CHEST) + .add(Blocks.TRAPPED_CHEST) + .add(Blocks.CRAFTING_TABLE) + .add(Blocks.DAYLIGHT_DETECTOR) + .add(ItemTags.BANNERS) + .add(Items.BOW) + .add(Items.FISHING_ROD) + .add(Blocks.LADDER) + .add(Items.WOODEN_SHOVEL) + .add(Items.WOODEN_SWORD) + .add(Items.WOODEN_SPEAR) + .add(Items.WOODEN_HOE) + .add(Items.WOODEN_AXE) + .add(Items.WOODEN_PICKAXE) + .add(Items.STICK) + .add(ItemTags.SAPLINGS) + .add(Items.BOWL) + .remove(ItemTags.NON_FLAMMABLE_WOOD) + .build(); + + return FUELS_1_3_1; + } + + public static FurnaceFuels fuels_1_2_5() { + if (FUELS_1_2_5 == null) + FUELS_1_2_5 = new FurnaceFuels.Builder(client.level.registryAccess()) + .add(Items.LAVA_BUCKET) + .add(Blocks.COAL_BLOCK) + .add(Items.BLAZE_ROD) + .add(Items.COAL) + .add(Items.CHARCOAL) + .add(ItemTags.LOGS) + .add(ItemTags.PLANKS) + .add(ItemTags.WOODEN_STAIRS) + .add(ItemTags.WOODEN_TRAPDOORS) + .add(ItemTags.WOODEN_PRESSURE_PLATES) + .add(ItemTags.WOODEN_FENCES) + .add(ItemTags.FENCE_GATES) + .add(Blocks.NOTE_BLOCK) + .add(Blocks.BOOKSHELF) + .add(Blocks.JUKEBOX) + .add(Blocks.CHEST) + .add(Blocks.TRAPPED_CHEST) + .add(Blocks.CRAFTING_TABLE) + .add(Blocks.DAYLIGHT_DETECTOR) + .add(ItemTags.BANNERS) + .add(Items.BOW) + .add(Items.FISHING_ROD) + .add(Blocks.LADDER) + .add(Items.STICK) + .add(ItemTags.SAPLINGS) + .add(Items.BOWL) + .remove(ItemTags.NON_FLAMMABLE_WOOD) + .build(); + + return FUELS_1_2_5; + } + + public static class Builder { + private final HolderLookup items; + private final ArrayList values = new ArrayList<>(); + + public Builder(final HolderLookup.Provider registries) { + this.items = registries.lookupOrThrow(Registries.ITEM); + } + + public FurnaceFuels build() { + return new FurnaceFuels(this.values); + } + + public FurnaceFuels.Builder remove(final TagKey tag) { + this.values.removeIf(item -> item.builtInRegistryHolder().is(tag)); + return this; + } + + public FurnaceFuels.Builder add(final TagKey tag) { + this.items.get(tag).ifPresent(items -> { + for (Holder item : items) { + this.values.add(item.value()); + } + }); + return this; + } + + public FurnaceFuels.Builder add(final ItemLike itemLike) { + Item item = itemLike.asItem(); + this.values.add(item); + return this; + } + } +} diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java index cb5c56431..8165582fd 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java @@ -22,6 +22,8 @@ package com.viaversion.viafabricplus.injection.mixin.features.v1_2_1; import com.viaversion.viafabricplus.ViaFabricPlus; +import com.viaversion.viafabricplus.features.global.FurnaceFuels; +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import net.minecraft.world.inventory.AbstractFurnaceMenu; import net.minecraft.world.item.ItemStack; import net.raphimc.vialegacy.api.LegacyProtocolVersion; @@ -46,7 +48,18 @@ private boolean disableShiftClickSmeltingSlot(AbstractFurnaceMenu instance, Item @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/AbstractFurnaceMenu;isFuel(Lnet/minecraft/world/item/ItemStack;)Z")) private boolean disableShiftClickFuelSlot(AbstractFurnaceMenu instance, ItemStack itemStack) { - return this.isFuel(itemStack) && ViaFabricPlus.api().targetVersion().newerThan(LegacyProtocolVersion.r1_2_1tor1_2_3); + boolean isFuel; + + if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_2_4tor1_2_5) && ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2)) + isFuel = FurnaceFuels.fuels_1_2_5().isFuel(itemStack); + else if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2) && ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_11)) + isFuel = FurnaceFuels.fuels_1_3_1().isFuel(itemStack); + else if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(ProtocolVersion.v1_11) && ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_14)) + isFuel = FurnaceFuels.fuels_1_11().isFuel(itemStack); + else + isFuel = this.isFuel(itemStack); + + return isFuel && ViaFabricPlus.api().targetVersion().newerThan(LegacyProtocolVersion.r1_2_1tor1_2_3); } } From ba601f38d8abe3c1eaee27d1c47e11194bb3d2a6 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Thu, 17 Sep 2026 01:19:21 +0700 Subject: [PATCH 15/33] rename FurnaceFuels method names and remove its init --- .../features/FeaturesLoading.java | 2 -- .../features/global/FurnaceFuels.java | 24 +++++++------------ .../v1_2_1/MixinAbstractFurnaceMenu.java | 6 ++--- 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/viaversion/viafabricplus/features/FeaturesLoading.java b/src/main/java/com/viaversion/viafabricplus/features/FeaturesLoading.java index 77b8d932f..d4c06cf2f 100644 --- a/src/main/java/com/viaversion/viafabricplus/features/FeaturesLoading.java +++ b/src/main/java/com/viaversion/viafabricplus/features/FeaturesLoading.java @@ -27,7 +27,6 @@ import com.viaversion.viafabricplus.features.global.CollisionShapes; import com.viaversion.viafabricplus.features.global.ClassiCubeAccount; import com.viaversion.viafabricplus.features.c0_30cpe.CPEAdditions; -import com.viaversion.viafabricplus.features.global.FurnaceFuels; import com.viaversion.viafabricplus.features.v1_20_5.EnchantmentAttributesEmulation1_20_6; import com.viaversion.viafabricplus.features.global.EntityDimensionDiff; import com.viaversion.viafabricplus.features.global.FontCacheReload; @@ -82,7 +81,6 @@ public static void onPostGameLoading() { Recipes1_11_2.init(); ArmorHudEmulation1_8.init(); CPEAdditions.postInit(); - FurnaceFuels.init(); } } diff --git a/src/main/java/com/viaversion/viafabricplus/features/global/FurnaceFuels.java b/src/main/java/com/viaversion/viafabricplus/features/global/FurnaceFuels.java index fff27db20..f87425aac 100644 --- a/src/main/java/com/viaversion/viafabricplus/features/global/FurnaceFuels.java +++ b/src/main/java/com/viaversion/viafabricplus/features/global/FurnaceFuels.java @@ -35,15 +35,9 @@ import java.util.ArrayList; public class FurnaceFuels { - public static FurnaceFuels FUELS_1_11 = null; - public static FurnaceFuels FUELS_1_3_1 = null; - public static FurnaceFuels FUELS_1_2_5 = null; - - private static Minecraft client = null; - - public static void init() { - client = Minecraft.getInstance(); - } + private static FurnaceFuels FUELS_1_11 = null; + private static FurnaceFuels FUELS_1_3_1 = null; + private static FurnaceFuels FUELS_1_2_5 = null; private final ArrayList values; @@ -55,9 +49,9 @@ public boolean isFuel(final ItemStack itemStack) { return this.values.contains(itemStack.getItem()); } - public static FurnaceFuels fuels_1_11() { + public static FurnaceFuels getFuels_1_11() { if (FUELS_1_11 == null) - FUELS_1_11 = new FurnaceFuels.Builder(client.level.registryAccess()) + FUELS_1_11 = new FurnaceFuels.Builder(Minecraft.getInstance().level.registryAccess()) .add(Items.LAVA_BUCKET) .add(Blocks.COAL_BLOCK) .add(Items.BLAZE_ROD) @@ -102,9 +96,9 @@ public static FurnaceFuels fuels_1_11() { return FUELS_1_11; } - public static FurnaceFuels fuels_1_3_1() { + public static FurnaceFuels getFuels_1_3_1() { if (FUELS_1_3_1 == null) - FUELS_1_3_1 = new FurnaceFuels.Builder(client.level.registryAccess()) + FUELS_1_3_1 = new FurnaceFuels.Builder(Minecraft.getInstance().level.registryAccess()) .add(Items.LAVA_BUCKET) .add(Blocks.COAL_BLOCK) .add(Items.BLAZE_ROD) @@ -143,9 +137,9 @@ public static FurnaceFuels fuels_1_3_1() { return FUELS_1_3_1; } - public static FurnaceFuels fuels_1_2_5() { + public static FurnaceFuels getFuels_1_2_5() { if (FUELS_1_2_5 == null) - FUELS_1_2_5 = new FurnaceFuels.Builder(client.level.registryAccess()) + FUELS_1_2_5 = new FurnaceFuels.Builder(Minecraft.getInstance().level.registryAccess()) .add(Items.LAVA_BUCKET) .add(Blocks.COAL_BLOCK) .add(Items.BLAZE_ROD) diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java index 8165582fd..75725082f 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java @@ -51,11 +51,11 @@ private boolean disableShiftClickFuelSlot(AbstractFurnaceMenu instance, ItemStac boolean isFuel; if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_2_4tor1_2_5) && ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2)) - isFuel = FurnaceFuels.fuels_1_2_5().isFuel(itemStack); + isFuel = FurnaceFuels.getFuels_1_2_5().isFuel(itemStack); else if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2) && ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_11)) - isFuel = FurnaceFuels.fuels_1_3_1().isFuel(itemStack); + isFuel = FurnaceFuels.getFuels_1_3_1().isFuel(itemStack); else if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(ProtocolVersion.v1_11) && ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_14)) - isFuel = FurnaceFuels.fuels_1_11().isFuel(itemStack); + isFuel = FurnaceFuels.getFuels_1_11().isFuel(itemStack); else isFuel = this.isFuel(itemStack); From d5ab994b1dee1847f18efc5cec53cf7955e861b0 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Thu, 17 Sep 2026 10:33:54 +0700 Subject: [PATCH 16/33] move FurnaceFuels to v1_11 and stop using the Minecraft instance for getting the registry --- .../{global => v1_11}/FurnaceFuels.java | 29 +++++++++---------- .../v1_2_1/MixinAbstractFurnaceMenu.java | 2 +- 2 files changed, 14 insertions(+), 17 deletions(-) rename src/main/java/com/viaversion/viafabricplus/features/{global => v1_11}/FurnaceFuels.java (89%) diff --git a/src/main/java/com/viaversion/viafabricplus/features/global/FurnaceFuels.java b/src/main/java/com/viaversion/viafabricplus/features/v1_11/FurnaceFuels.java similarity index 89% rename from src/main/java/com/viaversion/viafabricplus/features/global/FurnaceFuels.java rename to src/main/java/com/viaversion/viafabricplus/features/v1_11/FurnaceFuels.java index f87425aac..22523f9fc 100644 --- a/src/main/java/com/viaversion/viafabricplus/features/global/FurnaceFuels.java +++ b/src/main/java/com/viaversion/viafabricplus/features/v1_11/FurnaceFuels.java @@ -19,12 +19,10 @@ * along with this program. If not, see . */ -package com.viaversion.viafabricplus.features.global; +package com.viaversion.viafabricplus.features.v1_11; -import net.minecraft.client.Minecraft; import net.minecraft.core.Holder; -import net.minecraft.core.HolderLookup; -import net.minecraft.core.registries.Registries; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; @@ -48,10 +46,10 @@ private FurnaceFuels(final ArrayList values) { public boolean isFuel(final ItemStack itemStack) { return this.values.contains(itemStack.getItem()); } - + public static FurnaceFuels getFuels_1_11() { if (FUELS_1_11 == null) - FUELS_1_11 = new FurnaceFuels.Builder(Minecraft.getInstance().level.registryAccess()) + FUELS_1_11 = new FurnaceFuels.Builder() .add(Items.LAVA_BUCKET) .add(Blocks.COAL_BLOCK) .add(Items.BLAZE_ROD) @@ -75,7 +73,7 @@ public static FurnaceFuels getFuels_1_11() { .add(Items.BOW) .add(Items.FISHING_ROD) .add(Blocks.LADDER) - .add(Blocks.OAK_SIGN) + .add(ItemTags.SIGNS) .add(Items.WOODEN_SHOVEL) .add(Items.WOODEN_SWORD) .add(Items.WOODEN_SPEAR) @@ -98,7 +96,7 @@ public static FurnaceFuels getFuels_1_11() { public static FurnaceFuels getFuels_1_3_1() { if (FUELS_1_3_1 == null) - FUELS_1_3_1 = new FurnaceFuels.Builder(Minecraft.getInstance().level.registryAccess()) + FUELS_1_3_1 = new FurnaceFuels.Builder() .add(Items.LAVA_BUCKET) .add(Blocks.COAL_BLOCK) .add(Items.BLAZE_ROD) @@ -139,7 +137,7 @@ public static FurnaceFuels getFuels_1_3_1() { public static FurnaceFuels getFuels_1_2_5() { if (FUELS_1_2_5 == null) - FUELS_1_2_5 = new FurnaceFuels.Builder(Minecraft.getInstance().level.registryAccess()) + FUELS_1_2_5 = new FurnaceFuels.Builder() .add(Items.LAVA_BUCKET) .add(Blocks.COAL_BLOCK) .add(Items.BLAZE_ROD) @@ -173,24 +171,23 @@ public static FurnaceFuels getFuels_1_2_5() { } public static class Builder { - private final HolderLookup items; private final ArrayList values = new ArrayList<>(); - public Builder(final HolderLookup.Provider registries) { - this.items = registries.lookupOrThrow(Registries.ITEM); - } - public FurnaceFuels build() { return new FurnaceFuels(this.values); } public FurnaceFuels.Builder remove(final TagKey tag) { - this.values.removeIf(item -> item.builtInRegistryHolder().is(tag)); + BuiltInRegistries.ITEM.get(tag).ifPresent(items -> { + for (Holder item : items) { + this.values.remove(item.value()); + } + }); return this; } public FurnaceFuels.Builder add(final TagKey tag) { - this.items.get(tag).ifPresent(items -> { + BuiltInRegistries.ITEM.get(tag).ifPresent(items -> { for (Holder item : items) { this.values.add(item.value()); } diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java index 75725082f..e59ade739 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java @@ -22,7 +22,7 @@ package com.viaversion.viafabricplus.injection.mixin.features.v1_2_1; import com.viaversion.viafabricplus.ViaFabricPlus; -import com.viaversion.viafabricplus.features.global.FurnaceFuels; +import com.viaversion.viafabricplus.features.v1_11.FurnaceFuels; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import net.minecraft.world.inventory.AbstractFurnaceMenu; import net.minecraft.world.item.ItemStack; From 2370c3c712090afb11394ac24402c594e5db9f35 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Thu, 17 Sep 2026 10:47:41 +0700 Subject: [PATCH 17/33] fix FurnaceFuels formatting --- .../viafabricplus/features/v1_11/FurnaceFuels.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/viaversion/viafabricplus/features/v1_11/FurnaceFuels.java b/src/main/java/com/viaversion/viafabricplus/features/v1_11/FurnaceFuels.java index 22523f9fc..bd52b2f7f 100644 --- a/src/main/java/com/viaversion/viafabricplus/features/v1_11/FurnaceFuels.java +++ b/src/main/java/com/viaversion/viafabricplus/features/v1_11/FurnaceFuels.java @@ -32,7 +32,8 @@ import net.minecraft.world.level.block.Blocks; import java.util.ArrayList; -public class FurnaceFuels { +public final class FurnaceFuels { + private static FurnaceFuels FUELS_1_11 = null; private static FurnaceFuels FUELS_1_3_1 = null; private static FurnaceFuels FUELS_1_2_5 = null; @@ -171,6 +172,7 @@ public static FurnaceFuels getFuels_1_2_5() { } public static class Builder { + private final ArrayList values = new ArrayList<>(); public FurnaceFuels build() { @@ -200,5 +202,7 @@ public FurnaceFuels.Builder add(final ItemLike itemLike) { this.values.add(item); return this; } + } + } From 2e74b5d23b5d7516b96bbec0ae32fcc409c55f50 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Thu, 17 Sep 2026 11:26:35 +0700 Subject: [PATCH 18/33] move the fuel whitelist to a new mixin --- .../features/v1_11/FurnaceFuels.java | 2 ++ .../v1_2_1/MixinAbstractFurnaceMenu.java | 27 ++++++++++--------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/viaversion/viafabricplus/features/v1_11/FurnaceFuels.java b/src/main/java/com/viaversion/viafabricplus/features/v1_11/FurnaceFuels.java index bd52b2f7f..847492547 100644 --- a/src/main/java/com/viaversion/viafabricplus/features/v1_11/FurnaceFuels.java +++ b/src/main/java/com/viaversion/viafabricplus/features/v1_11/FurnaceFuels.java @@ -168,6 +168,8 @@ public static FurnaceFuels getFuels_1_2_5() { .remove(ItemTags.NON_FLAMMABLE_WOOD) .build(); + ItemTags. + return FUELS_1_2_5; } diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java index e59ade739..7fb7342c2 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java @@ -22,6 +22,7 @@ package com.viaversion.viafabricplus.injection.mixin.features.v1_2_1; import com.viaversion.viafabricplus.ViaFabricPlus; +import com.viaversion.viafabricplus.ViaFabricPlusImpl; import com.viaversion.viafabricplus.features.v1_11.FurnaceFuels; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import net.minecraft.world.inventory.AbstractFurnaceMenu; @@ -30,7 +31,9 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(AbstractFurnaceMenu.class) public abstract class MixinAbstractFurnaceMenu { @@ -41,25 +44,25 @@ public abstract class MixinAbstractFurnaceMenu { @Shadow protected abstract boolean isFuel(ItemStack itemStack); + @Inject(method = "isFuel", at = @At("HEAD"), cancellable = true) + private void fuelSlotShiftClickWhitelist(ItemStack itemStack, CallbackInfoReturnable cir) { + if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_2_4tor1_2_5) && ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2)) + cir.setReturnValue(FurnaceFuels.getFuels_1_2_5().isFuel(itemStack)); + else if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2) && ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_11)) + cir.setReturnValue(FurnaceFuels.getFuels_1_3_1().isFuel(itemStack)); + else if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(ProtocolVersion.v1_11) && ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_14)) + cir.setReturnValue(FurnaceFuels.getFuels_1_11().isFuel(itemStack)); + } + @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/AbstractFurnaceMenu;canSmelt(Lnet/minecraft/world/item/ItemStack;)Z")) private boolean disableShiftClickSmeltingSlot(AbstractFurnaceMenu instance, ItemStack itemStack) { + ViaFabricPlusImpl.impl().logger().warn("can smelt : {}\n item is : {}", this.canSmelt(itemStack), itemStack.getItem().toString()); return this.canSmelt(itemStack) && ViaFabricPlus.api().targetVersion().newerThan(LegacyProtocolVersion.r1_2_1tor1_2_3); } @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/AbstractFurnaceMenu;isFuel(Lnet/minecraft/world/item/ItemStack;)Z")) private boolean disableShiftClickFuelSlot(AbstractFurnaceMenu instance, ItemStack itemStack) { - boolean isFuel; - - if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_2_4tor1_2_5) && ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2)) - isFuel = FurnaceFuels.getFuels_1_2_5().isFuel(itemStack); - else if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2) && ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_11)) - isFuel = FurnaceFuels.getFuels_1_3_1().isFuel(itemStack); - else if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(ProtocolVersion.v1_11) && ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_14)) - isFuel = FurnaceFuels.getFuels_1_11().isFuel(itemStack); - else - isFuel = this.isFuel(itemStack); - - return isFuel && ViaFabricPlus.api().targetVersion().newerThan(LegacyProtocolVersion.r1_2_1tor1_2_3); + return this.isFuel(itemStack) && ViaFabricPlus.api().targetVersion().newerThan(LegacyProtocolVersion.r1_2_1tor1_2_3); } } From 5ddbb8ac167939ec2e36ddb5896b51365370a317 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Thu, 17 Sep 2026 11:27:10 +0700 Subject: [PATCH 19/33] remove the stray "ItemTags." --- .../viaversion/viafabricplus/features/v1_11/FurnaceFuels.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/viaversion/viafabricplus/features/v1_11/FurnaceFuels.java b/src/main/java/com/viaversion/viafabricplus/features/v1_11/FurnaceFuels.java index 847492547..bd52b2f7f 100644 --- a/src/main/java/com/viaversion/viafabricplus/features/v1_11/FurnaceFuels.java +++ b/src/main/java/com/viaversion/viafabricplus/features/v1_11/FurnaceFuels.java @@ -168,8 +168,6 @@ public static FurnaceFuels getFuels_1_2_5() { .remove(ItemTags.NON_FLAMMABLE_WOOD) .build(); - ItemTags. - return FUELS_1_2_5; } From 1b53c806c6ac09fde91a14e886386eee679d7d0a Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Thu, 17 Sep 2026 12:07:41 +0700 Subject: [PATCH 20/33] remove the stray logger call (oops) --- .../mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java index 7fb7342c2..ba0c15d54 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java @@ -27,6 +27,7 @@ import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import net.minecraft.world.inventory.AbstractFurnaceMenu; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -56,7 +57,6 @@ else if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(ProtocolVersion. @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/AbstractFurnaceMenu;canSmelt(Lnet/minecraft/world/item/ItemStack;)Z")) private boolean disableShiftClickSmeltingSlot(AbstractFurnaceMenu instance, ItemStack itemStack) { - ViaFabricPlusImpl.impl().logger().warn("can smelt : {}\n item is : {}", this.canSmelt(itemStack), itemStack.getItem().toString()); return this.canSmelt(itemStack) && ViaFabricPlus.api().targetVersion().newerThan(LegacyProtocolVersion.r1_2_1tor1_2_3); } From a8af1c192749808da2ff0346b18a073545d44012 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Thu, 17 Sep 2026 12:15:53 +0700 Subject: [PATCH 21/33] remove logs from FurnaceFuels lists --- .../viaversion/viafabricplus/features/v1_11/FurnaceFuels.java | 3 --- .../mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java | 2 -- 2 files changed, 5 deletions(-) diff --git a/src/main/java/com/viaversion/viafabricplus/features/v1_11/FurnaceFuels.java b/src/main/java/com/viaversion/viafabricplus/features/v1_11/FurnaceFuels.java index bd52b2f7f..32d2ad2be 100644 --- a/src/main/java/com/viaversion/viafabricplus/features/v1_11/FurnaceFuels.java +++ b/src/main/java/com/viaversion/viafabricplus/features/v1_11/FurnaceFuels.java @@ -56,7 +56,6 @@ public static FurnaceFuels getFuels_1_11() { .add(Items.BLAZE_ROD) .add(Items.COAL) .add(Items.CHARCOAL) - .add(ItemTags.LOGS) .add(ItemTags.PLANKS) .add(ItemTags.WOODEN_STAIRS) .add(ItemTags.WOODEN_TRAPDOORS) @@ -103,7 +102,6 @@ public static FurnaceFuels getFuels_1_3_1() { .add(Items.BLAZE_ROD) .add(Items.COAL) .add(Items.CHARCOAL) - .add(ItemTags.LOGS) .add(ItemTags.PLANKS) .add(ItemTags.WOODEN_STAIRS) .add(ItemTags.WOODEN_TRAPDOORS) @@ -144,7 +142,6 @@ public static FurnaceFuels getFuels_1_2_5() { .add(Items.BLAZE_ROD) .add(Items.COAL) .add(Items.CHARCOAL) - .add(ItemTags.LOGS) .add(ItemTags.PLANKS) .add(ItemTags.WOODEN_STAIRS) .add(ItemTags.WOODEN_TRAPDOORS) diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java index ba0c15d54..1cc4adb07 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java @@ -22,12 +22,10 @@ package com.viaversion.viafabricplus.injection.mixin.features.v1_2_1; import com.viaversion.viafabricplus.ViaFabricPlus; -import com.viaversion.viafabricplus.ViaFabricPlusImpl; import com.viaversion.viafabricplus.features.v1_11.FurnaceFuels; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import net.minecraft.world.inventory.AbstractFurnaceMenu; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; From 98b5655f678fb5f17d6a67068a7a2e09a3b26149 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Thu, 17 Sep 2026 16:50:12 +0700 Subject: [PATCH 22/33] add furnace input shift click whitelist for 1.11.2- --- .../v1_2_1/MixinAbstractFurnaceMenu.java | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java index 1cc4adb07..bda083e05 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java @@ -23,10 +23,17 @@ import com.viaversion.viafabricplus.ViaFabricPlus; import com.viaversion.viafabricplus.features.v1_11.FurnaceFuels; +import com.viaversion.viafabricplus.features.v1_11_1.Recipes1_11_2; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import net.minecraft.world.inventory.AbstractFurnaceMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.RecipeBookMenu; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SingleRecipeInput; +import net.minecraft.world.level.Level; import net.raphimc.vialegacy.api.LegacyProtocolVersion; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -43,14 +50,26 @@ public abstract class MixinAbstractFurnaceMenu { @Shadow protected abstract boolean isFuel(ItemStack itemStack); + @Final + @Shadow + protected Level level; + + @Inject(method = "canSmelt", at = @At("HEAD"), cancellable = true) + private void smeltingSlotShiftClickWhitelist(ItemStack itemStack, CallbackInfoReturnable cir) { + if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(ProtocolVersion.v1_11_1)) { + cir.setReturnValue(Recipes1_11_2.getRecipeManager(this.level.registryAccess().freeze()).getFirstMatch(RecipeType.SMELTING, new SingleRecipeInput(itemStack), this.level).isPresent()); + } + } + @Inject(method = "isFuel", at = @At("HEAD"), cancellable = true) private void fuelSlotShiftClickWhitelist(ItemStack itemStack, CallbackInfoReturnable cir) { - if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_2_4tor1_2_5) && ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2)) + if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_2_4tor1_2_5) && ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2)) { cir.setReturnValue(FurnaceFuels.getFuels_1_2_5().isFuel(itemStack)); - else if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2) && ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_11)) + } else if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2) && ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_11)) { cir.setReturnValue(FurnaceFuels.getFuels_1_3_1().isFuel(itemStack)); - else if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(ProtocolVersion.v1_11) && ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_14)) + } else if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(ProtocolVersion.v1_11) && ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_14)) { cir.setReturnValue(FurnaceFuels.getFuels_1_11().isFuel(itemStack)); + } } @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/AbstractFurnaceMenu;canSmelt(Lnet/minecraft/world/item/ItemStack;)Z")) From e7488ac6a7d2951397e6df3c2300044c8d93b0cb Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Thu, 17 Sep 2026 16:50:39 +0700 Subject: [PATCH 23/33] remove unused imports --- .../mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java index bda083e05..7d43da3d1 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java @@ -26,8 +26,6 @@ import com.viaversion.viafabricplus.features.v1_11_1.Recipes1_11_2; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import net.minecraft.world.inventory.AbstractFurnaceMenu; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.inventory.RecipeBookMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.SingleRecipeInput; From 89d918fbf078bb8e9c09b4145e76c27cb2789f14 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Thu, 17 Sep 2026 18:05:41 +0700 Subject: [PATCH 24/33] fix slight oversight with the reverse ordering for chest shift click --- .../injection/mixin/features/b1_5/MixinChestMenu.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java index 068b560e2..9aaace2e4 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java @@ -45,7 +45,7 @@ public MixinChestMenu(final MenuType menuType, final int containerId) { */ @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/ChestMenu;moveItemStackTo(Lnet/minecraft/world/item/ItemStack;IIZ)Z", ordinal = 0)) private boolean reverseShiftClickItemPlacementOrdering(ChestMenu instance, ItemStack itemStack, int startSlot, int endSlot, boolean backwards) { - return this.moveItemStackTo(itemStack, startSlot, endSlot, ViaFabricPlus.api().targetVersion().equalTo(LegacyProtocolVersion.b1_5tob1_5_2) && backwards); + return this.moveItemStackTo(itemStack, startSlot, endSlot, ViaFabricPlus.api().targetVersion().newerThan(LegacyProtocolVersion.b1_5tob1_5_2) && backwards); } } From 4ea0ef80123464d64bd3efd69ee4675b2b24e910 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Fri, 18 Sep 2026 12:41:43 +0700 Subject: [PATCH 25/33] fix brewing stand shift click behavior of blaze powder in 1.11- --- .../features/v1_9/MixinBrewingStandMenu.java | 51 +++++++++++++++++++ .../v1_9/MixinBrewingStandMenu_FuelSlot.java | 44 ++++++++++++++++ .../resources/viafabricplus.accesswidener | 1 + src/main/resources/viafabricplus.mixins.json | 2 + 4 files changed, 98 insertions(+) create mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_9/MixinBrewingStandMenu.java create mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_9/MixinBrewingStandMenu_FuelSlot.java diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_9/MixinBrewingStandMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_9/MixinBrewingStandMenu.java new file mode 100644 index 000000000..7884fb154 --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_9/MixinBrewingStandMenu.java @@ -0,0 +1,51 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus + * Copyright (C) 2021-2026 the original authors + * - Florian Reuth + * - RK_01/RaphiMC + * Copyright (C) 2023-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.viaversion.viafabricplus.injection.mixin.features.v1_9; + +import com.viaversion.viafabricplus.ViaFabricPlus; +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; +import net.minecraft.world.inventory.BrewingStandMenu; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(BrewingStandMenu.class) +public abstract class MixinBrewingStandMenu { + + @Shadow + @Final + private Slot ingredientSlot; + + @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/BrewingStandMenu$FuelSlot;mayPlaceItem(Lnet/minecraft/world/item/ItemStack;)Z")) + private boolean disableShiftClickBlazePowderFuelSlotWhenIngredientSlotEmpty(ItemStack itemStack) { + if (ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_11)) { + return BrewingStandMenu.FuelSlot.mayPlaceItem(itemStack) && !this.ingredientSlot.getItem().isEmpty(); + } + + return BrewingStandMenu.FuelSlot.mayPlaceItem(itemStack); + } + +} diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_9/MixinBrewingStandMenu_FuelSlot.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_9/MixinBrewingStandMenu_FuelSlot.java new file mode 100644 index 000000000..a8b035a95 --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_9/MixinBrewingStandMenu_FuelSlot.java @@ -0,0 +1,44 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus + * Copyright (C) 2021-2026 the original authors + * - Florian Reuth + * - RK_01/RaphiMC + * Copyright (C) 2023-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.viaversion.viafabricplus.injection.mixin.features.v1_9; + +import com.viaversion.viafabricplus.ViaFabricPlus; +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; +import net.minecraft.world.inventory.BrewingStandMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +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; + +@Mixin(BrewingStandMenu.FuelSlot.class) +public abstract class MixinBrewingStandMenu_FuelSlot { + + @Inject(method = "mayPlaceItem", at = @At("HEAD"), cancellable = true) + private static void enableShiftClickBlazePowderFuelSlot(ItemStack itemStack, CallbackInfoReturnable cir) { + if (itemStack.is(Items.BLAZE_POWDER) && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(ProtocolVersion.v1_9) && ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_11)) { + cir.setReturnValue(true); + } + } + +} diff --git a/src/main/resources/viafabricplus.accesswidener b/src/main/resources/viafabricplus.accesswidener index f3b9b5bc9..c5d52eae6 100644 --- a/src/main/resources/viafabricplus.accesswidener +++ b/src/main/resources/viafabricplus.accesswidener @@ -58,3 +58,4 @@ accessible class net/minecraft/world/entity/EntityFluidInteraction$Tracker accessible class net/minecraft/client/gui/screens/debug/GameModeSwitcherScreen$GameModeIcon accessible class net/minecraft/client/gui/Font$PreparedTextBuilder accessible class net/minecraft/world/inventory/BrewingStandMenu$PotionSlot +accessible class net/minecraft/world/inventory/BrewingStandMenu$FuelSlot diff --git a/src/main/resources/viafabricplus.mixins.json b/src/main/resources/viafabricplus.mixins.json index d7d65a45c..97c2ef1ca 100644 --- a/src/main/resources/viafabricplus.mixins.json +++ b/src/main/resources/viafabricplus.mixins.json @@ -390,6 +390,8 @@ "features.v1_8.screen.MixinBrewingStandMenu_FuelSlot", "features.v1_8.screen.MixinCommandBlockEditScreen", "features.v1_8.screen.MixinInventoryMenu", + "features.v1_9.MixinBrewingStandMenu", + "features.v1_9.MixinBrewingStandMenu_FuelSlot", "features.v1_9_3.MixinFarmlandBlock", "features.v1_9_3.MixinLivingEntity", "features.v1_9_3.network.MixinChatScreen", From 9ef302446479d6c6ce53494b91249963dd87365b Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Fri, 18 Sep 2026 16:00:00 +0700 Subject: [PATCH 26/33] new mixin disabling shift clicking ingredients into the ingredient slot when the ingredient slot is not empty (even if the ingredient item stack is not full) new mixin fixing an issue with shift clicking out of the crafting output slot on 1.4.5 and below sometimes kicks the player use .betweenInclusive for applicable checks --- .../MixinBrewingStandMenu.java | 4 +- .../MixinBrewingStandMenu_FuelSlot.java | 4 +- .../MixinBrewingStandMenu_IngredientSlot.java | 56 +++++++++++++++++++ .../v1_2_1/MixinAbstractFurnaceMenu.java | 6 +- .../v1_4_4/MixinMultiPlayerGameMode.java | 54 ++++++++++++++++++ .../resources/viafabricplus.accesswidener | 1 + src/main/resources/viafabricplus.mixins.json | 6 +- 7 files changed, 122 insertions(+), 9 deletions(-) rename src/main/java/com/viaversion/viafabricplus/injection/mixin/features/{v1_9 => v1_10}/MixinBrewingStandMenu.java (94%) rename src/main/java/com/viaversion/viafabricplus/injection/mixin/features/{v1_9 => v1_10}/MixinBrewingStandMenu_FuelSlot.java (93%) create mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu_IngredientSlot.java create mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_4_4/MixinMultiPlayerGameMode.java diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_9/MixinBrewingStandMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu.java similarity index 94% rename from src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_9/MixinBrewingStandMenu.java rename to src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu.java index 7884fb154..eb2551991 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_9/MixinBrewingStandMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu.java @@ -19,7 +19,7 @@ * along with this program. If not, see . */ -package com.viaversion.viafabricplus.injection.mixin.features.v1_9; +package com.viaversion.viafabricplus.injection.mixin.features.v1_10; import com.viaversion.viafabricplus.ViaFabricPlus; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; @@ -41,7 +41,7 @@ public abstract class MixinBrewingStandMenu { @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/BrewingStandMenu$FuelSlot;mayPlaceItem(Lnet/minecraft/world/item/ItemStack;)Z")) private boolean disableShiftClickBlazePowderFuelSlotWhenIngredientSlotEmpty(ItemStack itemStack) { - if (ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_11)) { + if (ViaFabricPlus.api().targetVersion().betweenInclusive(ProtocolVersion.v1_9, ProtocolVersion.v1_10)) { return BrewingStandMenu.FuelSlot.mayPlaceItem(itemStack) && !this.ingredientSlot.getItem().isEmpty(); } diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_9/MixinBrewingStandMenu_FuelSlot.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu_FuelSlot.java similarity index 93% rename from src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_9/MixinBrewingStandMenu_FuelSlot.java rename to src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu_FuelSlot.java index a8b035a95..f036f7331 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_9/MixinBrewingStandMenu_FuelSlot.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu_FuelSlot.java @@ -19,7 +19,7 @@ * along with this program. If not, see . */ -package com.viaversion.viafabricplus.injection.mixin.features.v1_9; +package com.viaversion.viafabricplus.injection.mixin.features.v1_10; import com.viaversion.viafabricplus.ViaFabricPlus; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; @@ -36,7 +36,7 @@ public abstract class MixinBrewingStandMenu_FuelSlot { @Inject(method = "mayPlaceItem", at = @At("HEAD"), cancellable = true) private static void enableShiftClickBlazePowderFuelSlot(ItemStack itemStack, CallbackInfoReturnable cir) { - if (itemStack.is(Items.BLAZE_POWDER) && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(ProtocolVersion.v1_9) && ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_11)) { + if (itemStack.is(Items.BLAZE_POWDER) && ViaFabricPlus.api().targetVersion().betweenInclusive(ProtocolVersion.v1_9, ProtocolVersion.v1_10)) { cir.setReturnValue(true); } } diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu_IngredientSlot.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu_IngredientSlot.java new file mode 100644 index 000000000..ab51a92f2 --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu_IngredientSlot.java @@ -0,0 +1,56 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus + * Copyright (C) 2021-2026 the original authors + * - Florian Reuth + * - RK_01/RaphiMC + * Copyright (C) 2023-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.viaversion.viafabricplus.injection.mixin.features.v1_10; + +import com.viaversion.viafabricplus.ViaFabricPlus; +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; +import net.minecraft.world.Container; +import net.minecraft.world.inventory.BrewingStandMenu; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.alchemy.PotionBrewing; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(BrewingStandMenu.IngredientsSlot.class) +public abstract class MixinBrewingStandMenu_IngredientSlot extends Slot { + + @Shadow + @Final + private PotionBrewing potionBrewing; + + public MixinBrewingStandMenu_IngredientSlot(final Container container, final int slot, final int x, final int y) { + super(container, slot, x, y); + } + + @Inject(method = "mayPlace", at = @At("HEAD"), cancellable = true) + private void disableShiftClickIngredientWhenIngredientSlotNotEmpty(ItemStack itemStack, CallbackInfoReturnable cir) { + if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(ProtocolVersion.v1_10)) { + cir.setReturnValue(this.potionBrewing.isIngredient(itemStack) && this.getItem().isEmpty()); + } + } + +} diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java index 7d43da3d1..add829c0e 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_2_1/MixinAbstractFurnaceMenu.java @@ -61,11 +61,11 @@ private void smeltingSlotShiftClickWhitelist(ItemStack itemStack, CallbackInfoRe @Inject(method = "isFuel", at = @At("HEAD"), cancellable = true) private void fuelSlotShiftClickWhitelist(ItemStack itemStack, CallbackInfoReturnable cir) { - if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_2_4tor1_2_5) && ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2)) { + if (ViaFabricPlus.api().targetVersion().equalTo(LegacyProtocolVersion.r1_2_4tor1_2_5)) { cir.setReturnValue(FurnaceFuels.getFuels_1_2_5().isFuel(itemStack)); - } else if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2) && ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_11)) { + } else if (ViaFabricPlus.api().targetVersion().betweenInclusive(LegacyProtocolVersion.r1_3_1tor1_3_2, ProtocolVersion.v1_10)) { cir.setReturnValue(FurnaceFuels.getFuels_1_3_1().isFuel(itemStack)); - } else if (ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(ProtocolVersion.v1_11) && ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_14)) { + } else if (ViaFabricPlus.api().targetVersion().betweenInclusive(ProtocolVersion.v1_11, ProtocolVersion.v1_13_2)) { cir.setReturnValue(FurnaceFuels.getFuels_1_11().isFuel(itemStack)); } } diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_4_4/MixinMultiPlayerGameMode.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_4_4/MixinMultiPlayerGameMode.java new file mode 100644 index 000000000..bc982fff1 --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_4_4/MixinMultiPlayerGameMode.java @@ -0,0 +1,54 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus + * Copyright (C) 2021-2026 the original authors + * - Florian Reuth + * - RK_01/RaphiMC + * Copyright (C) 2023-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.viaversion.viafabricplus.injection.mixin.features.v1_4_4; + +import com.viaversion.viafabricplus.ViaFabricPlus; +import com.viaversion.viafabricplus.ViaFabricPlusImpl; +import net.minecraft.client.multiplayer.MultiPlayerGameMode; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ContainerInput; +import net.raphimc.vialegacy.api.LegacyProtocolVersion; +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.CallbackInfo; + +@Mixin(MultiPlayerGameMode.class) +public abstract class MixinMultiPlayerGameMode { + + /** + * on 1.4.5 and below(?) if a server receives a container click packet with + * a negative slot number it will forcefully disconnect the player because + * the server does not check for the negative slot number and tries to index + * a list(?) with the negative slot number, causing a disconnect + * this can happen when you hold shift and spam click on the crafting result slot, + * especially when crafting multiple different tools + * this problem does not happen on the actual 1.4.5 and below clients + */ + @Inject(method = "handleContainerInput", at = @At("HEAD"), cancellable = true) + private void cancelContainerClickWithNegativeSlotNumber(int containerId, int slotNum, int buttonNum, ContainerInput containerInput, Player player, CallbackInfo ci) { + if (slotNum < 0 && ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_4_4tor1_4_5)) { + ci.cancel(); + } + } + +} diff --git a/src/main/resources/viafabricplus.accesswidener b/src/main/resources/viafabricplus.accesswidener index c5d52eae6..30490e0ff 100644 --- a/src/main/resources/viafabricplus.accesswidener +++ b/src/main/resources/viafabricplus.accesswidener @@ -59,3 +59,4 @@ accessible class net/minecraft/client/gui/screens/debug/GameModeSwitcherScreen$G accessible class net/minecraft/client/gui/Font$PreparedTextBuilder accessible class net/minecraft/world/inventory/BrewingStandMenu$PotionSlot accessible class net/minecraft/world/inventory/BrewingStandMenu$FuelSlot +accessible class net/minecraft/world/inventory/BrewingStandMenu$IngredientsSlot diff --git a/src/main/resources/viafabricplus.mixins.json b/src/main/resources/viafabricplus.mixins.json index 97c2ef1ca..0a6299c0b 100644 --- a/src/main/resources/viafabricplus.mixins.json +++ b/src/main/resources/viafabricplus.mixins.json @@ -349,6 +349,7 @@ "features.v1_4_2.MixinAbstractContainerScreen", "features.v1_4_2.MixinChestBlock", "features.v1_4_2.MixinEnderChestBlock", + "features.v1_4_4.MixinMultiPlayerGameMode", "features.v1_4_6.MixinBlockBehaviour", "features.v1_5.MixinAbstractContainerScreen", "features.v1_5_2.MixinLocalPlayer", @@ -390,8 +391,9 @@ "features.v1_8.screen.MixinBrewingStandMenu_FuelSlot", "features.v1_8.screen.MixinCommandBlockEditScreen", "features.v1_8.screen.MixinInventoryMenu", - "features.v1_9.MixinBrewingStandMenu", - "features.v1_9.MixinBrewingStandMenu_FuelSlot", + "features.v1_10.MixinBrewingStandMenu_IngredientSlot", + "features.v1_10.MixinBrewingStandMenu", + "features.v1_10.MixinBrewingStandMenu_FuelSlot", "features.v1_9_3.MixinFarmlandBlock", "features.v1_9_3.MixinLivingEntity", "features.v1_9_3.network.MixinChatScreen", From f3993efcc6c7991ec5454d1fb7b80bd816b0b5b1 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Fri, 18 Sep 2026 16:02:43 +0700 Subject: [PATCH 27/33] remove unused import --- .../mixin/features/v1_4_4/MixinMultiPlayerGameMode.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_4_4/MixinMultiPlayerGameMode.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_4_4/MixinMultiPlayerGameMode.java index bc982fff1..5af3b76e9 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_4_4/MixinMultiPlayerGameMode.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_4_4/MixinMultiPlayerGameMode.java @@ -22,7 +22,6 @@ package com.viaversion.viafabricplus.injection.mixin.features.v1_4_4; import com.viaversion.viafabricplus.ViaFabricPlus; -import com.viaversion.viafabricplus.ViaFabricPlusImpl; import net.minecraft.client.multiplayer.MultiPlayerGameMode; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.ContainerInput; From 3236028fea20860b9152961eec1e709322ff72fd Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Fri, 18 Sep 2026 17:00:12 +0700 Subject: [PATCH 28/33] new mixin disabling shift clicking in / out lapis slot before 1.8 --- .../v1_8/screen/MixinEnchantmentMenu.java | 54 +++++++++++++++++++ src/main/resources/viafabricplus.mixins.json | 1 + 2 files changed, 55 insertions(+) create mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_8/screen/MixinEnchantmentMenu.java diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_8/screen/MixinEnchantmentMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_8/screen/MixinEnchantmentMenu.java new file mode 100644 index 000000000..75e09e00a --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_8/screen/MixinEnchantmentMenu.java @@ -0,0 +1,54 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus + * Copyright (C) 2021-2026 the original authors + * - Florian Reuth + * - RK_01/RaphiMC + * Copyright (C) 2023-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.viaversion.viafabricplus.injection.mixin.features.v1_8.screen; + +import com.viaversion.viafabricplus.ViaFabricPlus; +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.EnchantmentMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import org.jspecify.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + + +@Mixin(EnchantmentMenu.class) +public abstract class MixinEnchantmentMenu extends AbstractContainerMenu { + + protected MixinEnchantmentMenu(@Nullable final MenuType menuType, final int containerId) { + super(menuType, containerId); + } + + @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/EnchantmentMenu;moveItemStackTo(Lnet/minecraft/world/item/ItemStack;IIZ)Z", ordinal = 1)) + private boolean disableShiftClickLapisLazuliSlot(EnchantmentMenu instance, ItemStack itemStack, int startSlot, int endSlot, boolean backwards) { + return ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(ProtocolVersion.v1_8) && this.moveItemStackTo(itemStack, startSlot, endSlot, backwards); + } + + @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;is(Ljava/lang/Object;)Z")) + private boolean disableShiftClickLapisLazuliIntoLapisLazuliSlot(ItemStack instance, Object lapisLazuli) { + return instance.is((Item) lapisLazuli) && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(ProtocolVersion.v1_8); + } + +} diff --git a/src/main/resources/viafabricplus.mixins.json b/src/main/resources/viafabricplus.mixins.json index 0a6299c0b..99c70858d 100644 --- a/src/main/resources/viafabricplus.mixins.json +++ b/src/main/resources/viafabricplus.mixins.json @@ -391,6 +391,7 @@ "features.v1_8.screen.MixinBrewingStandMenu_FuelSlot", "features.v1_8.screen.MixinCommandBlockEditScreen", "features.v1_8.screen.MixinInventoryMenu", + "features.v1_8.screen.MixinEnchantmentMenu", "features.v1_10.MixinBrewingStandMenu_IngredientSlot", "features.v1_10.MixinBrewingStandMenu", "features.v1_10.MixinBrewingStandMenu_FuelSlot", From 777523e41fa5508b1d4938859b1d32b6702b1126 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Fri, 18 Sep 2026 19:43:30 +0700 Subject: [PATCH 29/33] new mixin attempting to disable max craft (shift clicking on output) on below b1.6 and b1.6.5 to below b1.8 --- .../b1_7/MixinAbstractContainerMenu.java | 48 +++++++++++++++++++ src/main/resources/viafabricplus.mixins.json | 1 + 2 files changed, 49 insertions(+) create mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_7/MixinAbstractContainerMenu.java diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_7/MixinAbstractContainerMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_7/MixinAbstractContainerMenu.java new file mode 100644 index 000000000..7bfce0c75 --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_7/MixinAbstractContainerMenu.java @@ -0,0 +1,48 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus + * Copyright (C) 2021-2026 the original authors + * - Florian Reuth + * - RK_01/RaphiMC + * Copyright (C) 2023-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.viaversion.viafabricplus.injection.mixin.features.b1_7; + +import com.viaversion.viafabricplus.ViaFabricPlus; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.AbstractCraftingMenu; +import net.minecraft.world.item.ItemStack; +import net.raphimc.vialegacy.api.LegacyProtocolVersion; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(AbstractContainerMenu.class) +public abstract class MixinAbstractContainerMenu { + + @Redirect(method = "doClick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/AbstractContainerMenu;quickMoveStack(Lnet/minecraft/world/entity/player/Player;I)Lnet/minecraft/world/item/ItemStack;", ordinal = 0)) + private ItemStack disableQuickCraftMaxAmount(AbstractContainerMenu instance, Player player, int slotIndex) { + ItemStack clicked = instance.quickMoveStack(player, slotIndex); + + if ((Object) this instanceof AbstractCraftingMenu && slotIndex == 0 && ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.b1_7tob1_7_3)) { + return ItemStack.EMPTY; + } + + return clicked; + } + +} diff --git a/src/main/resources/viafabricplus.mixins.json b/src/main/resources/viafabricplus.mixins.json index 99c70858d..09da37641 100644 --- a/src/main/resources/viafabricplus.mixins.json +++ b/src/main/resources/viafabricplus.mixins.json @@ -46,6 +46,7 @@ "features.b1_5.MixinCraftingMenu", "features.b1_7.MixinDispenserMenu", "features.b1_7.MixinBowItem", + "features.b1_7.MixinAbstractContainerMenu", "features.b1_7.MixinHud", "features.b1_7.MixinMultiPlayerGameMode", "features.b1_7.MixinServerSelectionList_OnlineServerEntry", From 9774c860289cba68acec57e8c1a22cc63ec41026 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Fri, 18 Sep 2026 20:31:27 +0700 Subject: [PATCH 30/33] completely disable shift clicking on the crafting output slot on b1.6.6 and below and move the max craft disable up to b1.7.x --- .../features/b1_7/MixinAbstractContainerMenu.java | 2 +- .../features/v1_15_2/MixinMultiPlayerGameMode.java | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_7/MixinAbstractContainerMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_7/MixinAbstractContainerMenu.java index 7bfce0c75..e9f02296e 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_7/MixinAbstractContainerMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_7/MixinAbstractContainerMenu.java @@ -38,7 +38,7 @@ public abstract class MixinAbstractContainerMenu { private ItemStack disableQuickCraftMaxAmount(AbstractContainerMenu instance, Player player, int slotIndex) { ItemStack clicked = instance.quickMoveStack(player, slotIndex); - if ((Object) this instanceof AbstractCraftingMenu && slotIndex == 0 && ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.b1_7tob1_7_3)) { + if ((Object) this instanceof AbstractCraftingMenu && slotIndex == 0 && ViaFabricPlus.api().targetVersion().equalTo(LegacyProtocolVersion.b1_7tob1_7_3)) { return ItemStack.EMPTY; } diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_15_2/MixinMultiPlayerGameMode.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_15_2/MixinMultiPlayerGameMode.java index a7c25e56a..864c6f8d5 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_15_2/MixinMultiPlayerGameMode.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_15_2/MixinMultiPlayerGameMode.java @@ -29,6 +29,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractCraftingMenu; import net.minecraft.world.inventory.ContainerInput; import net.minecraft.world.level.block.Blocks; import net.raphimc.vialegacy.api.LegacyProtocolVersion; @@ -59,10 +60,11 @@ private boolean checkFireBlock(MultiPlayerGameMode instance, BlockPos pos, @Loca @Inject(method = "handleContainerInput", at = @At("HEAD"), cancellable = true) private void removeClickActions(int containerId, int slotNum, int buttonNum, ContainerInput containerInput, Player player, CallbackInfo ci) { -// if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.b1_5tob1_5_2) && !containerInput.equals(ContainerInput.PICKUP)) { -// ci.cancel(); -// } else - if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_4_6tor1_4_7) && !containerInput.equals(ContainerInput.PICKUP) && !containerInput.equals(ContainerInput.QUICK_MOVE) && !containerInput.equals(ContainerInput.SWAP) && !containerInput.equals(ContainerInput.CLONE)) { + if (ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.b1_5tob1_5_2) && !containerInput.equals(ContainerInput.PICKUP)) { + ci.cancel(); + } else if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.b1_6tob1_6_6) && slotNum == 0 && player.containerMenu instanceof AbstractCraftingMenu && !containerInput.equals(ContainerInput.PICKUP)) { + ci.cancel(); + } else if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_4_6tor1_4_7) && !containerInput.equals(ContainerInput.PICKUP) && !containerInput.equals(ContainerInput.QUICK_MOVE) && !containerInput.equals(ContainerInput.SWAP) && !containerInput.equals(ContainerInput.CLONE)) { ci.cancel(); } if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(ProtocolVersion.v1_15_2) && containerInput == ContainerInput.SWAP && buttonNum == 40) { // Pressing 'F' in inventory From 3cbc3654456b936ffe75347604967344631a8280 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Sat, 19 Sep 2026 08:50:55 +0700 Subject: [PATCH 31/33] only cancel negative slot num QUICK_MOVE container input on b1.4.5 and below --- .../features/v1_4_4/MixinMultiPlayerGameMode.java | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_4_4/MixinMultiPlayerGameMode.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_4_4/MixinMultiPlayerGameMode.java index 5af3b76e9..c27b3b8c1 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_4_4/MixinMultiPlayerGameMode.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_4_4/MixinMultiPlayerGameMode.java @@ -34,19 +34,10 @@ @Mixin(MultiPlayerGameMode.class) public abstract class MixinMultiPlayerGameMode { - /** - * on 1.4.5 and below(?) if a server receives a container click packet with - * a negative slot number it will forcefully disconnect the player because - * the server does not check for the negative slot number and tries to index - * a list(?) with the negative slot number, causing a disconnect - * this can happen when you hold shift and spam click on the crafting result slot, - * especially when crafting multiple different tools - * this problem does not happen on the actual 1.4.5 and below clients - */ @Inject(method = "handleContainerInput", at = @At("HEAD"), cancellable = true) - private void cancelContainerClickWithNegativeSlotNumber(int containerId, int slotNum, int buttonNum, ContainerInput containerInput, Player player, CallbackInfo ci) { - if (slotNum < 0 && ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_4_4tor1_4_5)) { - ci.cancel(); + private void cancelQuickMoveWithNegativeSlotNumber(int containerId, int slotNum, int buttonNum, ContainerInput containerInput, Player player, CallbackInfo ci) { + if (slotNum < 0 && containerInput.equals(ContainerInput.QUICK_MOVE) && ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_4_4tor1_4_5)) { + ci.cancel(); } } From 45d1c38d800a688a22fdce50580cb8485217bed6 Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Sun, 20 Sep 2026 17:54:34 +0700 Subject: [PATCH 32/33] bring back PotionBrewing from 26.2 --- .../features/FeaturesLoading.java | 2 + .../features/v26_2/PotionBrewing26_2.java | 160 ++++++++++++++++++ .../MixinBrewingStandMenu_IngredientSlot.java | 12 +- .../v1_3_1/MixinBrewingStandMenu.java | 16 +- 4 files changed, 181 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/viaversion/viafabricplus/features/v26_2/PotionBrewing26_2.java diff --git a/src/main/java/com/viaversion/viafabricplus/features/FeaturesLoading.java b/src/main/java/com/viaversion/viafabricplus/features/FeaturesLoading.java index d4c06cf2f..2e49f5126 100644 --- a/src/main/java/com/viaversion/viafabricplus/features/FeaturesLoading.java +++ b/src/main/java/com/viaversion/viafabricplus/features/FeaturesLoading.java @@ -35,6 +35,7 @@ import com.viaversion.viafabricplus.features.global.ResourcePackHeaderDiff; import com.viaversion.viafabricplus.features.v1_11_1.Recipes1_11_2; import com.viaversion.viafabricplus.features.v1_12_2.FootStepParticle1_12_2; +import com.viaversion.viafabricplus.features.v26_2.PotionBrewing26_2; import com.viaversion.viafabricplus.util.network.SyncTasks; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import net.minecraft.client.Minecraft; @@ -81,6 +82,7 @@ public static void onPostGameLoading() { Recipes1_11_2.init(); ArmorHudEmulation1_8.init(); CPEAdditions.postInit(); + PotionBrewing26_2.init(); } } diff --git a/src/main/java/com/viaversion/viafabricplus/features/v26_2/PotionBrewing26_2.java b/src/main/java/com/viaversion/viafabricplus/features/v26_2/PotionBrewing26_2.java new file mode 100644 index 000000000..9a314c308 --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/features/v26_2/PotionBrewing26_2.java @@ -0,0 +1,160 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus + * Copyright (C) 2021-2026 the original authors + * - Florian Reuth + * - RK_01/RaphiMC + * Copyright (C) 2023-2026 ViaVersion and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.viaversion.viafabricplus.features.v26_2; + +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.item.crafting.Ingredient; +import java.util.ArrayList; +import java.util.List; + +public class PotionBrewing26_2 { + public static PotionBrewing26_2 INSTANCE = null; + private final List> potionMixes; + private final List> containerMixes; + + private PotionBrewing26_2( + final List> potionMixes, final List> containerMixes + ) { + this.potionMixes = potionMixes; + this.containerMixes = containerMixes; + } + + public boolean isIngredient(final ItemStack ingredient) { + return this.isContainerIngredient(ingredient) || this.isPotionIngredient(ingredient); + } + + public boolean isContainerIngredient(final ItemStack ingredient) { + for (PotionBrewing26_2.Mix containerMix : this.containerMixes) { + if (containerMix.ingredient.test(ingredient)) { + return true; + } + } + + return false; + } + + public boolean isPotionIngredient(final ItemStack ingredient) { + for (PotionBrewing26_2.Mix potionMix : this.potionMixes) { + if (potionMix.ingredient.test(ingredient)) { + return true; + } + } + + return false; + } + + public static void init() { + if (INSTANCE != null) { + throw new IllegalStateException("PotionBrewing26_2 is already initialized"); + } + + PotionBrewing26_2.Builder builder = new PotionBrewing26_2.Builder(); + + builder.addContainerRecipe(Items.POTION, Items.GUNPOWDER, Items.SPLASH_POTION); + builder.addContainerRecipe(Items.SPLASH_POTION, Items.DRAGON_BREATH, Items.LINGERING_POTION); + builder.addMix(Potions.WATER, Items.GLOWSTONE_DUST, Potions.THICK); + builder.addMix(Potions.WATER, Items.REDSTONE, Potions.MUNDANE); + builder.addMix(Potions.WATER, Items.NETHER_WART, Potions.AWKWARD); + builder.addStartMix(Items.BREEZE_ROD, Potions.WIND_CHARGED); + builder.addStartMix(Items.SLIME_BLOCK, Potions.OOZING); + builder.addStartMix(Items.STONE, Potions.INFESTED); + builder.addStartMix(Items.COBWEB, Potions.WEAVING); + builder.addMix(Potions.AWKWARD, Items.GOLDEN_CARROT, Potions.NIGHT_VISION); + builder.addMix(Potions.NIGHT_VISION, Items.REDSTONE, Potions.LONG_NIGHT_VISION); + builder.addMix(Potions.NIGHT_VISION, Items.FERMENTED_SPIDER_EYE, Potions.INVISIBILITY); + builder.addMix(Potions.LONG_NIGHT_VISION, Items.FERMENTED_SPIDER_EYE, Potions.LONG_INVISIBILITY); + builder.addMix(Potions.INVISIBILITY, Items.REDSTONE, Potions.LONG_INVISIBILITY); + builder.addStartMix(Items.MAGMA_CREAM, Potions.FIRE_RESISTANCE); + builder.addMix(Potions.FIRE_RESISTANCE, Items.REDSTONE, Potions.LONG_FIRE_RESISTANCE); + builder.addStartMix(Items.RABBIT_FOOT, Potions.LEAPING); + builder.addMix(Potions.LEAPING, Items.REDSTONE, Potions.LONG_LEAPING); + builder.addMix(Potions.LEAPING, Items.GLOWSTONE_DUST, Potions.STRONG_LEAPING); + builder.addMix(Potions.LEAPING, Items.FERMENTED_SPIDER_EYE, Potions.SLOWNESS); + builder.addMix(Potions.LONG_LEAPING, Items.FERMENTED_SPIDER_EYE, Potions.LONG_SLOWNESS); + builder.addMix(Potions.SLOWNESS, Items.REDSTONE, Potions.LONG_SLOWNESS); + builder.addMix(Potions.SLOWNESS, Items.GLOWSTONE_DUST, Potions.STRONG_SLOWNESS); + builder.addMix(Potions.AWKWARD, Items.TURTLE_HELMET, Potions.TURTLE_MASTER); + builder.addMix(Potions.TURTLE_MASTER, Items.REDSTONE, Potions.LONG_TURTLE_MASTER); + builder.addMix(Potions.TURTLE_MASTER, Items.GLOWSTONE_DUST, Potions.STRONG_TURTLE_MASTER); + builder.addMix(Potions.SWIFTNESS, Items.FERMENTED_SPIDER_EYE, Potions.SLOWNESS); + builder.addMix(Potions.LONG_SWIFTNESS, Items.FERMENTED_SPIDER_EYE, Potions.LONG_SLOWNESS); + builder.addStartMix(Items.SUGAR, Potions.SWIFTNESS); + builder.addMix(Potions.SWIFTNESS, Items.REDSTONE, Potions.LONG_SWIFTNESS); + builder.addMix(Potions.SWIFTNESS, Items.GLOWSTONE_DUST, Potions.STRONG_SWIFTNESS); + builder.addMix(Potions.AWKWARD, Items.PUFFERFISH, Potions.WATER_BREATHING); + builder.addMix(Potions.WATER_BREATHING, Items.REDSTONE, Potions.LONG_WATER_BREATHING); + builder.addStartMix(Items.GLISTERING_MELON_SLICE, Potions.HEALING); + builder.addMix(Potions.HEALING, Items.GLOWSTONE_DUST, Potions.STRONG_HEALING); + builder.addMix(Potions.HEALING, Items.FERMENTED_SPIDER_EYE, Potions.HARMING); + builder.addMix(Potions.STRONG_HEALING, Items.FERMENTED_SPIDER_EYE, Potions.STRONG_HARMING); + builder.addMix(Potions.HARMING, Items.GLOWSTONE_DUST, Potions.STRONG_HARMING); + builder.addMix(Potions.POISON, Items.FERMENTED_SPIDER_EYE, Potions.HARMING); + builder.addMix(Potions.LONG_POISON, Items.FERMENTED_SPIDER_EYE, Potions.HARMING); + builder.addMix(Potions.STRONG_POISON, Items.FERMENTED_SPIDER_EYE, Potions.STRONG_HARMING); + builder.addStartMix(Items.SPIDER_EYE, Potions.POISON); + builder.addMix(Potions.POISON, Items.REDSTONE, Potions.LONG_POISON); + builder.addMix(Potions.POISON, Items.GLOWSTONE_DUST, Potions.STRONG_POISON); + builder.addStartMix(Items.GHAST_TEAR, Potions.REGENERATION); + builder.addMix(Potions.REGENERATION, Items.REDSTONE, Potions.LONG_REGENERATION); + builder.addMix(Potions.REGENERATION, Items.GLOWSTONE_DUST, Potions.STRONG_REGENERATION); + builder.addStartMix(Items.BLAZE_POWDER, Potions.STRENGTH); + builder.addMix(Potions.STRENGTH, Items.REDSTONE, Potions.LONG_STRENGTH); + builder.addMix(Potions.STRENGTH, Items.GLOWSTONE_DUST, Potions.STRONG_STRENGTH); + builder.addMix(Potions.WATER, Items.FERMENTED_SPIDER_EYE, Potions.WEAKNESS); + builder.addMix(Potions.WEAKNESS, Items.REDSTONE, Potions.LONG_WEAKNESS); + builder.addMix(Potions.AWKWARD, Items.PHANTOM_MEMBRANE, Potions.SLOW_FALLING); + builder.addMix(Potions.SLOW_FALLING, Items.REDSTONE, Potions.LONG_SLOW_FALLING); + + INSTANCE = builder.build(); + } + + public static class Builder { + private final List> potionMixes = new ArrayList<>(); + private final List> containerMixes = new ArrayList<>(); + + public void addContainerRecipe(final Item from, final Item ingredient, final Item to) { + this.containerMixes.add(new PotionBrewing26_2.Mix<>(BuiltInRegistries.ITEM.wrapAsHolder(from), Ingredient.of(ingredient), BuiltInRegistries.ITEM.wrapAsHolder(to))); + } + + public void addMix(final Holder from, final Item ingredient, final Holder to) { + this.potionMixes.add(new PotionBrewing26_2.Mix<>(from, Ingredient.of(ingredient), to)); + } + + public void addStartMix(final Item ingredient, final Holder potion) { + this.addMix(Potions.WATER, ingredient, Potions.MUNDANE); + this.addMix(Potions.AWKWARD, ingredient, potion); + } + + public PotionBrewing26_2 build() { + return new PotionBrewing26_2(List.copyOf(this.potionMixes), List.copyOf(this.containerMixes)); + } + } + + private record Mix(Holder from, Ingredient ingredient, Holder to) { + } +} diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu_IngredientSlot.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu_IngredientSlot.java index ab51a92f2..00ba95c56 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu_IngredientSlot.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu_IngredientSlot.java @@ -22,12 +22,14 @@ package com.viaversion.viafabricplus.injection.mixin.features.v1_10; import com.viaversion.viafabricplus.ViaFabricPlus; +import com.viaversion.viafabricplus.features.v26_2.PotionBrewing26_2; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; +import net.minecraft.client.color.item.Potion; import net.minecraft.world.Container; import net.minecraft.world.inventory.BrewingStandMenu; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.alchemy.PotionBrewing; +import net.minecraft.world.item.crafting.RecipePropertySet; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -38,10 +40,6 @@ @Mixin(BrewingStandMenu.IngredientsSlot.class) public abstract class MixinBrewingStandMenu_IngredientSlot extends Slot { - @Shadow - @Final - private PotionBrewing potionBrewing; - public MixinBrewingStandMenu_IngredientSlot(final Container container, final int slot, final int x, final int y) { super(container, slot, x, y); } @@ -49,7 +47,9 @@ public MixinBrewingStandMenu_IngredientSlot(final Container container, final int @Inject(method = "mayPlace", at = @At("HEAD"), cancellable = true) private void disableShiftClickIngredientWhenIngredientSlotNotEmpty(ItemStack itemStack, CallbackInfoReturnable cir) { if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(ProtocolVersion.v1_10)) { - cir.setReturnValue(this.potionBrewing.isIngredient(itemStack) && this.getItem().isEmpty()); + cir.setReturnValue(PotionBrewing26_2.INSTANCE.isIngredient(itemStack) && this.getItem().isEmpty()); + } else if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(ProtocolVersion.v26_2)) { + cir.setReturnValue(PotionBrewing26_2.INSTANCE.isIngredient(itemStack)); } } diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinBrewingStandMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinBrewingStandMenu.java index 54a8aa649..a736a1f00 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinBrewingStandMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinBrewingStandMenu.java @@ -22,11 +22,17 @@ package com.viaversion.viafabricplus.injection.mixin.features.v1_3_1; import com.viaversion.viafabricplus.ViaFabricPlus; +import com.viaversion.viafabricplus.ViaFabricPlusImpl; +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.BrewingStandMenu; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.PotionIngredient; +import net.minecraft.world.item.crafting.RecipeAccess; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; @@ -45,9 +51,13 @@ private boolean disableShiftClickIngredientSlot(Slot instance, ItemStack itemSta return instance.mayPlace(itemStack) && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2); } - @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/BrewingStandMenu$PotionSlot;mayPlaceItem(Lnet/minecraft/world/item/ItemStack;)Z")) - private boolean disableShiftClickPotionSlot(ItemStack itemStack) { - return BrewingStandMenu.PotionSlot.mayPlaceItem(itemStack) && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2); + @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/crafting/PotionIngredient;isPotionInput(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/item/crafting/RecipeAccess;)Z")) + private boolean disableShiftClickPotionSlot(ItemStack itemStack, RecipeAccess recipeAccess) { + if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(ProtocolVersion.v26_2)) { + return (itemStack.is(Items.POTION) || itemStack.is(Items.SPLASH_POTION) || itemStack.is(Items.LINGERING_POTION) || itemStack.is(Items.GLASS_BOTTLE)) && ViaFabricPlus.api().targetVersion().newerThanOrEqualTo(LegacyProtocolVersion.r1_3_1tor1_3_2); + } + + return PotionIngredient.isPotionInput(itemStack, recipeAccess); } } From 2bf36b12f85651700aa0583350474d257bc190ea Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Sun, 20 Sep 2026 17:55:10 +0700 Subject: [PATCH 33/33] remove unused imports --- .../features/v1_10/MixinBrewingStandMenu_IngredientSlot.java | 4 ---- .../mixin/features/v1_3_1/MixinBrewingStandMenu.java | 2 -- 2 files changed, 6 deletions(-) diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu_IngredientSlot.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu_IngredientSlot.java index 00ba95c56..a4d063344 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu_IngredientSlot.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu_IngredientSlot.java @@ -24,15 +24,11 @@ import com.viaversion.viafabricplus.ViaFabricPlus; import com.viaversion.viafabricplus.features.v26_2.PotionBrewing26_2; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; -import net.minecraft.client.color.item.Potion; import net.minecraft.world.Container; import net.minecraft.world.inventory.BrewingStandMenu; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.RecipePropertySet; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinBrewingStandMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinBrewingStandMenu.java index a736a1f00..b629e2bff 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinBrewingStandMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_3_1/MixinBrewingStandMenu.java @@ -22,13 +22,11 @@ package com.viaversion.viafabricplus.injection.mixin.features.v1_3_1; import com.viaversion.viafabricplus.ViaFabricPlus; -import com.viaversion.viafabricplus.ViaFabricPlusImpl; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.BrewingStandMenu; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.PotionIngredient;