From 13c28c6c1bd2127e68624ef2072b2687d1c2e02a Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Sun, 4 Oct 2026 17:30:50 +0700 Subject: [PATCH 1/4] fix shift click behavior in containers on legacy versions --- .../features/v1_11_1/FurnaceFuels1_11_2.java | 208 ++++++++++++++++++ .../mixin/features/b1_5/MixinChestMenu.java | 47 ++++ .../screen/MixinAbstractFurnaceMenu.java | 66 ++++++ .../v1_15_2/MixinMultiPlayerGameMode.java | 24 +- src/main/resources/viafabricplus.mixins.json | 3 +- 5 files changed, 346 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/viaversion/viafabricplus/features/v1_11_1/FurnaceFuels1_11_2.java create mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java create mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_11_1/screen/MixinAbstractFurnaceMenu.java diff --git a/src/main/java/com/viaversion/viafabricplus/features/v1_11_1/FurnaceFuels1_11_2.java b/src/main/java/com/viaversion/viafabricplus/features/v1_11_1/FurnaceFuels1_11_2.java new file mode 100644 index 000000000..ad150790a --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/features/v1_11_1/FurnaceFuels1_11_2.java @@ -0,0 +1,208 @@ +/* + * 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.v1_11_1; + +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; +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 final class FurnaceFuels1_11_2 { + + private static FurnaceFuels1_11_2 FUELS_1_11 = null; + private static FurnaceFuels1_11_2 FUELS_1_3_1 = null; + private static FurnaceFuels1_11_2 FUELS_1_2_5 = null; + + private final ArrayList values; + + private FurnaceFuels1_11_2(final ArrayList values) { + this.values = values; + } + + public boolean isFuel(final ItemStack itemStack) { + return this.values.contains(itemStack.getItem()); + } + + public static FurnaceFuels1_11_2 getFuels_1_11() { + if (FUELS_1_11 == null) + FUELS_1_11 = new FurnaceFuels1_11_2.Builder() + .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(ItemTags.SIGNS) + .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 FurnaceFuels1_11_2 getFuels_1_3_1() { + if (FUELS_1_3_1 == null) + FUELS_1_3_1 = new FurnaceFuels1_11_2.Builder() + .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 FurnaceFuels1_11_2 getFuels_1_2_5() { + if (FUELS_1_2_5 == null) + FUELS_1_2_5 = new FurnaceFuels1_11_2.Builder() + .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 ArrayList values = new ArrayList<>(); + + public FurnaceFuels1_11_2 build() { + return new FurnaceFuels1_11_2(this.values); + } + + public FurnaceFuels1_11_2.Builder remove(final TagKey tag) { + BuiltInRegistries.ITEM.get(tag).ifPresent(items -> { + for (Holder item : items) { + this.values.remove(item.value()); + } + }); + return this; + } + + public FurnaceFuels1_11_2.Builder add(final TagKey tag) { + BuiltInRegistries.ITEM.get(tag).ifPresent(items -> { + for (Holder item : items) { + this.values.add(item.value()); + } + }); + return this; + } + + public FurnaceFuels1_11_2.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/b1_5/MixinChestMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java new file mode 100644 index 000000000..390eca283 --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/b1_5/MixinChestMenu.java @@ -0,0 +1,47 @@ +/* + * 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.AbstractContainerMenu; +import net.minecraft.world.inventory.ChestMenu; +import net.minecraft.world.inventory.MenuType; +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(ChestMenu.class) +public abstract class MixinChestMenu extends AbstractContainerMenu { + + protected MixinChestMenu(@Nullable final MenuType menuType, final int containerId) { + super(menuType, 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 reverseQuickMovePlacementOrder(ChestMenu instance, ItemStack itemStack, int startSlot, int endSlot, boolean backwards) { + return this.moveItemStackTo(itemStack, startSlot, endSlot, ViaFabricPlus.api().targetVersion().newerThan(LegacyProtocolVersion.b1_5tob1_5_2) && backwards); + } + +} diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_11_1/screen/MixinAbstractFurnaceMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_11_1/screen/MixinAbstractFurnaceMenu.java new file mode 100644 index 000000000..f0f819048 --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_11_1/screen/MixinAbstractFurnaceMenu.java @@ -0,0 +1,66 @@ +/* + * 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_11_1.screen; + +import com.viaversion.viafabricplus.ViaFabricPlus; +import com.viaversion.viafabricplus.features.v1_11_1.FurnaceFuels1_11_2; +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.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; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(AbstractFurnaceMenu.class) +public abstract class MixinAbstractFurnaceMenu { + + @Final + @Shadow + protected Level level; + + @Inject(method = "canSmelt", at = @At("HEAD"), cancellable = true) + private void fixQuickMoveMaterial(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 fixQuickMoveFuel(ItemStack itemStack, CallbackInfoReturnable cir) { + if (ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2)) { + cir.setReturnValue(FurnaceFuels1_11_2.getFuels_1_2_5().isFuel(itemStack)); + } else if (ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_11)) { + cir.setReturnValue(FurnaceFuels1_11_2.getFuels_1_3_1().isFuel(itemStack)); + } else if (ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_14)) { + cir.setReturnValue(FurnaceFuels1_11_2.getFuels_1_11().isFuel(itemStack)); + } + } + +} 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..a6e31da83 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,7 +29,13 @@ 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.BrewingStandMenu; +import net.minecraft.world.inventory.ChestMenu; import net.minecraft.world.inventory.ContainerInput; +import net.minecraft.world.inventory.DispenserMenu; +import net.minecraft.world.inventory.EnchantmentMenu; +import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.level.block.Blocks; import net.raphimc.vialegacy.api.LegacyProtocolVersion; import org.spongepowered.asm.mixin.Final; @@ -59,11 +65,27 @@ 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)) { + if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.b1_4tob1_4_1) && !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(LegacyProtocolVersion.b1_5tob1_5_2) && player.containerMenu instanceof InventoryMenu && !(slotNum >= 5 && slotNum <= 8) && containerInput.equals(ContainerInput.QUICK_MOVE)) { + ci.cancel(); + } else if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.b1_5tob1_5_2) && !(player.containerMenu instanceof ChestMenu) && containerInput.equals(ContainerInput.QUICK_MOVE)) { + ci.cancel(); + } else if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.b1_7tob1_7_3) && player.containerMenu instanceof AbstractCraftingMenu && slotNum == 0 && containerInput.equals(ContainerInput.QUICK_MOVE)) { + ci.cancel(); + } else if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.b1_7tob1_7_3) && player.containerMenu instanceof DispenserMenu && containerInput.equals(ContainerInput.QUICK_MOVE)) { + ci.cancel(); + } else if (ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2) && player.containerMenu instanceof BrewingStandMenu && containerInput.equals(ContainerInput.QUICK_MOVE)) { + // needs new legacy recipe entries for shift click to work properly still on 1.3.2+ + ci.cancel(); + } else if (ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2) && player.containerMenu instanceof EnchantmentMenu && slotNum != 0 && containerInput.equals(ContainerInput.QUICK_MOVE)) { + ci.cancel(); + } else if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_4_4tor1_4_5) && slotNum < 0 && containerInput.equals(ContainerInput.QUICK_MOVE)) { + ci.cancel(); + } if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(ProtocolVersion.v1_15_2) && containerInput == ContainerInput.SWAP && buttonNum == 40) { // Pressing 'F' in inventory ci.cancel(); } diff --git a/src/main/resources/viafabricplus.mixins.json b/src/main/resources/viafabricplus.mixins.json index 7abd70cd3..a2f182288 100644 --- a/src/main/resources/viafabricplus.mixins.json +++ b/src/main/resources/viafabricplus.mixins.json @@ -39,6 +39,7 @@ "core.integration.sync_tasks.MixinClientCommonPacketListenerImpl", "core.performance.MixinServerStatusPinger", "features.b1_5.MixinLivingEntity", + "features.b1_5.MixinChestMenu", "features.b1_7.MixinBowItem", "features.b1_7.MixinHud", "features.b1_7.MixinMultiPlayerGameMode", @@ -76,6 +77,7 @@ "features.v1_11_1.MixinEntityPacketRewriter1_12", "features.v1_11_1.MixinMinecraft", "features.v1_11_1.screen.MixinCraftingMenu", + "features.v1_11_1.screen.MixinAbstractFurnaceMenu", "features.v1_11_1.screen.MixinInventoryMenu", "features.v1_11_1.screen.MixinScreen", "features.v1_12_2.MixinBlockPlaceContext", @@ -342,7 +344,6 @@ "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 b5cce2d567327bed95e7ae942595f89846872b8b Mon Sep 17 00:00:00 2001 From: Evelyn <36399055+Socketlike@users.noreply.github.com> Date: Sun, 4 Oct 2026 18:07:28 +0700 Subject: [PATCH 2/4] disable shift clicking blaze powder into fuel slot when the ingredient slot is empty (1.9-1.10) --- .../features/v1_10/MixinBrewingStandMenu.java | 51 +++++++++++++++++++ .../resources/viafabricplus.accesswidener | 1 + src/main/resources/viafabricplus.mixins.json | 1 + 3 files changed, 53 insertions(+) create mode 100644 src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu.java diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/MixinBrewingStandMenu.java new file mode 100644 index 000000000..71592f5fa --- /dev/null +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_10/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_10; + +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 disableQuickMoveFuelWhenIngredientEmpty(ItemStack itemStack) { + if (ViaFabricPlus.api().targetVersion().betweenInclusive(ProtocolVersion.v1_9, ProtocolVersion.v1_10)) { + return BrewingStandMenu.FuelSlot.mayPlaceItem(itemStack) && !this.ingredientSlot.getItem().isEmpty(); + } + + return BrewingStandMenu.FuelSlot.mayPlaceItem(itemStack); + } + +} diff --git a/src/main/resources/viafabricplus.accesswidener b/src/main/resources/viafabricplus.accesswidener index 29d1a8f3d..213040644 100644 --- a/src/main/resources/viafabricplus.accesswidener +++ b/src/main/resources/viafabricplus.accesswidener @@ -53,3 +53,4 @@ accessible class net/minecraft/client/multiplayer/ClientPacketListener$CommandCh accessible class net/minecraft/world/entity/EntityFluidInteraction$CurrentAccumulator 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$FuelSlot diff --git a/src/main/resources/viafabricplus.mixins.json b/src/main/resources/viafabricplus.mixins.json index a2f182288..a8598bdbc 100644 --- a/src/main/resources/viafabricplus.mixins.json +++ b/src/main/resources/viafabricplus.mixins.json @@ -68,6 +68,7 @@ "features.v1_0_0.MixinLivingEntity", "features.v1_1.MixinPistonBaseBlock", "features.v1_10.MixinBaseRailBlock", + "features.v1_10.MixinBrewingStandMenu", "features.v1_10.MixinFlowerPotBlock", "features.v1_10.MixinGuiGraphicsExtractor", "features.v1_10.MixinPlayer", From fae82cda23766436a0adedfca1fbc5ea6e819e80 Mon Sep 17 00:00:00 2001 From: Florian Reuth Date: Tue, 6 Oct 2026 12:50:25 +0200 Subject: [PATCH 3/4] Cleanup code --- .../features/FeaturesLoading.java | 13 +- .../features/v1_11_1/FurnaceFuels1_11_2.java | 237 ++++++------------ .../screen/MixinAbstractFurnaceMenu.java | 9 +- .../v1_15_2/MixinMultiPlayerGameMode.java | 55 ++-- .../protocoltranslator/LimitationsImpl.java | 1 - .../ProtocolTranslationImpl.java | 2 +- .../data/furnace-fuels-1.11.2.json | 156 ++++++++++++ 7 files changed, 277 insertions(+), 196 deletions(-) create mode 100644 src/main/resources/assets/viafabricplus/data/furnace-fuels-1.11.2.json diff --git a/src/main/java/com/viaversion/viafabricplus/features/FeaturesLoading.java b/src/main/java/com/viaversion/viafabricplus/features/FeaturesLoading.java index d4c06cf2f..6e50cc261 100644 --- a/src/main/java/com/viaversion/viafabricplus/features/FeaturesLoading.java +++ b/src/main/java/com/viaversion/viafabricplus/features/FeaturesLoading.java @@ -24,17 +24,18 @@ import com.viaversion.viaaprilfools.api.AprilFoolsProtocolVersion; import com.viaversion.viafabricplus.ViaFabricPlus; import com.viaversion.viafabricplus.ViaFabricPlusImpl; -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.v1_20_5.EnchantmentAttributesEmulation1_20_6; +import com.viaversion.viafabricplus.features.global.ClassiCubeAccount; +import com.viaversion.viafabricplus.features.global.CollisionShapes; import com.viaversion.viafabricplus.features.global.EntityDimensionDiff; import com.viaversion.viafabricplus.features.global.FontCacheReload; -import com.viaversion.viafabricplus.features.v1_12_2.RenderableGlyphDiff; -import com.viaversion.viafabricplus.features.v1_8.ArmorHudEmulation1_8; import com.viaversion.viafabricplus.features.global.ResourcePackHeaderDiff; +import com.viaversion.viafabricplus.features.v1_11_1.FurnaceFuels1_11_2; 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.v1_12_2.RenderableGlyphDiff; +import com.viaversion.viafabricplus.features.v1_20_5.EnchantmentAttributesEmulation1_20_6; +import com.viaversion.viafabricplus.features.v1_8.ArmorHudEmulation1_8; import com.viaversion.viafabricplus.util.network.SyncTasks; import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; import net.minecraft.client.Minecraft; @@ -63,6 +64,7 @@ public static void onPreLoading() { if (newVersion.olderThanOrEqualTo(ProtocolVersion.v1_11_1)) { Recipes1_11_2.reset(); } + FurnaceFuels1_11_2.reset(); EnvironmentAttributes.RESPAWN_ANCHOR_WORKS.isSyncable = newVersion.olderThanOrEqualTo(ProtocolVersion.v1_21_9); })); @@ -79,6 +81,7 @@ public static void onPostGameLoading() { EntityDimensionDiff.init(); EnchantmentAttributesEmulation1_20_6.init(); Recipes1_11_2.init(); + FurnaceFuels1_11_2.init(); ArmorHudEmulation1_8.init(); CPEAdditions.postInit(); } diff --git a/src/main/java/com/viaversion/viafabricplus/features/v1_11_1/FurnaceFuels1_11_2.java b/src/main/java/com/viaversion/viafabricplus/features/v1_11_1/FurnaceFuels1_11_2.java index ad150790a..f7583196f 100644 --- a/src/main/java/com/viaversion/viafabricplus/features/v1_11_1/FurnaceFuels1_11_2.java +++ b/src/main/java/com/viaversion/viafabricplus/features/v1_11_1/FurnaceFuels1_11_2.java @@ -21,188 +21,101 @@ package com.viaversion.viafabricplus.features.v1_11_1; +import com.mojang.datafixers.util.Pair; +import com.viaversion.viafabricplus.ViaFabricPlus; +import com.viaversion.viafabricplus.protocoltranslator.impl.ViaFabricPlusMappingDataLoader; +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; +import com.viaversion.viaversion.api.protocol.version.ProtocolVersionRange; +import com.viaversion.viaversion.libs.gson.JsonArray; +import com.viaversion.viaversion.libs.gson.JsonElement; +import com.viaversion.viaversion.libs.gson.JsonObject; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.Identifier; 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; +import org.jspecify.annotations.Nullable; public final class FurnaceFuels1_11_2 { - private static FurnaceFuels1_11_2 FUELS_1_11 = null; - private static FurnaceFuels1_11_2 FUELS_1_3_1 = null; - private static FurnaceFuels1_11_2 FUELS_1_2_5 = null; - - private final ArrayList values; - - private FurnaceFuels1_11_2(final ArrayList values) { - this.values = values; - } - - public boolean isFuel(final ItemStack itemStack) { - return this.values.contains(itemStack.getItem()); - } + private static final List> LEGACY_FUELS = new ArrayList<>(); + private static Set FUELS; - public static FurnaceFuels1_11_2 getFuels_1_11() { - if (FUELS_1_11 == null) - FUELS_1_11 = new FurnaceFuels1_11_2.Builder() - .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(ItemTags.SIGNS) - .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(); + public static void init() { + if (!LEGACY_FUELS.isEmpty()) { + throw new IllegalStateException("FurnaceFuels1_11_2 is already initialized"); + } - return FUELS_1_11; + final JsonArray fuels = ViaFabricPlusMappingDataLoader.INSTANCE.loadData("furnace-fuels-1.11.2.json").getAsJsonArray(""); + for (JsonElement fuelElement : fuels) { + final JsonObject fuel = fuelElement.getAsJsonObject(); + final ProtocolVersionRange versionRange = ProtocolVersionRange.fromString(fuel.get("version").getAsString()); + if (fuel.has("tag")) { + LEGACY_FUELS.add(new Pair<>(new Fuel(null, TagKey.create(Registries.ITEM, Identifier.parse(fuel.get("tag").getAsString()))), versionRange)); + } else { + final Identifier id = Identifier.parse(fuel.get("item").getAsString()); + final Item item = BuiltInRegistries.ITEM.getOptional(id).orElseThrow(() -> new IllegalStateException("Unknown item: " + id)); + LEGACY_FUELS.add(new Pair<>(new Fuel(item, null), versionRange)); + } + } } - public static FurnaceFuels1_11_2 getFuels_1_3_1() { - if (FUELS_1_3_1 == null) - FUELS_1_3_1 = new FurnaceFuels1_11_2.Builder() - .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; + /** + * Checks the item against the fuel list of the current target version, only meaningful for versions older than 1.14. + * + * @param itemStack the item to check + * @return whether the item could be burned in a furnace on the target version + */ + public static boolean isFuel(final ItemStack itemStack) { + if (FUELS == null) { + FUELS = resolveFuels(ViaFabricPlus.api().targetVersion()); + } + return FUELS.contains(itemStack.getItem()); } - public static FurnaceFuels1_11_2 getFuels_1_2_5() { - if (FUELS_1_2_5 == null) - FUELS_1_2_5 = new FurnaceFuels1_11_2.Builder() - .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; + /** + * Drops the resolved fuel list, must be called when the target version changes. + */ + public static void reset() { + FUELS = null; } - public static class Builder { - - private final ArrayList values = new ArrayList<>(); - - public FurnaceFuels1_11_2 build() { - return new FurnaceFuels1_11_2(this.values); - } - - public FurnaceFuels1_11_2.Builder remove(final TagKey tag) { - BuiltInRegistries.ITEM.get(tag).ifPresent(items -> { - for (Holder item : items) { - this.values.remove(item.value()); - } - }); - return this; - } - - public FurnaceFuels1_11_2.Builder add(final TagKey tag) { - BuiltInRegistries.ITEM.get(tag).ifPresent(items -> { - for (Holder item : items) { - this.values.add(item.value()); - } - }); - return this; + private static Set resolveFuels(final ProtocolVersion version) { + final Set fuels = new HashSet<>(); + for (Pair legacyFuel : LEGACY_FUELS) { + if (!legacyFuel.getSecond().contains(version)) { + continue; + } + + final Fuel fuel = legacyFuel.getFirst(); + if (fuel.item() != null) { + fuels.add(fuel.item()); + } else { + BuiltInRegistries.ITEM.get(fuel.tag()).ifPresent(items -> { + for (Holder item : items) { + fuels.add(item.value()); + } + }); + } } - public FurnaceFuels1_11_2.Builder add(final ItemLike itemLike) { - Item item = itemLike.asItem(); - this.values.add(item); - return this; - } + // Nether wood didn't exist yet, but the modern tags above include it + BuiltInRegistries.ITEM.get(ItemTags.NON_FLAMMABLE_WOOD).ifPresent(items -> { + for (Holder item : items) { + fuels.remove(item.value()); + } + }); + return Set.copyOf(fuels); + } + private record Fuel(@Nullable Item item, @Nullable TagKey tag) { } } diff --git a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_11_1/screen/MixinAbstractFurnaceMenu.java b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_11_1/screen/MixinAbstractFurnaceMenu.java index f0f819048..d775dd7f9 100644 --- a/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_11_1/screen/MixinAbstractFurnaceMenu.java +++ b/src/main/java/com/viaversion/viafabricplus/injection/mixin/features/v1_11_1/screen/MixinAbstractFurnaceMenu.java @@ -30,7 +30,6 @@ 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; @@ -54,12 +53,8 @@ private void fixQuickMoveMaterial(ItemStack itemStack, CallbackInfoReturnable cir) { - if (ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2)) { - cir.setReturnValue(FurnaceFuels1_11_2.getFuels_1_2_5().isFuel(itemStack)); - } else if (ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_11)) { - cir.setReturnValue(FurnaceFuels1_11_2.getFuels_1_3_1().isFuel(itemStack)); - } else if (ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_14)) { - cir.setReturnValue(FurnaceFuels1_11_2.getFuels_1_11().isFuel(itemStack)); + if (ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_14)) { + cir.setReturnValue(FurnaceFuels1_11_2.isFuel(itemStack)); } } 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 a6e31da83..c48403c3a 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 @@ -65,30 +65,45 @@ 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_4tob1_4_1) && !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 (this.viaFabricPlus$shouldCancel(slotNum, buttonNum, containerInput, player)) { ci.cancel(); } - if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.b1_5tob1_5_2) && player.containerMenu instanceof InventoryMenu && !(slotNum >= 5 && slotNum <= 8) && containerInput.equals(ContainerInput.QUICK_MOVE)) { - ci.cancel(); - } else if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.b1_5tob1_5_2) && !(player.containerMenu instanceof ChestMenu) && containerInput.equals(ContainerInput.QUICK_MOVE)) { - ci.cancel(); - } else if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.b1_7tob1_7_3) && player.containerMenu instanceof AbstractCraftingMenu && slotNum == 0 && containerInput.equals(ContainerInput.QUICK_MOVE)) { - ci.cancel(); - } else if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.b1_7tob1_7_3) && player.containerMenu instanceof DispenserMenu && containerInput.equals(ContainerInput.QUICK_MOVE)) { - ci.cancel(); - } else if (ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2) && player.containerMenu instanceof BrewingStandMenu && containerInput.equals(ContainerInput.QUICK_MOVE)) { - // needs new legacy recipe entries for shift click to work properly still on 1.3.2+ - ci.cancel(); - } else if (ViaFabricPlus.api().targetVersion().olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2) && player.containerMenu instanceof EnchantmentMenu && slotNum != 0 && containerInput.equals(ContainerInput.QUICK_MOVE)) { - ci.cancel(); - } else if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_4_4tor1_4_5) && slotNum < 0 && containerInput.equals(ContainerInput.QUICK_MOVE)) { - ci.cancel(); + } + + @Unique + private boolean viaFabricPlus$shouldCancel(final int slotNum, final int buttonNum, final ContainerInput containerInput, final Player player) { + final ProtocolVersion version = ViaFabricPlus.api().targetVersion(); + if (version.olderThanOrEqualTo(LegacyProtocolVersion.b1_4tob1_4_1) && containerInput != ContainerInput.PICKUP) { + return true; } - if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(ProtocolVersion.v1_15_2) && containerInput == ContainerInput.SWAP && buttonNum == 40) { // Pressing 'F' in inventory - ci.cancel(); + if (version.olderThanOrEqualTo(LegacyProtocolVersion.r1_4_6tor1_4_7) && containerInput != ContainerInput.PICKUP && containerInput != ContainerInput.QUICK_MOVE && containerInput != ContainerInput.SWAP && containerInput != ContainerInput.CLONE) { + return true; + } + if (version.olderThanOrEqualTo(ProtocolVersion.v1_15_2) && containerInput == ContainerInput.SWAP && buttonNum == 40) { // Pressing 'F' in inventory + return true; + } + if (containerInput != ContainerInput.QUICK_MOVE) { + return false; + } + + if (version.olderThanOrEqualTo(LegacyProtocolVersion.b1_5tob1_5_2)) { + final boolean allowed = player.containerMenu instanceof InventoryMenu ? slotNum >= 5 && slotNum <= 8 : player.containerMenu instanceof ChestMenu; + if (!allowed) { + return true; + } + } + if (version.olderThanOrEqualTo(LegacyProtocolVersion.b1_7tob1_7_3) && (player.containerMenu instanceof AbstractCraftingMenu && slotNum == 0 || player.containerMenu instanceof DispenserMenu)) { + return true; + } + if (version.olderThan(LegacyProtocolVersion.r1_3_1tor1_3_2)) { + if (player.containerMenu instanceof BrewingStandMenu) { // needs new legacy recipe entries for shift click to work properly still on 1.3.2+ + return true; + } + if (player.containerMenu instanceof EnchantmentMenu && slotNum != 0) { + return true; + } } + return version.olderThanOrEqualTo(LegacyProtocolVersion.r1_4_4tor1_4_5) && slotNum < 0; } @Unique diff --git a/src/main/java/com/viaversion/viafabricplus/protocoltranslator/LimitationsImpl.java b/src/main/java/com/viaversion/viafabricplus/protocoltranslator/LimitationsImpl.java index 06e446381..e4a264ad0 100644 --- a/src/main/java/com/viaversion/viafabricplus/protocoltranslator/LimitationsImpl.java +++ b/src/main/java/com/viaversion/viafabricplus/protocoltranslator/LimitationsImpl.java @@ -217,7 +217,6 @@ public Reference2ObjectMap, ProtocolVersionRange> getEn return enchantmentDiff; } - public Reference2ObjectMap, ProtocolVersionRange> getEffectDiff() { return effectDiff; } diff --git a/src/main/java/com/viaversion/viafabricplus/protocoltranslator/ProtocolTranslationImpl.java b/src/main/java/com/viaversion/viafabricplus/protocoltranslator/ProtocolTranslationImpl.java index e9b809163..934323ca2 100644 --- a/src/main/java/com/viaversion/viafabricplus/protocoltranslator/ProtocolTranslationImpl.java +++ b/src/main/java/com/viaversion/viafabricplus/protocoltranslator/ProtocolTranslationImpl.java @@ -142,7 +142,7 @@ public CompletableFuture init(final Path path) { } // Register command callback for /viafabricplus - ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> { + ClientCommandRegistrationCallback.EVENT.register((dispatcher, _) -> { final ViaFabricPlusCommandHandler commandHandler = (ViaFabricPlusCommandHandler) Via.getManager().getCommandHandler(); final RequiredArgumentBuilder executor = RequiredArgumentBuilder.argument("args", StringArgumentType.greedyString()).executes(commandHandler::execute).suggests(commandHandler::suggestion); diff --git a/src/main/resources/assets/viafabricplus/data/furnace-fuels-1.11.2.json b/src/main/resources/assets/viafabricplus/data/furnace-fuels-1.11.2.json new file mode 100644 index 000000000..b5fb0f2c7 --- /dev/null +++ b/src/main/resources/assets/viafabricplus/data/furnace-fuels-1.11.2.json @@ -0,0 +1,156 @@ +{ + "": [ + { + "item": "minecraft:lava_bucket", + "version": "*" + }, + { + "item": "minecraft:coal_block", + "version": "*" + }, + { + "item": "minecraft:blaze_rod", + "version": "*" + }, + { + "item": "minecraft:coal", + "version": "*" + }, + { + "item": "minecraft:charcoal", + "version": "*" + }, + { + "tag": "minecraft:logs", + "version": "*" + }, + { + "tag": "minecraft:planks", + "version": "*" + }, + { + "tag": "minecraft:wooden_stairs", + "version": "*" + }, + { + "tag": "minecraft:wooden_trapdoors", + "version": "*" + }, + { + "tag": "minecraft:wooden_pressure_plates", + "version": "*" + }, + { + "tag": "minecraft:wooden_fences", + "version": "*" + }, + { + "tag": "minecraft:fence_gates", + "version": "*" + }, + { + "item": "minecraft:note_block", + "version": "*" + }, + { + "item": "minecraft:bookshelf", + "version": "*" + }, + { + "item": "minecraft:jukebox", + "version": "*" + }, + { + "item": "minecraft:chest", + "version": "*" + }, + { + "item": "minecraft:trapped_chest", + "version": "*" + }, + { + "item": "minecraft:crafting_table", + "version": "*" + }, + { + "item": "minecraft:daylight_detector", + "version": "*" + }, + { + "tag": "minecraft:banners", + "version": "*" + }, + { + "item": "minecraft:bow", + "version": "*" + }, + { + "item": "minecraft:fishing_rod", + "version": "*" + }, + { + "item": "minecraft:ladder", + "version": "*" + }, + { + "item": "minecraft:stick", + "version": "*" + }, + { + "tag": "minecraft:saplings", + "version": "*" + }, + { + "item": "minecraft:bowl", + "version": "*" + }, + { + "item": "minecraft:wooden_shovel", + "version": ">= 1.3.1-1.3.2" + }, + { + "item": "minecraft:wooden_sword", + "version": ">= 1.3.1-1.3.2" + }, + { + "item": "minecraft:wooden_spear", + "version": ">= 1.3.1-1.3.2" + }, + { + "item": "minecraft:wooden_hoe", + "version": ">= 1.3.1-1.3.2" + }, + { + "item": "minecraft:wooden_axe", + "version": ">= 1.3.1-1.3.2" + }, + { + "item": "minecraft:wooden_pickaxe", + "version": ">= 1.3.1-1.3.2" + }, + { + "tag": "minecraft:signs", + "version": ">= 1.11" + }, + { + "tag": "minecraft:wooden_doors", + "version": ">= 1.11" + }, + { + "tag": "minecraft:boats", + "version": ">= 1.11" + }, + { + "tag": "minecraft:wool", + "version": ">= 1.11" + }, + { + "tag": "minecraft:wooden_buttons", + "version": ">= 1.11" + }, + { + "tag": "minecraft:wool_carpets", + "version": ">= 1.11" + } + ] +} From f1cda2d1ad096f75089c9d2a97634e5582cadc0b Mon Sep 17 00:00:00 2001 From: Florian Reuth Date: Tue, 6 Oct 2026 13:06:35 +0200 Subject: [PATCH 4/4] Remove unregistered mixin --- .../features/v1_11_1/FurnaceFuels1_11_2.java | 19 +-------- .../v1_6_1/MixinAbstractContainerScreen.java | 40 ------------------- .../data/furnace-fuels-1.11.2.json | 12 ++---- 3 files changed, 5 insertions(+), 66 deletions(-) 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/features/v1_11_1/FurnaceFuels1_11_2.java b/src/main/java/com/viaversion/viafabricplus/features/v1_11_1/FurnaceFuels1_11_2.java index f7583196f..751d7b500 100644 --- a/src/main/java/com/viaversion/viafabricplus/features/v1_11_1/FurnaceFuels1_11_2.java +++ b/src/main/java/com/viaversion/viafabricplus/features/v1_11_1/FurnaceFuels1_11_2.java @@ -37,7 +37,6 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.resources.Identifier; -import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -67,12 +66,6 @@ public static void init() { } } - /** - * Checks the item against the fuel list of the current target version, only meaningful for versions older than 1.14. - * - * @param itemStack the item to check - * @return whether the item could be burned in a furnace on the target version - */ public static boolean isFuel(final ItemStack itemStack) { if (FUELS == null) { FUELS = resolveFuels(ViaFabricPlus.api().targetVersion()); @@ -80,9 +73,6 @@ public static boolean isFuel(final ItemStack itemStack) { return FUELS.contains(itemStack.getItem()); } - /** - * Drops the resolved fuel list, must be called when the target version changes. - */ public static void reset() { FUELS = null; } @@ -105,14 +95,7 @@ private static Set resolveFuels(final ProtocolVersion version) { }); } } - - // Nether wood didn't exist yet, but the modern tags above include it - BuiltInRegistries.ITEM.get(ItemTags.NON_FLAMMABLE_WOOD).ifPresent(items -> { - for (Holder item : items) { - fuels.remove(item.value()); - } - }); - return Set.copyOf(fuels); + return fuels; } private record Fuel(@Nullable Item item, @Nullable TagKey tag) { 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/assets/viafabricplus/data/furnace-fuels-1.11.2.json b/src/main/resources/assets/viafabricplus/data/furnace-fuels-1.11.2.json index b5fb0f2c7..bb73ca99b 100644 --- a/src/main/resources/assets/viafabricplus/data/furnace-fuels-1.11.2.json +++ b/src/main/resources/assets/viafabricplus/data/furnace-fuels-1.11.2.json @@ -82,15 +82,15 @@ }, { "item": "minecraft:bow", - "version": "*" + "version": ">= 1.11" }, { "item": "minecraft:fishing_rod", - "version": "*" + "version": ">= 1.11" }, { "item": "minecraft:ladder", - "version": "*" + "version": ">= 1.11" }, { "item": "minecraft:stick", @@ -102,7 +102,7 @@ }, { "item": "minecraft:bowl", - "version": "*" + "version": ">= 1.11" }, { "item": "minecraft:wooden_shovel", @@ -112,10 +112,6 @@ "item": "minecraft:wooden_sword", "version": ">= 1.3.1-1.3.2" }, - { - "item": "minecraft:wooden_spear", - "version": ">= 1.3.1-1.3.2" - }, { "item": "minecraft:wooden_hoe", "version": ">= 1.3.1-1.3.2"