修复F键搜索失效问题

This commit is contained in:
GaLi 2025-11-25 10:15:56 +08:00
parent 0a820c734b
commit af71f3ba8b
2 changed files with 28 additions and 10 deletions

View File

@ -2,6 +2,7 @@ package com.extendedae_plus.client;
import appeng.api.stacks.GenericStack;
import appeng.client.gui.me.common.MEStorageScreen;
import com.extendedae_plus.ExtendedAEPlus;
import com.extendedae_plus.mixin.ae2.accessor.MEStorageScreenAccessor;
import com.extendedae_plus.mixin.extendedae.accessor.GuiExPatternTerminalAccessor;
import com.extendedae_plus.network.OpenCraftFromJeiC2SPacket;
@ -14,11 +15,15 @@ import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.neoforge.client.event.ScreenEvent;
import net.neoforged.neoforge.network.PacketDistributor;
import org.lwjgl.glfw.GLFW;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Method;
import java.util.Optional;
public final class InputEvents {
private static final Logger log = LoggerFactory.getLogger(InputEvents.class);
private InputEvents() {}
private static Optional<?> getIngredientUnderMouse() {
@ -136,14 +141,18 @@ public final class InputEvents {
public static void onKeyPressedPre(ScreenEvent.KeyPressed.Pre event) {
if (event.getKeyCode() != GLFW.GLFW_KEY_F) return;
var screen = Minecraft.getInstance().screen;
if (!(screen instanceof MEStorageScreen<?> || screen instanceof GuiExPatternTerminal<?>)) {
return;
}
Optional<?> hovered = getIngredientUnderMouse();
if (hovered.isEmpty()) return;
if (hovered.isEmpty()) {
return;}
Object typed = hovered.get();
String name = getTypedIngredientDisplayName(typed);
if (name == null || name.isEmpty()) return;
var screen = Minecraft.getInstance().screen;
if (name == null || name.isEmpty()) {
return;}
if (screen instanceof MEStorageScreen<?> me) {
try {
MEStorageScreenAccessor acc = (MEStorageScreenAccessor) (Object) me;

View File

@ -24,6 +24,10 @@ public final class JeiRuntimeProxy {
RUNTIME = runtime;
}
private static Class<?> eap$getIngredientTypeClass() throws ClassNotFoundException {
return Class.forName("mezz.jei.api.ingredients.IIngredientType");
}
@Nullable
public static Object get() {
return RUNTIME;
@ -55,16 +59,17 @@ public final class JeiRuntimeProxy {
Object rt = RUNTIME;
if (rt == null) return Optional.empty();
try {
Class<?> ingredientTypeClass = eap$getIngredientTypeClass();
Method getRecipesGui = rt.getClass().getMethod("getRecipesGui");
Object gui = getRecipesGui.invoke(rt);
if (gui == null) return Optional.empty();
Object ingredientManager = rt.getClass().getMethod("getIngredientManager").invoke(rt);
Class<?> vanillaTypes = Class.forName("mezz.jei.api.constants.VanillaTypes");
Object itemType = vanillaTypes.getField("ITEM_STACK").get(null);
Method getUnder = gui.getClass().getMethod("getIngredientUnderMouse", itemType.getClass());
Method getUnder = gui.getClass().getMethod("getIngredientUnderMouse", ingredientTypeClass);
Object valueOpt = getUnder.invoke(gui, itemType);
if (!(valueOpt instanceof Optional<?> value) || value.isEmpty()) return Optional.empty();
Method createTyped = ingredientManager.getClass().getMethod("createTypedIngredient", itemType.getClass(), Object.class);
Method createTyped = ingredientManager.getClass().getMethod("createTypedIngredient", ingredientTypeClass, Object.class);
Object typedOpt = createTyped.invoke(ingredientManager, itemType, value.get());
return typedOpt instanceof Optional<?> o ? o : Optional.empty();
} catch (Throwable ignored) {}
@ -87,10 +92,11 @@ public final class JeiRuntimeProxy {
Object rt = RUNTIME;
if (rt == null || typed == null) return "";
try {
Class<?> ingredientTypeClass = eap$getIngredientTypeClass();
Object manager = rt.getClass().getMethod("getIngredientManager").invoke(rt);
Method getType = typed.getClass().getMethod("getType");
Object type = getType.invoke(typed);
Method getHelper = manager.getClass().getMethod("getIngredientHelper", type.getClass());
Method getHelper = manager.getClass().getMethod("getIngredientHelper", ingredientTypeClass);
Object helper = getHelper.invoke(manager, type);
Method getIngredient = typed.getClass().getMethod("getIngredient");
Object ingredient = getIngredient.invoke(typed);
@ -144,9 +150,10 @@ public final class JeiRuntimeProxy {
Field f = overlay.getClass().getDeclaredField("bookmarkList");
f.setAccessible(true);
Object list = f.get(overlay);
Class<?> ingredientTypeClass = eap$getIngredientTypeClass();
Object manager = rt.getClass().getMethod("getIngredientManager").invoke(rt);
Object itemType = Class.forName("mezz.jei.api.constants.VanillaTypes").getField("ITEM_STACK").get(null);
Method createTyped = manager.getClass().getMethod("createTypedIngredient", itemType.getClass(), Object.class);
Method createTyped = manager.getClass().getMethod("createTypedIngredient", ingredientTypeClass, Object.class);
Object typedOpt = createTyped.invoke(manager, itemType, stack);
if (typedOpt instanceof Optional<?> opt && opt.isPresent()) {
Object typed = opt.get();
@ -174,9 +181,10 @@ public final class JeiRuntimeProxy {
Field f = overlay.getClass().getDeclaredField("bookmarkList");
f.setAccessible(true);
Object list = f.get(overlay);
Class<?> ingredientTypeClass = eap$getIngredientTypeClass();
Object manager = rt.getClass().getMethod("getIngredientManager").invoke(rt);
Object fluidType = Class.forName("mezz.jei.api.neoforge.NeoForgeTypes").getField("FLUID_STACK").get(null);
Method createTyped = manager.getClass().getMethod("createTypedIngredient", fluidType.getClass(), Object.class);
Method createTyped = manager.getClass().getMethod("createTypedIngredient", ingredientTypeClass, Object.class);
Object typedOpt = createTyped.invoke(manager, fluidType, fluidStack);
if (typedOpt instanceof Optional<?> opt && opt.isPresent()) {
Object typed = opt.get();
@ -203,6 +211,7 @@ public final class JeiRuntimeProxy {
Field f = overlay.getClass().getDeclaredField("bookmarkList");
f.setAccessible(true);
Object list = f.get(overlay);
Class<?> ingredientTypeClass = eap$getIngredientTypeClass();
Object manager = rt.getClass().getMethod("getIngredientManager").invoke(rt);
String mekanismJeiClass = "mekanism.client.recipe_viewer.jei.MekanismJEI";
Class<?> jeiCls = Class.forName(mekanismJeiClass);
@ -212,7 +221,7 @@ public final class JeiRuntimeProxy {
}
if (typeField == null) return;
Object typeConst = typeField.get(null);
Method createTyped = manager.getClass().getMethod("createTypedIngredient", typeConst.getClass(), Object.class);
Method createTyped = manager.getClass().getMethod("createTypedIngredient", ingredientTypeClass, Object.class);
Object typedOpt = createTyped.invoke(manager, typeConst, chemicalStack);
if (typedOpt instanceof Optional<?> opt && opt.isPresent()) {
Object typed = opt.get();