Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}));
Expand All @@ -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();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
/*
* This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus
* Copyright (C) 2021-2026 the original authors
* - Florian Reuth <git@florianreuth.de>
* - 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 <http://www.gnu.org/licenses/>.
*/

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.TagKey;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import org.jspecify.annotations.Nullable;

public final class FurnaceFuels1_11_2 {

private static final List<Pair<Fuel, ProtocolVersionRange>> LEGACY_FUELS = new ArrayList<>();
private static Set<Item> FUELS;

public static void init() {
if (!LEGACY_FUELS.isEmpty()) {
throw new IllegalStateException("FurnaceFuels1_11_2 is already initialized");
}

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 boolean isFuel(final ItemStack itemStack) {
if (FUELS == null) {
FUELS = resolveFuels(ViaFabricPlus.api().targetVersion());
}
return FUELS.contains(itemStack.getItem());
}

public static void reset() {
FUELS = null;
}

private static Set<Item> resolveFuels(final ProtocolVersion version) {
final Set<Item> fuels = new HashSet<>();
for (Pair<Fuel, ProtocolVersionRange> 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> item : items) {
fuels.add(item.value());
}
});
}
}
return fuels;
}

private record Fuel(@Nullable Item item, @Nullable TagKey<Item> tag) {
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/*
* This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus
* Copyright (C) 2021-2026 the original authors
* - Florian Reuth <git@florianreuth.de>
* - 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 <http://www.gnu.org/licenses/>.
*/

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);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,33 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

package com.viaversion.viafabricplus.injection.mixin.features.v1_6_1;
package com.viaversion.viafabricplus.injection.mixin.features.v1_10;

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 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(AbstractContainerScreen.class)
public abstract class MixinAbstractContainerScreen {
@Mixin(BrewingStandMenu.class)
public abstract class MixinBrewingStandMenu {

@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);
@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);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
* This file is part of ViaFabricPlus - https://github.com/ViaVersion/ViaFabricPlus
* Copyright (C) 2021-2026 the original authors
* - Florian Reuth <git@florianreuth.de>
* - 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 <http://www.gnu.org/licenses/>.
*/

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 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<Boolean> 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<Boolean> cir) {
if (ViaFabricPlus.api().targetVersion().olderThan(ProtocolVersion.v1_14)) {
cir.setReturnValue(FurnaceFuels1_11_2.isFuel(itemStack));
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -59,14 +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_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 (this.viaFabricPlus$shouldCancel(slotNum, buttonNum, containerInput, player)) {
ci.cancel();
}
if (ViaFabricPlus.api().targetVersion().olderThanOrEqualTo(ProtocolVersion.v1_15_2) && containerInput == ContainerInput.SWAP && buttonNum == 40) { // Pressing 'F' in inventory
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 (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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,6 @@ public Reference2ObjectMap<ResourceKey<Enchantment>, ProtocolVersionRange> getEn
return enchantmentDiff;
}


public Reference2ObjectMap<Holder<MobEffect>, ProtocolVersionRange> getEffectDiff() {
return effectDiff;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ public CompletableFuture<Void> 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<FabricClientCommandSource, String> executor = RequiredArgumentBuilder.<FabricClientCommandSource, String>argument("args", StringArgumentType.greedyString()).executes(commandHandler::execute).suggests(commandHandler::suggestion);

Expand Down
Loading
Loading