From dc21828860565f55ce3fdf1a13b11aa689259aa9 Mon Sep 17 00:00:00 2001 From: FlorianMichael <60033407+FlorianMichael@users.noreply.github.com> Date: Sun, 5 Nov 2023 18:27:35 +0100 Subject: [PATCH] Emulate recipes for 1.8 - 1.11.2 --- .../definition/RecipesPre1_12.java | 67 +++++++++++++++++++ .../access/IProtocol1_13To1_12_2.java | 25 +++++++ .../MixinClientPlayNetworkHandler.java | 24 +++++++ .../MixinProtocol1_12To1_11_1.java | 63 +++++++++++++++++ .../MixinProtocol1_13To1_12_2.java | 35 ++++++++++ src/main/resources/viafabricplus.mixins.json | 10 ++- 6 files changed, 221 insertions(+), 3 deletions(-) create mode 100644 src/main/java/de/florianmichael/viafabricplus/definition/RecipesPre1_12.java create mode 100644 src/main/java/de/florianmichael/viafabricplus/injection/access/IProtocol1_13To1_12_2.java create mode 100644 src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/viaversion/protocol1_12to1_11_1/MixinProtocol1_12To1_11_1.java create mode 100644 src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/viaversion/protocol1_13to1_12_2/MixinProtocol1_13To1_12_2.java diff --git a/src/main/java/de/florianmichael/viafabricplus/definition/RecipesPre1_12.java b/src/main/java/de/florianmichael/viafabricplus/definition/RecipesPre1_12.java new file mode 100644 index 00000000..3d29a9c9 --- /dev/null +++ b/src/main/java/de/florianmichael/viafabricplus/definition/RecipesPre1_12.java @@ -0,0 +1,67 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus + * Copyright (C) 2021-2023 FlorianMichael/EnZaXD 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 de.florianmichael.viafabricplus.definition; + +import net.minecraft.block.ConcretePowderBlock; +import net.minecraft.block.GlazedTerracottaBlock; +import net.minecraft.block.ShulkerBoxBlock; +import net.minecraft.client.MinecraftClient; +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.recipe.*; +import net.raphimc.vialoader.util.VersionEnum; + +import java.util.List; + +public class RecipesPre1_12 { + + public static void editRecipes(final List> recipes, final VersionEnum version) { + final var registryManager = MinecraftClient.getInstance().world.getRegistryManager(); + + recipes.removeIf(recipe -> { + if (recipe.getResult(registryManager).getItem() instanceof BlockItem block) { + return block.getBlock() instanceof ConcretePowderBlock || block.getBlock() instanceof GlazedTerracottaBlock; + } + return false; + }); + + if (version.isOlderThanOrEqualTo(VersionEnum.r1_11)) { + recipes.removeIf(recipe -> recipe.getResult(registryManager).getItem() == Items.IRON_NUGGET); + + if (version.isOlderThanOrEqualTo(VersionEnum.r1_10)) { + recipes.removeIf(recipe -> { + Item item = recipe.getResult(registryManager).getItem(); + if (item instanceof BlockItem blockItem) { + return blockItem.getBlock() instanceof ShulkerBoxBlock; + } else if (item == Items.OBSERVER || item == Items.IRON_NUGGET) { + return true; + } else if (item == Items.GOLD_NUGGET) { + return recipe.getSerializer() == RecipeSerializer.SMELTING; + } else { + return false; + } + }); + } + + if (version.isOlderThanOrEqualTo(VersionEnum.r1_9_3tor1_9_4)) { + recipes.removeIf(recipe -> recipe.getResult(registryManager).getItem() == Items.BONE_BLOCK); + } + } + } +} diff --git a/src/main/java/de/florianmichael/viafabricplus/injection/access/IProtocol1_13To1_12_2.java b/src/main/java/de/florianmichael/viafabricplus/injection/access/IProtocol1_13To1_12_2.java new file mode 100644 index 00000000..4639c35b --- /dev/null +++ b/src/main/java/de/florianmichael/viafabricplus/injection/access/IProtocol1_13To1_12_2.java @@ -0,0 +1,25 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus + * Copyright (C) 2021-2023 FlorianMichael/EnZaXD 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 de.florianmichael.viafabricplus.injection.access; + +import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; + +public interface IProtocol1_13To1_12_2 { + + void viafabricplus_writeDeclareRecipes(final PacketWrapper recipesPacket); +} diff --git a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/minecraft/network/MixinClientPlayNetworkHandler.java b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/minecraft/network/MixinClientPlayNetworkHandler.java index a46f6ccc..5cfd1454 100644 --- a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/minecraft/network/MixinClientPlayNetworkHandler.java +++ b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/minecraft/network/MixinClientPlayNetworkHandler.java @@ -19,6 +19,7 @@ package de.florianmichael.viafabricplus.injection.mixin.fixes.minecraft.network; import com.llamalad7.mixinextras.injector.WrapWithCondition; import de.florianmichael.viafabricplus.ViaFabricPlus; +import de.florianmichael.viafabricplus.definition.RecipesPre1_12; import de.florianmichael.viafabricplus.settings.impl.VisualSettings; import de.florianmichael.viafabricplus.injection.access.IBoatEntity; import de.florianmichael.viafabricplus.protocolhack.ProtocolHack; @@ -29,6 +30,9 @@ import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.vehicle.BoatEntity; import net.minecraft.network.ClientConnection; import net.minecraft.network.packet.s2c.play.*; +import net.minecraft.recipe.Recipe; +import net.minecraft.recipe.RecipeEntry; +import net.minecraft.util.Identifier; import net.raphimc.vialoader.util.VersionEnum; import org.slf4j.Logger; import org.spongepowered.asm.mixin.Final; @@ -38,8 +42,11 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.ArrayList; import java.util.LinkedHashSet; +import java.util.List; import java.util.Set; +import java.util.stream.Collectors; @SuppressWarnings("DataFlowIssue") @Mixin(ClientPlayNetworkHandler.class) @@ -136,4 +143,21 @@ public abstract class MixinClientPlayNetworkHandler { ci.cancel(); } } + + @Redirect(method = "onSynchronizeRecipes", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/packet/s2c/play/SynchronizeRecipesS2CPacket;getRecipes()Ljava/util/List;")) + public List> rewriteRecipes(SynchronizeRecipesS2CPacket instance) { + if (ProtocolHack.getTargetVersion().isOlderThanOrEqualTo(VersionEnum.r1_11_1to1_11_2)) { + final List> recipes = instance.getRecipes().stream().map(RecipeEntry::value).collect(Collectors.toList()); + RecipesPre1_12.editRecipes(recipes, ProtocolHack.getTargetVersion()); + + final List> entries = new ArrayList<>(); + int recipeId = 0; + for (final Recipe recipe : recipes) { + entries.add(new RecipeEntry<>(new Identifier(String.valueOf(recipeId++)), recipe)); + } + + return entries; + } + return instance.getRecipes(); + } } diff --git a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/viaversion/protocol1_12to1_11_1/MixinProtocol1_12To1_11_1.java b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/viaversion/protocol1_12to1_11_1/MixinProtocol1_12To1_11_1.java new file mode 100644 index 00000000..0ac653f0 --- /dev/null +++ b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/viaversion/protocol1_12to1_11_1/MixinProtocol1_12To1_11_1.java @@ -0,0 +1,63 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus + * Copyright (C) 2021-2023 FlorianMichael/EnZaXD 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 de.florianmichael.viafabricplus.injection.mixin.fixes.viaversion.protocol1_12to1_11_1; + +import com.viaversion.viaversion.api.Via; +import com.viaversion.viaversion.api.minecraft.ClientWorld; +import com.viaversion.viaversion.api.protocol.AbstractProtocol; +import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers; +import com.viaversion.viaversion.api.type.Type; +import com.viaversion.viaversion.protocols.protocol1_12to1_11_1.ClientboundPackets1_12; +import com.viaversion.viaversion.protocols.protocol1_12to1_11_1.Protocol1_12To1_11_1; +import com.viaversion.viaversion.protocols.protocol1_12to1_11_1.ServerboundPackets1_12; +import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.ClientboundPackets1_13; +import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.Protocol1_13To1_12_2; +import com.viaversion.viaversion.protocols.protocol1_9_3to1_9_1_2.ClientboundPackets1_9_3; +import com.viaversion.viaversion.protocols.protocol1_9_3to1_9_1_2.ServerboundPackets1_9_3; +import de.florianmichael.viafabricplus.injection.access.IProtocol1_13To1_12_2; +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(value = Protocol1_12To1_11_1.class, remap = false) +public class MixinProtocol1_12To1_11_1 extends AbstractProtocol { + + @Inject(method = "registerPackets", at = @At("RETURN")) + public void enforceRecipeWriting(CallbackInfo ci) { + registerClientbound(ClientboundPackets1_9_3.JOIN_GAME, new PacketHandlers() { + @Override + public void register() { + map(Type.INT); + map(Type.UNSIGNED_BYTE); + map(Type.INT); + handler(wrapper -> { + wrapper.user().get(ClientWorld.class).setEnvironment(wrapper.get(Type.INT, 1)); + + final IProtocol1_13To1_12_2 protocol = (IProtocol1_13To1_12_2) wrapper.user().getProtocolInfo().getPipeline().getProtocol(Protocol1_13To1_12_2.class); + if (protocol == null) { + Via.getPlatform().getLogger().warning("Protocol1_13To1_12_2 not found!"); + return; + } + + wrapper.create(ClientboundPackets1_13.DECLARE_RECIPES, protocol::viafabricplus_writeDeclareRecipes).scheduleSend(Protocol1_13To1_12_2.class); + }); + } + }); + } +} diff --git a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/viaversion/protocol1_13to1_12_2/MixinProtocol1_13To1_12_2.java b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/viaversion/protocol1_13to1_12_2/MixinProtocol1_13To1_12_2.java new file mode 100644 index 00000000..768ed4e8 --- /dev/null +++ b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/viaversion/protocol1_13to1_12_2/MixinProtocol1_13To1_12_2.java @@ -0,0 +1,35 @@ +/* + * This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus + * Copyright (C) 2021-2023 FlorianMichael/EnZaXD 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 de.florianmichael.viafabricplus.injection.mixin.fixes.viaversion.protocol1_13to1_12_2; + +import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; +import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.Protocol1_13To1_12_2; +import de.florianmichael.viafabricplus.injection.access.IProtocol1_13To1_12_2; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(value = Protocol1_13To1_12_2.class, remap = false) +public abstract class MixinProtocol1_13To1_12_2 implements IProtocol1_13To1_12_2 { + + @Shadow protected abstract void writeDeclareRecipes(PacketWrapper recipesPacket); + + @Override + public void viafabricplus_writeDeclareRecipes(PacketWrapper recipesPacket) { + writeDeclareRecipes(recipesPacket); + } +} diff --git a/src/main/resources/viafabricplus.mixins.json b/src/main/resources/viafabricplus.mixins.json index e596dde9..0bda3f94 100644 --- a/src/main/resources/viafabricplus.mixins.json +++ b/src/main/resources/viafabricplus.mixins.json @@ -136,6 +136,7 @@ "fixes.minecraft.screen.merchant.MixinMerchantScreen", "fixes.minecraft.screen.merchant.MixinMerchantScreenHandler", "fixes.minecraft.screen.screenhandler.MixinBrewingStandScreenHandler_FuelSlot", + "fixes.minecraft.screen.screenhandler.MixinCraftingScreenHandler", "fixes.minecraft.screen.screenhandler.MixinPlayerScreenHandler", "fixes.minecraft.screen.screenhandler.MixinScreenHandler", "fixes.viabedrock.MixinBedrockProtocol", @@ -169,10 +170,13 @@ "fixes.viaversion.protocol1_9to1_8.MixinEntityTracker1_9", "fixes.viaversion.protocol1_9to1_8.MixinMetadataRewriter1_9To1_8", "jsonwebtoken.MixinClasses", - "jsonwebtoken.MixinDefaultJwtParserBuilder", - "fixes.minecraft.screen.screenhandler.MixinCraftingScreenHandler" + "jsonwebtoken.MixinDefaultJwtParserBuilder" ], "injectors": { "defaultRequire": 1 - } + }, + "mixins": [ + "fixes.viaversion.protocol1_12to1_11_1.MixinProtocol1_12To1_11_1", + "fixes.viaversion.protocol1_13to1_12_2.MixinProtocol1_13To1_12_2" + ] }