From 7eb9669180d6cad62c8a9735d8d7a3b713cf46bd Mon Sep 17 00:00:00 2001 From: XianYuFish001 Date: Fri, 26 Sep 2025 13:19:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=A9=E5=B1=95=E4=BA=86=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E7=9A=84=E5=8A=9F=E8=83=BD,=20=E7=BB=99=E9=85=8D=E6=96=B9?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E4=B9=9F=E5=8A=A0=E4=BA=86=E5=BF=AB=E9=80=9F?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0(=E2=80=BE=E2=97=A1=E2=97=9D)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 2 +- readme.md | 15 +- .../extendedae_plus/client/InputEvents.java | 28 +--- .../PatternEncodingTermMenuMixinHelper.java | 2 +- .../client/ui/ProviderSelectScreen.java | 147 +++++++++++++----- .../integration/emi/HandlerBoMRecipes.java | 53 ++----- .../PatternEncodingTermMenuAccessor.java | 8 - .../ae2/client/gui/MixinActionButton.java | 27 ++++ .../gui/PatternProviderScreenMixin.java | 2 - .../menu/PatternEncodingTermMenuMixin.java | 16 +- .../mixin/emi/MixinBoMScreen.java | 28 ++-- .../mixin/emi/MixinEncodePatternTransfer.java | 10 +- .../mixin/emi/MixinRecipeFillButton.java | 25 +++ .../network/C2SPacketTargetKeyTriggered.java | 10 +- .../network/ProvidersListS2CPacket.java | 46 ++---- .../RequestProvidersListC2SPacket.java | 41 ++--- .../util/ExtendedAEPatternUploadUtil.java | 126 +++++++++------ .../java/com/extendedae_plus/util/GetKey.java | 1 + .../assets/extendedae_plus/lang/zh_cn.json | 1 + .../resources/extendedae_plus.mixins.json | 2 + 20 files changed, 354 insertions(+), 236 deletions(-) create mode 100644 src/main/java/com/extendedae_plus/mixin/ae2/client/gui/MixinActionButton.java create mode 100644 src/main/java/com/extendedae_plus/mixin/emi/MixinRecipeFillButton.java diff --git a/gradle.properties b/gradle.properties index 4345f0a..e8fede5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,7 +15,7 @@ loader_version_range=[1,) mod_id=extendedae_plus mod_name=ExtendedAE-Plus mod_license=LGPL-3.0-or-later -mod_version=1.0.1 +mod_version=1.0.2 mod_group_id=com.extendedae_plus mod_authors=GaLicn, XianYuFish001 mod_description= diff --git a/readme.md b/readme.md index 24f5a66..b3ada76 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,17 @@ # ExtendedAE Plus _这个分支是粗浅的EMI适配,技术力不足,请见谅_ -### 相较于主分支(1.4.0)的改动: +### 相较于主分支(1.4.0)的改动 - 删除了JEI的适配 -- 一些QoL功能, 针对EMI环境下遇到的问题 \ No newline at end of file + +### 增加/更改的QoL功能 +- 在EMI配方/配方树界面快速拉起样板编写&上传 +- 扩展了样板供应器选择界面的搜索功能 + - 现在可以匹配样板供应器目标方块的本地化键名 + - 允许在多个获取到的关键词间切换 + - 默认顺序: + - | 别名 _(不包含特殊字符的字符串现在都会被视为别名)_ + - | EMI配方类别本地化关键词 + - | 原版配方关键词 + - ↓ EMI配方关键词 +- 更多功能正在极速构思中 _(您知道吗? 这里的构思与构思谐音, 令人忍俊不禁)_ \ No newline at end of file diff --git a/src/main/java/com/extendedae_plus/client/InputEvents.java b/src/main/java/com/extendedae_plus/client/InputEvents.java index 2c0e30a..c3ca7e2 100644 --- a/src/main/java/com/extendedae_plus/client/InputEvents.java +++ b/src/main/java/com/extendedae_plus/client/InputEvents.java @@ -3,6 +3,7 @@ package com.extendedae_plus.client; import appeng.api.stacks.GenericStack; import appeng.client.gui.me.common.MEStorageScreen; import appeng.core.AEConfig; +import appeng.integration.modules.emi.EmiStackHelper; import com.extendedae_plus.ExtendedAEPlus; import com.extendedae_plus.mixin.ae2.accessor.MEStorageScreenAccessor; import com.extendedae_plus.mixin.extendedae.accessor.GuiExPatternTerminalAccessor; @@ -14,15 +15,11 @@ import dev.emi.emi.api.EmiApi; import dev.emi.emi.api.stack.EmiStack; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.material.Fluid; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.InputEvent; import net.neoforged.neoforge.client.event.ScreenEvent; -import net.neoforged.neoforge.fluids.FluidStack; import net.neoforged.neoforge.network.PacketDistributor; import org.lwjgl.glfw.GLFW; @@ -32,17 +29,6 @@ import java.util.List; public final class InputEvents { private InputEvents() {} - private static GenericStack toGenericStack(EmiStack stack) { - try { - GenericStack genericStack = null; - Object typed = stack.getKey(); - if (typed instanceof Item item) genericStack = GenericStack.fromItemStack(new ItemStack(item)); - else if (typed instanceof Fluid fluid) genericStack = GenericStack.fromFluidStack(new FluidStack(fluid, 1000)); - return genericStack; - } catch (Throwable ignored) {} - return null; - } - @SubscribeEvent public static void onMouseButtonPre(InputEvent.MouseButton.Pre event) { if (event.getAction() != GLFW.GLFW_PRESS) return; @@ -55,7 +41,7 @@ public final class InputEvents { // Optional> hovered = new JemiBookmarkOverlay().getIngredientUnderMouse(); List stacks = EmiApi.getHoveredStack(false).getStack().getEmiStacks(); if (stacks.isEmpty()) return; - GenericStack stack = toGenericStack(stacks.getFirst()); + GenericStack stack = EmiStackHelper.toGenericStack(stacks.getFirst()); if (stack == null) return; PacketDistributor.sendToServer(new PullFromJeiOrCraftC2SPacket(stack)); } @@ -66,7 +52,7 @@ public final class InputEvents { List stacks = EmiApi.getHoveredStack(false).getStack().getEmiStacks(); if (stacks.isEmpty()) return; - GenericStack stack = toGenericStack(stacks.getFirst()); + GenericStack stack = EmiStackHelper.toGenericStack(stacks.getFirst()); if (stack == null) return; // 发送到服务端,让其验证并打开 CraftAmountMenu @@ -112,13 +98,13 @@ public final class InputEvents { } catch (Throwable ignored) { } } - } else if (event.getKeyCode() == GLFW.GLFW_KEY_LEFT_SHIFT) - PacketDistributor.sendToServer(new C2SPacketTargetKeyTriggered(C2SPacketTargetKeyTriggered.KeyType.SHIFT_DOWN)); + } else if (event.getKeyCode() == GLFW.GLFW_KEY_LEFT_CONTROL) + PacketDistributor.sendToServer(new C2SPacketTargetKeyTriggered(C2SPacketTargetKeyTriggered.KeyType.CTRL_DOWN)); } @SubscribeEvent public static void onKeyReleasePre(ScreenEvent.KeyReleased.Pre event) { - if (event.getKeyCode() == GLFW.GLFW_KEY_LEFT_SHIFT) - PacketDistributor.sendToServer(new C2SPacketTargetKeyTriggered(C2SPacketTargetKeyTriggered.KeyType.SHIFT_UP)); + if (event.getKeyCode() == GLFW.GLFW_KEY_LEFT_CONTROL) + PacketDistributor.sendToServer(new C2SPacketTargetKeyTriggered(C2SPacketTargetKeyTriggered.KeyType.CTRL_UP)); } } diff --git a/src/main/java/com/extendedae_plus/client/PatternEncodingTermMenuMixinHelper.java b/src/main/java/com/extendedae_plus/client/PatternEncodingTermMenuMixinHelper.java index beb4156..f7f6f0c 100644 --- a/src/main/java/com/extendedae_plus/client/PatternEncodingTermMenuMixinHelper.java +++ b/src/main/java/com/extendedae_plus/client/PatternEncodingTermMenuMixinHelper.java @@ -1,5 +1,5 @@ package com.extendedae_plus.client; public interface PatternEncodingTermMenuMixinHelper { - void eaep$setShiftPressed(boolean pressed); + void eaep$setCtrlPressed(boolean pressed); } diff --git a/src/main/java/com/extendedae_plus/client/ui/ProviderSelectScreen.java b/src/main/java/com/extendedae_plus/client/ui/ProviderSelectScreen.java index f0704e0..d342a8c 100644 --- a/src/main/java/com/extendedae_plus/client/ui/ProviderSelectScreen.java +++ b/src/main/java/com/extendedae_plus/client/ui/ProviderSelectScreen.java @@ -1,11 +1,15 @@ package com.extendedae_plus.client.ui; import com.extendedae_plus.network.UploadEncodedPatternToProviderC2SPacket; +import com.extendedae_plus.util.ExtendedAEPatternUploadUtil; +import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.components.Tooltip; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; import java.util.*; @@ -18,11 +22,13 @@ public class ProviderSelectScreen extends Screen { // 原始数据 private final List ids; private final List names; + private final List i18nKeys; private final List emptySlots; // 分组后的数据(同名合并) - private final List gIds = new ArrayList<>(); // 代表条目使用的 providerId:选择空位数最多的那个 + private final List gIds = new ArrayList<>(); // 代表条目使用的 providerId:选择空位数最多的那个 private final List gNames = new ArrayList<>(); // 分组名(供应器名称) + private final List gI18nKeys = new ArrayList<>(); // 分组名(供应器Key) private final List gTotalSlots = new ArrayList<>(); // 该名称下供应器空位总和 private final List gCount = new ArrayList<>(); // 该名称下供应器数量 @@ -35,8 +41,9 @@ public class ProviderSelectScreen extends Screen { // 搜索框 private EditBox searchBox; // 中文名输入框(用于添加映射) - private EditBox cnInput; - private String query = ""; + private EditBox aliasInput; + private String selectedQuery = ""; + private List query = new ArrayList<>(); private boolean needsRefresh = false; private int page = 0; @@ -44,19 +51,26 @@ public class ProviderSelectScreen extends Screen { private final List