修复jei不存在时classnotfonud的问题
This commit is contained in:
parent
b812dac9de
commit
39f89183e7
|
|
@ -18,6 +18,7 @@ import net.minecraftforge.api.distmarker.Dist;
|
||||||
import net.minecraftforge.client.event.ScreenEvent;
|
import net.minecraftforge.client.event.ScreenEvent;
|
||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||||
import net.minecraftforge.fml.common.Mod;
|
import net.minecraftforge.fml.common.Mod;
|
||||||
|
import net.minecraftforge.fml.ModList;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
@ -28,88 +29,115 @@ public final class InputEvents {
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public static void onMouseButtonPre(ScreenEvent.MouseButtonPressed.Pre event) {
|
public static void onMouseButtonPre(ScreenEvent.MouseButtonPressed.Pre event) {
|
||||||
|
// 若未安装 JEI,直接跳过,避免触发 JEI 类加载导致的 NoClassDefFoundError
|
||||||
|
if (!ModList.get().isLoaded("jei")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 若 JEI 运行时尚未就绪,跳过
|
||||||
|
if (JeiRuntimeProxy.get() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
// 优先处理:Shift + 左键(拉取或下单)
|
// 优先处理:Shift + 左键(拉取或下单)
|
||||||
if (event.getButton() == GLFW.GLFW_MOUSE_BUTTON_LEFT && Screen.hasShiftDown()) {
|
if (event.getButton() == GLFW.GLFW_MOUSE_BUTTON_LEFT && Screen.hasShiftDown()) {
|
||||||
double mouseX = event.getMouseX();
|
try {
|
||||||
double mouseY = event.getMouseY();
|
double mouseX = event.getMouseX();
|
||||||
Optional<ITypedIngredient<?>> hovered = JeiRuntimeProxy.getIngredientUnderMouse(mouseX, mouseY);
|
double mouseY = event.getMouseY();
|
||||||
if (hovered.isEmpty()) {
|
Optional<ITypedIngredient<?>> hovered = JeiRuntimeProxy.getIngredientUnderMouse(mouseX, mouseY);
|
||||||
hovered = JeiRuntimeProxy.getIngredientUnderMouse();
|
if (hovered.isEmpty()) {
|
||||||
}
|
hovered = JeiRuntimeProxy.getIngredientUnderMouse();
|
||||||
if (hovered.isPresent()) {
|
|
||||||
// 若 JEI 作弊模式开启,则放行给 JEI 处理(Shift+左键=一组)
|
|
||||||
if (JeiRuntimeProxy.isJeiCheatModeEnabled()) {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
ITypedIngredient<?> typed = hovered.get();
|
if (hovered.isPresent()) {
|
||||||
GenericStack stack = GenericEntryStackHelper.ingredientToStack(typed);
|
// 若 JEI 作弊模式开启,则放行给 JEI 处理(Shift+左键=一组)
|
||||||
if (stack != null) {
|
if (JeiRuntimeProxy.isJeiCheatModeEnabled()) {
|
||||||
// 发送到服务端:若网络有库存则拉取一组到空槽,否则若可合成则打开下单界面
|
return;
|
||||||
ModNetwork.CHANNEL.sendToServer(new PullFromJeiOrCraftC2SPacket(stack));
|
}
|
||||||
// 消费此次点击,避免 JEI/原版对左键的其它处理
|
ITypedIngredient<?> typed = hovered.get();
|
||||||
event.setCanceled(true);
|
GenericStack stack = GenericEntryStackHelper.ingredientToStack(typed);
|
||||||
return;
|
if (stack != null) {
|
||||||
|
// 发送到服务端:若网络有库存则拉取一组到空槽,否则若可合成则打开下单界面
|
||||||
|
ModNetwork.CHANNEL.sendToServer(new PullFromJeiOrCraftC2SPacket(stack));
|
||||||
|
// 消费此次点击,避免 JEI/原版对左键的其它处理
|
||||||
|
event.setCanceled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} catch (Throwable ignored) {
|
||||||
|
// 兼容 JEI 版本差异或运行时异常
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 中键:打开 AE 下单界面(保持原有功能)
|
// 中键:打开 AE 下单界面(保持原有功能)
|
||||||
if (event.getButton() == GLFW.GLFW_MOUSE_BUTTON_MIDDLE) {
|
if (event.getButton() == GLFW.GLFW_MOUSE_BUTTON_MIDDLE) {
|
||||||
// 优先在 JEI 配方界面基于坐标获取;若无,再从覆盖层/书签获取
|
try {
|
||||||
double mouseX = event.getMouseX();
|
// 优先在 JEI 配方界面基于坐标获取;若无,再从覆盖层/书签获取
|
||||||
double mouseY = event.getMouseY();
|
double mouseX = event.getMouseX();
|
||||||
Optional<ITypedIngredient<?>> hovered = JeiRuntimeProxy.getIngredientUnderMouse(mouseX, mouseY);
|
double mouseY = event.getMouseY();
|
||||||
if (hovered.isEmpty()) {
|
Optional<ITypedIngredient<?>> hovered = JeiRuntimeProxy.getIngredientUnderMouse(mouseX, mouseY);
|
||||||
hovered = JeiRuntimeProxy.getIngredientUnderMouse();
|
if (hovered.isEmpty()) {
|
||||||
|
hovered = JeiRuntimeProxy.getIngredientUnderMouse();
|
||||||
|
}
|
||||||
|
if (hovered.isEmpty()) return;
|
||||||
|
|
||||||
|
ITypedIngredient<?> typed = hovered.get();
|
||||||
|
// 若 JEI 作弊模式开启,则放行给 JEI 处理(中键=一组)
|
||||||
|
if (JeiRuntimeProxy.isJeiCheatModeEnabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
GenericStack stack = GenericEntryStackHelper.ingredientToStack(typed);
|
||||||
|
if (stack == null) return;
|
||||||
|
|
||||||
|
// 发送到服务端,让其验证并打开 CraftAmountMenu
|
||||||
|
ModNetwork.CHANNEL.sendToServer(new OpenCraftFromJeiC2SPacket(stack));
|
||||||
|
|
||||||
|
// 消费此次点击,避免 JEI/原版对中键的其它处理
|
||||||
|
event.setCanceled(true);
|
||||||
|
} catch (Throwable ignored) {
|
||||||
|
// 兼容 JEI 版本差异或运行时异常
|
||||||
}
|
}
|
||||||
if (hovered.isEmpty()) return;
|
|
||||||
|
|
||||||
ITypedIngredient<?> typed = hovered.get();
|
|
||||||
// 若 JEI 作弊模式开启,则放行给 JEI 处理(中键=一组)
|
|
||||||
if (JeiRuntimeProxy.isJeiCheatModeEnabled()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
GenericStack stack = GenericEntryStackHelper.ingredientToStack(typed);
|
|
||||||
if (stack == null) return;
|
|
||||||
|
|
||||||
// 发送到服务端,让其验证并打开 CraftAmountMenu
|
|
||||||
ModNetwork.CHANNEL.sendToServer(new OpenCraftFromJeiC2SPacket(stack));
|
|
||||||
|
|
||||||
// 消费此次点击,避免 JEI/原版对中键的其它处理
|
|
||||||
event.setCanceled(true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public static void onKeyPressedPre(ScreenEvent.KeyPressed.Pre event) {
|
public static void onKeyPressedPre(ScreenEvent.KeyPressed.Pre event) {
|
||||||
|
// 若未安装 JEI,直接跳过
|
||||||
|
if (!ModList.get().isLoaded("jei")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (JeiRuntimeProxy.get() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (event.getKeyCode() != GLFW.GLFW_KEY_F) return;
|
if (event.getKeyCode() != GLFW.GLFW_KEY_F) return;
|
||||||
|
|
||||||
// 仅当鼠标确实悬停在 JEI 配料上时触发
|
// 仅当鼠标确实悬停在 JEI 配料上时触发
|
||||||
Optional<ITypedIngredient<?>> hovered = JeiRuntimeProxy.getIngredientUnderMouse();
|
try {
|
||||||
if (hovered.isEmpty()) return;
|
Optional<ITypedIngredient<?>> hovered = JeiRuntimeProxy.getIngredientUnderMouse();
|
||||||
|
if (hovered.isEmpty()) return;
|
||||||
|
|
||||||
ITypedIngredient<?> typed = hovered.get();
|
ITypedIngredient<?> typed = hovered.get();
|
||||||
|
|
||||||
// 通用获取显示名称(兼容物品/流体等)
|
// 通用获取显示名称(兼容物品/流体等)
|
||||||
String name = JeiRuntimeProxy.getTypedIngredientDisplayName(typed);
|
String name = JeiRuntimeProxy.getTypedIngredientDisplayName(typed);
|
||||||
if (name == null || name.isEmpty()) return;
|
if (name == null || name.isEmpty()) return;
|
||||||
|
|
||||||
// 写入 AE2 终端的搜索框
|
// 写入 AE2 终端的搜索框
|
||||||
var screen = Minecraft.getInstance().screen;
|
var screen = Minecraft.getInstance().screen;
|
||||||
if (screen instanceof MEStorageScreen<?> me) {
|
if (screen instanceof MEStorageScreen<?> me) {
|
||||||
try {
|
try {
|
||||||
MEStorageScreenAccessor acc = (MEStorageScreenAccessor) me;
|
MEStorageScreenAccessor acc = (MEStorageScreenAccessor) me;
|
||||||
acc.eap$getSearchField().setValue(name);
|
acc.eap$getSearchField().setValue(name);
|
||||||
acc.eap$setSearchText(name); // 同步到 Repo 并刷新
|
acc.eap$setSearchText(name); // 同步到 Repo 并刷新
|
||||||
event.setCanceled(true);
|
event.setCanceled(true);
|
||||||
} catch (Throwable ignored) {
|
} catch (Throwable ignored) {
|
||||||
|
}
|
||||||
|
}else if (screen instanceof GuiExPatternTerminal<?> gpt) {
|
||||||
|
try {
|
||||||
|
GuiExPatternTerminalAccessor acc = (GuiExPatternTerminalAccessor) gpt;
|
||||||
|
acc.getSearchOutField().setValue(name);
|
||||||
|
event.setCanceled(true);
|
||||||
|
}catch (Throwable ignored) {}
|
||||||
}
|
}
|
||||||
}else if (screen instanceof GuiExPatternTerminal<?> gpt) {
|
} catch (Throwable ignored) {
|
||||||
try {
|
// 兼容 JEI 版本差异或运行时异常
|
||||||
GuiExPatternTerminalAccessor acc = (GuiExPatternTerminalAccessor) gpt;
|
|
||||||
acc.getSearchOutField().setValue(name);
|
|
||||||
event.setCanceled(true);
|
|
||||||
}catch (Throwable ignored) {}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user