From 0a4001979e0213a5f54909561e1714f89f715b9c Mon Sep 17 00:00:00 2001 From: vfyjxf <2331007009@qq.com> Date: Sun, 27 Nov 2022 03:33:52 +0800 Subject: [PATCH] pae2 support --- .../network/packet/PacketRecipeTransfer.java | 61 ++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/github/vfyjxf/nee/network/packet/PacketRecipeTransfer.java b/src/main/java/com/github/vfyjxf/nee/network/packet/PacketRecipeTransfer.java index 796e585..aeeaddc 100644 --- a/src/main/java/com/github/vfyjxf/nee/network/packet/PacketRecipeTransfer.java +++ b/src/main/java/com/github/vfyjxf/nee/network/packet/PacketRecipeTransfer.java @@ -3,8 +3,10 @@ import appeng.api.networking.IGridNode; import appeng.container.implementations.ContainerPatternTerm; import appeng.helpers.IContainerCraftingPacket; +import appeng.parts.reporting.PartPatternTerminal; import appeng.util.helpers.ItemHandlerUtil; import appeng.util.inv.WrapperInvItemHandler; +import com.google.common.collect.Sets; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.Container; @@ -18,6 +20,10 @@ import javax.annotation.Nonnull; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashSet; + import static com.github.vfyjxf.nee.jei.PatternTransferHandler.OUTPUT_KEY; /** @@ -79,7 +85,8 @@ public IMessage onMessage(PacketRecipeTransfer message, MessageContext ctx) { Container container = player.openContainer; player.getServerWorld().addScheduledTask(() -> { if (container instanceof ContainerPatternTerm) { - ((ContainerPatternTerm) container).getPatternTerminal().setCraftingRecipe(message.getCraftingMode()); + // ((ContainerPatternTerm) container).getPatternTerminal().setCraftingRecipe(message.getCraftingMode()); + this.setCraftingRecipe((ContainerPatternTerm) container, message.getCraftingMode()); ItemStack[] recipeInputs = new ItemStack[9]; ItemStack[] recipeOutputs = null; NBTTagCompound currentStack; @@ -127,6 +134,58 @@ public IMessage onMessage(PacketRecipeTransfer message, MessageContext ctx) { return null; } + private Method getPartPatternTerminalMethod; + + private Boolean canSetCraftingRecipe = null; + + private final HashSet possibleSupportedMethodNames = Sets.newHashSet( + // Applied Energistics 2 + "getPatternTerminal", + // AE2 Unofficial Extended Life + "getPart" + ); + + private final String noSuchMethodErrorMessage = "no such method: " + String.join(" or ", possibleSupportedMethodNames); + + private void setCraftingRecipe(ContainerPatternTerm container, boolean craftingMode) { + if (Boolean.FALSE.equals(canSetCraftingRecipe)) { + throw new NoSuchMethodError(noSuchMethodErrorMessage); + } + + if (getPartPatternTerminalMethod == null) { + Class clazz = ContainerPatternTerm.class; + Method[] methods = clazz.getMethods(); + + for (Method method : methods) { + String methodName = method.getName(); + if (!possibleSupportedMethodNames.contains(methodName)) { + continue; + } + getPartPatternTerminalMethod = method; + getPartPatternTerminalMethod.setAccessible(true); + if (getPartPatternTerminalMethod.getParameters().length > 0) { + continue; + } + canSetCraftingRecipe = true; + break; + } + if (getPartPatternTerminalMethod == null) { + canSetCraftingRecipe = false; + } + } + + if (getPartPatternTerminalMethod == null) { + throw new NoSuchMethodError(noSuchMethodErrorMessage); + } + + try { + PartPatternTerminal patternTerminal = (PartPatternTerminal) getPartPatternTerminalMethod.invoke(container); + patternTerminal.setCraftingRecipe(craftingMode); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new NoSuchMethodError(noSuchMethodErrorMessage); + } + } + } }